From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Ralf Wildenhues Newsgroups: gmane.lisp.guile.bugs,gmane.comp.gnu.libtool.patches Subject: Re: Mac OS X .dylib not working Date: Fri, 4 Mar 2011 19:47:25 +0100 Organization: Institute for Numerical Simulation, University of Bonn Message-ID: <20110304184724.GL10500@gmx.de> References: <4D705581.1030701@pogma.com> <24B671DD-89B7-4FBC-BDC5-39E6C058872E@telia.com> <4D712A62.2090901@pogma.com> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: dough.gmane.org 1299264505 23562 80.91.229.12 (4 Mar 2011 18:48:25 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Fri, 4 Mar 2011 18:48:25 +0000 (UTC) Cc: Guile bug , Ludovic =?iso-8859-1?Q?Court=E8s?= , libtool-patches@gnu.org To: Peter O'Gorman Original-X-From: bug-guile-bounces+guile-bugs=m.gmane.org@gnu.org Fri Mar 04 19:48:20 2011 Return-path: Envelope-to: guile-bugs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1Pva30-0005Ew-EG for guile-bugs@m.gmane.org; Fri, 04 Mar 2011 19:48:18 +0100 Original-Received: from localhost ([127.0.0.1]:48673 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Pva2z-0005Dm-Un for guile-bugs@m.gmane.org; Fri, 04 Mar 2011 13:48:18 -0500 Original-Received: from [140.186.70.92] (port=57762 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Pva2m-0005BJ-5O for bug-guile@gnu.org; Fri, 04 Mar 2011 13:48:05 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Pva2j-0001zq-JU for bug-guile@gnu.org; Fri, 04 Mar 2011 13:48:03 -0500 Original-Received: from mailout-de.gmx.net ([213.165.64.22]:49685) by eggs.gnu.org with smtp (Exim 4.71) (envelope-from ) id 1Pva2j-0001ya-6o for bug-guile@gnu.org; Fri, 04 Mar 2011 13:48:01 -0500 Original-Received: (qmail invoked by alias); 04 Mar 2011 18:47:59 -0000 Original-Received: from xdsl-89-0-180-85.netcologne.de (EHLO localhost.localdomain) [89.0.180.85] by mail.gmx.net (mp048) with SMTP; 04 Mar 2011 19:47:59 +0100 X-Authenticated: #13673931 X-Provags-ID: V01U2FsdGVkX18IcrZHipgIXtq0z1z/AHQH1dczqMTlYGSed2nHDt nz/Hg/9FbKpfnc Original-Received: from ralf by localhost.localdomain with local (Exim 4.72) (envelope-from ) id 1Pva29-0007GD-1f; Fri, 04 Mar 2011 19:47:25 +0100 Mail-Followup-To: Peter O'Gorman , Hans Aberg , Guile bug , Ludovic =?iso-8859-1?Q?Court=E8s?= , Michael Ellis , libtool-patches@gnu.org Content-Disposition: inline In-Reply-To: <4D712A62.2090901@pogma.com> User-Agent: Mutt/1.5.20 (2010-08-04) X-Y-GMX-Trusted: 0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-Received-From: 213.165.64.22 X-BeenThere: bug-guile@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Bug reports for GUILE, GNU's Ubiquitous Extension Language" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: bug-guile-bounces+guile-bugs=m.gmane.org@gnu.org Errors-To: bug-guile-bounces+guile-bugs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.lisp.guile.bugs:5284 gmane.comp.gnu.libtool.patches:11061 Archived-At: [ 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: > +# > +# 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