+2004-06-21 Gary V. Vaughan <gary@gnu.org>
+
+ * m4/ltdl.m4 (AC_WITH_LTDL): Remove redundant AC_REQUIRE calls.
+ Either set variables to allow a client to link with the installed
+ libltdl, or else compile a local libltdl as a convenience library.
+ * libtoolize.in (opt_ltdl): Removed in favour of...
+ (ltdldir): ...this, which is defaulted to "libltdl" or can be set
+ by the user with an argument to --ltdl.
+ (Main): Use it!
+ * doc/libtool.texi (Distributing libltdl): Improved documentation
+ on libltdl.
+ (Invoking libtoolize): Document new optional --ltdl target
+ directory argument.
+
2004-06-17 Gary V. Vaughan <gary@gnu.org>
* m4/libtool.m4 (AC_LIBTOOL_PROG_LD_SHLIBS) [darwin*]: Fix a typo
* GNU Free Documentation License:: License for this manual.
* Index:: Full index.
-@detailmenu --- The Detailed Node Listing ---
+@detailmenu
+ --- The Detailed Node Listing ---
Introduction
Using libtool with other languages
-* C++ libraries::
-* Tags:: Using Tags.
+* C++ libraries:: Writing libraries for C++
+* Tags:: Tags
Library interface versions
@item --help
Display a help message and exit.
-@item --ltdl
-Install libltdl in a subdirectory of your package.
+@item --ltdl [@var{TARGET-DIRECTORY-NAME}]
+Install libltdl in a the @var{TARGET-DIRECTORY-NAME} subdirectory of
+your package. If you specify a subdirectory name, then you will need
+to be careful to pass the same directory name to the autoconf macros:
+@code{AC_WITH_LTDL}; @code{AC_LIBLTDL_CONVENIENCE};
+@code{AC_LIBLTDL_INSTALLABLE} (@pxref{Distributing libltdl}). Without
+an argument, @samp{libltdl} is used as the default target directory
+name.
@item --quiet
@itemx -q
and what special considerations you need to make if you do not use C.
@menu
-* C++ libraries::
-* Tags::
+* C++ libraries:: Writing libraries for C++
+* Tags:: Tags
@end menu
@node C++ libraries
@end itemize
@noindent
-libltdl is licensed under the terms of the @sc{gnu} Library General Public License,
-with the following exception:
+libltdl is licensed under the terms of the @sc{gnu} Library General
+Public License, with the following exception:
@quotation
As a special exception to the @sc{gnu} Lesser General Public License,
@node Distributing libltdl
@section How to distribute libltdl with your package
-Even though libltdl is installed together with libtool, you may wish to
-include libltdl in the distribution of your package, for the convenience
-of users of your package that don't have libtool or libltdl installed.
-In this case, you must decide whether to manually add the @code{ltdl}
-objects to your package, or else which flavor of libltdl you want to use:
-a convenience library or an installable libtool library.
-
-The most simplistic way to add @code{libltdl} to your package is to copy
-the source files, @file{ltdl.c} and @file{ltdl.h}, to a source directory
-withing your package and to build and link them along with the rest of
-your sources. To help you do this, the m4 macros for Autoconf are
-available in @file{ltdl.m4}. You must ensure that they are available in
-@file{aclocal.m4} before you run Autoconf@footnote{@c
+Even though libltdl is installed together with libtool, you may wish
+to include libltdl in the distribution of your package, for the
+convenience of users of your package that don't have libtool or
+libltdl installed. In this case, you must decide whether to manually
+add the @code{ltdl} objects to your package, or else which flavor of
+libltdl you want to use: a convenience library or an installable
+libtool library.
+
+The most simplistic way to add @code{libltdl} to your package is to
+copy all the @file{libltdl} source files, to a subdirectory within
+your package and to build and link them along with the rest of your
+sources. To help you do this, the m4 macros for Autoconf are
+available in @file{ltdl.m4}. You must ensure that they are available
+in @file{aclocal.m4} before you run Autoconf@footnote{@c
@c
We used to recommend adding the contents of @file{ltdl.m4} to
@file{acinclude.m4}, but with modern Automake (1.8 or newer) and this
release of libltdl.
@c
}. Having made the macros available, you must add a call to the
-@samp{AC_LIB_LTDL} macro to your package's @file{configure.ac} to
-perform the configure time checks required to build @file{ltdl.o}
+@samp{AC_WITH_LTDL} macro to your package's @file{configure.ac} to
+perform the configure time checks required to build the library
correctly. This method has problems if you then try to link the
package binaries with an installed libltdl, or a library which depends
on libltdl: you will have problems with duplicate symbol definitions.
-One advantage of the convenience library is that it is not installed, so
-the fact that you use libltdl will not be apparent to the user, and it
-will not overwrite a pre-installed version of libltdl a user might have.
-On the other hand, if you want to upgrade libltdl for any reason
-(e.g. a bugfix) you'll have to recompile your package instead of just
-replacing an installed version of libltdl. However, if your programs
-or libraries are linked with other libraries that use such a
+@defmac AC_WITH_LTDL (@var{DIRECTORY})
+Add the @code{--with-included-ltdl} option to the @file{configure}
+script. By default, this macro will try to build @code{libltdl} in
+a subdirectory named @file{libltdl}, which is where
+@command{libtoolize --ltdl} will place the files unless directed
+differently. @xref{Invoking libtoolize}, for how to do that.
+Otherwise, use @var{DIRECTORY} to pass the location of the
+@code{libltdl} source files.
+@end defmac
+
+@defmac AC_LIBLTDL_INSTALLABLE (@var{DIRECTORY})
+If there is an installed @code{libltdl}, then set @code{LIBLTDL} to the
+link flags needed to use it, and @code{LTDLINCL} to the preprocessor
+flags needed to find the installed headers. Otherwise, set them to
+point into an included version of @code{libltdl}, and install that.
+
+By default, this macro will pass options to the @file{libltdl}
+subdirectory @file{configure} to cause it to be built as an
+installable library. If you named the @code{libltdl} source directory
+differently, then pass the directory name relative to
+@code{top_srcdir} as @var{DIRECTORY}. If you're not using automake,
+you will need to define @code{top_builddir} and @code{top_srcdir} in
+your makefile so that @code{LIBLTDL} and @code{LTDLINCL} are expanded
+properly.
+
+If used in conjunction with @code{AC_WITH_LTDL}, this macro must
+appear @strong{before} the call to @code{AC_WITH_LTDL}. If you are
+not using @code{AC_WITH_LTDL}, then you must add a call to
+@code{AC_CONFIG_SUBDIRS(@var{DIRECTORY})} to your @file{configure.ac}.
+@end defmac
+
+@defmac AC_LIBLTDL_CONVENIENCE (@var{DIRECTORY})
+Unless you call @code{AC_LIBLTDL_INSTALLABLE} before hand,
+@code{AC_WITH_LTDL} calls this macro automatically, so you should only
+ever need to use it yourself if @code{AC_WITH_LTDL} doesn't do what
+you want.
+
+By default, this macro will pass options to the @file{libltdl}
+subdirectory @file{configure} to cause it to be built as a convenience
+library. If you put the @code{libltdl} sources in a different
+subdirectory, then you should tell @code{AC_LIBLTDL_CONVENIENCE} where
+with the @var{DIRECTORY} parameter.
+@end defmac
+
+One advantage of the convenience library is that it is not installed,
+so the fact that you use libltdl will not be apparent to the user, and
+it will not overwrite a pre-installed version of libltdl a user might
+have. On the other hand, if you want to upgrade libltdl for any
+reason (e.g. a bugfix) you'll have to recompile your package instead
+of just replacing an installed version of libltdl. However, if your
+programs or libraries are linked with other libraries that use such a
pre-installed version of libltdl, you may get linker errors or
run-time crashes. Another problem is that you cannot link the
convenience library into more than one libtool library, then link a
programs which don't depend on other libraries that might use libltdl
too. In order to enable this flavor of libltdl, add a call to
@samp{AC_LIBLTDL_CONVENIENCE} to your @file{configure.ac},
-@emph{before} @samp{LT_INIT}.
+@emph{before} @samp{LT_INIT}, or use @samp{AC_WITH_LTDL}.
In order to select the installable version of libltdl, you should add a
call of the macro @samp{AC_LIBLTDL_INSTALLABLE} to your
regardless of the existence of another version, using the configure
switch @samp{--enable-ltdl-install}.
-In order to embed libltdl into your package, just add @samp{--ltdl} to
-the @code{libtoolize} command line. It will copy the libltdl sources
-to a subdirectory @samp{libltdl} in your package.
-Both macros accept an optional argument to specify the location
-of the @samp{libltdl} directory. By the default both macros assume that it
-is @samp{$@{top_srcdir@}/libltdl}.
-
Whatever macro you use, it is up to you to ensure that your
@file{configure.ac} will configure libltdl by using
@samp{AC_WITH_LTDL}. Both macros define the shell variables
@var{LIBLTDL}, to the link flag that you should use to link with
libltdl, and @var{LTDLINCL}, to the preprocessor flag that you should
-use to compile with programs that include @file{ltdl.h}. It is up to
-you to use @samp{AC_SUBST} to ensure that this variable will be
-available in @file{Makefile}s, or add them to variables that are
-@samp{AC_SUBST}ed by default, such as @var{LIBS} and @var{CPPFLAGS}.
+use to compile with programs that include @file{ltdl.h}.
If you're using the convenience libltdl, @var{LIBLTDL} will be the
pathname for the convenience version of libltdl and @var{LTDLINCL} will be
all platforms, because the dlopening functions may not be available
for static linking.
-The following example shows you how to embed the convenience libltdl in
-your package. In order to use the installable variant just replace
-@samp{AC_LIBLTDL_CONVENIENCE} with @samp{AC_LIBLTDL_INSTALLABLE}. We
+The following example shows you how to embed an installable libltdl in
+your package. In order to use the convenience variant just replace
+@samp{AC_LIBLTDL_INSTALLABLE} with @samp{AC_LIBLTDL_CONVENIENCE}. We
assume that libltdl was embedded using @samp{libtoolize --ltdl}.
configure.ac:
@example
...
## ------------------------------------------ ##
-## Enable building of the convenience library ##
-## and set LIBLTDL accordingly. ##
+## Enable building of the installable library ##
## ------------------------------------------ ##
-AC_LIBLTDL_CONVENIENCE
-# Substitute LTDLINCL and LIBLTDL in the Makefiles
-AC_SUBST([LTDLINCL])
-AC_SUBST([LIBLTDL])
+AC_LIBLTDL_INSTALLABLE
+
# Configure libtool with dlopen support if possible
LT_INIT([dlopen])
AC_WITH_LTDL
AM_CPPFLAGS = $(LTDLINCL)
myprog_LDFLAGS = -export-dynamic
-# The quotes around -dlopen below fool Automake <= 1.4 into accepting it
-myprog_LDADD = $(LIBLTDL) "-dlopen" self "-dlopen" foo1.la
+myprog_LDADD = $(LIBLTDL) -dlopen self -dlopen foo1.la
myprog_DEPENDENCIES = $(LIBLTDL) foo1.la
...
@end example
# -f, --force replace existing files
# --help display this message and exit
# -i, --install copy missing auxiliary files
-# --ltdl install libltdl in a subdirectory
+# --ltdl[=DIR] install libltdl in a subdirectory [default: libltdl]
# -q, --quiet work silently
# -v, --verbose verbosely report processing
# --version print version information and exit
opt_force=false
opt_install=false
opt_link=:
-opt_ltdl=false
opt_quiet=false
opt_verbose=false
aclocaldir=@aclocaldir@
auxdir=
m4dir=
+ltdldir=
configure_ac=configure.in
fi
;;
- --force|-f) opt_force=: ;;
- --install|-i) opt_install=: ;;
- --ltdl) opt_ltdl=: ;;
+ --force|-f) opt_force=: ;;
+ --install|-i) opt_install=: ;;
+
+ --ltdl) ltdldir=libltdl
+ if test $# -gt 0; then
+ case $1 in
+ -*) ;;
+ *) ltdldir="$1"; shift ;;
+ esac
+ fi
+ ;;
+
--quiet|--automake|-q) # --automake is for 1.5 compatibility
- opt_quiet=: ;;
- --verbose|-v) opt_verbose=: ;;
+ opt_quiet=: ;;
+ --verbose|-v) opt_verbose=: ;;
+
+ # Separate optargs to long options:
+ --ltdl=*)
+ arg=`echo "$opt" | $SED "$my_sed_long_arg"`
+ opt=`echo "$opt" | $SED "$my_sed_long_opt"`
+ set -- "$opt" "$arg" ${1+"$@"}
+ ;;
+ # Separate non-argument short options:
-c*|-i*|-f*|-n*|-q*|-v*)
rest=`echo "$opt" |$SED "$my_sed_single_rest"`
opt=`echo "$opt" |$SED "$my_sed_single_opt"`
$opt_quiet || func_check_macros
# Copy all the files from installed libltdl to this project, if the
- # user specified `--with-ltdl'.
- $opt_ltdl && eval func_copy_all_files "$pkgdatadir/libltdl" libltdl
+ # user specified `--ltdl'.
+ if test -n "$ltdldir"; then
+ eval func_copy_all_files "$pkgdatadir/libltdl" "$ltdldir"
+ fi
# Copy all the installed utility files to the auxiliary directory if
# `--install' was passed, or else copy just ltmain.sh.
])# AC_CHECK_LIBM
-# AC_LIBLTDL_CONVENIENCE([DIRECTORY])
-# -----------------------------------
-# sets LIBLTDL to the link flags for the libltdl convenience library and
-# LTDLINCL to the include flags for the libltdl header and adds
-# --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL
-# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If
-# DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will
-# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with
-# '${top_srcdir}/' (note the single quotes!). If your package is not
-# flat and you're not using automake, define top_builddir and
-# top_srcdir appropriately in the Makefiles.
-AC_DEFUN([AC_LIBLTDL_CONVENIENCE],
-[case $enable_ltdl_convenience in
- no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
- "") enable_ltdl_convenience=yes
- ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
- esac
- LIBLTDL='${top_builddir}/'m4_if($#, 1,[$1], ['libltdl'])/libltdlc.la
- LTDLINCL='-I${top_srcdir}/'m4_if($#, 1, [$1], ['libltdl'])
- # For backwards non-gettext consistent compatibility...
- INCLTDL="$LTDLINCL"
-])# AC_LIBLTDL_CONVENIENCE
-
-
-# AC_LIBLTDL_INSTALLABLE([DIRECTORY])
-# -----------------------------------
-# sets LIBLTDL to the link flags for the libltdl installable library and
-# LTDLINCL to the include flags for the libltdl header and adds
-# --enable-ltdl-install to the configure arguments. Note that LIBLTDL
-# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If
-# DIRECTORY is not provided and an installed libltdl is not found, it is
-# assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/'
-# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single
-# quotes!). If your package is not flat and you're not using automake,
-# define top_builddir and top_srcdir appropriately in the Makefiles.
-# In the future, this macro may have to be called after AC_PROG_LIBTOOL.
-AC_DEFUN([AC_LIBLTDL_INSTALLABLE],
-[AC_CHECK_LIB(ltdl, lt_dlinit,
- [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no],
- [if test x"$enable_ltdl_install" = xno; then
- AC_MSG_WARN([libltdl not installed, but installation disabled])
- else
- enable_ltdl_install=yes
- fi
- ])
- if test x"$enable_ltdl_install" = x"yes"; then
- ac_configure_args="$ac_configure_args --enable-ltdl-install"
- LIBLTDL='${top_builddir}/'m4_if($#, 1, [$1], ['libltdl'])/libltdl.la
- LTDLINCL='-I${top_srcdir}/'m4_if($#, 1, [$1], ['libltdl'])
- else
- ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
- LIBLTDL="-lltdl"
- LTDLINCL=
- fi
- # For backwards non-gettext consistent compatibility...
- INCLTDL="$LTDLINCL"
-])# AC_LIBLTDL_INSTALLABLE
-
-
# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME])
# -------------------------------------------
AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI],
# serial 6 AC_LIB_LTDL
-# AC_WITH_LTDL
-# ------------
+# AC_WITH_LTDL([DIRECTORY])
+# -------------------------
# Clients of libltdl can use this macro to allow the installer to
# choose between a shipped copy of the ltdl sources or a preinstalled
# version of the library.
AC_DEFUN([AC_WITH_LTDL],
-[AC_REQUIRE([AC_LIB_LTDL])
-AC_SUBST([LIBLTDL])
-AC_SUBST([INCLTDL])
-
-# Unless the user asks us to check, assume no installed ltdl exists.
-use_installed_libltdl=no
-
-AC_ARG_WITH([included_ltdl],
- [ --with-included-ltdl use the GNU ltdl sources included here])
+[AC_ARG_WITH([included_ltdl],
+ [AC_HELP_STRING([--with-included-ltdl],
+ [use the GNU ltdl sources included here])])
if test "x$with_included_ltdl" != xyes; then
# We are not being forced to use the included libltdl sources, so
AC_MSG_CHECKING([whether to use included libltdl])
AC_MSG_RESULT([$with_included_ltdl])
-AC_CONFIG_SUBDIRS([libltdl])
+AC_CONFIG_SUBDIRS([m4_if($#, 1, [$1], [libltdl])])
])# AC_WITH_LTDL
+# AC_LIBLTDL_CONVENIENCE([DIRECTORY])
+# -----------------------------------
+# sets LIBLTDL to the link flags for the libltdl convenience library and
+# LTDLINCL to the include flags for the libltdl header and adds
+# --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL
+# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If
+# DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will
+# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with
+# '${top_srcdir}/' (note the single quotes!). If your package is not
+# flat and you're not using automake, define top_builddir and
+# top_srcdir appropriately in the Makefiles.
+AC_DEFUN([AC_LIBLTDL_CONVENIENCE],
+[case $enable_ltdl_convenience in
+ no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
+ "") enable_ltdl_convenience=yes
+ ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
+ esac
+LIBLTDL='${top_builddir}/'m4_if($#, 1,[$1], ['libltdl'])/libltdlc.la
+LTDLINCL='-I${top_srcdir}/'m4_if($#, 1, [$1], ['libltdl'])
+
+AC_SUBST([LIBLTDL])
+AC_SUBST([LTDLINCL])
+
+# For backwards non-gettext consistent compatibility...
+INCLTDL="$LTDLINCL"
+AC_SUBST([INCLTDL])
+])# AC_LIBLTDL_CONVENIENCE
+
+
+# AC_LIBLTDL_INSTALLABLE([DIRECTORY])
+# -----------------------------------
+# sets LIBLTDL to the link flags for the libltdl installable library and
+# LTDLINCL to the include flags for the libltdl header and adds
+# --enable-ltdl-install to the configure arguments. Note that LIBLTDL
+# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If
+# DIRECTORY is not provided and an installed libltdl is not found, it is
+# assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/'
+# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single
+# quotes!). If your package is not flat and you're not using automake,
+# define top_builddir and top_srcdir appropriately in the Makefiles.
+# In the future, this macro may have to be called after LT_INIT.
+AC_DEFUN([AC_LIBLTDL_INSTALLABLE],
+[AC_CHECK_LIB(ltdl, lt_dlinit,
+ [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no],
+ [if test x"$enable_ltdl_install" = xno; then
+ AC_MSG_WARN([libltdl not installed, but installation disabled])
+ else
+ enable_ltdl_install=yes
+ fi
+ ])
+if test x"$enable_ltdl_install" = x"yes"; then
+ ac_configure_args="$ac_configure_args --enable-ltdl-install"
+ LIBLTDL='${top_builddir}/'m4_if($#, 1, [$1], ['libltdl'])/libltdl.la
+ LTDLINCL='-I${top_srcdir}/'m4_if($#, 1, [$1], ['libltdl'])
+else
+ ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
+ LIBLTDL="-lltdl"
+ LTDLINCL=
+fi
+
+AC_SUBST([LIBLTDL])
+AC_SUBST([LTDLINCL])
+
+# For backwards non-gettext consistent compatibility...
+INCLTDL="$LTDLINCL"
+AC_SUBST([INCLTDL])
+])# AC_LIBLTDL_INSTALLABLE
+
+
# AC_LIB_LTDL
# -----------
# Perform all the checks necessary for compilation of the ltdl objects
# -- including compiler checks and header checks.
AC_DEFUN([AC_LIB_LTDL],
-[AC_PREREQ(2.50)
-AC_REQUIRE([AC_PROG_CC])
+[AC_REQUIRE([AC_PROG_CC])
AC_REQUIRE([AC_C_CONST])
AC_REQUIRE([AC_HEADER_STDC])
AC_REQUIRE([AC_HEADER_DIRENT])