[ dropping bug-libtool ] Hi Peter,
* Peter O'Gorman wrote on Fri, Mar 04, 2011 at 07:07:30PM CET: > Ok? A few copyright year bumps are missing. Some minor nits inline below. Thank you, Ralf > Subject: [PATCH] On Mac OS X try .dylib as well as .so with lt_dlopenext > > * libltdl/m4/ltdl.m4: Define extra extension if module extension > differs from shared lib extension. > * libltdl/ltdl.c: Use it. > * tests/darwin.at: Test it. > Reported by Hans Aberg, Michael Ellis, and others. > --- a/tests/darwin.at > +++ b/tests/darwin.at > @@ -228,3 +228,224 @@ mv stdout expout > LT_AT_CONFIGURE([LDFLAGS=-L/there/is/no/dir/here]) > AT_CHECK([./libtool --config],[ignore],[expout],[ignore]) > AT_CLEANUP > + > +AT_SETUP(darwin can lt_dlopen .dylib and .so files) Missing m4 quotes (for style only) > +AT_KEYWORDS([libltdl dylib]) > + > +# This test requires shared library support. > +AT_CHECK([$LIBTOOL --features | grep 'enable shared libraries' || exit 77], > + [], [ignore]) > + > + > +eval `$LIBTOOL --config | $EGREP '^(shlibpath_var|shrext_cmds)='` > + > +module=no > +eval shared_ext=\"$shrext_cmds\" > +module=yes > +eval module_ext=\"$shrext_cmds\" > + > +# Only bother with this test if module extension is different from > +# shared extension > +AT_CHECK([test "$shared_ext" != "$module_ext" || exit 77], > + [], [ignore]) You can drop arguments two and three here. > +# This code is copied from the Autobook: > +# <http://sources.redhat.com/autobook/autobook/autobook_169.html> > +# so if it needs changes, be sure to notify the Autobook authors > +# about them. > +int > +main (int argc, const char *argv[]) > +{ > + char *errormsg = NULL; > + lt_dlhandle module = NULL; > + entrypoint *run = NULL; > + int errors = 0; Isn't this lacking LTDL_SET_PRELOADED_SYMBOLS(); or was that needed only for static libs (which you've excluded earlier)? > + if (argc != 3) > + { > + fprintf (stderr, "USAGE: main MODULENAME ARGUMENT\n"); > + exit (EXIT_FAILURE); > + } > + > + /* Initialise libltdl. */ > + errors = lt_dlinit (); > + > + /* Set the module search path. */ > + if (!errors) > + { > + const char *path = getenv (MODULE_PATH_ENV); > + > + if (path != NULL) > + errors = lt_dlsetsearchpath (path); > + } > + > + /* Load the module. */ > + if (!errors) > + module = lt_dlopenext (argv[1]); > + > + /* Find the entry point. */ > + if (module) > + { > + run = (entrypoint *) lt_dlsym (module, "run"); > + > + /* In principle, run might legitimately be NULL, so > + I don't use run == NULL as an error indicator > + in general. */ > + errormsg = dlerrordup (errormsg); > + if (errormsg != NULL) > + { > + errors = lt_dlclose (module); > + module = NULL; > + } > + } > + else > + errors = 1; > + > + /* Call the entry point function. */ > + if (!errors) > + { > + int result = (*run) (argv[2]); > + if (result < 0) > + errormsg = strdup ("module entry point execution failed"); > + else > + printf ("\t=> %d\n", result); > + } > + > + /* Unload the module, now that we are done with it. */ > + if (!errors) > + errors = lt_dlclose (module); > + > + if (errors) > + { > + /* Diagnose the encountered error. */ > + errormsg = dlerrordup (errormsg); > + > + if (!errormsg) > + { > + fprintf (stderr, "%s: dlerror() failed.\n", argv[0]); > + return EXIT_FAILURE; > + } > + } > + > + /* Finished with ltdl now. */ > + if (!errors) > + if (lt_dlexit () != 0) > + errormsg = dlerrordup (errormsg); I'm not particularly fond of this coding style, where ownership information essentially gets lots once an error occurs in any of the commands. Might be ok for a test like this, but not such a good example for users. lt_dlexit could be warranted even if some error occurred before. Anyway, I won't reject the patch for this. > + if (errormsg) > + { > + fprintf (stderr, "%s: %s.\n", argv[0], errormsg); > + free (errormsg); > + exit (EXIT_FAILURE); > + } > + > + return EXIT_SUCCESS; > +} > + > +/* Be careful to save a copy of the error message, > + since the next API call may overwrite the original. */ > +static char * > +dlerrordup (char *errormsg) > +{ > + char *error = (char *) lt_dlerror (); > + if (error && !errormsg) > + errormsg = strdup (error); > + return errormsg; > +} > +]]) > +if test "$shlibpath_var" = PATH; then This looks wrong; shouldn't it be != here? Otherwise, ... > + $unset shlibpath_var || shlibpath_var= > +fi > +rm $libdir/simple-module.la ... this has only a small chance of succeeding. > +rm $libdir/libsimple-dylib.la > + > +for dir in inst/lib "$libdir"; do > + LT_AT_EXEC_CHECK([./ltdl-loader], [], [stdout], [ignore], > + [$dir/simple-module World]) > + AT_CHECK([grep "Hello, World" stdout], [], [ignore]) > + LT_AT_EXEC_CHECK([./ltdl-loader], [], [stdout], [ignore], > + [$dir/libsimple-dylib World]) > + AT_CHECK([grep "Hello, World" stdout], [], [ignore]) > +done > + > +AT_CLEANUP