| # 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 |