mirror of
git://git.savannah.gnu.org/libtool.git
synced 2024-11-27 06:09:57 +08:00
ec703fac9e
* 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.
853 lines
19 KiB
Plaintext
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
|