]> git.ipfire.org Git - thirdparty/libtool.git/commitdiff
1998-11-04 Alexandre Oliva <oliva@dcc.unicamp.br>
authorAlexandre Oliva <oliva@dcc.unicamp.br>
Wed, 4 Nov 1998 09:43:29 +0000 (09:43 +0000)
committerAlexandre Oliva <aoliva@redhat.com>
Wed, 4 Nov 1998 09:43:29 +0000 (09:43 +0000)
* 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.

28 files changed:
ChangeLog
Makefile.am
demo/configure.in
demo/dlmain.c
doc/libtool.texi
libtool.m4
ltconfig.in
ltmain.in
mdemo/.cvsignore [new file with mode: 0644]
mdemo/Makefile.am [new file with mode: 0644]
mdemo/README [new file with mode: 0644]
mdemo/configure.in [new file with mode: 0644]
mdemo/foo.h [new file with mode: 0644]
mdemo/foo1.c [new file with mode: 0644]
mdemo/foo2.c [new file with mode: 0644]
mdemo/libfoo1.sym [new file with mode: 0644]
mdemo/libfoo2.sym [new file with mode: 0644]
mdemo/ltdl.c [new file with mode: 0644]
mdemo/ltdl.h [new file with mode: 0644]
mdemo/ltdls.c [new file with mode: 0644]
mdemo/main.c [new file with mode: 0644]
tests/Makefile.am
tests/mdemo-conf.test [new file with mode: 0755]
tests/mdemo-exec.test [new file with mode: 0755]
tests/mdemo-inst.test [new file with mode: 0755]
tests/mdemo-make.test [new file with mode: 0755]
tests/mdemo-unst.test [new file with mode: 0755]
tests/mdemo.test [new file with mode: 0644]

index 68f525c2650fbe46fd8a2b4e75b7085f71999ee2..84e355c894859ae8810ea743641339a4410d372b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,64 @@
+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
index 050ea0d83674dc88374e35c31423cd4d57e9e1d4..a500d71a5627ae8e04cd3cc33c34a3db60b2fafb 100644 (file)
@@ -20,6 +20,14 @@ demo_distfiles = demo/Makefile.in demo/Makefile.am demo/README \
        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
