# Process with autom4te to create an -*- Autotest -*- test suite.
#
#   Copyright (C) 2004, 2005, 2006, 2007, 2008 Free Software
#   Foundation, Inc.
#   Written by Gary V. Vaughan, 2004
#
#   This file is part of GNU Libtool.
#
# GNU Libtool is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
#
# GNU Libtool is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GNU Libtool; see the file COPYING.  If not, a copy
# can be downloaded from  http://www.gnu.org/licenses/gpl.html,
# or obtained by writing to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
####

m4_divert_push([PREPARE_TESTS])dnl
: ${tst_dist=dist}
: ${ACLOCAL=aclocal}
: ${AUTOHEADER=autoheader}
: ${AUTOCONF=autoconf}
: ${AUTOMAKE=automake}
: ${AUTORECONF=autoreconf}
for tool in ACLOCAL AUTOHEADER AUTOCONF AUTOMAKE AUTORECONF; do
  if eval \$$tool --version >/dev/null 2>&1; then :; else eval $tool=no; fi
done
export ACLOCAL AUTOHEADER AUTOCONF AUTOMAKE AUTORECONF
eval `$LIBTOOL --config | grep '^EGREP='`
eval `$LIBTOOL --config | $EGREP '^(host|host_os|host_alias|build|build_alias|ECHO)='`
configure_options=--prefix=/nonexistent
if test -n "$host_alias"; then
  configure_options="$configure_options --host $host_alias"
fi
if test -n "$build_alias"; then
  configure_options="$configure_options --build $build_alias"
fi
if (FOO=bar; unset FOO) >/dev/null 2>&1; then
  unset=unset
else
  unset=false
fi
: ${mkdir_p="$abs_top_srcdir/libltdl/config/install-sh -d"}

# On AIX, shared libraries remain loaded in memory after use if they
# are world-readable, until root issues slibclean.  On NFS, this causes
# a testsuite rerun to fail to clean up test group directories.  Avoid
# this with a suitable umask.  Do not do this on other systems, for
# example HP-UX suffers unless shared libraries are mode 555.
case $host_os in
aix*) umask o-rwx ;;
esac
m4_divert_pop([PREPARE_TESTS])dnl


# LT_AT_LIBTOOLIZE([ARGS])
# ------------------------
m4_define([LT_AT_LIBTOOLIZE],
[$LIBTOOLIZE $1
AT_KEYWORDS([libtoolize])
])


# _LIBTOOLIZE_TRANSFORM(FILE)
# ---------------------------
# Fix the expected output of installed libtoolize in presence of --program-*.
m4_define([_LIBTOOLIZE_TRANSFORM],
[lt_name=`$ECHO "$LIBTOOLIZE" | sed "s,^.*/,,"`
sed "s/libtoolize/$lt_name/g
s|/usr/local/share/aclocal/|${tst_aclocaldir-$abs_top_srcdir/libltdl/m4}/|" < $1 > $1.t
mv -f $1.t $1
])dnl


# LT_AT_CHECK_LIBTOOLIZE(ARGS, [EXIT-STATUS = 0], [STDOUT = `'], [STDERR = `'])
# -----------------------------------------------------------------------------
m4_define([LT_AT_CHECK_LIBTOOLIZE],
[m4_if([$3], [expout], [_LIBTOOLIZE_TRANSFORM([$3])])dnl
m4_if([$4], [experr], [_LIBTOOLIZE_TRANSFORM([$4])])dnl
AT_CHECK([LT_AT_LIBTOOLIZE([$1])],
  [$2], [$3], [$4])
])


# LT_AT_ACLOCAL([OPTIONS])
# --------------------------
m4_define([LT_AT_ACLOCAL],
[AT_CHECK([$ACLOCAL $1], [0], [ignore], [ignore])
AT_XFAIL_IF([test "$ACLOCAL" = no])
AT_KEYWORDS([automake])
])


# LT_AT_AUTOCONF([OPTIONS])
# --------------------------
m4_define([LT_AT_AUTOCONF],
[AT_CHECK([$AUTOCONF $1], [0], [ignore], [ignore])
AT_XFAIL_IF([test "$AUTOCONF" = no])
AT_KEYWORDS([autoconf])
])


# LT_AT_AUTOMAKE([OPTIONS])
# --------------------------
m4_define([LT_AT_AUTOMAKE],
[AT_CHECK([$AUTOMAKE $1], [0], [ignore], [stderr],
  [AT_CHECK([grep 'require .*but have' stderr && (exit 77)], [1])])
AT_XFAIL_IF([test "$AUTOMAKE" = no])
AT_KEYWORDS([automake])
])


# LT_AT_AUTOHEADER([OPTIONS])
# ---------------------------
m4_define([LT_AT_AUTOHEADER],
[AT_CHECK([$AUTOHEADER $1], [0], [ignore], [ignore])
AT_XFAIL_IF([test "$AUTOHEADER" = no])
AT_KEYWORDS([autoconf])
])


