# configure-iface.at -- test ltdl configure interface         -*- Autotest -*-
#
#   Copyright (C) 2007, 2008 Free Software Foundation, Inc.
#   Written by Gary V. Vaughan, 2007
#
#   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.
####

AT_BANNER([configure interface to libltdl.])

# _LT_AT_LTDL_SETUP
# -----------------
m4_pushdef([_LT_AT_LTDL_SETUP],
[AT_DATA([main.c],
[[#include <ltdl.h>
#include <stdio.h>

typedef int funcp (void);

static int errors = 0;

int
main (void)
{
  lt_dlhandle handle;

  LTDL_SET_PRELOADED_SYMBOLS();

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

  handle = lt_dlopenext ("libmodule");
  if (!handle)
    {
      fprintf (stderr, "can't open libmodule: %s\n", lt_dlerror ());
      ++errors;
    }

  {
    funcp *f = (funcp *) lt_dlsym (handle, "f");

    if (f)
      {
        printf ("%d\n", f ());
      }
    else
      {
        fprintf (stderr, "function `f' not found: %s\n", lt_dlerror ());
        ++errors;
      }
  }

  if (lt_dlexit () != 0)
    {
      fprintf (stderr, "error during exit: %s\n", lt_dlerror ());
      ++errors;
    }

  return (errors != 0);
}
]])

AT_DATA([libmodule.c],
[[#ifdef __cplusplus
extern "C" {
#endif
int f (void) { return 5150; }
#ifdef __cplusplus
}
#endif
]])

AT_DATA([expout],
[[5150
]])
])# _LT_AT_LTDL_SETUP


## -------------------- ##
## Installable libltdl. ##
## -------------------- ##

AT_SETUP([installable libltdl])
AT_KEYWORDS([libltdl])

_LT_AT_LTDL_SETUP

AT_DATA([configure.ac],
[[AC_INIT([installable-ltdl-demo], ]AT_PACKAGE_VERSION[, ]AT_PACKAGE_BUGREPORT[)
AC_CONFIG_AUX_DIR([libltdl/config])
AC_CONFIG_MACRO_DIR([libltdl/m4])
AC_CONFIG_HEADERS([config.h:config.hin])
LT_CONFIG_LTDL_DIR([libltdl])
AM_INIT_AUTOMAKE([foreign])
AC_PROG_CC
AM_PROG_CC_C_O
LT_INIT([dlopen])
LTDL_INIT([installable])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
]])

AT_DATA([Makefile.am],
[[AUTOMAKE_OPTIONS	= 1.7

SUBDIRS			= libltdl

AM_CPPFLAGS		= $(LTDLINCL)

lib_LTLIBRARIES		= libmodule.la
libmodule_la_LDFLAGS	= -module

bin_PROGRAMS		= main
main_LDFLAGS		= -dlopen libmodule.la
main_LDADD		= $(LIBLTDL)
main_DEPENDENCIES	= $(LTDLDEPS) libmodule.la
]])

# Install everything!
prefix=`pwd`/_inst

LT_AT_BOOTSTRAP([--ltdl], [-I libltdl/m4], [], [--add-missing], [],
        [--with-included-ltdl --prefix=$prefix], [all install])

# TODO: Check that the installed program `main' is linked against our libltdl
AT_CHECK([test -f $prefix/lib/libltdl.la])
AT_CHECK([test -f $prefix/include/ltdl.h])

# Check that main is rebuilt if libltdl.la is newer
rm -f libltdl/libltdl.la
AT_CHECK([$MAKE -q main$EXEEXT || exit 1], [1], [ignore], [ignore])

AT_CLEANUP


## ------------------------------- ##
## Link against installed libltdl. ##
## ------------------------------- ##

AT_SETUP([--with-ltdl-include/lib])
AT_KEYWORDS([libltdl])

# Install libltdl
prefix=`pwd`/_inst

LT_AT_LIBTOOLIZE([--copy --ltdl=ltdl])

(cd ltdl
LT_AT_CONFIGURE([--enable-ltdl-install --prefix=$prefix])
LT_AT_MAKE([all install])
)

# Remove build files
rm -rf ltdl/

AT_CHECK([test -f $prefix/lib/libltdl.la])
AT_CHECK([test -f $prefix/include/ltdl.h])

_LT_AT_LTDL_SETUP

