From 8c1f97e1be220e4924a1dcc7adbf8f9a5e55d2b3 Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Wed, 4 Nov 1998 09:43:29 +0000 Subject: [PATCH] 1998-11-04 Alexandre Oliva * ltconfig.in, ltmain.in: updated and fixed the patches below 1998-11-04 Thomas Tanner * 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 * 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 * ltmain.in: New flag -export-symbols; new dlpreopen system * demo/dlmain.c: removed dld_preloaded_symbol_count 1998-11-04 Ian Lance Taylor * 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 * 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 * ltconfig.in: Look in the right directory for libtool.c in archive_cmds for cygwin32. 1998-11-04 Ian Lance Taylor * 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 * 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. --- ChangeLog | 61 +++++++++++ Makefile.am | 37 ++++++- demo/configure.in | 1 + demo/dlmain.c | 26 ++--- doc/libtool.texi | 37 +++---- libtool.m4 | 15 ++- ltconfig.in | 192 +++++++++++++++++++++++++++++++--- ltmain.in | 238 ++++++++++++++++++++++++++---------------- mdemo/.cvsignore | 13 +++ mdemo/Makefile.am | 29 +++++ mdemo/README | 10 ++ mdemo/configure.in | 23 ++++ mdemo/foo.h | 60 +++++++++++ mdemo/foo1.c | 41 ++++++++ mdemo/foo2.c | 41 ++++++++ mdemo/libfoo1.sym | 3 + mdemo/libfoo2.sym | 3 + mdemo/ltdl.c | 43 ++++++++ mdemo/ltdl.h | 55 ++++++++++ mdemo/ltdls.c | 76 ++++++++++++++ mdemo/main.c | 92 ++++++++++++++++ tests/Makefile.am | 8 +- tests/mdemo-conf.test | 30 ++++++ tests/mdemo-exec.test | 35 +++++++ tests/mdemo-inst.test | 46 ++++++++ tests/mdemo-make.test | 25 +++++ tests/mdemo-unst.test | 35 +++++++ tests/mdemo.test | 79 ++++++++++++++ 28 files changed, 1215 insertions(+), 139 deletions(-) create mode 100644 mdemo/.cvsignore create mode 100644 mdemo/Makefile.am create mode 100644 mdemo/README create mode 100644 mdemo/configure.in create mode 100644 mdemo/foo.h create mode 100644 mdemo/foo1.c create mode 100644 mdemo/foo2.c create mode 100644 mdemo/libfoo1.sym create mode 100644 mdemo/libfoo2.sym create mode 100644 mdemo/ltdl.c create mode 100644 mdemo/ltdl.h create mode 100644 mdemo/ltdls.c create mode 100644 mdemo/main.c create mode 100755 tests/mdemo-conf.test create mode 100755 tests/mdemo-exec.test create mode 100755 tests/mdemo-inst.test create mode 100755 tests/mdemo-make.test create mode 100755 tests/mdemo-unst.test create mode 100644 tests/mdemo.test diff --git a/ChangeLog b/ChangeLog index 68f525c2..84e355c8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,64 @@ +1998-11-04 Alexandre Oliva + + * ltconfig.in, ltmain.in: updated and fixed the patches below + +1998-11-04 Thomas Tanner + + * 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 + + * 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 + + * ltmain.in: New flag -export-symbols; new dlpreopen system + * demo/dlmain.c: removed dld_preloaded_symbol_count + +1998-11-04 Ian Lance Taylor + + * 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 + + * 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 + + * ltconfig.in: Look in the right directory for libtool.c in + archive_cmds for cygwin32. + +1998-11-04 Ian Lance Taylor + + * 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 + + * 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 * libtool.m4 (sco): fix typo diff --git a/Makefile.am b/Makefile.am index 050ea0d8..a500d71a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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 diff --git a/demo/configure.in b/demo/configure.in index f7b80378..a6885e06 100644 --- a/demo/configure.in +++ b/demo/configure.in @@ -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 diff --git a/demo/dlmain.c b/demo/dlmain.c index 90afd7a7..c0268faf 100644 --- a/demo/dlmain.c +++ b/demo/dlmain.c @@ -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 ++; } diff --git a/doc/libtool.texi b/doc/libtool.texi index 888b18cf..ca425e84 100644 --- a/doc/libtool.texi +++ b/doc/libtool.texi @@ -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 diff --git a/libtool.m4 b/libtool.m4 index d39c52d1..09cba0c6 100644 --- a/libtool.m4 +++ b/libtool.m4 @@ -21,11 +21,12 @@ ## 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) +]) diff --git a/ltconfig.in b/ltconfig.in index 3e6a2a5c..90c83bf9 100755 --- a/ltconfig.in +++ b/ltconfig.in @@ -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 + +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 + +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 <> "$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 diff --git a/ltmain.in b/ltmain.in index d1917d1a..97f32890 100644 --- 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/ $//'` + 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 - # Discover the nlist of each of the dlfiles. - nlist="${output_objdir}/${output}.nm" + # Discover the nlist of each of the dlfiles. + nlist="$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 - - for arg in $dlprefiles; do - $show "extracting global C symbols from \`$arg'" - $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" - done - - # 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\ " - ;; + fi - *) - $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 - exit 1 - ;; - esac - fi + # 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 $? - # 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 $? - - # 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 index 00000000..3b25c3fe --- /dev/null +++ b/mdemo/.cvsignore @@ -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 index 00000000..52df8d8e --- /dev/null +++ b/mdemo/Makefile.am @@ -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 index 00000000..10cbf4ca --- /dev/null +++ b/mdemo/README @@ -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 index 00000000..f54bede3 --- /dev/null +++ b/mdemo/configure.in @@ -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 index 00000000..541becab --- /dev/null +++ b/mdemo/foo.h @@ -0,0 +1,60 @@ +/* foo.h -- interface to the libfoo* libraries + Copyright (C) 1998 Thomas Tanner + 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 index 00000000..929eb5d1 --- /dev/null +++ b/mdemo/foo1.c @@ -0,0 +1,41 @@ +/* foo1.c -- trivial test library + Copyright (C) 1998 Thomas Tanner + 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 +#include + +/* 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 index 00000000..7af5c98a --- /dev/null +++ b/mdemo/foo2.c @@ -0,0 +1,41 @@ +/* foo2.c -- trivial test library + Copyright (C) 1998 Thomas Tanner + 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 +#include + +/* 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 index 00000000..3f9544a5 --- /dev/null +++ b/mdemo/libfoo1.sym @@ -0,0 +1,3 @@ +nothing +hello +foo1 diff --git a/mdemo/libfoo2.sym b/mdemo/libfoo2.sym new file mode 100644 index 00000000..3d8cd947 --- /dev/null +++ b/mdemo/libfoo2.sym @@ -0,0 +1,3 @@ +nothing +hello +foo2 diff --git a/mdemo/ltdl.c b/mdemo/ltdl.c new file mode 100644 index 00000000..05f1b5ad --- /dev/null +++ b/mdemo/ltdl.c @@ -0,0 +1,43 @@ +/* ltdl.c -- dlopen functions + Copyright (C) 1998 Thomas Tanner + 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 +#endif + +#ifdef HAVE_DL_H +#include +#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 index 00000000..508c2e86 --- /dev/null +++ b/mdemo/ltdl.h @@ -0,0 +1,55 @@ +/* ltdl.h -- generic dlopen functions + Copyright (C) 1998 Thomas Tanner + 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 index 00000000..e799cfb5 --- /dev/null +++ b/mdemo/ltdls.c @@ -0,0 +1,76 @@ +/* ltdls.c -- static dlopen functions + Copyright (C) 1998 Thomas Tanner + 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 +#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 index 00000000..f9b0c748 --- /dev/null +++ b/mdemo/main.c @@ -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 +#include + +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; +} diff --git a/tests/Makefile.am b/tests/Makefile.am index ee32ab64..d1688a09 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -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 index 00000000..d74b1356 --- /dev/null +++ b/tests/mdemo-conf.test @@ -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 index 00000000..a37da01c --- /dev/null +++ b/tests/mdemo-exec.test @@ -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 index 00000000..e56fdd01 --- /dev/null +++ b/tests/mdemo-inst.test @@ -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 index 00000000..d530d0af --- /dev/null +++ b/tests/mdemo-make.test @@ -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 index 00000000..77c5d0ac --- /dev/null +++ b/tests/mdemo-unst.test @@ -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 index 00000000..225853b1 --- /dev/null +++ b/tests/mdemo.test @@ -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