@@ -59,8 +67,8 @@ $(srcdir)/ltmain.sh: ltmain.in $(top_srcdir)/configure.in
        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` \
@@ -72,9 +80,20 @@ dist-hook: $(demo_distfiles)
          || 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
@@ -83,6 +102,9 @@ $(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
@@ -94,6 +116,15 @@ $(srcdir)/demo/configure: 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
index f7b803789555cc2f7e75ad72f789a5bd3b6f0bed..a6885e0602c97473032bbc73227d87bc20b2d8ae 100644 (file)
@@ -3,6 +3,7 @@ AC_INIT(hello.c)
 AM_INIT_AUTOMAKE(hell,1.0)
 
 AC_PROG_CC
+AC_EXEEXT
 AM_PROG_LIBTOOL
 
 dnl Output the makefile
index 90afd7a7ecff18a800d7c1f0852c71338f507d35..c0268faf4e835ce3cbdfa069ce1fa0008ef3e0e8 100644 (file)
@@ -28,7 +28,6 @@ struct dld_symlist
 };
 
 extern struct dld_symlist dld_preloaded_symbols[];
-extern int dld_preloaded_symbol_count;
 
 int
 main (argc, argv)
@@ -42,24 +41,21 @@ 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 ++;
     }
 
index 888b18cf54b1d97e1773e199440a631decd375f6..ca425e84783e9847bf7988daa307bfb4e55a508d 100644 (file)
@@ -1109,6 +1109,11 @@ Link @var{file} into the output program, and add its symbols to
 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.
@@ -2227,10 +2232,10 @@ On some operating systems, a program symbol must be specially declared
 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
@@ -2289,9 +2294,9 @@ module, or the module is not found, then the application can recover
 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}
@@ -2305,15 +2310,10 @@ generic pointer to the appropriate object, such as @code{&fprintf}.
 
 @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
@@ -2327,8 +2327,9 @@ in @var{dld_preloaded_symbols}.
 @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
index d39c52d16c07eb9d814391a03c0a4f81bfcb3721..09cba0c6a9e954b0081322a2150233ce7ed1bf9e 100644 (file)
 ## 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
@@ -77,6 +78,11 @@ case "$host" in
     CFLAGS="$SAVE_CFLAGS"
   fi
   ;;
+
+*-*-cygwin32*)
+  AM_SYS_LIBTOOL_CYGWIN32
+  ;;
+
 esac
 
 # enable the --disable-libtool-lock switch
@@ -94,6 +100,7 @@ fi
 # 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])
@@ -276,3 +283,9 @@ NM="$ac_cv_path_NM"
 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)
+])
index 3e6a2a5c6e5cd384a4fbe96f428bfadd12941754..90c83bf9f32fc0ed6a82ddffb755f48eca1fdcb4 100755 (executable)
@@ -118,6 +118,8 @@ verify_host=yes
 with_gcc=no
 with_gnu_ld=no
 need_locks=yes
+objext=o
+libext=a
 
 old_AR="$AR"
 old_CC="$CC"
@@ -127,6 +129,8 @@ old_LD="$LD"
 old_LN_S="$LN_S"
 old_NM="$NM"
 old_RANLIB="$RANLIB"
+old_DLLTOOL="$DLLTOOL"
+old_AS="$AS"
 
 # Parse the command line options.
 args=
@@ -393,6 +397,10 @@ if test -n "$RANLIB"; then
   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.
@@ -482,6 +490,28 @@ fi
 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=
@@ -498,7 +528,7 @@ if test "$with_gcc" = yes; then
   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*)
@@ -532,7 +562,7 @@ else
     # PIC (with -KPIC) is the default.
     ;;
 
-  os2*)
+  cygwin32* | mingw32* | os2*)
     # We can build DLLs from non-PIC.
     ;;
 
@@ -587,7 +617,7 @@ if test -n "$pic_flag"; then
   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
 
@@ -848,6 +878,54 @@ if test "$with_gnu_ld" = yes; then
     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'
@@ -857,7 +935,7 @@ if test "$with_gnu_ld" = yes; then
     ;;
   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'
@@ -868,7 +946,8 @@ else
   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
@@ -881,7 +960,8 @@ else
 
   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
     ;;
@@ -892,6 +972,53 @@ else
     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
@@ -1076,6 +1203,10 @@ case "$host_os" in
 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]'
@@ -1090,6 +1221,14 @@ if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
   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'"
 
@@ -1109,10 +1248,10 @@ main(){nm_test_var='a';nm_test_func();return(0);}
 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
@@ -1165,10 +1304,10 @@ EOF
 #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
@@ -1258,6 +1397,18 @@ amigaos*)
   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'
@@ -1433,7 +1584,8 @@ case "$ltmain" in
 *.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 \
@@ -1503,7 +1655,7 @@ EOF
 *)
   # 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
 
@@ -1524,6 +1676,7 @@ cat <<EOF >> "$cfgfile"
 #
 # 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
@@ -1563,6 +1716,12 @@ LN_S=$LN_S
 # 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
 
@@ -1573,6 +1732,12 @@ reload_cmds=$reload_cmds
 # 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
 
@@ -1666,6 +1831,9 @@ hardcode_minus_L=$hardcode_minus_L
 # 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
index d1917d1a31457774f0a6073e5daac25b9c2d6164..97f3289066999ff72ed27e3c7f77da39b934ec0b 100644 (file)
--- a/ltmain.in
+++ b/ltmain.in
@@ -89,6 +89,8 @@ run=
 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
@@ -347,7 +349,7 @@ if test -z "$show_help"; then
     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
@@ -373,7 +375,7 @@ if test -z "$show_help"; then
     # 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
@@ -408,6 +410,10 @@ compiler."
       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.
@@ -557,6 +563,7 @@ compiler."
     dlfiles=
     dlprefiles=
     export_dynamic=no
+    export_symbols=
     generated=
     hardcode_libdirs=
     libobjs=
@@ -614,6 +621,23 @@ compiler."
             ;;
           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=
@@ -674,6 +698,19 @@ compiler."
         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
@@ -733,7 +770,7 @@ compiler."
        esac
         ;;
 
-      *.o | *.a)
+      *.o | *.obj | *.a | *.lib)
         # A standard object.
         objs="$objs $arg"
         ;;
@@ -753,7 +790,7 @@ compiler."
 
        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"
@@ -1013,7 +1050,7 @@ compiler."
       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
@@ -1189,6 +1226,13 @@ compiler."
          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
@@ -1240,10 +1284,10 @@ compiler."
 
       # 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
@@ -1266,7 +1310,7 @@ compiler."
        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
@@ -1312,15 +1356,15 @@ compiler."
          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
@@ -1353,7 +1397,7 @@ compiler."
           exit 1
         fi
         libobj="$output"
-        obj=`$echo "X$output" | $Xsed -e 's/\.lo$/.o/'`
+        obj=`$echo "X$output" | $Xsed -e "$lo2o"`
         ;;
       *)
         libobj=
@@ -1365,7 +1409,7 @@ compiler."
       $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\"
@@ -1471,61 +1515,45 @@ compiler."
 
       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 */
 
@@ -1534,21 +1562,39 @@ extern \"C\" {
 #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__
@@ -1557,9 +1603,6 @@ extern \"C\" {
 # 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;
@@ -1569,6 +1612,25 @@ dld_preloaded_symbols[] =
 {\
 "
 
+            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
@@ -1581,23 +1643,22 @@ dld_preloaded_symbols[] =
 }
 #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
@@ -1821,6 +1882,7 @@ fi\
        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
 
@@ -1869,7 +1931,7 @@ 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.
@@ -2060,7 +2122,7 @@ libdir='$install_libdir'\
 
       # Do each installation.
       case "$file" in
-      *.a)
+      *.a | *.lib)
         # Do the static libraries later.
         staticlibs="$staticlibs $file"
         ;;
@@ -2165,9 +2227,9 @@ libdir='$install_libdir'\
         # 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=
           ;;
@@ -2187,7 +2249,7 @@ libdir='$install_libdir'\
         # 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 $?
@@ -2584,7 +2646,7 @@ libdir='$install_libdir'\
 
       *.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"
@@ -2742,11 +2804,11 @@ object files.
 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)
diff --git a/mdemo/.cvsignore b/mdemo/.cvsignore
new file mode 100644 (file)
index 0000000..3b25c3f
--- /dev/null
@@ -0,0 +1,13 @@
+.deps
+.libs
+Makefile
+Makefile.in
+aclocal.m4
+configure
+config.*
+conftest*
+libtool
+*.lo
+*.la
+hell
+hell.debug
diff --git a/mdemo/Makefile.am b/mdemo/Makefile.am
new file mode 100644 (file)
index 0000000..52df8d8
--- /dev/null
@@ -0,0 +1,29 @@
+# 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
diff --git a/mdemo/README b/mdemo/README
new file mode 100644 (file)
index 0000000..10cbf4c
--- /dev/null
@@ -0,0 +1,10 @@
+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.
+
diff --git a/mdemo/configure.in b/mdemo/configure.in
new file mode 100644 (file)
index 0000000..f54bede
--- /dev/null
@@ -0,0 +1,23 @@
+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)
diff --git a/mdemo/foo.h b/mdemo/foo.h
new file mode 100644 (file)
index 0000000..541beca
--- /dev/null
@@ -0,0 +1,60 @@
+/* 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_ */
diff --git a/mdemo/foo1.c b/mdemo/foo1.c
new file mode 100644 (file)
index 0000000..929eb5d
--- /dev/null
@@ -0,0 +1,41 @@
+/* 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;
+}
diff --git a/mdemo/foo2.c b/mdemo/foo2.c
new file mode 100644 (file)
index 0000000..7af5c98
--- /dev/null
@@ -0,0 +1,41 @@
+/* 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;
+}
diff --git a/mdemo/libfoo1.sym b/mdemo/libfoo1.sym
new file mode 100644 (file)
index 0000000..3f9544a
--- /dev/null
@@ -0,0 +1,3 @@
+nothing
+hello
+foo1
diff --git a/mdemo/libfoo2.sym b/mdemo/libfoo2.sym
new file mode 100644 (file)
index 0000000..3d8cd94
--- /dev/null
@@ -0,0 +1,3 @@
+nothing
+hello
+foo2
diff --git a/mdemo/ltdl.c b/mdemo/ltdl.c
new file mode 100644 (file)
index 0000000..05f1b5a
--- /dev/null
@@ -0,0 +1,43 @@
+/* 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);
+}
diff --git a/mdemo/ltdl.h b/mdemo/ltdl.h
new file mode 100644 (file)
index 0000000..508c2e8
--- /dev/null
@@ -0,0 +1,55 @@
+/* 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_ */
diff --git a/mdemo/ltdls.c b/mdemo/ltdls.c
new file mode 100644 (file)
index 0000000..e799cfb
--- /dev/null
@@ -0,0 +1,76 @@
+/* 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;
+}
+
diff --git a/mdemo/main.c b/mdemo/main.c
new file mode 100644 (file)
index 0000000..f9b0c74
--- /dev/null
@@ -0,0 +1,92 @@
+/* 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;
+}
index ee32ab642da38c277d548a130a9e942178a3aff9..d1688a0927eeebae4ea26a2d84b01cee3b84295e 100644 (file)
@@ -3,8 +3,11 @@
 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.
@@ -16,4 +19,5 @@ EXTRA_DIST = defs $(TESTS)
 # 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
diff --git a/tests/mdemo-conf.test b/tests/mdemo-conf.test
new file mode 100755 (executable)
index 0000000..d74b135
--- /dev/null
@@ -0,0 +1,30 @@
+#! /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
diff --git a/tests/mdemo-exec.test b/tests/mdemo-exec.test
new file mode 100755 (executable)
index 0000000..a37da01
--- /dev/null
@@ -0,0 +1,35 @@
+#! /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
diff --git a/tests/mdemo-inst.test b/tests/mdemo-inst.test
new file mode 100755 (executable)
index 0000000..e56fdd0
--- /dev/null
@@ -0,0 +1,46 @@
+#! /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
diff --git a/tests/mdemo-make.test b/tests/mdemo-make.test
new file mode 100755 (executable)
index 0000000..d530d0a
--- /dev/null
@@ -0,0 +1,25 @@
+#! /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
diff --git a/tests/mdemo-unst.test b/tests/mdemo-unst.test
new file mode 100755 (executable)
index 0000000..77c5d0a
--- /dev/null
@@ -0,0 +1,35 @@
+#! /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
diff --git a/tests/mdemo.test b/tests/mdemo.test
new file mode 100644 (file)
index 0000000..225853b
--- /dev/null
@@ -0,0 +1,79 @@
+#! /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