>From e51daabd9975b141ed491f2f49bb340b797a6383 Mon Sep 17 00:00:00 2001 From: Peter O'Gorman
Date: Fri, 4 Mar 2011 14:35:14 -0600 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. * NEWS: Announce it. Reported by Hans Aberg, Michael Ellis, and others. --- ChangeLog | 10 +++ NEWS | 3 + libltdl/ltdl.c | 21 +++++- libltdl/m4/ltdl.m4 | 9 ++- tests/darwin.at | 216 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 257 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7f74eab..528e404 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2011-03-04 Peter O'Gorman + + 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. + * NEWS: Announce it. + Reported by Hans Aberg, Michael Ellis, and others. + 2011-02-12 Peter O'Gorman Install ltmain.sh without execute bit set. diff --git a/NEWS b/NEWS index dbad2ae..90d14b7 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,9 @@ New in 2.4.2 2011-??-??: git version 2.4.1a, Libtool team: - Initial support for Go, using the gccgo compiler. + - On Mac OS X .dylib is now tried as well as .so with + lt_dlopenext(). + * Bug fixes: - The generic approximation of the command line length limit (when getconf is diff --git a/libltdl/ltdl.c b/libltdl/ltdl.c index be1e4c0..01853e0 100644 --- a/libltdl/ltdl.c +++ b/libltdl/ltdl.c @@ -1,7 +1,7 @@ /* ltdl.c -- system independent dlopen wrapper Copyright (C) 1998, 1999, 2000, 2004, 2005, 2006, - 2007, 2008 Free Software Foundation, Inc. + 2007, 2008, 2011 Free Software Foundation, Inc. Written by Thomas Tanner, 1998 NOTE: The canonical source of this file is maintained with the @@ -80,6 +80,11 @@ static const char libprefix[] = LT_LIBPREFIX; #if defined(LT_MODULE_EXT) static const char shlib_ext[] = LT_MODULE_EXT; #endif +/* If the loadable module suffix is not the same as the linkable + * shared library suffix, this will be defined. */ +#if defined(LT_SHARED_EXT) +static const char shared_ext[] = LT_SHARED_EXT; +#endif #if defined(LT_DLSEARCH_PATH) static const char sys_dlsearch_path[] = LT_DLSEARCH_PATH; #endif @@ -1537,6 +1542,9 @@ has_library_ext (const char *filename) #if defined(LT_MODULE_EXT) || (streq (ext, shlib_ext)) #endif +#if defined(LT_SHARED_EXT) + || (streq (ext, shared_ext)) +#endif )) { return 1; @@ -1682,6 +1690,17 @@ lt_dlopenadvise (const char *filename, lt_dladvise advise) if (handle || ((errors > 0) && !file_not_found ())) return handle; #endif + +#if defined(LT_SHARED_EXT) + /* Try appending SHARED_EXT. */ + LT__SETERRORSTR (saved_error); + errors = try_dlopen (&handle, filename, shared_ext, advise); + + /* As before, if the file was found but loading failed, return now + with the current error message. */ + if (handle || ((errors > 0) && !file_not_found ())) + return handle; +#endif } /* Still here? Then we really did fail to locate any of the file diff --git a/libltdl/m4/ltdl.m4 b/libltdl/m4/ltdl.m4 index 42e07e9..ea76f4d 100644 --- a/libltdl/m4/ltdl.m4 +++ b/libltdl/m4/ltdl.m4 @@ -1,6 +1,6 @@ # ltdl.m4 - Configure ltdl for the target system. -*-Autoconf-*- # -# Copyright (C) 1999-2006, 2007, 2008 Free Software Foundation, Inc. +# Copyright (C) 1999-2006, 2007, 2008, 2011 Free Software Foundation, Inc. # Written by Thomas Tanner, 1999 # # This file is free software; the Free Software Foundation gives @@ -553,12 +553,19 @@ AC_CACHE_CHECK([which extension is used for runtime loadable modules], [ module=yes eval libltdl_cv_shlibext=$shrext_cmds +module=no +eval libltdl_cv_shrext=$shrext_cmds ]) if test -n "$libltdl_cv_shlibext"; then m4_pattern_allow([LT_MODULE_EXT])dnl AC_DEFINE_UNQUOTED([LT_MODULE_EXT], ["$libltdl_cv_shlibext"], [Define to the extension used for runtime loadable modules, say, ".so".]) fi +if test "$libltdl_cv_shrext" != "$libltdl_cv_shlibext"; then + m4_pattern_allow([LT_SHARED_EXT])dnl + AC_DEFINE_UNQUOTED([LT_SHARED_EXT], ["$libltdl_cv_shrext"], + [Define to the shared library suffix, say, ".dylib".]) +fi ])# LT_SYS_MODULE_EXT # Old name: diff --git a/tests/darwin.at b/tests/darwin.at index 4e5034e..b255abe 100644 --- a/tests/darwin.at +++ b/tests/darwin.at @@ -228,3 +228,219 @@ 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]) + +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 '^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]) + +# Skip this test when called from: +# make distcheck DISTCHECK_CONFIGURE_FLAGS=--disable-ltdl-install +AT_CHECK([case $LIBLTDL in #( + */_inst/lib/*) test -f $LIBLTDL || (exit 77) ;; +esac], [], [ignore]) + +prefix=`pwd`/inst +libdir=$prefix/lib +bindir=$prefix/bin +mkdir $prefix $libdir $bindir + +# This code is copied from the Autobook: +#