# LT_AT_AUTORECONF([OPTIONS])
# --------------------------
m4_define([LT_AT_AUTORECONF],
[AT_CHECK([$AUTORECONF $1], [0], [ignore], [stderr],
  [AT_CHECK([grep 'require .*but have' stderr && (exit 77)], [1])])
AT_XFAIL_IF(
  [case ,$AUTORECONF,$AUTOCONF,$AUTOHEADER,$ACLOCAL,$AUTOMAKE, in *,no,*) :;; *) false;; esac])
AT_KEYWORDS([autoconf automake])
])


# LT_AT_CONFIGURE([OPTIONS])
# --------------------------
m4_define([LT_AT_CONFIGURE],
[( SHELL=${CONFIG_SHELL-/bin/sh}
   AT_CHECK([CONFIG_SHELL=$SHELL $SHELL ./configure $configure_options $1],
	 [0], [ignore], [ignore])
 )
])


# LT_AT_MAKE([TGTS], [VARS])
# --------------------------
m4_define([LT_AT_MAKE],
[( $unset LIBTOOL LIBTOOLIZE
  for target in m4_default([$1], [all])
  do
    AT_CHECK([$MAKE $target $2], [0], [ignore], [ignore])
  done )
])


# LT_AT_BOOTSTRAP([LIBTOOLIZE-ARGS], [ACLOCAL-ARGS], [AUTOHEADER-ARGS],
#	[AUTOMAKE-ARGS], [AUTOCONF-ARGS], [CONFIGURE-ARGS], [MAKE-ARGS])
# ----------------------------------------------------------------------
m4_define([LT_AT_BOOTSTRAP],
[m4_if([$1], [ignore], [], [LT_AT_LIBTOOLIZE([$1])])
m4_if([$2], [ignore], [], [LT_AT_ACLOCAL([$2])])
m4_if([$3], [ignore], [], [LT_AT_AUTOHEADER([$3])])
m4_if([$4], [ignore], [], [LT_AT_AUTOMAKE([$4])])
m4_if([$5], [ignore], [], [LT_AT_AUTOCONF([$5])])
m4_if([$6], [ignore], [], [LT_AT_CONFIGURE([$6])])
m4_if([$7], [ignore], [], [LT_AT_MAKE([$7])])
])