AT_DATA([configure.ac],
[[AC_INIT([configure-iface-demo], ]AT_PACKAGE_VERSION[, ]AT_PACKAGE_BUGREPORT[)
AC_CONFIG_MACRO_DIR([_inst/aclocal])
AC_CONFIG_HEADERS([config.h:config.hin])
AM_INIT_AUTOMAKE([foreign])
AC_PROG_CC
AM_PROG_CC_C_O
LT_INIT([dlopen])
LTDL_INIT
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
]])

AT_DATA([Makefile.am],
[[AUTOMAKE_OPTIONS	= 1.7

AM_CPPFLAGS		= $(LTDLINCL)

lib_LTLIBRARIES		= libmodule.la
libmodule_la_LDFLAGS	= -module

bin_PROGRAMS		= main
main_LDFLAGS		= -dlopen libmodule.la
main_LDADD		= $(LIBLTDL)
main_DEPENDENCIES	= $(LTDLDEPS) libmodule.la
]])

# We don't use 'libtoolize --ltdl', so that we get an error if the test
# tries to build and link against its own ltdl sources:
LT_AT_BOOTSTRAP([], [-I _inst/aclocal], [], [--add-missing], [],
	[--with-ltdl-lib=$prefix/lib --with-ltdl-include=$prefix/include],
	[all])

## TODO: portable ldd check for correct libltdl
## Currently, this test doesn't fail if `main' ends up linking against a
## previously installed system libltdl.
LT_AT_NOINST_EXEC_CHECK([./main], [-dlopen libmodule.la], [], [expout], [])

AT_CLEANUP


## ------------------------------------- ##
## Link against shipped libltdl sources. ##
## ------------------------------------- ##

AT_SETUP([--with-included-ltdl])
AT_KEYWORDS([libltdl])

_LT_AT_LTDL_SETUP

AT_DATA([configure.ac],
[[AC_INIT([configure-iface-demo], ]AT_PACKAGE_VERSION[, ]AT_PACKAGE_BUGREPORT[)
AC_CONFIG_AUX_DIR([libltdl/config])
AC_CONFIG_MACRO_DIR([libltdl/m4])
AC_CONFIG_HEADERS([config.h:config.hin])
LT_CONFIG_LTDL_DIR([libltdl])
AM_INIT_AUTOMAKE([foreign])
AC_PROG_CC
AM_PROG_CC_C_O
LT_INIT([dlopen])
LTDL_INIT
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
]])

AT_DATA([Makefile.am],
[[AUTOMAKE_OPTIONS	= 1.7

SUBDIRS			= libltdl

AM_CPPFLAGS		= $(LTDLINCL)

lib_LTLIBRARIES		= libmodule.la
libmodule_la_LDFLAGS	= -module

bin_PROGRAMS		= main
main_LDFLAGS		= -dlopen libmodule.la
main_LDADD		= $(LIBLTDL)
main_DEPENDENCIES	= $(LTDLDEPS) libmodule.la
]])

LT_AT_BOOTSTRAP([--ltdl], [-I libltdl/m4], [], [--add-missing], [],
        [--with-included-ltdl], [all])

# --with-included-ltdl should build a convenience lib by default
AT_CHECK([test -f libltdl/libltdlc.la])

## TODO: portable ldd check for correct libltdl
## Currently, this test doesn't fail if `main' ends up linking against a
## previously installed system libltdl.
LT_AT_NOINST_EXEC_CHECK([./main], [-dlopen libmodule.la], [], [expout], [])

# Check that main is rebuilt if libltdlc.la is newer
rm -f libltdl/libltdlc.la
AT_CHECK([$MAKE -q main$EXEEXT || exit 1], [1], [ignore], [ignore])

AT_CLEANUP


## -------------------- ##
## Convenience libltdl. ##
## -------------------- ##

AT_SETUP([convenience libltdl])

AT_DATA([configure.ac],
[[AC_INIT
AC_CONFIG_AUX_DIR([libltdl/config])
AC_LIBLTDL_CONVENIENCE
AC_LIBTOOL_DLOPEN
AC_PROG_LIBTOOL
AC_CONFIG_FILES(Makefile)
AC_OUTPUT
]])
AT_DATA([Makefile.in],
[[LIBLTDL = @LIBLTDL@
print-ltdl:
	echo $(LIBLTDL)
]])

LT_AT_BOOTSTRAP([--ltdl], [-I libltdl/m4], [ignore], [ignore], [], [], [ignore])
AT_CHECK([$MAKE print-ltdl], [], [stdout], [ignore])
AT_CHECK([grep libltdl/libltdlc.la stdout], [], [ignore])

AT_CLEANUP

dnl Be careful not to let the definition leak into other tests
m4_popdef([_LT_AT_LTDL_SETUP])
