libtool/tests/mdemo.at
Ileana Dumitrescu ec703fac9e
libtool: FSF office address replaced by URL
* AUTHORS, HACKING, Makefile.am, bootstrap.conf, build-aux/edit-readme-alpha,
build-aux/no-bogus-m4-defines, cfg.mk, configure.ac, libltdl/configure.ac,
libltdl/libltdl/lt__alloc.h, libltdl/libltdl/lt__argz_.h,
libltdl/libltdl/lt__dirent.h, libltdl/libltdl/lt__glibc.h,
libltdl/libltdl/lt__private.h, libltdl/libltdl/lt__strl.h,
libltdl/libltdl/lt_dlloader.h, libltdl/libltdl/lt_error.h,
libltdl/libltdl/lt_system.h, libltdl/libltdl/slist.h,
libltdl/loaders/dld_link.c, libltdl/loaders/dlopen.c,
libltdl/loaders/dyld.c, libltdl/loaders/load_add_on.c,
libltdl/loaders/loadlibrary.c, libltdl/loaders/preopen.c,
libltdl/loaders/shl_load.c, libltdl/lt__alloc.c, libltdl/lt__argz.c,
libltdl/lt__dirent.c, libltdl/lt__strl.c, libltdl/lt_dlloader.c,
libltdl/lt_error.c, libltdl/ltdl.c, libltdl/ltdl.h, libltdl/ltdl.mk,
libltdl/slist.c, tests/am-subdir.at, tests/archive-in-archive.at,
tests/bindir.at, tests/bug_62343.at, tests/cdemo.at, tests/cmdline_wrap.at,
tests/configure-funcs.at, tests/configure-iface.at, tests/convenience.at,
tests/ctor.at, tests/cwrapper.at, tests/darwin.at, tests/demo.at,
tests/depdemo.at, tests/deplib-in-subdir.at, tests/deplibs-ident.at,
tests/deplibs-mingw.at, tests/destdir.at, tests/dlloader-api.at,
tests/dumpbin-symbols.at, tests/duplicate_conv.at, tests/duplicate_deps.at,
tests/duplicate_members.at, tests/early-libtool.at, tests/exceptions.at,
tests/execute-mode.at, tests/exeext.at, tests/export-def.at,
tests/export.at, tests/f77demo.at, tests/fail.at, tests/fcdemo.at,
tests/flags.at, tests/help.at, tests/indirect_deps.at, tests/infer-tag.at,
tests/inherited_flags.at, tests/install.at, tests/lalib-syntax.at,
tests/libtool.at, tests/libtoolize.at, tests/link-order.at,
tests/link-order2.at, tests/loadlibrary.at, tests/localization.at,
tests/lt_dladvise.at, tests/lt_dlexit.at, tests/lt_dlopen.at,
tests/lt_dlopen_a.at, tests/lt_dlopenext.at, tests/ltdl-api.at,
tests/ltdl-libdir.at, tests/mdemo.at, tests/need_lib_prefix.at,
tests/no-executables.at, tests/nocase.at, tests/nonrecursive.at,
tests/old-m4-iface.at, tests/pic_flag.at, tests/recursive.at,
tests/resident.at, tests/runpath-in-lalib.at, tests/search-path.at,
tests/shlibpath.at, tests/slist.at, tests/standalone.at, tests/static.at,
tests/stresstest.at, tests/subproject.at, tests/sysroot.at, tests/tagdemo.at,
tests/template.at, tests/testsuite.at, tests/versioning.at,
tests/with-pic.at: Replace FSF address in each file's license block with
a URL that points to licenses online hosted by GNU.
2024-09-13 20:19:33 +03:00

853 lines
19 KiB
Plaintext