# LT_ESCAPE(ARG)
# --------------
# Escape command for output (expand only parameters).
m4_define([LT_ESCAPE],
[m4_bpatsubst([$1],
	     m4_dquote(m4_default([$2], [\"`])),
	     [\\\&])])


# LT_AT_CHECK
# -----------
# Wrapper around AT_CHECK that outputs the command first, with
# parameters expanded.
m4_define([LT_AT_CHECK],
[echo "LT_ESCAPE([$1])"; AT_CHECK($@)])


# _LT_AT_TRANSLATE_TEXT_OUTPUT(FILE)
# ----------------------------------
# Ensure correct line ending for expected output of host executables.
m4_define([_LT_AT_TRANSLATE_TEXT_OUTPUT],
[case $host_os in mingw*)
  while read -r l; do printf "%s\r\n" "$l"; done < $1 > $1.t
  mv -f $1.t $1 ;;
esac])


# LT_AT_EXEC_CHECK(EXECUTABLE, [STATUS = 0], [STDOUT], [STDERR])
# --------------------------------------------------------------
m4_define([LT_AT_EXEC_CHECK],
[m4_if([$3], [expout], [_LT_AT_TRANSLATE_TEXT_OUTPUT([$3])])
m4_if([$4], [experr], [_LT_AT_TRANSLATE_TEXT_OUTPUT([$4])])
AT_CHECK([$1; lt_status=$?; if test $lt_status -eq 0; then :;
	   elif test "X$host" != "X$build" && \
	        { test -x "$1" || test -x "$1"$EXEEXT; }
	   then (exit 77); else (exit $lt_status); fi],[$2],[$3],[$4])
])


# LT_AT_NOINST_EXEC_CHECK(EXECUTABLE, [NOINST-MODULES],
# 			  [STATUS = 0], [STDOUT], [STDERR])
# ---------------------------------------------------------
m4_define([LT_AT_NOINST_EXEC_CHECK],
[m4_if([$4], [expout], [_LT_AT_TRANSLATE_TEXT_OUTPUT([$4])])
m4_if([$5], [experr], [_LT_AT_TRANSLATE_TEXT_OUTPUT([$5])])
AT_CHECK([$LIBTOOL --mode=execute $2 $1; lt_status=$?;
	   if test $lt_status -eq 0; then :;
	   elif test "X$host" != "X$build" && \
	        { test -x "$1" || test -x "$1"$EXEEXT; }
	   then (exit 77); else (exit $lt_status); fi],[$3],[$4],[$5])
])


# LT_AT_TAG(TAG)
# --------------
m4_define([LT_AT_TAG],
[AT_KEYWORDS([$1])
AT_CHECK([{ test -n "[$]$1" && test "X[$]$1" != Xno; } || (exit 77)])
m4_if([$1], [CXX],
  [AT_CHECK([test "X$CXX" != Xg++ || (g++ -v >/dev/null 2>&1) || (exit 77)])])
])


# LT_AT_MVDIR(SRC, DEST)
# ----------------------
# Move contents of a directory recursively.
# Avoid `mv DIR ...' due to issues with non-deletable shared libraries
# on AIX on NFS mounts.  We cannot use slibclean as non-superuser.
m4_define([LT_AT_MVDIR],
[$mkdir_p $2
(cd $1 && find . -type d) | (cd $2 && xargs $mkdir_p)
for file in `cd $1 && find . -type f -print -o -type l -print`
do
  mv $1/$file $2/$file
done
rm -rf $1
])

## ------------------------------- ##
## Files for a small ltdl project. ##
## ------------------------------- ##

# _LTDL_PROJECT_FILES([LTDL-DIR])
# -------------------------------
# LTDL-DIR is needed to generate a correct Makefile.  If the argument
# is omitted, then no Makefile is created.
m4_define([_LTDL_PROJECT_FILES],
[AT_DATA([module.c],
[[#ifdef __cplusplus
extern "C"
#endif
const char *
hello (void)
{
  return "Hello!";
}
]])

AT_DATA([main.c],
[[#include <stdio.h>
#include "ltdl.h"

int
main ()
{
  lt_dlhandle module;
  const char *(*func) (void) = 0;
  int status = 1;

  LTDL_SET_PRELOADED_SYMBOLS();
  if (lt_dlinit() != 0) {
    fprintf (stderr, "error during initialisation: %s\n", lt_dlerror());
    return 1;
  }

  module = lt_dlopen("module.la");
  if (!module) {
    fprintf (stderr, "error dlopening module.la: %s\n", lt_dlerror());
    goto finish;
  }

  func = (const char *(*)(void)) lt_dlsym (module, "hello");
  if (!func) {
    fprintf (stderr, "error fetching func: %s\n", lt_dlerror());
    goto finish;
  }

  printf ("%s\n", (*func) ());
  status = 0;

finish:
  if (lt_dlexit() != 0) {
    fprintf (stderr, "error during finalisation: %s\n", lt_dlerror());
    status = 1;
  }

  return status;
}
]])

m4_pushdef([_ARG_DIR], m4_bpatsubst([$1], [/*$]))
m4_ifval([$1],
[AT_DATA([Makefile],
[[top_builddir	= .
LIBTOOL		= ./]_ARG_DIR[/libtool
INCLUDES	= -I./]_ARG_DIR[
MODFLAGS	= -module -avoid-version -no-undefined

LTCOMPILE = $(LIBTOOL) --tag=CC $(LIBTOOLFLAGS) --mode=compile \
        $(CC) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
LTLINK    = $(LIBTOOL) --tag=CC $(LIBTOOLFLAGS) --mode=link \
        $(CC) $(CFLAGS) $(LDFLAGS)

TARGETS		= ]_ARG_DIR[/libltdlc.la module.la ltdldemo$(EXEEXT)

all: $(TARGETS)

$(LIBTOOL) ]_ARG_DIR[/libltdlc.la: ]_ARG_DIR[/Makefile
	MAKE='$(MAKE)'; test -n "$$MAKE" || MAKE=make; \
	cd ]_ARG_DIR[ && $$MAKE CC="$(CC)" LIBTOOLFLAGS="$(LIBTOOLFLAGS)" \
	  CPPFLAGS="$(CPPFLAGS)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \
          CONFIGURE_OPTIONS="$(CONFIGURE_OPTIONS)"

]_ARG_DIR[/Makefile:
	cd ]_ARG_DIR[ && CONFIG_SHELL="$(SHELL)" $(SHELL) ./configure $(CONFIGURE_OPTIONS)

ltdldemo$(EXEEXT): $(LIBTOOL) module.la ]_ARG_DIR[/libltdlc.la main.lo
	$(LTLINK) -o ltdldemo main.lo -dlopen module.la ./]_ARG_DIR[/libltdlc.la

main.lo: $(LIBTOOL) main.c
	$(LTCOMPILE) -c main.c

module.la: $(LIBTOOL) module.lo
	$(LTLINK) -o module.la module.lo $(MODFLAGS) -rpath /dev/null

module.lo: $(LIBTOOL) module.c
	$(LTCOMPILE) -c module.c
]])
cat >> Makefile <<EOF
SHELL = $SHELL 
EOF
])
m4_popdef([_ARG_DIR])
])# _LTDL_PROJECT_FILES


# We use `dnl' in zillions of places...
m4_pattern_allow([^dnl$])

# We exercise these tools.
dnl AT_TESTED([grep autoreconf autom4te automake])

## ----------- ##
## The suite.  ##
## ----------- ##

AT_INIT
# The other tests will be appended here by the Makefile rule.
