+1998-11-04 Alexandre Oliva <oliva@dcc.unicamp.br>
+
+ * ltconfig.in, ltmain.in: updated and fixed the patches below
+
+1998-11-04 Thomas Tanner <tanner@gmx.de>
+
+ * mdemo/*: added new demo to demonstrate building of dlopenend
+ modules
+ * tests/Makefile.am, tests/mdemo*: added some tests for mdemo
+
+1998-11-04 Gary V. Vaughan <gvaughan@oranda.demon.co.uk>
+
+ * demo/configure.in: added AC_EXEEXT macro so that the tests can
+ work on cywin32/mingw32 hosts. This requires the current CVS
+ autoconf
+
+1998-11-04 Thomas Tanner <tanner@gmx.de>
+
+ * ltmain.in: New flag -export-symbols; new dlpreopen system
+ * demo/dlmain.c: removed dld_preloaded_symbol_count
+
+1998-11-04 Ian Lance Taylor <ian@cygnus.com>
+
+ * ltmain.in: On installation, don't get confused if the same name
+ appears more than once in the list of library names.
+
+1998-11-04 Ian Lance Taylor <ian@cygnus.com>
+
+ * ltconfig.in: Add objext and libext variables. Check for object
+ suffix. Check for mingw32* as well as cygwin32*. Use objext when
+ testing compiler. Add support for Visual C++ on cygwin32 when not
+ using gcc. Add objext, libext, and fix_srcfile_path to generated
+ libtool script.
+ * ltmain.in: Use .${objext} rather than .o. Use fix_srcfile_path
+ if it is set. Check for .obj as well as for .o, and for .lib as
+ well as for .a. Use .${libext} rather than .a when creating old
+ libraries.
+ * libtoolize.in: Change initial /bin/sh to @SHELL@.
+ * libtool.m4 (AM_PROG_LIBTOOL): Add AC_REQUIRE for
+ AC_CANONICAL_BUILD, so that autoconf doesn't get mixed up by the
+ AC_REQUIRE in AC_CHECK_TOOL.
+
+1998-11-04 Ian Lance Taylor <ian@cygnus.com>
+
+ * ltconfig.in: Look in the right directory for libtool.c in
+ archive_cmds for cygwin32.
+
+1998-11-04 Ian Lance Taylor <ian@cygnus.com>
+
+ * ltconfig.in: Fix cygwin32 support to avoid using a double
+ extension, to delete the def file, to set version_type to windows,
+ and to include versuffix in the DLL name.
+ * ltmain.in: Add support for a version_type of windows.
+
+1998-11-04 Ian Lance Taylor <ian@cygnus.com>
+
+ * ltconfig.in: Add cygwin32 support.
+ * libtool.m4 (AM_PROG_LIBTOOL): Call AM_SYS_LIBTOOL_CYGWIN32 on a
+ cygwin32 host. Pass DLLTOOL and AS to ltconfig.
+ (AM_SYS_LIBTOOL_CYGWIN32): New macro.
+
1998-11-04 Alexandre Oliva <oliva@dcc.unicamp.br>
* libtool.m4 (sco): fix typo
demo/configure demo/configure.in demo/foo.c demo/foo.h \
demo/dlmain.c demo/hello.c demo/main.c demo/run.test
+# Files in the mdemo subdirectory that go in the distribution.
+mdemo_distfiles = mdemo/Makefile.in mdemo/Makefile.am mdemo/README \
+ mdemo/acinclude.m4 mdemo/aclocal.m4 \
+ mdemo/configure mdemo/configure.in \
+ mdemo/foo.h mdemo/foo1.c mdemo/foo2.c \
+ mdemo/libfoo1.sym mdemo/libfoo2.sym \
+ mdemo/main.c mdemo/ltdl.h mdemo/ltdl.c mdemo/ltdls.c
+
# These are required by libtoolize.
pkgdata_SCRIPTS = config.guess config.sub ltconfig
pkgdata_DATA = ltmain.sh
sed -e 's/@''PACKAGE@/@PACKAGE@/' -e 's/@''VERSION@/@VERSION@/' $(srcdir)/ltmain.in > ltmain.shT
mv -f ltmain.shT $@
-# Distribute the demo subdirectory.
-dist-hook: $(demo_distfiles)
+# Distribute the demo and mdemo subdirectory.
+dist-hook: $(demo_distfiles) $(mdemo_distfiles)
mkdir $(distdir)/demo
-chmod 755 $(distdir)/demo
here=`pwd`; distdir=`cd $(distdir) && pwd` \
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
|| cp -p $$d/$$file $(distdir)/$$file; \
done
+ mkdir $(distdir)/mdemo
+ -chmod 755 $(distdir)/mdemo
+ here=`pwd`; distdir=`cd $(distdir) && pwd` \
+ && cd $(srcdir)/mdemo \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here/mdemo --srcdir-name=$(srcdir)/mdemo --output-dir=$$distdir/mdemo
+ @for file in $(mdemo_distfiles); do \
+ d=$(srcdir); \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file; \
+ done
# All our rules should depend on these demo files.
-all: demo/Makefile.in demo/configure
+all: demo/Makefile.in demo/configure mdemo/Makefile.in mdemo/configure
# We use our own libtool.m4.
$(srcdir)/acinclude.m4: libtool.m4
$(srcdir)/demo/acinclude.m4: libtool.m4
rm -f $(srcdir)/demo/acinclude.m4
cd $(srcdir)/demo && $(LN_S) ../libtool.m4 acinclude.m4
+$(srcdir)/mdemo/acinclude.m4: libtool.m4
+ rm -f $(srcdir)/mdemo/acinclude.m4
+ cd $(srcdir)/mdemo && $(LN_S) ../libtool.m4 acinclude.m4
# Rules for rebuilding some of the demo source files.
$(srcdir)/demo/Makefile.in: demo/Makefile.am demo/configure.in demo/aclocal.m4
$(srcdir)/demo/aclocal.m4: demo/configure.in demo/acinclude.m4
cd $(srcdir)/demo && $(ACLOCAL)
+$(srcdir)/mdemo/Makefile.in: mdemo/Makefile.am mdemo/configure.in mdemo/aclocal.m4
+ cd $(srcdir)/mdemo && $(AUTOMAKE)
+
+$(srcdir)/mdemo/configure: mdemo/configure.in mdemo/aclocal.m4
+ cd $(srcdir)/mdemo && $(AUTOCONF)
+
+$(srcdir)/mdemo/aclocal.m4: mdemo/configure.in mdemo/acinclude.m4
+ cd $(srcdir)/mdemo && $(ACLOCAL)
+
######################################################################
# These commands really help my life as a maintainer who uses PRCS.
# Feel free to copy them to your own project. I just run a
AM_INIT_AUTOMAKE(hell,1.0)
AC_PROG_CC
+AC_EXEEXT
AM_PROG_LIBTOOL
dnl Output the makefile
};
extern struct dld_symlist dld_preloaded_symbols[];
-extern int dld_preloaded_symbol_count;
int
main (argc, argv)
printf ("Welcome to *modular* GNU Hell!\n");
- if (dld_preloaded_symbol_count < 0)
- printf ("Sorry, the symbol list is not sorted and unique.\n");
- else
- printf ("Yippee! The symbol list is both sorted and unique.\n");
-
/* Look up the symbols we require for this demonstration. */
s = dld_preloaded_symbols;
while (s->name)
{
- /* FIXME: we are simplistic about leading underscores. */
- printf ("found symbol: %s\n", s->name);
- if (!strcmp ("hello", s->name))
- phello = s->address;
- else if (!strcmp ("foo", s->name))
- pfoo = s->address;
- else if (!strcmp ("nothing", s->name))
- pnothing = s->address;
-
+ if (s->address) {
+ /* FIXME: we are simplistic about leading underscores. */
+ printf ("found symbol: %s\n", s->name);
+ if (!strcmp ("hello", s->name))
+ phello = s->address;
+ else if (!strcmp ("foo", s->name))
+ pfoo = s->address;
+ else if (!strcmp ("nothing", s->name))
+ pnothing = s->address;
+ } else
+ printf ("found file: %s\n", s->name);
s ++;
}
Allow symbols from @var{output-file} to be resolved with @code{dlsym}
(@pxref{Dlopened modules}).
+@item -export-symbols @var{symfile}
+Same as @samp{-export-dynamic}, except that it only exports symbols
+that are listed in @var{symfile}. The symbol file should end in @samp{.sym}
+and must contain the name of one symbol per line.
+
@item -L@var{libdir}
Search @var{libdir} for required libraries that have already been
installed.
in order to be dynamically resolved with the @code{dlsym} (or
equivalent) function.
-Libtool provides the @samp{-export-dynamic} link flag (@pxref{Link
-mode}), which does this declaration. You need to use this flag if you
-are linking an application program that dlopens other modules or a
-libtool library that will also be dlopened.
+Libtool provides the @samp{-export-dynamic} and @samp{-export-symbols} link
+flags (@pxref{Link mode}), which does this declaration.
+You need to use this flag if you are linking an application program that
+dlopens other modules or a libtool library that will also be dlopened.
For example, if we wanted to build a shared library, @file{libhello},
that would later be dlopened by an application, we would add
without crashing.
@end enumerate
-Libtool emulates @samp{-export-dynamic} on static platforms by linking
-objects into the program at compile time, and creating data structures
-that represent the program's symbol table.
+Libtool emulates @samp{-export-dynamic} and @samp{-export-symbols}
+on static platforms by linking objects into the program at compile time,
+and creating data structures that represent the program's symbol table.
In order to use this feature, you must declare the objects you want your
application to dlopen by using the @samp{-dlopen} or @samp{-dlpreopen}
@deftypevar {dld_symbol *} dld_preloaded_symbols
An array of @var{dld_symbol} structures, representing all the preloaded
-symbols linked into the program. The last element has a @var{name} of
-@code{0}.
-@end deftypevar
-
-@deftypevar int dld_preloaded_symbol_count
-The number of elements in @var{dld_preloaded_symbols}, if it is sorted
-in ascending order by @var{name}. Otherwise, @code{-1}, to indicate
-that the application needs to sort and count @var{dld_preloaded_symbols}
-itself, or search it linearly.
+symbols linked into the program. For each @samp{-dlpreloaded} file
+there is an element with the @var{name} of the file and a @var{address}
+of @code{0}, followed by all symbols exported from this file.
+The last element has a @var{name} and @var{address} of @code{0}.
@end deftypevar
Some compilers may allow identifiers which are not valid in ANSI C, such
@cindex names of dynamic modules
@cindex dynamic modules, names
-After a library has been linked with @samp{-export-dynamic}, it can be
-dlopened. Unfortunately, because of the variation in library names,
+After a library has been linked with @samp{-export-dynamic} or
+@samp{-export-symbols}, it can be dlopened.
+Unfortunately, because of the variation in library names,
your package needs to determine the correct file to dlopen.
The most straightforward and flexible implementation is to determine the
## configuration script generated by Autoconf, you may include it under
## the same distribution terms that you use for the rest of that program.
-# serial 28 AM_PROG_LIBTOOL
+# serial 29 AM_PROG_LIBTOOL
AC_DEFUN(AM_PROG_LIBTOOL,
[AC_REQUIRE([AM_ENABLE_SHARED])dnl
AC_REQUIRE([AM_ENABLE_STATIC])dnl
AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
AC_REQUIRE([AC_PROG_RANLIB])dnl
AC_REQUIRE([AC_PROG_CC])dnl
AC_REQUIRE([AM_PROG_LD])dnl
CFLAGS="$SAVE_CFLAGS"
fi
;;
+
+*-*-cygwin32*)
+ AM_SYS_LIBTOOL_CYGWIN32
+ ;;
+
esac
# enable the --disable-libtool-lock switch
# Actually configure libtool. ac_aux_dir is where install-sh is found.
CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \
LD="$LD" NM="$NM" RANLIB="$RANLIB" LN_S="$LN_S" \
+DLLTOOL="$DLLTOOL" AS="$AS" \
${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \
$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $host \
|| AC_MSG_ERROR([libtool configure failed])
AC_MSG_RESULT([$NM])
AC_SUBST(NM)
])
+
+# AM_SYS_LIBTOOL_CYGWIN32 - find tools needed on cygwin32
+AC_DEFUN(AM_SYS_LIBTOOL_CYGWIN32,
+[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+AC_CHECK_TOOL(AS, as, false)
+])
with_gcc=no
with_gnu_ld=no
need_locks=yes
+objext=o
+libext=a
old_AR="$AR"
old_CC="$CC"
old_LN_S="$LN_S"
old_NM="$NM"
old_RANLIB="$RANLIB"
+old_DLLTOOL="$DLLTOOL"
+old_AS="$AS"
# Parse the command line options.
args=
old_postinstall_cmds="\$RANLIB \$oldlib;$old_postinstall_cmds"
fi
+# Set sane defaults for `DLLTOOL' and `AS', used on cygwin32.
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$AS" && AS=as
+
# Check to see if we are using GCC.
if test "$with_gcc" != yes || test -z "$CC"; then
# If CC is not set, then try to find GCC or a usable CC.
set dummy $CC
compiler="$2"
+echo $ac_n "checking for object suffix... $ac_c" 1>&6
+$rm conftest*
+echo 'int i = 1;' > conftest.c
+echo "$progname:@LINENO@: checking for object suffix" >& 5
+if { (eval echo $progname:@LINENO@: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; }; then
+ # Append any warnings to the config.log.
+ cat conftest.err 1>&5
+
+ for ac_file in conftest.*; do
+ case $ac_file in
+ *.c) ;;
+ *) objext=`echo $ac_file | sed -e s/conftest.//` ;;
+ esac
+ done
+else
+ cat conftest.err 1>&5
+ echo "$progname: failed program was:" >&5
+ cat conftest.c >&5
+fi
+$rm conftest*
+echo "$ac_t$objext" 1>&6
+
echo $ac_n "checking for $compiler option to produce PIC... $ac_c" 1>&6
pic_flag=
special_shlib_compile_flags=
aix3* | aix4* | irix5* | irix6* | osf3* | osf4*)
# PIC is the default for these OSes.
;;
- os2*)
+ cygwin32* | mingw32* | os2*)
# We can build DLLs from non-PIC.
;;
amigaos*)
# PIC (with -KPIC) is the default.
;;
- os2*)
+ cygwin32* | mingw32* | os2*)
# We can build DLLs from non-PIC.
;;
save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $pic_flag -DPIC"
echo "$progname:@LINENO@: checking if $compiler PIC flag $pic_flag works" >&5
- if { (eval echo $progname:@LINENO@: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.o; then
+ if { (eval echo $progname:@LINENO@: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.$objext; then
# Append any warnings to the config.log.
cat conftest.err 1>&5
hardcode_shlibpath_var=no
;;
+ cygwin32* | mingw32*)
+ if test "$with_gcc" = yes; then
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ allow_undefined_flag=unsupported
+ # Very, very bogus.
+ echo '
+#include <windows.h>
+
+struct _reent *_impure_ptr;
+extern struct _reent *__imp_reent_data;
+BOOL APIENTRY
+__dll_entry (HINSTANCE hinst, DWORD reason, LPVOID reserved)
+{
+ _impure_ptr = __imp_reent_data;
+}
+' > ltdll.c
+ archive_cmds='$CC -c '"`pwd`"'/ltdll.c; echo EXPORTS > $lib.exp;
+ if test -z "$export_symbols"; then $NM$libobjs | $global_symbol_pipe | sed '\''s/.* //'\'' > $lib.exp;\
+ else cat "$export_symbols" > $lib.exp; fi;\
+ $LD -s --base-file $soname-base --dll -e ___dll_entry@12 -o $lib libtool.$objext$libobjs;\
+ $DLLTOOL --as=$AS --dllname $soname --def $lib.exp --base-file $soname-base --output-exp $soname-exp;\
+ $LD -s --base-file $soname-base $soname-exp --dll -e ___dll_entry@12 -o $lib libtool.$objext$libobjs;\
+ $DLLTOOL --as=$AS --dllname $soname --def $lib.exp --base-file $soname-base --output-exp $soname-exp;\
+ $LD $soname-exp --dll -e ___dll_entry@12 -o $lib libtool.$objext$libobjs;\
+ $rm libtool.$objext $soname-base $soname-exp'
+ old_archive_from_new_cmds='$DLLTOOL --as=$AS --dllname $soname --def $lib.exp --output-lib $objdir/$libname.a;$rm $lib.exp'
+ else
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ with_gnu_ld=no
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $lib$libobjs`echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll;linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_from_new_cmds='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds='lib /OUT:$oldlib$oldobjs'
+ fix_srcfile_path='`cygpath -w $srcfile`'
+ fi
+ ;;
+
*)
if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
archive_cmds='$CC -shared ${wl}-soname $wl$soname -o $lib$libobjs'
;;
esac
- if test "$ld_shlibs" = yes; then
+ if test "$ld_shlibs" = yes && test "$with_gnu_ld" = yes; then
runpath_var=LD_RUN_PATH
hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'
export_dynamic_flag_spec='${wl}--export-dynamic'
case "$host_os" in
aix3*)
allow_undefined_flag=unsupported
- archive_cmds='$NM$libobjs | $global_symbol_pipe | sed '\''s/.* //'\'' > $lib.exp;$LD -o $objdir/$soname$libobjs -bE:$lib.exp -T512 -H512 -bM:SRE;$AR cru $lib $objdir/$soname'
+ archive_cmds='if test -z "$export_symbols"; then $NM$libobjs | $global_symbol_pipe | sed '\''s/.* //'\'' > $lib.exp;\
+ else cat "$export_symbols" > $lib.exp; fi;$LD -o $objdir/$soname$libobjs -bE:$lib.exp -T512 -H512 -bM:SRE;$AR cru $lib $objdir/$soname'
# Note: this linker hardcodes the directories in LIBPATH if there
# are no directories specified by -L.
hardcode_minus_L=yes
aix4*)
allow_undefined_flag=unsupported
- archive_cmds='$NM$libobjs | $global_symbol_pipe | sed '\''s/.* //'\'' > $lib.exp;$CC -o $objdir/$soname$libobjs ${wl}-bE:$lib.exp ${wl}-bM:SRE ${wl}-bnoentry;$AR cru $lib $objdir/$soname'
+ archive_cmds='if test -z "$export_symbols"; then $NM$libobjs | $global_symbol_pipe | sed '\''s/.* //'\'' > $lib.exp;\
+ else cat "$export_symbols" > $lib.exp; fi; $CC -o $objdir/$soname$libobjs ${wl}-bE:$lib.exp ${wl}-bM:SRE ${wl}-bnoentry;$AR cru $lib $objdir/$soname'
hardcode_direct=yes
hardcode_minus_L=yes
;;
hardcode_minus_L=yes
;;
+ cygwin32* | mingw32*)
+ if test "$with_gcc" = yes; then
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ allow_undefined_flag=unsupported
+ # Very, very bogus.
+ echo '
+#include <windows.h>
+
+struct _reent *_impure_ptr;
+extern struct _reent *__imp_reent_data;
+BOOL APIENTRY
+__dll_entry (HINSTANCE hinst, DWORD reason, LPVOID reserved)
+{
+ _impure_ptr = __imp_reent_data;
+}
+' > ltdll.c
+ archive_cmds='$CC -c '"`pwd`"'/ltdll.c; echo EXPORTS > $lib.exp;
+ if test -z "$export_symbols"; then $NM$libobjs | $global_symbol_pipe | sed '\''s/.* //'\'' > $lib.exp;\
+ else cat "$export_symbols" > $lib.exp; fi;\
+ $LD -s --base-file $soname-base --dll -e ___dll_entry@12 -o $lib libtool.$objext$libobjs;\
+ $DLLTOOL --as=$AS --dllname $soname --def $lib.exp --base-file $soname-base --output-exp $soname-exp;\
+ $LD -s --base-file $soname-base $soname-exp --dll -e ___dll_entry@12 -o $lib libtool.$objext$libobjs;\
+ $DLLTOOL --as=$AS --dllname $soname --def $lib.exp --base-file $soname-base --output-exp $soname-exp;\
+ $LD $soname-exp --dll -e ___dll_entry@12 -o $lib libtool.$objext$libobjs;\
+ $rm libtool.$objext $soname-base $soname-exp'
+ old_archive_from_new_cmds='$DLLTOOL --as=$AS --dllname $soname --def $lib.exp --output-lib $objdir/$libname.a;$rm $lib.exp'
+ else
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $lib$libobjs`echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll;linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_from_new_cmds='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds='lib /OUT:$oldlib$oldobjs'
+ fix_srcfile_path='`cygpath -w $srcfile`'
+ fi
+ ;;
+
# FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
# support. Future versions do this automatically, but an explicit c++rt0.o
# does not break anything, and helps significantly (at the cost of a little
aix*)
symcode='[BCDTU]'
;;
+cygwin32* | mingw32*)
+ sympat='_\([_A-Za-z][_A-Za-z0-9]*\)'
+ symxfrm='_\1 \1'
+ ;;
irix*)
# Cannot use undefined symbols on IRIX because inlined functions mess us up.
symcode='[BCDEGRST]'
symcode='[ABCDGISTUW]'
fi
+case "$host_os" in
+cygwin32* | mingw32*)
+ # We do not want undefined symbols on cygwin32. The user must
+ # arrange to define them via -l arguments.
+ symcode='[ABCDGISTW]'
+ ;;
+esac
+
# Write the raw and C identifiers.
global_symbol_pipe="sed -n -e 's/^.* $symcode $sympat$/$symxfrm/p'"
EOF
echo "$progname:@LINENO@: checking if global_symbol_pipe works" >&5
-if { (eval echo $progname:@LINENO@: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.o; then
+if { (eval echo $progname:@LINENO@: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.$objext; then
# Now try to grab the symbols.
nlist=conftest.nm
- if { echo "$progname:@LINENO@: eval \"$NM conftest.o | $global_symbol_pipe > $nlist\"" >&5; eval "$NM conftest.o | $global_symbol_pipe > $nlist 2>&5"; } && test -s "$nlist"; then
+ if { echo "$progname:@LINENO@: eval \"$NM conftest.$objext | $global_symbol_pipe > $nlist\"" >&5; eval "$NM conftest.$objext | $global_symbol_pipe > $nlist 2>&5"; } && test -s "$nlist"; then
# Try sorting and uniquifying the output.
if sort "$nlist" | uniq > "$nlist"T; then
#endif
EOF
# Now try linking the two files.
- mv conftest.o conftestm.o
+ mv conftest.$objext conftestm.$objext
save_LIBS="$LIBS"
save_CFLAGS="$CFLAGS"
- LIBS='conftestm.o'
+ LIBS="conftestm.$objext"
CFLAGS="$CFLAGS$no_builtin_flag"
if { (eval echo $progname:@LINENO@: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
pipe_works=yes
finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done'
;;
+cygwin32* | mingw32*)
+ version_type=windows
+ if test "$with_gcc" = yes; then
+ library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.a'
+ else
+ library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib'
+ fi
+ dynamic_linker='Win32 ld.exe'
+ libname_spec='$name'
+ shlibpath_var=PATH
+ ;;
+
freebsd2* | freebsd3*)
version_type=sunos
library_names_spec='${libname}${release}.so$versuffix $libname.so'
*.sh)
# Now quote all the things that may contain metacharacters.
for var in ltecho old_CC old_CFLAGS old_CPPFLAGS old_LD old_NM old_RANLIB \
- old_LN_S AR CC LD LN_S NM LTSHELL VERSION reload_flag reload_cmds wl \
+ old_LN_S old_DLLTOOL old_AS AR CC LD LN_S NM LTSHELL VERSION \
+ reload_flag reload_cmds wl \
pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \
whole_archive_flag_spec libname_spec library_names_spec soname_spec \
RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \
*)
# Double-quote the variables that need it (for aesthetics).
for var in old_CC old_CFLAGS old_CPPFLAGS old_LD old_NM old_RANLIB \
- old_LN_S; do
+ old_LN_S old_DLLTOOL old_AS; do
eval "$var=\\\"\$var\\\""
done
#
# CC=$old_CC CFLAGS=$old_CFLAGS CPPFLAGS=$old_CPPFLAGS \\
# LD=$old_LD NM=$old_NM RANLIB=$old_RANLIB LN_S=$old_LN_S \\
+# DLLTOOL="$old_DLLTOOL" AS="$old_AS" \\
# $0$ltconfig_args
#
# Compiler and other test output produced by $progname, useful for
# A BSD-compatible nm program.
NM=$NM
+# Used on cygwin32: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin32: assembler.
+AS="$AS"
+
# The name of the directory that contains temporary libtool files.
objdir=$objdir
# How to pass a linker flag through the compiler.
wl=$wl
+# Object file suffix (normally "o").
+objext="$objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
# Additional compiler flags for building library objects.
pic_flag=$pic_flag
# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
# the resulting binary.
hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path"
EOF
case "$ltmain" in
show="$echo"
show_help=
execute_dlfiles=
+lo2o="s/\\.lo\$/.${objext}/"
+los2o="s/\\.lo /.${objext} /g"
# Parse our command line options once, thoroughly.
while test $# -gt 0
libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"`
case "$libobj" in
- *.lo) obj=`$echo "X$libobj" | $Xsed -e 's/\.lo$/.o/'` ;;
+ *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;;
*)
$echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2
exit 1
# Calculate the filename of the output object if compiler does
# not support -o with -c
if test "$compiler_c_o" = no; then
- output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\..*$%%'`.o
+ output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\..*$%%'`.${objext}
lockfile="$output_obj.lock"
removelist="$removelist $output_obj $lockfile"
trap "$run $rm $removelist; exit 1" 1 2 15
echo $srcfile > "$lockfile"
fi
+ if test -n "$fix_srcfile_path"; then
+ eval srcfile=\"$fix_srcfile_path\"
+ fi
+
# Only build a PIC object if we are building libtool libraries.
if test "$build_libtool_libs" = yes; then
# Without this assignment, base_compile gets emptied.
dlfiles=
dlprefiles=
export_dynamic=no
+ export_symbols=
generated=
hardcode_libdirs=
libobjs=
;;
esac
;;
+ exportsyms)
+ export_symbols="$arg"
+ if test ! -f "$arg"; then
+ $echo "$modename: symbol file \`$arg' does not exist"
+ exit 1
+ fi
+ if test -n "$export_dynamic_flag_spec"; then
+ eval arg=\"$export_dynamic_flag_spec\"
+ else
+ arg=
+ fi
+
+ # Add the symbol object into the linking commands.
+ compile_command="$compile_command @SYMFILE@"
+ finalize_command="$finalize_command @SYMFILE@"
+ prev=
+ ;;
release)
release="-$arg"
prev=
fi
;;
+ -export-symbols)
+ if test "$export_dynamic" != no; then
+ $echo "$modename: cannot have both -export-dynamic and -export-symbols"
+ exit 1
+ fi
+ if test -n "$export_symbols"; then
+ $echo "$modename: cannot have more than one -exported-symbols"
+ exit 1
+ fi
+ prev=exportsyms
+ continue
+ ;;
+
-L*)
dir=`$echo "X$arg" | $Xsed -e 's%^-L\(.*\)$%\1%'`
case "$dir" in
esac
;;
- *.o | *.a)
+ *.o | *.obj | *.a | *.lib)
# A standard object.
objs="$objs $arg"
;;
if test "$prev" = dlprefiles; then
# Preload the old-style object.
- dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e 's/\.lo$/.o/'`
+ dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"`
prev=
fi
libobjs="$libobjs $arg"
exit 1
;;
- *.a)
+ *.a | *.lib)
if test -n "$link_against_libtool_libs"; then
$echo "$modename: error: cannot link libtool libraries into archives" 1>&2
exit 1
versuffix=".$current.$revision"
;;
+ windows)
+ # Like Linux, but with '-' rather than '.', since we only
+ # want one extension on Windows 95.
+ major=`expr $current - $age`
+ versuffix="-$major-$age-$revision"
+ ;;
+
*)
$echo "$modename: unknown library version type \`$version_type'" 1>&2
echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2
# Now set the variables for building old libraries.
if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
- oldlibs="$oldlibs $output_objdir/$libname.a"
+ oldlibs="$oldlibs $output_objdir/$libname.$libext"
# Transform .lo files to .o files.
- oldobjs="$objs"`$echo "X$libobjs " | $Xsed -e 's/[^ ]*\.a //g' -e 's/\.lo /.o /g' -e 's/ $//g'`
+ oldobjs="$objs"`$echo "X$libobjs " | $Xsed -e 's/[^ ]*\.'${libext}' //g' -e "$los2o" -e 's/ $//g'`
fi
if test "$build_libtool_libs" = yes; then
done
# Use standard objects if they are PIC.
- test -z "$pic_flag" && libobjs=`$echo "X$libobjs " | $Xsed -e 's/\.lo /.o /g' -e 's/ $//g'`
+ test -z "$pic_flag" && libobjs=`$echo "X$libobjs " | $Xsed -e "$los2o" -e 's/ $//g'`
if test -n "$whole_archive_flag_spec"; then
if test -n "$convenience"; then
fi
done
- # If -export-dynamic was specified, set the dlname.
- if test "$export_dynamic" = yes; then
+ # If -export-dynamic/symbols was specified, set the dlname.
+ if test "$export_dynamic" = yes || test -n "$export_symbols"; then
# On all known operating systems, these are identical.
dlname="$soname"
fi
fi
;;
- *.lo | *.o)
+ *.lo | *.o | *.obj)
if test -n "$link_against_libtool_libs"; then
$echo "$modename: error: cannot link libtool libraries into objects" 1>&2
exit 1
exit 1
fi
libobj="$output"
- obj=`$echo "X$output" | $Xsed -e 's/\.lo$/.o/'`
+ obj=`$echo "X$output" | $Xsed -e "$lo2o"`
;;
*)
libobj=
$run $rm $obj $libobj
# Create the old-style object.
- reload_objs="$objs"`$echo "X$libobjs " | $Xsed -e 's/[^ ]*\.a //g' -e 's/\.lo /.o /g' -e 's/ $//g'`
+ reload_objs="$objs"`$echo "X$libobjs " | $Xsed -e 's/[^ ]*\.'${libext}' //g' -e 's/[^ ]*\.lib //g' -e "$los2o" -e 's/ $//g'`
output="$obj"
eval cmds=\"$reload_cmds\"
if test -n "$libobjs" && test "$build_old_libs" = yes; then
# Transform all the library objects into standard objects.
- compile_command=`$echo "X$compile_command " | $Xsed -e 's/\.lo /.o /g' -e 's/ $//'`
- finalize_command=`$echo "X$finalize_command " | $Xsed -e 's/\.lo /.o /g' -e 's/ $//'`
+ compile_command=`$echo "X$compile_command " | $Xsed -e "$los2o" -e 's/ $//'`
+ finalize_command=`$echo "X$finalize_command " | $Xsed -e "$los2o" -e 's/ $//'`
fi
- if test "$export_dynamic" = yes && test -n "$NM" && test -n "$global_symbol_pipe"; then
+ if { test "$export_dynamic" = yes || test "$export_dynamic" = yes; } &&
+ test -n "$NM" && test -n "$global_symbol_pipe"; then
dlsyms="${outputname}S.c"
else
dlsyms=
fi
if test -n "$dlsyms"; then
- # Add our own program objects to the preloaded list.
- dlprefiles=`$echo "X$objs$dlprefiles " | $Xsed -e 's/\.lo /.o /g' -e 's/ $//'`
-
- # Discover the nlist of each of the dlfiles.
- nlist="${output_objdir}/${output}.nm"
-
- if test -d $output_objdir; then
- $show "$rm $nlist ${nlist}T"
- $run $rm "$nlist" "${nlist}T"
- else
- $show "$mkdir $output_objdir"
- $run $mkdir $output_objdir
- status=$?
- if test $status -ne 0 && test ! -d $output_objdir; then
- exit $status
- fi
- fi
+ case "$dlsyms" in
+ "") ;;
+ *.c)
+ if test -z "$export_symbols"; then
+ # Add our own program objects to the preloaded list.
+ dlprefiles=`$echo "X$objs$dlprefiles " | $Xsed -e "$los2o" -e 's/ $//'`
+ fi
- for arg in $dlprefiles; do
- $show "extracting global C symbols from \`$arg'"
- $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
- done
+ # Discover the nlist of each of the dlfiles.
+ nlist="$objdir/${output}.nm"
- # Parse the name list into a source file.
- $show "creating $output_objdir/$dlsyms"
- if test -z "$run"; then
- # Make sure we at least have an empty file.
- test -f "$nlist" || : > "$nlist"
-
- # Try sorting and uniquifying the output.
- if sort "$nlist" | uniq > "$nlist"T; then
- mv -f "$nlist"T "$nlist"
- wcout=`wc "$nlist" 2>/dev/null`
- count=`echo "X$wcout" | $Xsed -e 's/^[ ]*\([0-9][0-9]*\).*$/\1/'`
- (test "$count" -ge 0) 2>/dev/null || count=-1
+ if test -d $objdir; then
+ $show "$rm $nlist ${nlist}T"
+ $run $rm "$nlist" "${nlist}T"
else
- $rm "$nlist"T
- count=-1
+ $show "$mkdir $objdir"
+ $run $mkdir $objdir
+ status=$?
+ if test $status -ne 0 && test ! -d $objdir; then
+ exit $status
+ fi
fi
- case "$dlsyms" in
- "") ;;
- *.c)
- $echo > "$output_objdir/$dlsyms" "\
+ # Parse the name list into a source file.
+ $show "creating $objdir/$dlsyms"
+
+ $echo > "$objdir/$dlsyms" "\
/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */
/* Generated by $PROGRAM - GNU $PACKAGE $VERSION */
#endif
/* Prevent the only kind of declaration conflicts we can make. */
-#define dld_preloaded_symbol_count some_other_symbol
#define dld_preloaded_symbols some_other_symbol
/* External symbol declarations for the compiler. */\
"
+ if test -n "$export_symbols"; then
+ sed -e 's/^\(.*\)/\1 \1/' < "$export_symbols" > "$nlist"
+ fi
+
+ for arg in $dlprefiles; do
+ $show "extracting global C symbols from \`$arg'"
+ $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+ done
+
+ if test -z "$run"; then
+ # Make sure we at least have an empty file.
+ test -f "$nlist" || : > "$nlist"
+
+ # Try sorting and uniquifying the output.
+ if sort "$nlist" | uniq > "$nlist"T; then
+ mv -f "$nlist"T "$nlist"
+ else
+ $rm "$nlist"T
+ fi
+
if test -f "$nlist"; then
sed -e 's/^.* \(.*\)$/extern char \1;/' < "$nlist" >> "$output_objdir/$dlsyms"
- else
+ else
echo '/* NONE */' >> "$output_objdir/$dlsyms"
- fi
-
+ fi
+
$echo >> "$output_objdir/$dlsyms" "\
-#undef dld_preloaded_symbol_count
#undef dld_preloaded_symbols
#if defined (__STDC__) && __STDC__
# define __ptr_t char *
#endif
-/* The number of symbols in dld_preloaded_symbols, -1 if unsorted. */
-int dld_preloaded_symbol_count = $count;
-
/* The mapping between symbol names and symbols. */
struct {
char *name;
{\
"
+ if test -n "$export_symbols"; then
+ echo >> "$objdir/$dlsyms" "\
+ {\"${output}\", (__ptr_t) 0},"
+ sed 's/^\(.*\)/ {"\1", (__ptr_t) \&\1},/' < "$export_symbols" >> "$objdir/$dlsyms"
+ fi
+
+ for arg in $dlprefiles; do
+ echo >> "$objdir/$dlsyms" "\
+ {\"$arg\", (__ptr_t) 0},"
+ eval "$NM $arg | $global_symbol_pipe > '$nlist'"
+
+ if test -f "$nlist"; then
+ sed 's/^\(.*\) \(.*\)$/ {"\1", (__ptr_t) \&\2},/' < "$nlist" >> "$objdir/$dlsyms"
+ else
+ echo '/* NONE */' >> "$output_objdir/$dlsyms"
+ fi
+
+ done
+
if test -f "$nlist"; then
sed 's/^\(.*\) \(.*\)$/ {"\1", (__ptr_t) \&\2},/' < "$nlist" >> "$output_objdir/$dlsyms"
fi
}
#endif\
"
- ;;
-
- *)
- $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2
- exit 1
- ;;
- esac
- fi
+ fi
- # Now compile the dynamic symbol file.
- $show "(cd $output_objdir && $CC -c$no_builtin_flag \"$dlsyms\")"
- $run eval '(cd $output_objdir && $CC -c$no_builtin_flag "$dlsyms")' || exit $?
+ # Now compile the dynamic symbol file.
+ $show "(cd $objdir && $CC -c$no_builtin_flag \"$dlsyms\")"
+ $run eval '(cd $objdir && $CC -c$no_builtin_flag "$dlsyms")' || exit $?
- # Transform the symbol file into the correct name.
- compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${output}S.o%"`
- finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${output}S.o%"`
- elif test "$export_dynamic" != yes; then
+ # Transform the symbol file into the correct name.
+ compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$objdir/${output}S.${objext}%"`
+ finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$objdir/${output}S.${objext}%"`
+ ;;
+ *)
+ $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2
+ exit 1
+ ;;
+ esac
+ elif test "$export_dynamic" != yes && test -z "$export_symbols"; then
test -n "$dlfiles$dlprefiles" && $echo "$modename: warning: \`-dlopen' and \`-dlpreopen' are ignored without \`-export-dynamic'" 1>&2
else
# We keep going just in case the user didn't refer to
addlibs="$convenience"
build_libtool_libs=no
else
+ oldobjs="$objs"`$echo "X$libobjs " | $Xsed -e 's/[^ ]*\.'${libext}' //g' -e 's/[^ ]*\.lib //g' -e "$los2o" -e 's/ $//g'`
addlibs="$old_convenience"
fi
case "$output" in
*.la)
old_library=
- test "$build_old_libs" = yes && old_library="$libname.a"
+ test "$build_old_libs" = yes && old_library="$libname.$libext"
$show "creating $output"
# Only create the output if not a dry run.
# Do each installation.
case "$file" in
- *.a)
+ *.a | *.lib)
# Do the static libraries later.
staticlibs="$staticlibs $file"
;;
# Deduce the name of the destination old-style object file.
case "$destfile" in
*.lo)
- staticdest=`$echo "X$destfile" | $Xsed -e 's/\.lo$/.o/'`
+ staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"`
;;
- *.o)
+ *.o | *.obj)
staticdest="$destfile"
destfile=
;;
# Install the old object if enabled.
if test "$build_old_libs" = yes; then
# Deduce the name of the old-style object file.
- staticobj=`$echo "X$file" | $Xsed -e 's/\.lo$/.o/'`
+ staticobj=`$echo "X$file" | $Xsed -e "$lo2o"`
$show "$install_prog $staticobj $staticdest"
$run eval "$install_prog \$staticobj \$staticdest" || exit $?
*.lo)
if test "$build_old_libs" = yes; then
- oldobj=`$echo "X$name" | $Xsed -e 's/\.lo$/.o/'`
+ oldobj=`$echo "X$name" | $Xsed -e "$lo2o"`
rmfiles="$rmfiles $dir/$oldobj"
fi
$show "$rm $rmfiles"
If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only
library objects (\`.lo' files) may be specified, and \`-rpath' is required.
-If OUTPUT-FILE ends in \`.a', then a standard library is created using \`ar'
-and \`ranlib'.
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
-If OUTPUT-FILE ends in \`.lo' or \`.o', then a reloadable object file is
-created, otherwise an executable program is created."
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
;;
uninstall)
--- /dev/null
+.deps
+.libs
+Makefile
+Makefile.in
+aclocal.m4
+configure
+config.*
+conftest*
+libtool
+*.lo
+*.la
+hell
+hell.debug
--- /dev/null
+# A brief demonstration of using Automake with Libtool. -*-Makefile-*-
+#
+# NOTE: Don't forget that in the libtool distribution, files in this
+# directory are distributed by the demo_distfiles variable in the top
+# level Makefile.
+AUTOMAKE_OPTIONS = foreign
+
+EXTRA_DIST = acinclude.m4
+
+lib_LTLIBRARIES = libfoo1.la libfoo2.la
+libfoo1_la_SOURCES = foo1.c foolib1.h
+libfoo1_la_LDFLAGS = -export-symbols $(srcdir)/libfoo1.sym -lm
+
+libfoo2_la_SOURCES = foo2.c foolib2.h
+libfoo2_la_LDFLAGS = -export-symbols $(srcdir)/libfoo2.sym -lm
+
+include_HEADERS = foo.h
+
+bin_PROGRAMS = hell hell.debug
+
+# Create a version of hell that does dlopen.
+hell_SOURCES = main.c ltdl.c
+hell_LDFLAGS = $(LIBADD_DL)
+hell_DEPENDENCIES = libfoo1.la libfoo2.la
+
+# Create an easier-to-debug version of hell.
+hell_debug_SOURCES = main.c ltdls.c
+hell_debug_LDADD = libfoo1.la libfoo2.la
+hell_debug_LDFLAGS = -export-dynamic -dlpreopen libfoo1.la -dlpreopen libfoo2.la -static
--- /dev/null
+This is GNU modular hell, an example package that uses GNU libtool with an
+Automake-generated environment to build two simple libraries and programs.
+
+It demonstrates how to build both dynamic and static libraries
+that can be dlopened. You need a wrapper (ltdl.c and ltdls.c)
+for your dlopen functions. For static libraries we prefix all
+non-static symbols with libname___ using the LTEXP(symbol) macro.
+When dlopening these static libraries, we cut the prefix off to
+get the real name.
+
--- /dev/null
+dnl Initialize the hell package.
+AC_INIT(main.c)
+AM_INIT_AUTOMAKE(module,1.0)
+
+AC_PROG_CC
+AC_EXEEXT
+AM_PROG_LIBTOOL
+
+AC_CHECK_HEADERS(string.h dlfcn.h dl.h)
+AC_CHECK_FUNCS(strdup)
+
+LIBADD_DL=
+AC_CHECK_FUNCS(dlopen,,
+[AC_CHECK_LIB(dl, dlopen, LIBADD_DL="-ldl",
+ [AC_CHECK_LIB(dld, shl_load, LIBADD_DL="-ldld",
+ [AC_CHECK_FUNCS(dlopen, LIBADD_DL="")]
+ )]
+ )]
+)
+AC_SUBST(LIBADD_DL)
+
+dnl Output the makefile
+AC_OUTPUT(Makefile)
--- /dev/null
+/* foo.h -- interface to the libfoo* libraries
+ Copyright (C) 1998 Thomas Tanner <tanner@gmx.de>
+ This file is part of GNU Libtool.
+
+This program 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.
+
+This program 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 this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+USA. */
+
+/* Only include this header file once. */
+#ifndef _FOO_H_
+#define _FOO_H_ 1
+
+/* __BEGIN_DECLS should be used at the beginning of your declarations,
+ so that C++ compilers don't mangle their names. Use __END_DECLS at
+ the end of C declarations. */
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+/* __P is a macro used to wrap function prototypes, so that compilers
+ that don't understand ANSI C prototypes still work, and ANSI C
+ compilers can issue warnings about type mismatches. */
+#undef __P
+#if defined (__STDC__) || defined (_AIX) || (defined (__mips) && defined (_SYSTYPE_SVR4)) || defined(WIN32) || defined(__cplusplus)
+# define __P(protos) protos
+#else
+# define __P(protos) ()
+#endif
+
+/* Silly constants that the functions return. */
+#define HELLO_RET 0xe110
+#define FOO_RET 0xf00
+
+#ifndef PIC
+#define glue(a,b) a ## b
+#define symglue(a,b) glue(a,b)
+#define LTPREFIX(name) ___ ## name
+#define LTEXP(name) symglue(DLNAME,LTPREFIX(name))
+#else
+#define LTEXP(name) name
+#endif
+
+#endif /* !_FOO_H_ */
--- /dev/null
+/* foo1.c -- trivial test library
+ Copyright (C) 1998 Thomas Tanner <tanner@gmx.de>
+ This file is part of GNU Libtool.
+
+This program 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.
+
+This program 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 this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+USA. */
+
+#define DLNAME foo1
+
+#include "foo.h"
+#include <stdio.h>
+#include <math.h>
+
+/* Give a global variable definition. */
+int LTEXP(nothing);
+
+int
+LTEXP(foo1)()
+{
+ printf ("cos (0.0) = %g\n", (double) cos ((double) 0.0));
+ return FOO_RET;
+}
+
+int
+LTEXP(hello) ()
+{
+ printf ("** This is foolib 1 **\n");
+ return HELLO_RET;
+}
--- /dev/null
+/* foo2.c -- trivial test library
+ Copyright (C) 1998 Thomas Tanner <tanner@gmx.de>
+ This file is part of GNU Libtool.
+
+This program 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.
+
+This program 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 this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+USA. */
+
+#define DLNAME foo2
+
+#include "foo.h"
+#include <stdio.h>
+#include <math.h>
+
+/* Give a global variable definition. */
+int LTEXP(nothing);
+
+int
+LTEXP(foo2)()
+{
+ printf ("sin (0.0) = %g\n", (double) sin ((double) 0.0));
+ return FOO_RET;
+}
+
+int
+LTEXP(hello) ()
+{
+ printf ("** This is foolib 2 **\n");
+ return HELLO_RET;
+}
--- /dev/null
+nothing
+hello
+foo1
--- /dev/null
+nothing
+hello
+foo2
--- /dev/null
+/* ltdl.c -- dlopen functions
+ Copyright (C) 1998 Thomas Tanner <tanner@gmx.de>
+ This file is part of GNU Libtool.
+
+This program 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.
+
+This program 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 this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+USA. */
+
+#include "ltdl.h"
+
+#ifdef HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#ifdef HAVE_DL_H
+#include <dl.h>
+#endif
+
+lt_dlhandle lt_dlopen(char *name)
+{
+ return dlopen(name, RTLD_LAZY);
+}
+
+void lt_dlclose(lt_dlhandle handle)
+{
+ dlclose(handle);
+}
+
+void *lt_dlsym(lt_dlhandle handle, char *name)
+{
+ return dlsym(handle, name);
+}
--- /dev/null
+/* ltdl.h -- generic dlopen functions
+ Copyright (C) 1998 Thomas Tanner <tanner@gmx.de>
+ This file is part of GNU Libtool.
+
+This program 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.
+
+This program 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 this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+USA. */
+
+/* Only include this header file once. */
+#ifndef _DL_H_
+#define _DL_H_ 1
+
+/* __BEGIN_DECLS should be used at the beginning of your declarations,
+ so that C++ compilers don't mangle their names. Use __END_DECLS at
+ the end of C declarations. */
+#undef __BEGIN_DECLS
+#undef __END_DECLS
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS /* empty */
+# define __END_DECLS /* empty */
+#endif
+
+/* __P is a macro used to wrap function prototypes, so that compilers
+ that don't understand ANSI C prototypes still work, and ANSI C
+ compilers can issue warnings about type mismatches. */
+#undef __P
+#if defined (__STDC__) || defined (_AIX) || (defined (__mips) && defined (_SYSTYPE_SVR4)) || defined(WIN32) || defined(__cplusplus)
+# define __P(protos) protos
+#else
+# define __P(protos) ()
+#endif
+
+typedef void *lt_dlhandle;
+
+__BEGIN_DECLS
+lt_dlhandle lt_dlopen __P((char *name));
+void lt_dlclose __P((lt_dlhandle handle));
+void *lt_dlsym __P((lt_dlhandle handle, char *name));
+__END_DECLS
+
+#endif /* !_DLL_H_ */
--- /dev/null
+/* ltdls.c -- static dlopen functions
+ Copyright (C) 1998 Thomas Tanner <tanner@gmx.de>
+ This file is part of GNU Libtool.
+
+This program 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.
+
+This program 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 this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+USA. */
+
+#include "ltdl.h"
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+struct dld_symlist
+{
+ char *name;
+ void *address;
+};
+
+extern struct dld_symlist dld_preloaded_symbols[];
+
+lt_dlhandle lt_dlopen(char *name)
+{
+ struct dld_symlist *s;
+
+ s = dld_preloaded_symbols;
+ while (s->name) {
+ if (!s->address && !strcmp(s->name, name))
+ break;
+ s++;
+ }
+ if (!s->name)
+ return NULL;
+ return strdup(name);
+}
+
+void lt_dlclose(lt_dlhandle handle)
+{
+ free(handle);
+}
+
+void *lt_dlsym(lt_dlhandle handle, char *name)
+{
+ struct dld_symlist *s;
+ char *p;
+
+ s = dld_preloaded_symbols;
+ while (s->name) {
+ if (!s->address && !strcmp(s->name, handle))
+ break;
+ s++;
+ }
+ if (!s->name)
+ return NULL;
+ s++;
+ while (s->address) {
+ p = strstr(s->name, "___");
+ if (p && !strcmp(&p[3], name))
+ return s->address;
+ s++;
+ }
+ return NULL;
+}
+
--- /dev/null
+/* main.c -- hello test program
+ Copyright (C) 1996 Free Software Foundation, Inc.
+ This file is part of GNU Libtool.
+
+This program 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.
+
+This program 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 this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+USA. */
+
+#include "foo.h"
+#include "ltdl.h"
+#include <stdio.h>
+#include <string.h>
+
+void testlib(char *lib, char *alt)
+{
+ lt_dlhandle handle;
+ int (*pfoo1)() = 0;
+ int (*pfoo2)() = 0;
+ int (*phello)() = 0;
+ int *pnothing = 0;
+
+ handle = lt_dlopen(lib);
+ if (!handle)
+ handle = lt_dlopen(alt);
+ if (!handle) {
+ fprintf (stderr, "can't open library %s!\n", lib);
+ return;
+ }
+ phello = lt_dlsym(handle, "hello");
+ pfoo1 = lt_dlsym(handle, "foo1");
+ pfoo2 = lt_dlsym(handle, "foo2");
+ pnothing = lt_dlsym(handle, "nothing");
+
+ 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");
+
+ /* Try assigning to the nothing variable. */
+ if (pnothing)
+ *pnothing = 1;
+ else
+ fprintf (stderr, "did not find the `nothing' variable\n");
+
+ /* Just call the functions and check return values. */
+ if (pfoo1)
+ {
+ if ((*pfoo1) () == FOO_RET)
+ printf("foo1 is ok!\n");
+ }
+ else if (pfoo2)
+ {
+ if ((*pfoo2) () == FOO_RET)
+ printf("foo2 is ok!\n");
+ }
+ else
+ fprintf (stderr, "did not find the `foo' function\n");
+
+ lt_dlclose(handle);
+}
+
+int
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+
+ printf ("Welcome to *modular* GNU Hell!\n");
+
+ testlib(".libs/libfoo1.so", ".libs/libfoo1.a");
+
+ testlib(".libs/libfoo2.so", ".libs/libfoo2.a");
+
+ return 0;
+}
AUTOMAKE_OPTIONS = gnits
makesequence = demo-make.test demo-exec.test \
- demo-inst.test demo-unst.test hardcode.test
-TESTS = demo-conf.test $(makesequence) link.test link-2.test nomode.test \
+ demo-inst.test demo-unst.test hardcode.test \
+ mdemo-make.test mdemo-exec.test \
+ mdemo-inst.test mdemo-unst.test
+TESTS = demo-conf.test mdemo-conf.test $(makesequence) \
+ link.test link-2.test nomode.test \
quote.test sh.test suffix.test
# Be sure to reexport important environment variables.
# We need to remove any files that the above tests created.
clean-local:
-test -f ../demo/Makefile && cd ../demo && $(MAKE) distclean
+ -test -f ../mdemo/Makefile && cd ../mdemo && $(MAKE) distclean
rm -rf _inst
--- /dev/null
+#! /bin/sh
+# mdemo-conf.test - try configuring the ../mdemo subdirectory
+
+# Test script header.
+need_prefix=yes
+if test -z "$srcdir"; then
+ srcdir=`echo "$0" | sed 's%/[^/]*$%%'`
+ test "$srcdir" = "$0" && srcdir=.
+ test "${VERBOSE+set}" != "set" && VERBOSE=yes
+fi
+. $srcdir/defs || exit 1
+
+# Maybe we have a VPATH build, in which case, create a new subdir.
+test -d ../mdemo || mkdir ../mdemo
+
+# Change to our build directory.
+cd ../mdemo || exit 1
+
+# Possibly clean up the distribution.
+if test -f Makefile; then
+ echo "= Running $make distclean in ../mdemo"
+ $make distclean
+fi
+rm -f config.cache
+
+# Configure the demonstration.
+echo "= Configuring in ../mdemo (prefix=$prefix)"
+CONFIG_SITE=/dev/null ${CONFIG_SHELL-/bin/sh} $srcdir/../mdemo/configure --srcdir=$srcdir/../mdemo --prefix=$prefix || exit 1
+
+exit 0
--- /dev/null
+#! /bin/sh
+# mdemo-exec.test - check that programs in the ../mdemo subdirectory are viable
+
+# Test script header.
+need_prefix=no
+if test -z "$srcdir"; then
+ srcdir=`echo "$0" | sed 's%/[^/]*$%%'`
+ test "$srcdir" = "$0" && srcdir=.
+ test "${VERBOSE+set}" != "set" && VERBOSE=yes
+fi
+. $srcdir/defs || exit 1
+
+if test -f ../mdemo/hell; then :
+else
+ echo "You must run mdemo-make.test before running $0" 1>&2
+ exit 1
+fi
+
+# Check to see if the programs really run.
+echo "Executing uninstalled programs in ../mdemo"
+
+status=0
+if ../mdemo/hell.debug| grep 'GNU Hell'; then :
+else
+ echo "$0: cannot execute ../mdemo/hell.debug" 1>&2
+ status=1
+fi
+
+if ../mdemo/hell | grep 'GNU Hell'; then :
+else
+ echo "$0: cannot execute ../mdemo/hell" 1>&2
+ status=1
+fi
+
+exit $status
--- /dev/null
+#! /bin/sh
+# mdemo-inst.test - try installing from the ../mdemo subdirectory
+
+# Test script header.
+need_prefix=yes
+if test -z "$srcdir"; then
+ srcdir=`echo "$0" | sed 's%/[^/]*$%%'`
+ test "$srcdir" = "$0" && srcdir=.
+ test "${VERBOSE+set}" != "set" && VERBOSE=yes
+fi
+. $srcdir/defs || exit 1
+
+# Check that things are built.
+if test -f ../mdemo/hell; then :
+else
+ echo "You must run mdemo-make.test before $0" 1>&2
+ exit 1
+fi
+
+# Change to our build directory.
+cd ../mdemo || exit 1
+
+echo "= Running $make install in ../mdemo"
+$make install || exit 1
+
+echo "= Executing installed programs"
+status=0
+if $prefix/bin/hell.debug | grep 'Welcome to GNU Hell'; then :
+else
+ echo "$0: cannot execute $prefix/bin/hell.debug" 1>&2
+ status=1
+fi
+
+if $prefix/bin/hell | grep 'Welcome to GNU Hell'; then :
+else
+ echo "$0: cannot execute $prefix/bin/hell" 1>&2
+
+ # Simple check to see if they are superuser.
+ if test -w /; then :
+ else
+ echo "You may need to run $0 as the superuser."
+ fi
+ status=1
+fi
+
+exit $status
--- /dev/null
+#! /bin/sh
+# mdemo-make.test - try building in the ../mdemo subdirectory
+
+# Test script header.
+need_prefix=no
+if test -z "$srcdir"; then
+ srcdir=`echo "$0" | sed 's%/[^/]*$%%'`
+ test "$srcdir" = "$0" && srcdir=.
+ test "${VERBOSE+set}" != "set" && VERBOSE=yes
+fi
+. $srcdir/defs || exit 1
+
+if test -f ../mdemo/Makefile; then :
+else
+ echo "You must run mdemo-conf.test before running $0" 1>&2
+ exit 1
+fi
+
+# Change to our build directory.
+cd ../mdemo || exit 1
+
+# Do the actual build.
+echo "Making in ../mdemo"
+$make || exit 1
+exit 0
--- /dev/null
+#! /bin/sh
+# mdemo.test - try uninstalling in the ../mdemo subdirectory
+
+# Test script header.
+need_prefix=yes
+if test -z "$srcdir"; then
+ srcdir=`echo "$0" | sed 's%/[^/]*$%%'`
+ test "$srcdir" = "$0" && srcdir=.
+ test "${VERBOSE+set}" != "set" && VERBOSE=yes
+fi
+. $srcdir/defs || exit 1
+
+# Maybe we have a VPATH build, in which case, create a new subdir.
+if test "$prefix/bin/hell"; then :
+else
+ echo "You must run mdemo-inst.test before $0." 1>&2
+ exit 1
+fi
+
+# Change to our build directory.
+cd ../mdemo || exit 1
+
+echo "= Running $make uninstall in ../mdemo"
+$make uninstall || exit 1
+
+# See that there were no files leftover in $prefix.
+# Ignore dotfiles, so that .nfsXXX files don't screw up the test.
+leftovers=`find $prefix ! -type d ! -name '.*' -print`
+if test -n "$leftovers"; then
+ echo "= Leftover after make uninstall:"
+ ls -l $leftovers
+ exit 1
+fi
+
+exit 0
--- /dev/null
+#! /bin/sh
+# mdemo.test - try building in the ../mdemo subdirectory
+
+# Test script header.
+need_prefix=yes
+if test -z "$srcdir"; then
+ srcdir=.
+ test "${VERBOSE+set}" != "set" && VERBOSE=yes
+fi
+. $srcdir/defs || exit 1
+
+# Maybe we have a VPATH build, in which case, create a new subdir.
+test -d ../mdemo || mkdir ../mdemo
+
+# Change to our build directory.
+cd ../mdemo || exit 1
+
+# Possibly clean up the distribution.
+if test -f config.cache; then
+ echo "= Running make distclean in ../mdemo"
+ make distclean || rm -f config.cache
+fi
+
+# Configure the demonstration.
+echo "= Configuring in ../mdemo (prefix=$prefix)"
+$srcdir/../mdemo/configure --srcdir=$srcdir/../mdemo --prefix=$prefix || exit 1
+
+# Do the actual build.
+echo "= Running make in ../mdemo"
+make || exit 1
+
+# Try running the program.
+echo "= Executing uninstalled programs"
+if ./hell.debug | grep 'GNU Hell'; then :
+else
+ echo "$0: cannot execute ./hell.debug" 1>&2
+ exit 1
+fi
+
+if ./hell | grep 'GNU Hell'; then :
+else
+ echo "$0: cannot execute ./hell" 1>&2
+ exit 1
+fi
+
+echo "= Running make install in ../mdemo"
+make install || exit 1
+
+echo "= Executing installed programs"
+if $prefix/bin/hell.debug | grep 'GNU Hell'; then :
+else
+ echo "$0: cannot execute $prefix/bin/hell.debug" 1>&2
+ exit 1
+fi
+
+if $prefix/bin/hell | grep 'GNU Hell'; then :
+else
+ echo "$0: warning: cannot execute $prefix/bin/hell" 1>&2
+fi
+
+echo "= Running make uninstall in ../mdemo"
+make uninstall || exit 1
+
+# See that there were no files leftover in $prefix.
+leftovers=`find $prefix ! -type d -print`
+if test -n "$leftovers"; then
+ echo "= Leftover after make uninstall:"
+ ls -l $leftovers
+ exit 1
+fi
+
+# Delete the directory tree we created.
+rm -rf $prefix
+
+
+# Clean up the distribution.
+make distclean
+
+exit 0