# demo.at -- Dynamic ltdl runtime loading -*- Autotest -*-
#
# Copyright (C) 1998, 2002-2004, 2011-2019, 2021-2024 Free Software
# Foundation, Inc.
# Written by Thomas Tanner, 1998
# Written by Greg Eisenhauer, 2002
# Rewritten by Gary V. Vaughan, 2003
#
# 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. If not, see <https://www.gnu.org/licenses/>.
####
AT_BANNER([Dynamic ltdl runtime loading.])
# _LT_SETUP
# ---------
m4_define([_LT_SETUP],
[dnl We can't use AT_DATA here, because we need an unquoted here-
dnl document to splice in the path to the top level libltdl directory,
dnl but, we do need to double m4-quote to prevent premature expansion
dnl of any active m4 symbols in the here-doc content, and to maintain
dnl the square-bracket symbols as is.
[cat >configure.ac <<_EOT_
AC_INIT([mdemo], ]AT_PACKAGE_VERSION[, ]AT_PACKAGE_BUGREPORT[)
AC_CONFIG_AUX_DIR([build-aux])
AC_CONFIG_MACRO_DIRS([m4])
LT_CONFIG_LTDL_DIR([libltdl])
AM_INIT_AUTOMAKE
AC_PROG_CC
LT_INIT([dlopen win32-dll])
LTDL_INIT([nonrecursive convenience])
AC_SUBST([LIBTOOL_DEPS])
AC_SUBST([INCLTDL])
AC_SUBST([LIBLTDL])
STATIC=
test yes = "$enable_static" && STATIC=-static
AC_SUBST([STATIC])
LT_LIB_M
AC_CONFIG_FILES([Makefile])
AC_CONFIG_HEADERS([config.h:config.in.h])
AC_OUTPUT
_EOT_]
[cat >Makefile.am <<_EOT_
AUTOMAKE_OPTIONS = no-dependencies subdir-objects foreign
ACLOCAL_AMFLAGS = -I m4
AM_CPPFLAGS = \$(INCLTDL)
AM_LDFLAGS =
noinst_LTLIBRARIES =
EXTRA_LTLIBRARIES =
include_HEADERS =
EXTRA_DIST =
BUILT_SOURCES =
CLEANFILES =
MOSTLYCLEANFILES =
lib_LTLIBRARIES = libsub.la foo1.la libfoo2.la libmlib.la
foo1_la_SOURCES = foo1.c
foo1_la_LIBADD = \$(LIBM) libsub.la
foo1_la_LDFLAGS = -no-undefined -module -avoid-version
libfoo2_la_SOURCES = foo2.c
libfoo2_la_LIBADD = \$(LIBM) libsub.la
libfoo2_la_LDFLAGS = -no-undefined -module -export-symbols-regex "libfoo2.*"
libsub_la_SOURCES = sub.c
libsub_la_LDFLAGS = -no-undefined
## Use -export-symbols-regex here explicitly because libltdl marks
## its exported symbols, and we use libltdl as a convenience archive.
## Thus, on w32, auto-exporting is turned off.
libmlib_la_SOURCES = mlib.c
libmlib_la_LIBADD = \$(LIBLTDL) "-dlopen" foo1.la "-dlopen" libfoo2.la
libmlib_la_LDFLAGS = -no-undefined -export-symbols-regex ".*"
libmlib_la_DEPENDENCIES = \$(LIBLTDL) libsub.la foo1.la libfoo2.la
noinst_HEADERS = foo.h
bin_PROGRAMS = mdemo mdemo_static
# Create a version of mdemo that does dlopen.
mdemo_SOURCES = main.c
mdemo_LDFLAGS = -export-dynamic
## The quotes around -dlopen below fool automake into accepting it
mdemo_LDADD = \$(LIBLTDL) libsub.la "-dlopen" self \
"-dlopen" foo1.la "-dlopen" libfoo2.la
mdemo_DEPENDENCIES = \$(LIBLTDL) libsub.la foo1.la libfoo2.la
# Create a statically linked version of mdemo.
mdemo_static_SOURCES = \$(mdemo_SOURCES)
mdemo_static_LDFLAGS = \$(STATIC) \$(mdemo_LDFLAGS)
mdemo_static_LDADD = \$(mdemo_LDADD)
mdemo_static_DEPENDENCIES = \$(mdemo_DEPENDENCIES)
libtool: \$(LIBTOOL_DEPS)
\$(SHELL) ./config.status --recheck
include \$(srcdir)/libltdl/ltdl.mk
include \$(srcdir)/mdemo.mk
_EOT_]
AT_DATA([mdemo.mk],
[[# Don't abort for lack of mdemo.mk
]])
AT_DATA([foo.h],
[[#ifndef FOO_H
#define FOO_H
/* Silly constants that the functions return. */
#define HELLO_RET 0xe110
#define FOO_RET 0xf00
int sub (void);
#endif
]])
AT_DATA([foo1.c],
[[#include <config.h>
#include <stdio.h>
#include <math.h>
#include "foo.h"
#define nothing foo1_LTX_nothing
#define foo1 foo1_LTX_foo1
#define hello foo1_LTX_hello
/* Give a global variable definition. */
int nothing = FOO_RET;
/* private function */
int _foo1_helper (void) {
sub ();
return FOO_RET;
}
/* export functions */
#ifdef __cplusplus
extern "C" {
#endif
int foo1 (void) {
printf ("cos (0.0) = %g\n", (double) cos ((double) 0.0));
return _foo1_helper ();
}
int hello () {
printf ("** This is foolib 1 **\n");
return HELLO_RET;
}
#ifdef __cplusplus
}
#endif
]])
AT_DATA([foo2.c],
[[#include <config.h>
#include <stdio.h>
#include <math.h>
#include "foo.h"
#define nothing libfoo2_LTX_nothing
#define foo2 libfoo2_LTX_foo2
#define hello libfoo2_LTX_hello
/* Give a global variable definition. */
int nothing;
/* private function */
int _foo2_helper (void) {
sub ();
return FOO_RET;
}
/* export functions */
#ifdef __cplusplus
extern "C" {
#endif
int foo2 (void) {
printf ("sin (0.0) = %g\n", (double) sin ((double) 0.0));
return _foo2_helper ();
}
int hello () {
printf ("** This is foolib 2 **\n");
return HELLO_RET;
}
#ifdef __cplusplus
}
#endif
]])
AT_DATA([mlib.c],
[[#include <config.h>
#include <stdio.h>
#include "foo.h"
#include "ltdl.h"
int test_dl (char *filename) {
lt_dlhandle handle;
const lt_dlinfo *info;
int (*pfoo1)() = 0;
int (*pfoo2)() = 0;
int (*phello)() = 0;
int *pnothing = 0;
int ret = 0;
handle = lt_dlopen(filename);
if (!handle) {
fprintf (stderr, "can't open the module %s!\n", filename);
fprintf (stderr, "error was: %s\n", lt_dlerror());
return 1;
}
info = lt_dlgetinfo(handle);
if (!info) {
fprintf (stderr, "can't get module info: %s\n", lt_dlerror());
return 1;
}
if (info->name) {
printf ("module name: %s\n", info->name);
} else {
printf ("module is not a libtool module\n");
}
printf ("module filename: %s\n", info->filename);
printf ("module reference count: %i\n", info->ref_count);
phello = (int(*)())lt_dlsym(handle, "hello");
if (phello)
{
int value = (*phello) ();
printf ("hello returned: %i\n", value);
if (value == HELLO_RET)
printf("hello is ok!\n");
}
else
{
fprintf (stderr, "did not find the 'hello' function\n");
fprintf (stderr, "error was: %s\n", lt_dlerror());
ret = 1;
}
pnothing = (int*)lt_dlsym(handle, "nothing");
/* Try assigning to the nothing variable. */
if (pnothing)
*pnothing = 1;
else
{
fprintf (stderr, "did not find the 'nothing' variable\n");
fprintf (stderr, "error was: %s\n", lt_dlerror());
ret = 1;
}
pfoo1 = (int(*)())lt_dlsym(handle, "foo1");
/* Just call the functions and check return values. */
if (pfoo1)
{
if ((*pfoo1) () == FOO_RET)
printf("foo1 is ok!\n");
else
ret = 1;
}
else {
pfoo2 = (int(*)())lt_dlsym(handle, "foo2");
if (pfoo2)
{
if ((*pfoo2) () == FOO_RET)
printf("foo2 is ok!\n");
else ret = 1;
}
else
{
fprintf (stderr, "did not find any of the 'foo' functions\n");
fprintf (stderr, "error was: %s\n", lt_dlerror());
ret = 1;
}
}
lt_dlclose(handle);
return ret;
}
int
mlib_func (int argc, char **argv)
{
int ret = 0;
int i;
/*
* Would be nice if this somehow worked for libraries, not just executables.
* LTDL_SET_PRELOADED_SYMBOLS();
*/
if (lt_dlinit() != 0) {
fprintf (stderr, "error during initialization: %s\n", lt_dlerror());
return 1;
}
for (i = 1; i < argc; i++)
if (test_dl(argv[i]))
ret = 1;
lt_dlexit();
return ret;
}
]])
AT_DATA([sub.c],
[[#include <config.h>
#include <stdio.h>
void sub (void) { printf ("sub() called\n"); }
]])
AT_DATA([main.c],
[[#include <config.h>
#include <stdio.h>
#include <string.h>
#include "foo.h"
#include "ltdl.h"
#ifdef __cplusplus
# define EXPORT extern "C"
#else
# define EXPORT extern
#endif
EXPORT int myfunc (void);
int
test_dl (char *filename, int test_ext)
{
lt_dlhandle handle;
const lt_dlinfo *info;
int (*pfoo1)() = 0;
int (*pfoo2)() = 0;
int (*phello)() = 0;
int *pnothing = 0;
int ret = 0;
if (test_ext)
handle = lt_dlopenext (filename);
else
handle = lt_dlopen (filename);
if (!handle) {
fprintf (stderr, "can't open the module %s!\n", filename);
fprintf (stderr, "error was: %s\n", lt_dlerror());
return 1;
}
info = lt_dlgetinfo(handle);
if (!info) {
fprintf (stderr, "can't get module info: %s\n", lt_dlerror());
return 1;
}
if (info->name) {
printf ("module name: %s\n", info->name);
} else {
printf ("module is not a libtool module\n");
}
printf ("module filename: %s\n", info->filename);
printf ("module reference count: %i\n", info->ref_count);
phello = (int(*)())lt_dlsym(handle, "hello");
if (phello)
{
int value = (*phello) ();
printf ("hello returned: %i\n", value);
if (value == HELLO_RET)
printf("hello is ok!\n");
}
else
{
fprintf (stderr, "did not find the 'hello' function\n");
fprintf (stderr, "error was: %s\n", lt_dlerror());
ret = 1;
}
pnothing = (int*)lt_dlsym(handle, "nothing");
/* Try assigning to the nothing variable. */
if (pnothing)
*pnothing = 1;
else
{
fprintf (stderr, "did not find the 'nothing' variable\n");
fprintf (stderr, "error was: %s\n", lt_dlerror());
ret = 1;
}
pfoo1 = (int(*)())lt_dlsym(handle, "foo1");
/* Just call the functions and check return values. */
if (pfoo1)
{
if ((*pfoo1) () == FOO_RET)
printf("foo1 is ok!\n");
else
ret = 1;
}
else {
pfoo2 = (int(*)())lt_dlsym(handle, "foo2");
if (pfoo2)
{
if ((*pfoo2) () == FOO_RET)
printf("foo2 is ok!\n");
else ret = 1;
}
else
{
fprintf (stderr, "did not find any of the 'foo' functions\n");
fprintf (stderr, "error was: %s\n", lt_dlerror());
ret = 1;
}
}
lt_dlclose(handle);
return ret;
}
int
myfunc ()
{
return HELLO_RET;
}
int myvar;
int
test_dlself ()
{
lt_dlhandle handle;
int (*pmyfunc)() = 0;
int *pmyvar = 0;
int ret = 0;
handle = lt_dlopen(0);
if (!handle) {
fprintf (stderr, "can't dlopen the program!\n");
fprintf (stderr, "error was: %s\n", lt_dlerror());
return 1;
}
pmyfunc = (int(*)())lt_dlsym(handle, "myfunc");
if (pmyfunc)
{
int value = (*pmyfunc) ();
printf ("myfunc returned: %i\n", value);
if (value == HELLO_RET)
printf("myfunc is ok!\n");
}
else
{
fprintf (stderr, "did not find the 'myfunc' function\n");
fprintf (stderr, "error was: %s\n", lt_dlerror());
ret = 1;
}
pmyvar = (int*)lt_dlsym(handle, "myvar");
/* Try assigning to the variable. */
if (pmyvar)
*pmyvar = 1;
else
{
fprintf (stderr, "did not find the 'myvar' variable\n");
fprintf (stderr, "error was: %s\n", lt_dlerror());
ret = 1;
}
lt_dlclose(handle);
return ret;
}
static int
callback (const char *filename, void *data)
{
printf ("%s: %s\n", (char *)data, filename);
return 0;
}
static int
try_iterate (const char *search_path)
{
char *s = "try_iterate";
return lt_dlforeachfile (search_path, callback, s);
}
/* cheap dirname clone. We require a '/' separator, nonempty and large
enough input, not ending with '/', and we will overwrite the input. */
static char *
my_dirname (char *path)
{
char *p = strrchr (path, '/');
if (p)
*p = '\0';
else
{
path[0] = '.';
path[1] = '\0';
}
return path;
}
int
main (int argc, char **argv)
{
int i;
int ret = 0;
char *p;
printf ("Welcome to GNU libtool mdemo!\n");
if (argc < 2) {
fprintf (stderr, "usage: %s module [module...]\n", argv[0]);
}
LTDL_SET_PRELOADED_SYMBOLS();
if (lt_dlinit() != 0) {
fprintf (stderr, "error during initialization: %s\n", lt_dlerror());
return 1;
}
for (i = 1; i < argc; i++)
{
if (test_dl(argv[i], 0))
ret = 1;
p = strrchr(argv[i], '.');
if (p)
{
*p = '\0';
if (test_dl(argv[i], 1))
ret = 1;
*p = '.';
}
}
if (test_dlself())
ret = 1;
for (i = 1; i < argc; i++)
if (argv[i][0] != '\0')
{
my_dirname (argv[i]);
if (try_iterate (argv[i]))
ret = 1;
}
lt_dlexit();
return ret;
}
]])
LT_AT_HOST_DATA([expout],
[[Welcome to GNU Hell!
cos (0.0) = 1
** This is not GNU Hello. There is no built-in mail reader. **
]])
prefix=`pwd`/_inst
]) # _LT_SETUP
# _LT_CHECK_EXECUTE
# -----------------
# Run the listed make rules, and check that the built binaries work.
m4_define([_LT_CHECK_EXECUTE],
[LT_AT_MAKE
LT_AT_EXEC_CHECK([./mdemo_static], 0, [ignore], [],
[./foo1.la ./libfoo2.la | $GREP '^try_iterate: '])
LT_AT_EXEC_CHECK([./mdemo], 0, [ignore], [],
[./foo1.la ./libfoo2.la | $GREP '^try_iterate: '])
LT_AT_EXEC_CHECK([./mdemo_static], 0, [ignore], [],
[`pwd`/foo1.la `pwd`/libfoo2.la | $GREP '^try_iterate: '])
LT_AT_EXEC_CHECK([./mdemo], 0, [ignore], [],
[`pwd`/foo1.la `pwd`/libfoo2.la | $GREP '^try_iterate: '])
])
# _LT_CHECK_INSTALL
# -----------------
# Run the make install rule, and check that installed binaries work too.
m4_define([_LT_CHECK_INSTALL],
[LT_AT_MAKE([install])
# Windows hosts search for dlls in the command path.
PATH=$prefix/lib:$PATH
LT_AT_EXEC_CHECK([$prefix/bin/mdemo_static], 0, [ignore], [],
[$prefix/lib/foo1.la $prefix/lib/libfoo2.la | $GREP '^try_iterate: '])
LT_AT_EXEC_CHECK([$prefix/bin/mdemo], 0, [ignore], [],
[$prefix/lib/foo1.la $prefix/lib/libfoo2.la | $GREP '^try_iterate: '])
])
## ------------- ##
## Mdemo static. ##
## ------------- ##
AT_SETUP([dynamically ltdl preload static modules])
_LT_SETUP
LT_AT_CHECK_CONFIG([--with-included-ltdl --disable-shared],
[^build_old_libs=yes], [^build_libtool_libs=no])
_LT_CHECK_EXECUTE
_LT_CHECK_INSTALL
LT_AT_CHECK_UNINSTALL
AT_CLEANUP
## ------------- ##
## Mdemo shared. ##
## ------------- ##
AT_SETUP([dynamically ltdl load a shared module])
_LT_SETUP
LT_AT_CHECK_CONFIG([--with-included-ltdl --disable-static],
[^build_old_libs=no], [^build_libtool_libs=yes])
_LT_CHECK_EXECUTE
_LT_CHECK_INSTALL
LT_AT_CHECK_UNINSTALL
AT_CLEANUP
## ----------- ##
## Mdemo conf. ##
## ----------- ##
AT_SETUP([ltdl load shared and static modules])
_LT_SETUP
LT_AT_CHECK_CONFIG([--with-included-ltdl],
[^build_old_libs=yes], [^build_libtool_libs=yes])
_LT_CHECK_EXECUTE
_LT_CHECK_INSTALL
LT_AT_CHECK_UNINSTALL
AT_CLEANUP
## ------------- ##
## Mdemo dryrun. ##
## ------------- ##
AT_SETUP([ltdl dryrun])
_LT_SETUP
LT_AT_CHECK_CONFIG([--with-included-ltdl])
LT_AT_MAKE([all-local libltdl/libltdlc.la])
# create 'before' and 'after' in a directory deep within objdir,
# so that their creation and removal does not modify even a timestamp
# in the output of 'ls -l . $objdir'
$lt_INSTALL -d "$objdir/temp/temp"
before=$objdir/temp/temp/before
after=$objdir/temp/temp/after
# Create a new libtool script that will enter dry run if the environment
# variable force_dry_run is set
$SED 's|^[[ ]]*opt_dry_run=.*$|opt_dry_run=$force_dry_run|' libtool > ltnew && mv ltnew libtool
export force_dry_run
# main.o is not compiled with libtool, but it depends on it, so make
# sure it is up-to-date. libfoo2.la is linked with libsub.la, so make
# sure it exists, otherwise libtool will complain.
force_dry_run=false
LT_AT_MAKE([main.$objext])
# Making object files
# ls -l in MSYS sometimes shows year, not time, for really fresh files.
sleep 1
ls -l . "$objdir" | $EGREP -v '(^total|testsuite.log$)' > "$before"
force_dry_run=:
LT_AT_MAKE([foo1.lo foo2.lo libsub.la])
ls -l . "$objdir" | $EGREP -v '(^total|testsuite.log$)' > "$after"
AT_CHECK([cmp "$before" "$after"], 0, [ignore])
# Now really make them
force_dry_run=false
LT_AT_MAKE([foo1.lo foo2.lo libsub.la])
# Making libraries
sleep 1 # for MSYS
ls -l . "$objdir" | $EGREP -v '(^total|testsuite.log$)' > "$before"
force_dry_run=:
LT_AT_MAKE([foo1.la libfoo2.la])
ls -l . "$objdir" | $EGREP -v '(^total|testsuite.log$)' > "$after"
AT_CHECK([cmp "$before" "$after"], 0, [ignore])
# Now really make them
force_dry_run=false
LT_AT_MAKE([foo1.la libfoo2.la])
# Making programs
sleep 1 # for MSYS
ls -l . "$objdir" | $EGREP -v '(^total|testsuite.log$)' > "$before"
force_dry_run=:
LT_AT_MAKE([mdemo$EXEEXT mdemo_static$EXEEXT])
ls -l . "$objdir" | $EGREP -v '(^total|testsuite.log$)' > "$after"
AT_CHECK([cmp "$before" "$after"], 0, [ignore])
# Running $MAKE install
# Libtool does not create these directories
$lt_INSTALL -d "$prefix/bin"
$lt_INSTALL -d "$prefix/include"
$lt_INSTALL -d "$prefix/lib"
sleep 1 # for MSYS
ls -l . "$objdir" | $EGREP -v '(^total|testsuite.log$)' > "$before"
ls -lR "$prefix" | $EGREP -v '(^total|testsuite.log$)' >> "$before"
force_dry_run=:
LT_AT_MAKE([install])
ls -l . "$objdir" | $EGREP -v '(^total|testsuite.log$)' > "$after"
ls -lR "$prefix" | $EGREP -v '(^total|testsuite.log$)' >> "$after"
AT_CHECK([cmp "$before" "$after"], 0, [ignore])
# Now really install
force_dry_run=false
LT_AT_MAKE([install])
# Running $MAKE uninstall
# Libtool does not uninstall the programs, remove them first
rm -f "$prefix/bin/mdemo$EXEEXT" "$prefix/bin/mdemo_static$EXEEXT"
sleep 1 # for MSYS
ls -l . "$objdir" | $EGREP -v '(^total|testsuite.log$)' > "$before"
ls -lR "$prefix" | $EGREP -v '(^total|testsuite.log$)' >> "$before"
force_dry_run=:
LT_AT_MAKE([uninstall])
ls -l . "$objdir" | $EGREP -v '(^total|testsuite.log$)' > "$after"
ls -lR "$prefix" | $EGREP -v '(^total|testsuite.log$)' >> "$after"
AT_CHECK([cmp "$before" "$after"], 0, [ignore])
# Now really uninstall
force_dry_run=false
LT_AT_CHECK_UNINSTALL
AT_CLEANUP
## ------- ##
## Mdemo2. ##
## ------- ##
AT_SETUP([link with library that loads ltdl modules])
_LT_SETUP
AT_DATA([mdemo.mk],
[[bin_PROGRAMS += mdemo2 mdemo2_static
# Create a version of mdemo2 that links a library that does dlopen.
mdemo2_LDFLAGS = -export-dynamic "-dlopen" force
mdemo2_LDADD = libmlib.la
# Create a statically linked version of mdemo.
mdemo2_static_SOURCES = mdemo2.c
mdemo2_static_LDFLAGS = $(STATIC) $(mdemo2_LDFLAGS)
mdemo2_static_LDADD = $(mdemo2_LDADD)
mdemo2_static_DEPENDENCIES = $(mdemo2_DEPENDENCIES)
]])
AT_DATA([mdemo2.c],
[[#include <stdio.h>
#include "ltdl.h"
extern int mlib_func (int, char **);
int main (int argc, char **argv)
{
int ret = 0;
printf ("Welcome to GNU libtool mdemo2!\n");
if (argc < 2) {
fprintf (stderr, "usage: %s module [module...]\n", argv[0]);
}
/* This must be called in the program to get the preloaded symbols */
LTDL_SET_PRELOADED_SYMBOLS();
ret = mlib_func(argc, argv);
return ret;
}
]])
# Normalize line endings after $EGREP instead of using LT_AT_HOST_DATA
# here, since $EGREP *may* normalize line endings for us.
AT_DATA([expout],
[[Welcome to GNU libtool mdemo2!
module name: foo1
module reference count: 1
** This is foolib 1 **
hello returned: 57616
hello is ok!
cos (0.0) = 1
sub() called
foo1 is ok!
module name: libfoo2
module reference count: 1
** This is foolib 2 **
hello returned: 57616
hello is ok!
sin (0.0) = 0
sub() called
foo2 is ok!
]])
LT_AT_CHECK_CONFIG([--with-included-ltdl])
LT_AT_MAKE
LT_AT_EXEC_CHECK([./mdemo2_static], 0, [stdout], [],
[./foo1.la ./libfoo2.la | $EGREP -v '^module filename: '])
LT_AT_UNIFY_NL([stdout])
LT_AT_CHECK([diff expout stdout])
LT_AT_EXEC_CHECK([./mdemo2], 0, [stdout], [],
[./foo1.la ./libfoo2.la | $EGREP -v '^module filename: '])
LT_AT_UNIFY_NL([stdout])
LT_AT_CHECK([diff expout stdout])
AT_CLEANUP