automake-1.16: Conditional Libtool Libraries
8.3.3 Building Libtool Libraries Conditionally
----------------------------------------------
Like conditional programs (⇒Conditional Programs), there are two
main ways to build conditional libraries: using Automake conditionals or
using Autoconf ‘AC_SUBST’itutions.
The important implementation detail you have to be aware of is that
the place where a library will be installed matters to libtool: it needs
to be indicated _at link-time_ using the ‘-rpath’ option.
For libraries whose destination directory is known when Automake
runs, Automake will automatically supply the appropriate ‘-rpath’ option
to libtool. This is the case for libraries listed explicitly in some
installable ‘_LTLIBRARIES’ variables such as ‘lib_LTLIBRARIES’.
However, for libraries determined at configure time (and thus
mentioned in ‘EXTRA_LTLIBRARIES’), Automake does not know the final
installation directory. For such libraries you must add the ‘-rpath’
option to the appropriate ‘_LDFLAGS’ variable by hand.
The examples below illustrate the differences between these two
methods.
Here is an example where ‘WANTEDLIBS’ is an ‘AC_SUBST’ed variable set
at ‘./configure’-time to either ‘libfoo.la’, ‘libbar.la’, both, or none.
Although ‘$(WANTEDLIBS)’ appears in the ‘lib_LTLIBRARIES’, Automake
cannot guess it relates to ‘libfoo.la’ or ‘libbar.la’ at the time it
creates the link rule for these two libraries. Therefore the ‘-rpath’
argument must be explicitly supplied.
EXTRA_LTLIBRARIES = libfoo.la libbar.la
lib_LTLIBRARIES = $(WANTEDLIBS)
libfoo_la_SOURCES = foo.c ...
libfoo_la_LDFLAGS = -rpath '$(libdir)'
libbar_la_SOURCES = bar.c ...
libbar_la_LDFLAGS = -rpath '$(libdir)'
Here is how the same ‘Makefile.am’ would look using Automake
conditionals named ‘WANT_LIBFOO’ and ‘WANT_LIBBAR’. Now Automake is
able to compute the ‘-rpath’ setting itself, because it’s clear that
both libraries will end up in ‘$(libdir)’ if they are installed.
lib_LTLIBRARIES =
if WANT_LIBFOO
lib_LTLIBRARIES += libfoo.la
endif
if WANT_LIBBAR
lib_LTLIBRARIES += libbar.la
endif
libfoo_la_SOURCES = foo.c ...
libbar_la_SOURCES = bar.c ...