From: Gary V. Vaughan Date: Thu, 31 Jan 2008 16:17:06 +0000 (+0000) Subject: Unfortunately, the autoconf implementation of AC_LIBOBJ and X-Git-Tag: release-2-1b~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e032959c826b7ffa52246b27e3eb67b079567806;p=thirdparty%2Flibtool.git Unfortunately, the autoconf implementation of AC_LIBOBJ and friends requires all libobjs to be in the same directory, as declared by AC_CONFIG_LIBOBJ_DIR. That might prevent using either recursive or nonrecursive libltdl if the parent project has libobjs of its own, except that this patch tracks libltdl's libobjs in another namespace: * libltdl/m4/ltdl.m4 (_LT_LIBOBJ, _LT_LIBSOURCES): Versions of AC_LIBOBJ and AC_LIBSOURCES that save missing sources in a ltdl_LIBOBJS automake macro, instead of the global LIBOBJS automake macro. Content of the macros inspired by code from gnulib-tool. (_LTDL_MODE_DISPATCH): Initialise lt_libobj_prefix in nonrecursive mode. (LTDL_INIT): Push and pop the new definitions around potential sites that call AC_LIBOBJ. Also, using lt_libobj_prefix, initialise ltdl_LIBOBJS and ltdl_LTLIBOBJS. * libtoolize.m4sh (func_fixup_Makefile): Substitute ltdl_LIBOBJS and ltdl_LTLIBOBJS for LIBOBJS and LTLIBOBJS during copying either Makefile.am or Makefile.inc, depending on ltdl_mode. Reported by Eric Blake --- diff --git a/ChangeLog b/ChangeLog index de9dbbce2..1b387fba1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,27 @@ +2008-02-01 Gary V. Vaughan + + Unfortunately, the autoconf implementation of AC_LIBOBJ and + friends requires all libobjs to be in the same directory, as + declared by AC_CONFIG_LIBOBJ_DIR. That might prevent using + either recursive or nonrecursive libltdl if the parent project + has libobjs of its own, except that this patch tracks libltdl's + libobjs in another namespace: + + * libltdl/m4/ltdl.m4 (_LT_LIBOBJ, _LT_LIBSOURCES): Versions of + AC_LIBOBJ and AC_LIBSOURCES that save missing sources in a + ltdl_LIBOBJS automake macro, instead of the global LIBOBJS + automake macro. Content of the macros inspired by code from + gnulib-tool. + (_LTDL_MODE_DISPATCH): Initialise lt_libobj_prefix in + nonrecursive mode. + (LTDL_INIT): Push and pop the new definitions around potential + sites that call AC_LIBOBJ. Also, using lt_libobj_prefix, + initialise ltdl_LIBOBJS and ltdl_LTLIBOBJS. + * libtoolize.m4sh (func_fixup_Makefile): Substitute ltdl_LIBOBJS + and ltdl_LTLIBOBJS for LIBOBJS and LTLIBOBJS during copying + either Makefile.am or Makefile.inc, depending on ltdl_mode. + Reported by Eric Blake + 2008-01-30 Gary V. Vaughan There are 5 distinct batches of files that libtoolize might diff --git a/libltdl/m4/ltdl.m4 b/libltdl/m4/ltdl.m4 index 452f2c709..3e4fc1593 100644 --- a/libltdl/m4/ltdl.m4 +++ b/libltdl/m4/ltdl.m4 @@ -198,7 +198,7 @@ m4_if(_LTDL_DIR, [], [m4_case(m4_default(_LTDL_MODE, [subproject]), [subproject], [AC_CONFIG_SUBDIRS(_LTDL_DIR) _LT_SHELL_INIT([lt_dlopen_dir="$lt_ltdl_dir"])], - [nonrecursive], [_LT_SHELL_INIT([lt_dlopen_dir="$lt_ltdl_dir"])], + [nonrecursive], [_LT_SHELL_INIT([lt_dlopen_dir="$lt_ltdl_dir"; lt_libobj_prefix="$lt_ltdl_dir/"])], [recursive], [], [m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])])dnl dnl Be careful not to expand twice: @@ -206,6 +206,32 @@ m4_define([$0], []) ])# _LTDL_MODE_DISPATCH +# _LT_LIBOBJ(MODULE_NAME) +# ----------------------- +# Like AC_LIBOBJ, except that MODULE_NAME goes into _LT_LIBOBJS instead +# of into LIBOBJS. +AC_DEFUN([_LT_LIBOBJ], [ + m4_pattern_allow([^_LT_LIBOBJS$]) + AS_LITERAL_IF([$1], [_LT_LIBSOURCES([$1.c])])dnl + _LT_LIBOBJS="$_LT_LIBOBJS $1.$ac_objext" +])# _LT_LIBOBJS + + +# _LT_LIBSOURCES(MODULE_NAMES) +# ---------------------------- +# Like AC_LIBSOURCES, except the directory where the libltdl source files +# are expected is distinct from the user LIBOBJ directory. +AC_DEFUN([_LT_LIBSOURCES], [ + m4_foreach([_LTNAME], [$1], [ + m4_syscmd([test -r "$lt_libobj_prefix]_LTNAME[" || + test -z "$lt_libobj_prefix" || + test ! -d "$lt_libobj_prefix"])dnl + m4_if(m4_sysval, [0], [], + [AC_FATAL([missing $lt_libobj_prefix/]_LTNAME)]) + ]) +])# _LT_LIBSOURCES + + # LTDL_INIT([OPTIONS]) # -------------------- # Clients of libltdl can use this macro to allow the installer to @@ -217,6 +243,12 @@ AC_DEFUN([LTDL_INIT], [dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) +dnl We need to keep our own list of libobjs separate from our parent project, +dnl and the easiest way to do that is redefine the AC_LIBOBJs macro while +dnl we look for our own LIBOBJs. Definitions in ltdl-libobj.m4. +m4_pushdef([AC_LIBOBJ], m4_defn([_LT_LIBOBJ])) +m4_pushdef([AC_LIBSOURCES], m4_defn([_LT_LIBSOURCES])) + dnl If not otherwise defined, default to the 1.5.x compatible subproject mode: m4_if(_LTDL_MODE, [], [m4_define([_LTDL_MODE], m4_default([$2], [subproject])) @@ -309,6 +341,25 @@ AC_MSG_RESULT([$LIBLTDL]) _LTDL_SETUP +dnl restore autoconf definition. +m4_popdef([AC_LIBOBJ]) +m4_popdef([AC_LIBSOURCES]) + +AC_CONFIG_COMMANDS_PRE([ + _ltdl_libobjs= + _ltdl_ltlibobjs= + if test -n "$_LT_LIBOBJS"; then + # Remove the extension. + _lt_sed_drop_objext='s/\.o$//;s/\.obj$//' + for i in `for i in $_LT_LIBOBJS; do echo "$i"; done | sed "$_lt_sed_drop_objext" | sort -u`; do + _ltdl_libobjs="$_ltdl_libobjs $lt_libobj_prefix$i.$ac_objext" + _ltdl_ltlibobjs="$_ltdl_ltlibobjs $lt_libobj_prefix$i.lo" + done + fi + AC_SUBST([ltdl_LIBOBJS], [$_ltdl_libobjs]) + AC_SUBST([ltdl_LTLIBOBJS], [$_ltdl_ltlibobjs]) +]) + # Only expand once: m4_define([LTDL_INIT]) ])# LTDL_INIT diff --git a/libtoolize.m4sh b/libtoolize.m4sh index de3760e00..210fa5476 100644 --- a/libtoolize.m4sh +++ b/libtoolize.m4sh @@ -320,6 +320,7 @@ func_copy_some_files () IFS="$my_save_IFS" } + # func_fixup_Makefile srcfile srcdir destdir func_fixup_Makefile () { @@ -328,6 +329,8 @@ func_fixup_Makefile () my_srcdir="$2" my_destdir="$3" my_fixup_non_subpackage_script="\ + s,(LIBOBJS),(ltdl_LIBOBJS),g + s,(LTLIBOBJS),(ltdl_LTLIBOBJS),g s,libltdl/configure.ac,, s,libltdl/configure,, s,libltdl/aclocal.m4,, @@ -1004,7 +1007,7 @@ func_install_pkgmacro_files () { $opt_debug - # argz.m4, libtool.m4 and ltdl.m4 are handled specially below: + # argz.m4, libtool.m4 and ltdl.m4 are handled specially: func_massage_aclocal_DATA 'argz.m4|libtool.m4|ltdl.m4' # 1. Parent has separate macrodir to subproject ltdl: