view doc/transversal.texi @ 40206:770a5696761e

relocatable-prog: Use wrapper-free installation on Mac OS X, take 2. This approach supports relocatable installation of shared libraries which depend on other shared libraries from the same package. * m4/relocatable.m4 (gl_RELOCATABLE_BODY): Determine use_macos_tools. If use_macos_tools is true, use reloc-ldflags and set LIBTOOL to be a wrapper around the original LIBTOOL. * build-aux/reloc-ldflags: Add support for Mac OS X, which uses the token '@loader_path' instead of '$ORIGIN'. * build-aux/libtool-reloc: New file. * modules/relocatable-prog (Files): Add it. * doc/relocatable-maint.texi (Supporting Relocation): Update to match the recent changes. Document the need to set the *_LDFLAGS of libraries. RELOCATABLE_LIBRARY_PATH and RELOCATABLE_CONFIG_H_DIR should be set in Makefile.am, not in configure.ac.
author Bruno Haible <bruno@clisp.org>
date Mon, 04 Mar 2019 17:25:09 +0100
parents 99c5c7bed4f9
children
line wrap: on
line source

@node Modules that modify the way other modules work
@section Modules that modify the way other modules work

The normal way to design modules is that each module has its own code,
and the module dependencies provide the facilities on which this code
can rely.  But sometimes it is necessary to use more advanced
techniques.  For example:
@itemize
@item
You may want to have optional module dependencies: Let module A use
facilities provided by module B, if module B is present, but without
requiring that module B is present.
@item
A module can indicate support for particular behaviours.  For example,
Gnulib has a module @samp{sigpipe} that requests POSIX compatible
SIGPIPE behaviour from all other modules -- something that is not
enabled by default.  Or consider the @samp{nonblocking} module, that is
an indicator that all I/O functions should handle non-blocking file
descriptors -- something that, equally, is not enabled by default.
@item
A module can indicate to other modules that they can rely on certain
guarantees, and thus omit specific code.  For example, when Gnulib's
@samp{malloc-gnu} module is present, you can omit code that test
@code{n} against zero when you call @code{malloc (n)}.
@end itemize

Be aware that these advanced techniques likely cause breakage in the
situation of multiple @code{gnulib-tool} invocations in the scope of a
single @code{configure} file.  This is because the question ``is module
B present?'' does not have a unique answer in such situations.
@code{gnulib-tool} has support for these techniques in the situation of
@code{--create-testdir --single-configure}, which basically has two
@code{gnulib-tool} invocations, one for a set of modules that end up in
@code{gllib}, and one for the set of modules that end up in
@code{gltests}.  But you should be aware that this does not cover the
general situation.

Which technique to use, depends on the answer to the question: ``If my
module occurs among the modules of @code{gltests}, should it have an
effect on the modules in @code{gllib}?''

If the answer is ``no'', your module description should invoke the
Autoconf macro @code{gl_MODULE_INDICATOR}.  This Autoconf macro takes
one argument: the name of your module.  The effect of
@code{gl_MODULE_INDICATOR([@var{my-module}])} is to define, in
@code{config.h}, a C macro @code{GNULIB_@var{MY_MODULE}} that indicates
whether your macro is considered to be present.  This works even when
your macro is used in @code{gltests}: @code{GNULIB_@var{MY_MODULE}}
will then evaluate to 1 in @code{gltests} but to 0 in @code{gllib}.

If the answer is ``yes'', you have two techniques available.  The first
one is to invoke a similar Autoconf macro, named
@code{gl_MODULE_INDICATOR_FOR_TESTS}.  It works similarly.  However,
when your macro is used in @code{gltests}, @code{GNULIB_@var{MY_MODULE}}
will evaluate to 1 both in @code{gltests} and in @code{gllib}.

The second one is to define a shell variable in the @code{configure}
file that tells whether your module is present, through use of
@code{m4_divert_text}.  The Autoconf macros of a dependency module will
initialize this shell variable, through
@samp{m4_divert_text([DEFAULTS], [@var{my_shell_var}=no])}.  The
Autoconf macros of your module will override this value, through
@samp{m4_divert_text([INIT_PREPARE], [@var{my_shell_var}=yes])}.  Then
you can use @code{@var{my_shell_var}} in the Autoconf macros of both
modules.  You can find more details about this technique in the Gnulib
module @code{getopt-gnu}.

Reminder: These techniques are advanced.  They have the potential to
cause lots of headaches if you apply them incorrectly.