summaryrefslogtreecommitdiff
path: root/gtk+-mingw/share/info/libtool.info-1
diff options
context:
space:
mode:
authorLeo Tenenbaum <pommicket@gmail.com>2018-08-20 21:12:06 -0400
committerLeo Tenenbaum <pommicket@gmail.com>2018-08-20 21:12:06 -0400
commit63e87c2d0c9d263f14c77b68f85c67d46ece82a9 (patch)
tree6260365cbf7d24f37d27669e8538227fcb72e243 /gtk+-mingw/share/info/libtool.info-1
parenta4460f6d9453bbd7e584937686449cef3e19f052 (diff)
Removed gtk+ docsHEADmaster
Diffstat (limited to 'gtk+-mingw/share/info/libtool.info-1')
-rw-r--r--gtk+-mingw/share/info/libtool.info-16698
1 files changed, 0 insertions, 6698 deletions
diff --git a/gtk+-mingw/share/info/libtool.info-1 b/gtk+-mingw/share/info/libtool.info-1
deleted file mode 100644
index 6d16648..0000000
--- a/gtk+-mingw/share/info/libtool.info-1
+++ /dev/null
@@ -1,6698 +0,0 @@
-This is doc/libtool.info, produced by makeinfo version 4.13 from
-./doc/libtool.texi.
-
-INFO-DIR-SECTION GNU programming tools
-START-INFO-DIR-ENTRY
-* Libtool: (libtool). Generic shared library support script.
-END-INFO-DIR-ENTRY
-
-INFO-DIR-SECTION Individual utilities
-START-INFO-DIR-ENTRY
-* libtool-invocation: (libtool)Invoking libtool.
- Running the `libtool' script.
-* libtoolize: (libtool)Invoking libtoolize. Adding libtool support.
-END-INFO-DIR-ENTRY
-
- This file documents GNU Libtool 2.4.2
-
- Copyright (C) 1996-2011 Free Software Foundation, Inc.
-
- Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version 1.3 or
-any later version published by the Free Software Foundation; with no
-Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
-Texts. A copy of the license is included in the section entitled "GNU
-Free Documentation License".
-
-
-File: libtool.info, Node: Top, Next: Introduction, Prev: (dir), Up: (dir)
-
-Shared library support for GNU
-******************************
-
-This file documents GNU Libtool, a script that allows package developers
-to provide generic shared library support. This edition documents
-version 2.4.2.
-
- *Note Reporting bugs::, for information on how to report problems
-with GNU Libtool.
-
-* Menu:
-
-* Introduction:: What the heck is libtool?
-* Libtool paradigm:: How libtool's view of libraries is different.
-* Using libtool:: Example of using libtool to build libraries.
-* Invoking libtool:: Running the `libtool' script.
-* Integrating libtool:: Using libtool in your own packages.
-* Other languages:: Using libtool without a C compiler.
-* Versioning:: Using library interface versions.
-* Library tips:: Tips for library interface design.
-* Inter-library dependencies:: Libraries that depend on other libraries.
-* Dlopened modules:: `dlopen'ing libtool-created libraries.
-* Using libltdl:: Libtool's portable `dlopen' wrapper library.
-* Trace interface:: Libtool's trace interface.
-* FAQ:: Frequently Asked Questions
-* Troubleshooting:: When libtool doesn't work as advertised.
-* Maintaining:: Information used by the libtool maintainer.
-* GNU Free Documentation License:: License for this manual.
-* Combined Index:: Full index.
-
- --- The Detailed Node Listing ---
-
-Introduction
-
-* Motivation:: Why does GNU need a libtool?
-* Issues:: The problems that need to be addressed.
-* Other implementations:: How other people have solved these issues.
-* Postmortem:: Learning from past difficulties.
-
-Using libtool
-
-* Creating object files:: Compiling object files for libraries.
-* Linking libraries:: Creating libraries from object files.
-* Linking executables:: Linking object files against libtool libraries.
-* Debugging executables:: Running GDB on libtool-generated programs.
-* Installing libraries:: Making libraries available to users.
-* Installing executables:: Making programs available to users.
-* Static libraries:: When shared libraries are not wanted.
-
-Linking executables
-
-* Wrapper executables:: Wrapper executables for some platforms.
-
-Invoking `libtool'
-
-* Compile mode:: Creating library object files.
-* Link mode:: Generating executables and libraries.
-* Execute mode:: Debugging libtool-generated programs.
-* Install mode:: Making libraries and executables public.
-* Finish mode:: Completing a library installation.
-* Uninstall mode:: Removing installed executables and libraries.
-* Clean mode:: Removing uninstalled executables and libraries.
-
-Integrating libtool with your package
-
-* Autoconf macros:: Autoconf macros exported by libtool.
-* Makefile rules:: Writing `Makefile' rules for libtool.
-* Using Automake:: Automatically supporting libtool.
-* Configuring:: Configuring libtool for a host system.
-* Distributing:: What files to distribute with your package.
-* Static-only libraries:: Sometimes shared libraries are just a pain.
-
-Configuring libtool
-
-* LT_INIT:: Configuring `libtool' in `configure.ac'.
-* Configure notes:: Platform-specific notes for configuration.
-
-Including libtool in your package
-
-* Invoking libtoolize:: `libtoolize' command line options.
-* Autoconf and LTLIBOBJS:: Autoconf automates LTLIBOBJS generation.
-
-Using libtool with other languages
-
-* C++ libraries:: Writing libraries for C++
-* Tags:: Tags
-
-Library interface versions
-
-* Interfaces:: What are library interfaces?
-* Libtool versioning:: Libtool's versioning system.
-* Updating version info:: Changing version information before releases.
-* Release numbers:: Breaking binary compatibility for aesthetics.
-
-Tips for interface design
-
-* C header files:: How to write portable include files.
-
-Dlopened modules
-
-* Building modules:: Creating dlopenable objects and libraries.
-* Dlpreopening:: Dlopening that works on static platforms.
-* Linking with dlopened modules:: Using dlopenable modules in libraries.
-* Finding the dlname:: Choosing the right file to `dlopen'.
-* Dlopen issues:: Unresolved problems that need your attention.
-
-Using libltdl
-
-* Libltdl interface:: How to use libltdl in your programs.
-* Modules for libltdl:: Creating modules that can be `dlopen'ed.
-* Thread Safety in libltdl:: Registering callbacks for multi-thread safety.
-* User defined module data:: Associating data with loaded modules.
-* Module loaders for libltdl:: Creating user defined module loaders.
-* Distributing libltdl:: How to distribute libltdl with your package.
-
-Frequently Asked Questions about libtool
-
-* Stripped link flags:: Dropped flags when creating a library
-
-Troubleshooting
-
-* Libtool test suite:: Libtool's self-tests.
-* Reporting bugs:: How to report problems with libtool.
-
-The libtool test suite
-
-* Test descriptions:: The contents of the old test suite.
-* When tests fail:: What to do when a test fails.
-
-Maintenance notes for libtool
-
-* New ports:: How to port libtool to new systems.
-* Tested platforms:: When libtool was last tested.
-* Platform quirks:: Information about different library systems.
-* libtool script contents:: Configuration information that libtool uses.
-* Cheap tricks:: Making libtool maintainership easier.
-
-Porting libtool to new systems
-
-* Information sources:: Where to find relevant documentation
-* Porting inter-library dependencies:: Implementation details explained
-
-Platform quirks
-
-* References:: Finding more information.
-* Compilers:: Creating object files from source files.
-* Reloadable objects:: Binding object files together.
-* Multiple dependencies:: Removing duplicate dependent libraries.
-* Archivers:: Programs that create static archives.
-* Cross compiling:: Issues that arise when cross compiling.
-* File name conversion:: Converting file names between platforms.
-* Windows DLLs:: Windows header defines.
-
-File name conversion
-
-* File Name Conversion Failure:: What happens when file name conversion fails
-* Native MinGW File Name Conversion:: MSYS file name conversion idiosyncrasies
-* Cygwin/Windows File Name Conversion:: Using `cygpath' to convert Cygwin file names
-* Unix/Windows File Name Conversion:: Using Wine to convert Unix paths
-* LT_CYGPATH:: Invoking `cygpath' from other environments
-* Cygwin to MinGW Cross:: Other notes concerning MinGW cross
-
-
-File: libtool.info, Node: Introduction, Next: Libtool paradigm, Prev: Top, Up: Top
-
-1 Introduction
-**************
-
-In the past, if you were a source code package developer and wanted to
-take advantage of the power of shared libraries, you needed to write
-custom support code for each platform on which your package ran. You
-also had to design a configuration interface so that the package
-installer could choose what sort of libraries were built.
-
- GNU Libtool simplifies your job by encapsulating both the
-platform-specific dependencies, and the user interface, in a single
-script. GNU Libtool is designed so that the complete functionality of
-each host type is available via a generic interface, but nasty quirks
-are hidden from the programmer.
-
- GNU Libtool's consistent interface is reassuring... users don't need
-to read obscure documentation in order to have their favorite source
-package build shared libraries. They just run your package `configure'
-script (or equivalent), and libtool does all the dirty work.
-
- There are several examples throughout this document. All assume the
-same environment: we want to build a library, `libhello', in a generic
-way.
-
- `libhello' could be a shared library, a static library, or both...
-whatever is available on the host system, as long as libtool has been
-ported to it.
-
- This chapter explains the original design philosophy of libtool.
-Feel free to skip to the next chapter, unless you are interested in
-history, or want to write code to extend libtool in a consistent way.
-
-* Menu:
-
-* Motivation:: Why does GNU need a libtool?
-* Issues:: The problems that need to be addressed.
-* Other implementations:: How other people have solved these issues.
-* Postmortem:: Learning from past difficulties.
-
-
-File: libtool.info, Node: Motivation, Next: Issues, Up: Introduction
-
-1.1 Motivation for writing libtool
-==================================
-
-Since early 1995, several different GNU developers have recognized the
-importance of having shared library support for their packages. The
-primary motivation for such a change is to encourage modularity and
-reuse of code (both conceptually and physically) in GNU programs.
-
- Such a demand means that the way libraries are built in GNU packages
-needs to be general, to allow for any library type the package installer
-might want. The problem is compounded by the absence of a standard
-procedure for creating shared libraries on different platforms.
-
- The following sections outline the major issues facing shared library
-support in GNU, and how shared library support could be standardized
-with libtool.
-
- The following specifications were used in developing and evaluating
-this system:
-
- 1. The system must be as elegant as possible.
-
- 2. The system must be fully integrated with the GNU Autoconf and
- Automake utilities, so that it will be easy for GNU maintainers to
- use. However, the system must not require these tools, so that it
- can be used by non-GNU packages.
-
- 3. Portability to other (non-GNU) architectures and tools is
- desirable.
-
-
-File: libtool.info, Node: Issues, Next: Other implementations, Prev: Motivation, Up: Introduction
-
-1.2 Implementation issues
-=========================
-
-The following issues need to be addressed in any reusable shared library
-system, specifically libtool:
-
- 1. The package installer should be able to control what sort of
- libraries are built.
-
- 2. It can be tricky to run dynamically linked programs whose
- libraries have not yet been installed. `LD_LIBRARY_PATH' must be
- set properly (if it is supported), or programs fail to run.
-
- 3. The system must operate consistently even on hosts that don't
- support shared libraries.
-
- 4. The commands required to build shared libraries may differ wildly
- from host to host. These need to be determined at configure time
- in a consistent way.
-
- 5. It is not always obvious with what prefix or suffix a shared
- library should be installed. This makes it difficult for
- `Makefile' rules, since they generally assume that file names are
- the same from host to host.
-
- 6. The system needs a simple library version number abstraction, so
- that shared libraries can be upgraded in place. The programmer
- should be informed how to design the interfaces to the library to
- maximize binary compatibility.
-
- 7. The install `Makefile' target should warn the package installer to
- set the proper environment variables (`LD_LIBRARY_PATH' or
- equivalent), or run `ldconfig'.
-
-
-File: libtool.info, Node: Other implementations, Next: Postmortem, Prev: Issues, Up: Introduction
-
-1.3 Other implementations
-=========================
-
-Even before libtool was developed, many free software packages built and
-installed their own shared libraries. At first, these packages were
-examined to avoid reinventing existing features.
-
- Now it is clear that none of these packages have documented the
-details of shared library systems that libtool requires. So, other
-packages have been more or less abandoned as influences.
-
-
-File: libtool.info, Node: Postmortem, Prev: Other implementations, Up: Introduction
-
-1.4 A postmortem analysis of other implementations
-==================================================
-
-In all fairness, each of the implementations that were examined do the
-job that they were intended to do, for a number of different host
-systems. However, none of these solutions seem to function well as a
-generalized, reusable component.
-
- Most were too complex to use (much less modify) without understanding
-exactly what the implementation does, and they were generally not
-documented.
-
- The main difficulty is that different vendors have different views of
-what libraries are, and none of the packages that were examined seemed
-to be confident enough to settle on a single paradigm that just _works_.
-
- Ideally, libtool would be a standard that would be implemented as
-series of extensions and modifications to existing library systems to
-make them work consistently. However, it is not an easy task to
-convince operating system developers to mend their evil ways, and
-people want to build shared libraries right now, even on buggy, broken,
-confused operating systems.
-
- For this reason, libtool was designed as an independent shell script.
-It isolates the problems and inconsistencies in library building that
-plague `Makefile' writers by wrapping the compiler suite on different
-platforms with a consistent, powerful interface.
-
- With luck, libtool will be useful to and used by the GNU community,
-and that the lessons that were learned in writing it will be taken up by
-designers of future library systems.
-
-
-File: libtool.info, Node: Libtool paradigm, Next: Using libtool, Prev: Introduction, Up: Top
-
-2 The libtool paradigm
-**********************
-
-At first, libtool was designed to support an arbitrary number of library
-object types. After libtool was ported to more platforms, a new
-paradigm gradually developed for describing the relationship between
-libraries and programs.
-
- In summary, "libraries are programs with multiple entry points, and
-more formally defined interfaces."
-
- Version 0.7 of libtool was a complete redesign and rewrite of
-libtool to reflect this new paradigm. So far, it has proved to be
-successful: libtool is simpler and more useful than before.
-
- The best way to introduce the libtool paradigm is to contrast it with
-the paradigm of existing library systems, with examples from each. It
-is a new way of thinking, so it may take a little time to absorb, but
-when you understand it, the world becomes simpler.
-
-
-File: libtool.info, Node: Using libtool, Next: Invoking libtool, Prev: Libtool paradigm, Up: Top
-
-3 Using libtool
-***************
-
-It makes little sense to talk about using libtool in your own packages
-until you have seen how it makes your life simpler. The examples in
-this chapter introduce the main features of libtool by comparing the
-standard library building procedure to libtool's operation on two
-different platforms:
-
-`a23'
- An Ultrix 4.2 platform with only static libraries.
-
-`burger'
- A NetBSD/i386 1.2 platform with shared libraries.
-
- You can follow these examples on your own platform, using the
-preconfigured libtool script that was installed with libtool (*note
-Configuring::).
-
- Source files for the following examples are taken from the `demo'
-subdirectory of the libtool distribution. Assume that we are building a
-library, `libhello', out of the files `foo.c' and `hello.c'.
-
- Note that the `foo.c' source file uses the `cos' math library
-function, which is usually found in the standalone math library, and not
-the C library (*note Trigonometric Functions: (libc)Trig Functions.).
-So, we need to add `-lm' to the end of the link line whenever we link
-`foo.lo' into an executable or a library (*note Inter-library
-dependencies::).
-
- The same rule applies whenever you use functions that don't appear in
-the standard C library... you need to add the appropriate `-lNAME' flag
-to the end of the link line when you link against those objects.
-
- After we have built that library, we want to create a program by
-linking `main.o' against `libhello'.
-
-* Menu:
-
-* Creating object files:: Compiling object files for libraries.
-* Linking libraries:: Creating libraries from object files.
-* Linking executables:: Linking object files against libtool libraries.
-* Debugging executables:: Running GDB on libtool-generated programs.
-* Installing libraries:: Making libraries available to users.
-* Installing executables:: Making programs available to users.
-* Static libraries:: When shared libraries are not wanted.
-
-
-File: libtool.info, Node: Creating object files, Next: Linking libraries, Up: Using libtool
-
-3.1 Creating object files
-=========================
-
-To create an object file from a source file, the compiler is invoked
-with the `-c' flag (and any other desired flags):
-
- burger$ gcc -g -O -c main.c
- burger$
-
- The above compiler command produces an object file, usually named
-`main.o', from the source file `main.c'.
-
- For most library systems, creating object files that become part of a
-static library is as simple as creating object files that are linked to
-form an executable:
-
- burger$ gcc -g -O -c foo.c
- burger$ gcc -g -O -c hello.c
- burger$
-
- Shared libraries, however, may only be built from
-"position-independent code" (PIC). So, special flags must be passed to
-the compiler to tell it to generate PIC rather than the standard
-position-dependent code.
-
- Since this is a library implementation detail, libtool hides the
-complexity of PIC compiler flags and uses separate library object files
-(the PIC one lives in the `.libs' subdirectory and the static one lives
-in the current directory). On systems without shared libraries, the
-PIC library object files are not created, whereas on systems where all
-code is PIC, such as AIX, the static ones are not created.
-
- To create library object files for `foo.c' and `hello.c', simply
-invoke libtool with the standard compilation command as arguments
-(*note Compile mode::):
-
- a23$ libtool --mode=compile gcc -g -O -c foo.c
- gcc -g -O -c foo.c -o foo.o
- a23$ libtool --mode=compile gcc -g -O -c hello.c
- gcc -g -O -c hello.c -o hello.o
- a23$
-
- Note that libtool silently creates an additional control file on each
-`compile' invocation. The `.lo' file is the libtool object, which
-Libtool uses to determine what object file may be built into a shared
-library. On `a23', only static libraries are supported so the library
-objects look like this:
-
- # foo.lo - a libtool object file
- # Generated by ltmain.sh (GNU libtool) 2.4.2
- #
- # Please DO NOT delete this file!
- # It is necessary for linking the library.
-
- # Name of the PIC object.
- pic_object=none
-
- # Name of the non-PIC object.
- non_pic_object='foo.o'
-
- On shared library systems, libtool automatically generates an
-additional PIC object by inserting the appropriate PIC generation flags
-into the compilation command:
-
- burger$ libtool --mode=compile gcc -g -O -c foo.c
- mkdir .libs
- gcc -g -O -c foo.c -fPIC -DPIC -o .libs/foo.o
- gcc -g -O -c foo.c -o foo.o >/dev/null 2>&1
- burger$
-
- Note that Libtool automatically created `.libs' directory upon its
-first execution, where PIC library object files will be stored.
-
- Since `burger' supports shared libraries, and requires PIC objects
-to build them, Libtool has compiled a PIC object this time, and made a
-note of it in the libtool object:
-
- # foo.lo - a libtool object file
- # Generated by ltmain.sh (GNU libtool) 2.4.2
- #
- # Please DO NOT delete this file!
- # It is necessary for linking the library.
-
- # Name of the PIC object.
- pic_object='.libs/foo.o'
-
- # Name of the non-PIC object.
- non_pic_object='foo.o'
-
- Notice that the second run of GCC has its output discarded. This is
-done so that compiler warnings aren't annoyingly duplicated. If you
-need to see both sets of warnings (you might have conditional code
-inside `#ifdef PIC' for example), you can turn off suppression with the
-`-no-suppress' option to libtool's compile mode:
-
- burger$ libtool --mode=compile gcc -no-suppress -g -O -c hello.c
- gcc -g -O -c hello.c -fPIC -DPIC -o .libs/hello.o
- gcc -g -O -c hello.c -o hello.o
- burger$
-
-
-File: libtool.info, Node: Linking libraries, Next: Linking executables, Prev: Creating object files, Up: Using libtool
-
-3.2 Linking libraries
-=====================
-
-Without libtool, the programmer would invoke the `ar' command to create
-a static library:
-
- burger$ ar cru libhello.a hello.o foo.o
- burger$
-
- But of course, that would be too simple, so many systems require that
-you run the `ranlib' command on the resulting library (to give it
-better karma, or something):
-
- burger$ ranlib libhello.a
- burger$
-
- It seems more natural to use the C compiler for this task, given
-libtool's "libraries are programs" approach. So, on platforms without
-shared libraries, libtool simply acts as a wrapper for the system `ar'
-(and possibly `ranlib') commands.
-
- Again, the libtool control file name (`.la' suffix) differs from the
-standard library name (`.a' suffix). The arguments to libtool are the
-same ones you would use to produce an executable named `libhello.la'
-with your compiler (*note Link mode::):
-
- a23$ libtool --mode=link gcc -g -O -o libhello.la foo.o hello.o
- *** Warning: Linking the shared library libhello.la against the
- *** non-libtool objects foo.o hello.o is not portable!
- ar cru .libs/libhello.a
- ranlib .libs/libhello.a
- creating libhello.la
- (cd .libs && rm -f libhello.la && ln -s ../libhello.la libhello.la)
- a23$
-
- Aha! Libtool caught a common error... trying to build a library
-from standard objects instead of special `.lo' object files. This
-doesn't matter so much for static libraries, but on shared library
-systems, it is of great importance. (Note that you may replace
-`libhello.la' with `libhello.a' in which case libtool won't issue the
-warning any more. But although this method works, this is not intended
-to be used because it makes you lose the benefits of using Libtool.)
-
- So, let's try again, this time with the library object files.
-Remember also that we need to add `-lm' to the link command line because
-`foo.c' uses the `cos' math library function (*note Using libtool::).
-
- Another complication in building shared libraries is that we need to
-specify the path to the directory in which they (eventually) will be
-installed (in this case, `/usr/local/lib')(1):
-
- a23$ libtool --mode=link gcc -g -O -o libhello.la foo.lo hello.lo \
- -rpath /usr/local/lib -lm
- ar cru .libs/libhello.a foo.o hello.o
- ranlib .libs/libhello.a
- creating libhello.la
- (cd .libs && rm -f libhello.la && ln -s ../libhello.la libhello.la)
- a23$
-
- Now, let's try the same trick on the shared library platform:
-
- burger$ libtool --mode=link gcc -g -O -o libhello.la foo.lo hello.lo \
- -rpath /usr/local/lib -lm
- rm -fr .libs/libhello.a .libs/libhello.la
- ld -Bshareable -o .libs/libhello.so.0.0 .libs/foo.o .libs/hello.o -lm
- ar cru .libs/libhello.a foo.o hello.o
- ranlib .libs/libhello.a
- creating libhello.la
- (cd .libs && rm -f libhello.la && ln -s ../libhello.la libhello.la)
- burger$
-
- Now that's significantly cooler... Libtool just ran an obscure `ld'
-command to create a shared library, as well as the static library.
-
- Note how libtool creates extra files in the `.libs' subdirectory,
-rather than the current directory. This feature is to make it easier
-to clean up the build directory, and to help ensure that other programs
-fail horribly if you accidentally forget to use libtool when you should.
-
- Again, you may want to have a look at the `.la' file in order to see
-what Libtool stores in it. In particular, you will see that Libtool
-uses this file to remember the destination directory for the library
-(the argument to `-rpath') as well as the dependency on the math
-library (`-lm').
-
- ---------- Footnotes ----------
-
- (1) If you don't specify an `rpath', then libtool builds a libtool
-convenience archive, not a shared library (*note Static libraries::).
-
-
-File: libtool.info, Node: Linking executables, Next: Debugging executables, Prev: Linking libraries, Up: Using libtool
-
-3.3 Linking executables
-=======================
-
-If you choose at this point to "install" the library (put it in a
-permanent location) before linking executables against it, then you
-don't need to use libtool to do the linking. Simply use the appropriate
-`-L' and `-l' flags to specify the library's location.
-
- Some system linkers insist on encoding the full directory name of
-each shared library in the resulting executable. Libtool has to work
-around this misfeature by special magic to ensure that only permanent
-directory names are put into installed executables.
-
- The importance of this bug must not be overlooked: it won't cause
-programs to crash in obvious ways. It creates a security hole, and
-possibly even worse, if you are modifying the library source code after
-you have installed the package, you will change the behaviour of the
-installed programs!
-
- So, if you want to link programs against the library before you
-install it, you must use libtool to do the linking.
-
- Here's the old way of linking against an uninstalled library:
-
- burger$ gcc -g -O -o hell.old main.o libhello.a -lm
- burger$
-
- Libtool's way is almost the same(1) (*note Link mode::):
-
- a23$ libtool --mode=link gcc -g -O -o hell main.o libhello.la
- gcc -g -O -o hell main.o ./.libs/libhello.a -lm
- a23$
-
- That looks too simple to be true. All libtool did was transform
-`libhello.la' to `./.libs/libhello.a', but remember that `a23' has no
-shared libraries. Notice that Libtool also remembered that
-`libhello.la' depends on `-lm', so even though we didn't specify `-lm'
-on the libtool command line(2) Libtool has added it to the `gcc' link
-line for us.
-
- On `burger' Libtool links against the uninstalled shared library:
-
- burger$ libtool --mode=link gcc -g -O -o hell main.o libhello.la
- gcc -g -O -o .libs/hell main.o -L./.libs -R/usr/local/lib -lhello -lm
- creating hell
- burger$
-
- Now assume `libhello.la' had already been installed, and you want to
-link a new program with it. You could figure out where it lives by
-yourself, then run:
-
- burger$ gcc -g -O -o test test.o -L/usr/local/lib -lhello -lm
-
- However, unless `/usr/local/lib' is in the standard library search
-path, you won't be able to run `test'. However, if you use libtool to
-link the already-installed libtool library, it will do The Right Thing
-(TM) for you:
-
- burger$ libtool --mode=link gcc -g -O -o test test.o \
- /usr/local/lib/libhello.la
- gcc -g -O -o .libs/test test.o -Wl,--rpath \
- -Wl,/usr/local/lib /usr/local/lib/libhello.a -lm
- creating test
- burger$
-
- Note that libtool added the necessary run-time path flag, as well as
-`-lm', the library libhello.la depended upon. Nice, huh?
-
- Notice that the executable, `hell', was actually created in the
-`.libs' subdirectory. Then, a wrapper script (or, on certain
-platforms, a wrapper executable *note Wrapper executables::) was
-created in the current directory.
-
- Since libtool created a wrapper script, you should use libtool to
-install it and debug it too. However, since the program does not depend
-on any uninstalled libtool library, it is probably usable even without
-the wrapper script.
-
- On NetBSD 1.2, libtool encodes the installation directory of
-`libhello', by using the `-R/usr/local/lib' compiler flag. Then, the
-wrapper script guarantees that the executable finds the correct shared
-library (the one in `./.libs') until it is properly installed.
-
- Let's compare the two different programs:
-
- burger$ time ./hell.old
- Welcome to GNU Hell!
- ** This is not GNU Hello. There is no built-in mail reader. **
- 0.21 real 0.02 user 0.08 sys
- burger$ time ./hell
- Welcome to GNU Hell!
- ** This is not GNU Hello. There is no built-in mail reader. **
- 0.63 real 0.09 user 0.59 sys
- burger$
-
- The wrapper script takes significantly longer to execute, but at
-least the results are correct, even though the shared library hasn't
-been installed yet.
-
- So, what about all the space savings that shared libraries are
-supposed to yield?
-
- burger$ ls -l hell.old libhello.a
- -rwxr-xr-x 1 gord gord 15481 Nov 14 12:11 hell.old
- -rw-r--r-- 1 gord gord 4274 Nov 13 18:02 libhello.a
- burger$ ls -l .libs/hell .libs/libhello.*
- -rwxr-xr-x 1 gord gord 11647 Nov 14 12:10 .libs/hell
- -rw-r--r-- 1 gord gord 4274 Nov 13 18:44 .libs/libhello.a
- -rwxr-xr-x 1 gord gord 12205 Nov 13 18:44 .libs/libhello.so.0.0
- burger$
-
- Well, that sucks. Maybe I should just scrap this project and take up
-basket weaving.
-
- Actually, it just proves an important point: shared libraries incur
-overhead because of their (relative) complexity. In this situation, the
-price of being dynamic is eight kilobytes, and the payoff is about four
-kilobytes. So, having a shared `libhello' won't be an advantage until
-we link it against at least a few more programs.
-
-* Menu:
-
-* Wrapper executables:: Wrapper executables for some platforms.
-
- ---------- Footnotes ----------
-
- (1) However, you should avoid using `-L' or `-l' flags to link
-against an uninstalled libtool library. Just specify the relative path
-to the `.la' file, such as `../intl/libintl.la'. This is a design
-decision to eliminate any ambiguity when linking against uninstalled
-shared libraries.
-
- (2) And why should we? `main.o' doesn't directly depend on `-lm'
-after all.
-
-
-File: libtool.info, Node: Wrapper executables, Up: Linking executables
-
-3.3.1 Wrapper executables for uninstalled programs
---------------------------------------------------
-
-Some platforms, notably those hosted on Windows such as Cygwin and
-MinGW, use a wrapper executable rather than a wrapper script to ensure
-proper operation of uninstalled programs linked by libtool against
-uninstalled shared libraries. The wrapper executable thus performs the
-same function as the wrapper script used on other platforms, but allows
-to satisfy the `make' rules for the program, whose name ends in
-`$(EXEEXT)'. The actual program executable is created below .libs, and
-its name will end in `$(EXEEXT)' and may or may not contain an `lt-'
-prefix. This wrapper executable sets various environment values so
-that the program executable may locate its (uninstalled) shared
-libraries, and then launches the program executable.
-
- The wrapper executable provides a debug mode, enabled by passing the
-command-line option `--lt-debug' (see below). When executing in debug
-mode, diagnostic information will be printed to `stderr' before the
-program executable is launched.
-
- Finally, the wrapper executable supports a number of command line
-options that may be useful when debugging the operation of the wrapper
-system. All of these options begin with `--lt-', and if present they
-and their arguments will be removed from the argument list passed on to
-the program executable. Therefore, the program executable may not
-employ command line options that begin with `--lt-'. (In fact, the
-wrapper executable will detect any command line options that begin with
-`--lt-' and abort with an error message if the option is not
-recognized). If this presents a problem, please contact the Libtool
-team at the Libtool bug reporting address <bug-libtool@gnu.org>.
-
- These command line options include:
-
-`--lt-dump-script'
- Causes the wrapper to print a copy of the wrapper _script_ to
- `stdout', and exit.
-
-`--lt-debug'
- Causes the wrapper to print diagnostic information to `stdout',
- before launching the program executable.
-
-
- For consistency, both the wrapper _script_ and the wrapper
-_executable_ support these options.
-
-
-File: libtool.info, Node: Debugging executables, Next: Installing libraries, Prev: Linking executables, Up: Using libtool
-
-3.4 Debugging executables
-=========================
-
-If `hell' was a complicated program, you would certainly want to test
-and debug it before installing it on your system. In the above
-section, you saw how the libtool wrapper script makes it possible to run
-the program directly, but unfortunately, this mechanism interferes with
-the debugger:
-
- burger$ gdb hell
- GDB is free software and you are welcome to distribute copies of it
- under certain conditions; type "show copying" to see the conditions.
- There is no warranty for GDB; type "show warranty" for details.
- GDB 4.16 (i386-unknown-netbsd), (C) 1996 Free Software Foundation, Inc.
-
- "hell": not in executable format: File format not recognized
-
- (gdb) quit
- burger$
-
- Sad. It doesn't work because GDB doesn't know where the executable
-lives. So, let's try again, by invoking GDB directly on the executable:
-
- burger$ gdb .libs/hell
- GNU gdb 5.3 (i386-unknown-netbsd)
- Copyright 2002 Free Software Foundation, Inc.
- GDB is free software, covered by the GNU General Public License,
- and you are welcome to change it and/or distribute copies of it
- under certain conditions. Type "show copying" to see the conditions.
- There is no warranty for GDB. Type "show warranty" for details.
- (gdb) break main
- Breakpoint 1 at 0x8048547: file main.c, line 29.
- (gdb) run
- Starting program: /home/src/libtool/demo/.libs/hell
- /home/src/libtool/demo/.libs/hell: can't load library 'libhello.so.0'
-
- Program exited with code 020.
- (gdb) quit
- burger$
-
- Argh. Now GDB complains because it cannot find the shared library
-that `hell' is linked against. So, we must use libtool in order to
-properly set the library path and run the debugger. Fortunately, we can
-forget all about the `.libs' directory, and just run it on the
-executable wrapper (*note Execute mode::):
-
- burger$ libtool --mode=execute gdb hell
- GNU gdb 5.3 (i386-unknown-netbsd)
- Copyright 2002 Free Software Foundation, Inc.
- GDB is free software, covered by the GNU General Public License,
- and you are welcome to change it and/or distribute copies of it
- under certain conditions. Type "show copying" to see the conditions.
- There is no warranty for GDB. Type "show warranty" for details.
- (gdb) break main
- Breakpoint 1 at 0x8048547: file main.c, line 29.
- (gdb) run
- Starting program: /home/src/libtool/demo/.libs/hell
-
- Breakpoint 1, main (argc=1, argv=0xbffffc40) at main.c:29
- 29 printf ("Welcome to GNU Hell!\n");
- (gdb) quit
- The program is running. Quit anyway (and kill it)? (y or n) y
- burger$
-
-
-File: libtool.info, Node: Installing libraries, Next: Installing executables, Prev: Debugging executables, Up: Using libtool
-
-3.5 Installing libraries
-========================
-
-Installing libraries on a non-libtool system is quite
-straightforward... just copy them into place:(1)
-
- burger$ su
- Password: ********
- burger# cp libhello.a /usr/local/lib/libhello.a
- burger#
-
- Oops, don't forget the `ranlib' command:
-
- burger# ranlib /usr/local/lib/libhello.a
- burger#
-
- Libtool installation is quite simple, as well. Just use the
-`install' or `cp' command that you normally would (*note Install
-mode::):
-
- a23# libtool --mode=install cp libhello.la /usr/local/lib/libhello.la
- cp libhello.la /usr/local/lib/libhello.la
- cp .libs/libhello.a /usr/local/lib/libhello.a
- ranlib /usr/local/lib/libhello.a
- a23#
-
- Note that the libtool library `libhello.la' is also installed, to
-help libtool with uninstallation (*note Uninstall mode::) and linking
-(*note Linking executables::) and to help programs with dlopening
-(*note Dlopened modules::).
-
- Here is the shared library example:
-
- burger# libtool --mode=install install -c libhello.la \
- /usr/local/lib/libhello.la
- install -c .libs/libhello.so.0.0 /usr/local/lib/libhello.so.0.0
- install -c libhello.la /usr/local/lib/libhello.la
- install -c .libs/libhello.a /usr/local/lib/libhello.a
- ranlib /usr/local/lib/libhello.a
- burger#
-
- It is safe to specify the `-s' (strip symbols) flag if you use a
-BSD-compatible install program when installing libraries. Libtool will
-either ignore the `-s' flag, or will run a program that will strip only
-debugging and compiler symbols from the library.
-
- Once the libraries have been put in place, there may be some
-additional configuration that you need to do before using them. First,
-you must make sure that where the library is installed actually agrees
-with the `-rpath' flag you used to build it.
-
- Then, running `libtool -n finish LIBDIR' can give you further hints
-on what to do (*note Finish mode::):
-
- burger# libtool -n finish /usr/local/lib
- PATH="$PATH:/sbin" ldconfig -m /usr/local/lib
- -----------------------------------------------------------------
- Libraries have been installed in:
- /usr/local/lib
-
- To link against installed libraries in a given directory, LIBDIR,
- you must use the `-LLIBDIR' flag during linking.
-
- You will also need to do one of the following:
- - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
- during execution
- - add LIBDIR to the `LD_RUN_PATH' environment variable
- during linking
- - use the `-RLIBDIR' linker flag
-
- See any operating system documentation about shared libraries for
- more information, such as the ld and ld.so manual pages.
- -----------------------------------------------------------------
- burger#
-
- After you have completed these steps, you can go on to begin using
-the installed libraries. You may also install any executables that
-depend on libraries you created.
-
- ---------- Footnotes ----------
-
- (1) Don't strip static libraries though, or they will be unusable.
-
-
-File: libtool.info, Node: Installing executables, Next: Static libraries, Prev: Installing libraries, Up: Using libtool
-
-3.6 Installing executables
-==========================
-
-If you used libtool to link any executables against uninstalled libtool
-libraries (*note Linking executables::), you need to use libtool to
-install the executables after the libraries have been installed (*note
-Installing libraries::).
-
- So, for our Ultrix example, we would run:
-
- a23# libtool --mode=install -c hell /usr/local/bin/hell
- install -c hell /usr/local/bin/hell
- a23#
-
- On shared library systems that require wrapper scripts, libtool just
-ignores the wrapper script and installs the correct binary:
-
- burger# libtool --mode=install -c hell /usr/local/bin/hell
- install -c .libs/hell /usr/local/bin/hell
- burger#
-
-
-File: libtool.info, Node: Static libraries, Prev: Installing executables, Up: Using libtool
-
-3.7 Linking static libraries
-============================
-
-Why return to `ar' and `ranlib' silliness when you've had a taste of
-libtool? Well, sometimes it is desirable to create a static archive
-that can never be shared. The most frequent case is when you have a
-set of object files that you use to build several different libraries.
-You can create a "convenience library" out of those objects, and link
-against that with the other libraries, instead of listing all the
-object files every time.
-
- If you just want to link this convenience library into programs, then
-you could just ignore libtool entirely, and use the old `ar' and
-`ranlib' commands (or the corresponding GNU Automake `_LIBRARIES'
-rules). You can even install a convenience library using GNU Libtool,
-though you probably don't want to and hence GNU Automake doesn't allow
-you to do so.
-
- burger$ libtool --mode=install ./install-sh -c libhello.a \
- /local/lib/libhello.a
- ./install-sh -c libhello.a /local/lib/libhello.a
- ranlib /local/lib/libhello.a
- burger$
-
- Using libtool for static library installation protects your library
-from being accidentally stripped (if the installer used the `-s' flag),
-as well as automatically running the correct `ranlib' command.
-
- But libtool libraries are more than just collections of object files:
-they can also carry library dependency information, which old archives
-do not. If you want to create a libtool static convenience library, you
-can omit the `-rpath' flag and use `-static' to indicate that you're
-only interested in a static library. When you link a program with such
-a library, libtool will actually link all object files and dependency
-libraries into the program.
-
- If you omit both `-rpath' and `-static', libtool will create a
-convenience library that can be used to create other libtool libraries,
-even shared ones. Just like in the static case, the library behaves as
-an alias to a set of object files and dependency libraries, but in this
-case the object files are suitable for inclusion in shared libraries.
-But be careful not to link a single convenience library, directly or
-indirectly, into a single program or library, otherwise you may get
-errors about symbol redefinitions.
-
- The key is remembering that a convenience library contains PIC
-objects, and can be linked where a list of PIC objects makes sense;
-i.e. into a shared library. A static convenience library contains
-non-PIC objects, so can be linked into an old static library, or a
-program.
-
- When GNU Automake is used, you should use `noinst_LTLIBRARIES'
-instead of `lib_LTLIBRARIES' for convenience libraries, so that the
-`-rpath' option is not passed when they are linked.
-
- As a rule of thumb, link a libtool convenience library into at most
-one libtool library, and never into a program, and link libtool static
-convenience libraries only into programs, and only if you need to carry
-library dependency information to the user of the static convenience
-library.
-
- Another common situation where static linking is desirable is in
-creating a standalone binary. Use libtool to do the linking and add the
-`-all-static' flag.
-
-
-File: libtool.info, Node: Invoking libtool, Next: Integrating libtool, Prev: Using libtool, Up: Top
-
-4 Invoking `libtool'
-********************
-
-The `libtool' program has the following synopsis:
-
- libtool [OPTION]... [MODE-ARG]...
-
-and accepts the following options:
-
-`--config'
- Display libtool configuration variables and exit.
-
-`--debug'
- Dump a trace of shell script execution to standard output. This
- produces a lot of output, so you may wish to pipe it to `less' (or
- `more') or redirect to a file.
-
-`-n'
-`--dry-run'
- Don't create, modify, or delete any files, just show what commands
- would be executed by libtool.
-
-`--features'
- Display basic configuration options. This provides a way for
- packages to determine whether shared or static libraries will be
- built.
-
-`--finish'
- Same as `--mode=finish'.
-
-`-h'
- Display short help message.
-
-`--help'
- Display a help message and exit. If `--mode=MODE' is specified,
- then detailed help for MODE is displayed.
-
-`--help-all'
- Display help for the general options as well as detailed help for
- each operation mode, and exit.
-
-`--mode=MODE'
- Use MODE as the operation mode. When using libtool from the
- command line, you can give just MODE (or a unique abbreviation of
- it) as the first argument as a shorthand for the full
- `--mode=MODE'. For example, the following are equivalent:
-
- $ libtool --mode=execute --dry-run gdb prog.exe
- $ libtool execute --dry-run gdb prog.exe
- $ libtool exe --dry-run gdb prog.exe
- $ libtool e --dry-run gdb prog.exe
-
- MODE must be set to one of the following:
-
- `compile'
- Compile a source file into a libtool object.
-
- `execute'
- Automatically set the library path so that another program
- can use uninstalled libtool-generated programs or libraries.
-
- `link'
- Create a library or an executable.
-
- `install'
- Install libraries or executables.
-
- `finish'
- Complete the installation of libtool libraries on the system.
-
- `uninstall'
- Delete installed libraries or executables.
-
- `clean'
- Delete uninstalled libraries or executables.
-
-`--tag=TAG'
- Use configuration variables from tag TAG (*note Tags::).
-
-`--preserve-dup-deps'
- Do not remove duplicate dependencies in libraries. When building
- packages with static libraries, the libraries may depend
- circularly on each other (shared libs can too, but for those it
- doesn't matter), so there are situations, where -la -lb -la is
- required, and the second -la may not be stripped or the link will
- fail. In cases where these duplications are required, this option
- will preserve them, only stripping the libraries that libtool
- knows it can safely.
-
-`--quiet'
-`--silent'
- Do not print out any progress or informational messages.
-
-`-v'
-`--verbose'
- Print out progress and informational messages (enabled by default),
- as well as additional messages not ordinary seen by default.
-
-`--no-quiet'
-`--no-silent'
- Print out the progress and informational messages that are seen by
- default. This option has no effect on whether the additional
- messages seen in `--verbose' mode are shown.
-
-`--no-verbose'
- Do not print out any additional informational messages beyond
- those ordinarily seen by default. This option has no effect on
- whether the ordinary progress and informational messages enabled
- by `--no-quiet' are shown.
-
- Thus, there are now three different message levels (not counting
- `--debug'), depending on whether the normal messages and/or the
- additional verbose messages are displayed. Note that there is no
- mechanism to diplay verbose messages, without also displaying
- normal messages.
-
- *default*
- Normal messages are displayed, verbose messages are not
- displayed. In addition to being the default mode, it can be
- forcibly achieved by using both option `--no-verbose' and
- either option `--no-silent' or option `--no-quiet'.
-
- *silent*
- Neither normal messages nor verbose messages are displayed.
- This mode can be achieved using either option `--silent' or
- option `--quiet'.
-
- *verbose*
- Both normal messages and verbose messages are displayed. This
- mode can be achieved using either option `-v' or option
- `--verbose'.
-
-`--version'
- Print libtool version information and exit.
-
- The current `libtool' implementation is done with a shell script
-that needs to be invoked by the shell which `configure' chose for
-configuring `libtool' (*note The Autoconf Manual:
-(autoconf)config.status Invocation.). This shell is set in the
-she-bang (`#!') line of the `libtool' script. Using a different shell
-may cause undefined behavior.
-
- The MODE-ARGS are a variable number of arguments, depending on the
-selected operation mode. In general, each MODE-ARG is interpreted by
-programs libtool invokes, rather than libtool itself.
-
-* Menu:
-
-* Compile mode:: Creating library object files.
-* Link mode:: Generating executables and libraries.
-* Execute mode:: Debugging libtool-generated programs.
-* Install mode:: Making libraries and executables public.
-* Finish mode:: Completing a library installation.
-* Uninstall mode:: Removing installed executables and libraries.
-* Clean mode:: Removing uninstalled executables and libraries.
-
-
-File: libtool.info, Node: Compile mode, Next: Link mode, Up: Invoking libtool
-
-4.1 Compile mode
-================
-
-For "compile" mode, MODE-ARGS is a compiler command to be used in
-creating a "standard" object file. These arguments should begin with
-the name of the C compiler, and contain the `-c' compiler flag so that
-only an object file is created.
-
- Libtool determines the name of the output file by removing the
-directory component from the source file name, then substituting the
-source code suffix (e.g. `.c' for C source code) with the library
-object suffix, `.lo'.
-
- If shared libraries are being built, any necessary PIC generation
-flags are substituted into the compilation command.
-
- The following components of MODE-ARGS are treated specially:
-
-`-o'
- Note that the `-o' option is now fully supported. It is emulated
- on the platforms that don't support it (by locking and moving the
- objects), so it is really easy to use libtool, just with minor
- modifications to your Makefiles. Typing for example
- libtool --mode=compile gcc -c foo/x.c -o foo/x.lo
- will do what you expect.
-
- Note, however, that, if the compiler does not support `-c' and
- `-o', it is impossible to compile `foo/x.c' without overwriting an
- existing `./x.o'. Therefore, if you do have a source file
- `./x.c', make sure you introduce dependencies in your `Makefile'
- to make sure `./x.o' (or `./x.lo') is re-created after any
- sub-directory's `x.lo':
-
- x.o x.lo: foo/x.lo bar/x.lo
-
- This will also ensure that make won't try to use a temporarily
- corrupted `x.o' to create a program or library. It may cause
- needless recompilation on platforms that support `-c' and `-o'
- together, but it's the only way to make it safe for those that
- don't.
-
-`-no-suppress'
- If both PIC and non-PIC objects are being built, libtool will
- normally suppress the compiler output for the PIC object
- compilation to save showing very similar, if not identical
- duplicate output for each object. If the `-no-suppress' option is
- given in compile mode, libtool will show the compiler output for
- both objects.
-
-`-prefer-pic'
- Libtool will try to build only PIC objects.
-
-`-prefer-non-pic'
- Libtool will try to build only non-PIC objects.
-
-`-shared'
- Even if Libtool was configured with `--enable-static', the object
- file Libtool builds will not be suitable for static linking.
- Libtool will signal an error if it was configured with
- `--disable-shared', or if the host does not support shared
- libraries.
-
-`-static'
- Even if libtool was configured with `--disable-static', the object
- file Libtool builds *will* be suitable for static linking.
-
-`-Wc,FLAG'
-`-Xcompiler FLAG'
- Pass a flag directly to the compiler. With `-Wc,', multiple flags
- may be separated by commas, whereas `-Xcompiler ' passes through
- commas unchanged.
-
-
-File: libtool.info, Node: Link mode, Next: Execute mode, Prev: Compile mode, Up: Invoking libtool
-
-4.2 Link mode
-=============
-
-"Link" mode links together object files (including library objects) to
-form another library or to create an executable program.
-
- MODE-ARGS consist of a command using the C compiler to create an
-output file (with the `-o' flag) from several object files.
-
- The following components of MODE-ARGS are treated specially:
-
-`-all-static'
- If OUTPUT-FILE is a program, then do not link it against any
- shared libraries at all. If OUTPUT-FILE is a library, then only
- create a static library. In general, this flag cannot be used
- together with `disable-static' (*note LT_INIT::).
-
-`-avoid-version'
- Tries to avoid versioning (*note Versioning::) for libraries and
- modules, i.e. no version information is stored and no symbolic
- links are created. If the platform requires versioning, this
- option has no effect.
-
-`-bindir'
- Pass the absolute name of the directory for installing executable
- programs (*note Directory Variables: (standards)Directory
- Variables.). `libtool' may use this value to install shared
- libraries there on systems that do not provide for any library
- hardcoding and use the directory of a program and the `PATH'
- variable as library search path. This is typically used for DLLs
- on Windows or other systems using the PE (Portable Executable)
- format. On other systems, `-bindir' is ignored. The default
- value used is `LIBDIR/../bin' for libraries installed to `LIBDIR'.
- You should not use `-bindir' for modules.
-
-`-dlopen FILE'
- Same as `-dlpreopen FILE', if native dlopening is not supported on
- the host platform (*note Dlopened modules::) or if the program is
- linked with `-static', `-static-libtool-libs', or `-all-static'.
- Otherwise, no effect. If FILE is `self' Libtool will make sure
- that the program can `dlopen' itself, either by enabling
- `-export-dynamic' or by falling back to `-dlpreopen self'.
-
-`-dlpreopen FILE'
- Link FILE into the output program, and add its symbols to the list
- of preloaded symbols (*note Dlpreopening::). If FILE is `self',
- the symbols of the program itself will be added to preloaded
- symbol lists. If FILE is `force' Libtool will make sure that a
- preloaded symbol list is always _defined_, regardless of whether
- it's empty or not.
-
-`-export-dynamic'
- Allow symbols from OUTPUT-FILE to be resolved with `dlsym' (*note
- Dlopened modules::).
-
-`-export-symbols SYMFILE'
- Tells the linker to export only the symbols listed in SYMFILE.
- The symbol file should end in `.sym' and must contain the name of
- one symbol per line. This option has no effect on some platforms.
- By default all symbols are exported.
-
-`-export-symbols-regex REGEX'
- Same as `-export-symbols', except that only symbols matching the
- regular expression REGEX are exported. By default all symbols are
- exported.
-
-`-LLIBDIR'
- Search LIBDIR for required libraries that have already been
- installed.
-
-`-lNAME'
- OUTPUT-FILE requires the installed library `libNAME'. This option
- is required even when OUTPUT-FILE is not an executable.
-
-`-module'
- Creates a library that can be dlopened (*note Dlopened modules::).
- This option doesn't work for programs. Module names don't need to
- be prefixed with `lib'. In order to prevent name clashes,
- however, `libNAME' and `NAME' must not be used at the same time in
- your package.
-
-`-no-fast-install'
- Disable fast-install mode for the executable OUTPUT-FILE. Useful
- if the program won't be necessarily installed.
-
-`-no-install'
- Link an executable OUTPUT-FILE that can't be installed and
- therefore doesn't need a wrapper script on systems that allow
- hardcoding of library paths. Useful if the program is only used
- in the build tree, e.g., for testing or generating other files.
-
-`-no-undefined'
- Declare that OUTPUT-FILE does not depend on any libraries other
- than the ones listed on the command line, i.e., after linking, it
- will not have unresolved symbols. Some platforms require all
- symbols in shared libraries to be resolved at library creation
- (*note Inter-library dependencies::), and using this parameter
- allows `libtool' to assume that this will not happen.
-
-`-o OUTPUT-FILE'
- Create OUTPUT-FILE from the specified objects and libraries.
-
-`-objectlist FILE'
- Use a list of object files found in FILE to specify objects.
-
-`-precious-files-regex REGEX'
- Prevents removal of files from the temporary output directory whose
- names match this regular expression. You might specify `\.bbg?$'
- to keep those files created with `gcc -ftest-coverage' for example.
-
-`-release RELEASE'
- Specify that the library was generated by release RELEASE of your
- package, so that users can easily tell which versions are newer
- than others. Be warned that no two releases of your package will
- be binary compatible if you use this flag. If you want binary
- compatibility, use the `-version-info' flag instead (*note
- Versioning::).
-
-`-rpath LIBDIR'
- If OUTPUT-FILE is a library, it will eventually be installed in
- LIBDIR. If OUTPUT-FILE is a program, add LIBDIR to the run-time
- path of the program. On platforms that don't support hardcoding
- library paths into executables and only search PATH for shared
- libraries, such as when OUTPUT-FILE is a Windows (or other PE
- platform) DLL, the `.la' control file will be installed in LIBDIR,
- but see `-bindir' above for the eventual destination of the `.dll'
- or other library file itself.
-
-`-R LIBDIR'
- If OUTPUT-FILE is a program, add LIBDIR to its run-time path. If
- OUTPUT-FILE is a library, add `-RLIBDIR' to its DEPENDENCY_LIBS,
- so that, whenever the library is linked into a program, LIBDIR
- will be added to its run-time path.
-
-`-shared'
- If OUTPUT-FILE is a program, then link it against any uninstalled
- shared libtool libraries (this is the default behavior). If
- OUTPUT-FILE is a library, then only create a shared library. In
- the later case, libtool will signal an error if it was configured
- with `--disable-shared', or if the host does not support shared
- libraries.
-
-`-shrext SUFFIX'
- If OUTPUT-FILE is a libtool library, replace the system's standard
- file name extension for shared libraries with SUFFIX (most systems
- use `.so' here). This option is helpful in certain cases where an
- application requires that shared libraries (typically modules)
- have an extension other than the default one. Please note you
- must supply the full file name extension including any leading dot.
-
-`-static'
- If OUTPUT-FILE is a program, then do not link it against any
- uninstalled shared libtool libraries. If OUTPUT-FILE is a
- library, then only create a static library.
-
-`-static-libtool-libs'
- If OUTPUT-FILE is a program, then do not link it against any
- shared libtool libraries. If OUTPUT-FILE is a library, then only
- create a static library.
-
-`-version-info CURRENT[:REVISION[:AGE]]'
- If OUTPUT-FILE is a libtool library, use interface version
- information CURRENT, REVISION, and AGE to build it (*note
- Versioning::). Do *not* use this flag to specify package release
- information, rather see the `-release' flag.
-
-`-version-number MAJOR[:MINOR[:REVISION]]'
- If OUTPUT-FILE is a libtool library, compute interface version
- information so that the resulting library uses the specified
- major, minor and revision numbers. This is designed to permit
- libtool to be used with existing projects where identical version
- numbers are already used across operating systems. New projects
- should use the `-version-info' flag instead.
-
-`-weak LIBNAME'
- if OUTPUT-FILE is a libtool library, declare that it provides a
- weak LIBNAME interface. This is a hint to libtool that there is
- no need to append LIBNAME to the list of dependency libraries of
- OUTPUT-FILE, because linking against OUTPUT-FILE already supplies
- the same interface (*note Linking with dlopened modules::).
-
-`-Wc,FLAG'
-`-Xcompiler FLAG'
- Pass a linker-specific flag directly to the compiler. With `-Wc,',
- multiple flags may be separated by commas, whereas `-Xcompiler '
- passes through commas unchanged.
-
-`-Wl,FLAG'
-`-Xlinker FLAG'
- Pass a linker-specific flag directly to the linker.
-
-`-XCClinker FLAG'
- Pass a link-specific flag to the compiler driver (`CC') during
- linking.
-
- If the OUTPUT-FILE ends in `.la', then a libtool library is created,
-which must be built only from library objects (`.lo' files). The
-`-rpath' option is required. In the current implementation, libtool
-libraries may not depend on other uninstalled libtool libraries (*note
-Inter-library dependencies::).
-
- If the OUTPUT-FILE ends in `.a', then a standard library is created
-using `ar' and possibly `ranlib'.
-
- If OUTPUT-FILE ends in `.o' or `.lo', then a reloadable object file
-is created from the input files (generally using `ld -r'). This method
-is often called "partial linking".
-
- Otherwise, an executable program is created.
-
-
-File: libtool.info, Node: Execute mode, Next: Install mode, Prev: Link mode, Up: Invoking libtool
-
-4.3 Execute mode
-================
-
-For "execute" mode, the library path is automatically set, then a
-program is executed.
-
- The first of the MODE-ARGS is treated as a program name, with the
-rest as arguments to that program.
-
- The following components of MODE-ARGS are treated specially:
-
-`-dlopen FILE'
- Add the directory containing FILE to the library path.
-
- This mode sets the library path environment variable according to any
-`-dlopen' flags.
-
- If any of the ARGS are libtool executable wrappers, then they are
-translated into the name of their corresponding uninstalled binary, and
-any of their required library directories are added to the library path.
-
-
-File: libtool.info, Node: Install mode, Next: Finish mode, Prev: Execute mode, Up: Invoking libtool
-
-4.4 Install mode
-================
-
-In "install" mode, libtool interprets most of the elements of MODE-ARGS
-as an installation command beginning with `cp', or a BSD-compatible
-`install' program.
-
- The following components of MODE-ARGS are treated specially:
-
-`-inst-prefix-dir INST-PREFIX-DIR'
- When installing into a temporary staging area, rather than the
- final `prefix', this argument is used to reflect the temporary
- path, in much the same way `automake' uses `DESTDIR'. For
- instance, if `prefix' is `/usr/local', but INST-PREFIX-DIR is
- `/tmp', then the object will be installed under `/tmp/usr/local/'.
- If the installed object is a libtool library, then the internal
- fields of that library will reflect only `prefix', not
- INST-PREFIX-DIR:
-
- # Directory that this library needs to be installed in:
- libdir='/usr/local/lib'
-
- not
-
- # Directory that this library needs to be installed in:
- libdir='/tmp/usr/local/lib'
-
- `inst-prefix' is also used to insure that if the installed object
- must be relinked upon installation, that it is relinked against
- the libraries in INST-PREFIX-DIR/`prefix', not `prefix'.
-
- In truth, this option is not really intended for use when calling
- libtool directly; it is automatically used when `libtool
- --mode=install' calls `libtool --mode=relink'. Libtool does this
- by analyzing the destination path given in the original `libtool
- --mode=install' command and comparing it to the expected
- installation path established during `libtool --mode=link'.
-
- Thus, end-users need change nothing, and `automake'-style `make
- install DESTDIR=/tmp' will Just Work(tm) most of the time. For
- systems where fast installation can not be turned on, relinking
- may be needed. In this case, a `DESTDIR' install will fail.
-
- Currently it is not generally possible to install into a temporary
- staging area that contains needed third-party libraries which are
- not yet visible at their final location.
-
- The rest of the MODE-ARGS are interpreted as arguments to the `cp'
-or `install' command.
-
- The command is run, and any necessary unprivileged post-installation
-commands are also completed.
-
-
-File: libtool.info, Node: Finish mode, Next: Uninstall mode, Prev: Install mode, Up: Invoking libtool
-
-4.5 Finish mode
-===============
-
-"Finish" mode has two functions. One is to help system administrators
-install libtool libraries so that they can be located and linked into
-user programs. To invoke this functionality, pass the name of a library
-directory as MODE-ARG. Running this command may require superuser
-privileges, and the `--dry-run' option may be useful.
-
- The second is to facilitate transferring libtool libraries to a
-native compilation environment after they were built in a
-cross-compilation environment. Cross-compilation environments may rely
-on recent libtool features, and running libtool in finish mode will
-make it easier to work with older versions of libtool. This task is
-performed whenever the MODE-ARG is a `.la' file.
-
-
-File: libtool.info, Node: Uninstall mode, Next: Clean mode, Prev: Finish mode, Up: Invoking libtool
-
-4.6 Uninstall mode
-==================
-
-"Uninstall" mode deletes installed libraries, executables and objects.
-
- The first MODE-ARG is the name of the program to use to delete files
-(typically `/bin/rm').
-
- The remaining MODE-ARGS are either flags for the deletion program
-(beginning with a `-'), or the names of files to delete.
-
-
-File: libtool.info, Node: Clean mode, Prev: Uninstall mode, Up: Invoking libtool
-
-4.7 Clean mode
-==============
-
-"Clean" mode deletes uninstalled libraries, executables, objects and
-libtool's temporary files associated with them.
-
- The first MODE-ARG is the name of the program to use to delete files
-(typically `/bin/rm').
-
- The remaining MODE-ARGS are either flags for the deletion program
-(beginning with a `-'), or the names of files to delete.
-
-
-File: libtool.info, Node: Integrating libtool, Next: Other languages, Prev: Invoking libtool, Up: Top
-
-5 Integrating libtool with your package
-***************************************
-
-This chapter describes how to integrate libtool with your packages so
-that your users can install hassle-free shared libraries.
-
- There are several ways in which Libtool may be integrated in your
-package, described in the following sections. Typically, the Libtool
-macro files as well as `ltmain.sh' are copied into your package using
-`libtoolize' and `aclocal' after setting up the `configure.ac' and
-toplevel `Makefile.am', then `autoconf' adds the needed tests to the
-`configure' script. These individual steps are often automated with
-`autoreconf'.
-
- Here is a diagram showing how such a typical Libtool configuration
-works when preparing a package for distribution, assuming that `m4' has
-been chosen as location for additional Autoconf macros, and `build-aux'
-as location for auxiliary build tools (*note The Autoconf Manual:
-(autoconf)Input.):
-
- libtool.m4 -----. .--> aclocal.m4 -----.
- ltoptions.m4 ---+ .-> aclocal* -+ +--> autoconf*
- ltversion.m4 ---+--+ `--> [copy in m4/] --+ |
- ltsugar.m4 -----+ | ^ | \/
- lt~obsolete.m4 -+ +-> libtoolize* -----' | configure
- [ltdl.m4] ------+ | |
- `----------------------------------'
-
- ltmain.sh -----------> libtoolize* -> [copy in build-aux/]
-
- During configuration, the `libtool' script is generated either
-through `config.status' or `config.lt':
-
- .--> config.status* --.
- configure* --+ +--> libtool
- `--> [config.lt*] ----' ^
- |
- ltmain.sh --------------------------------'
-
- At `make' run time, `libtool' is then invoked as needed as a wrapper
-around compilers, linkers, install and cleanup programs.
-
- There are alternatives choices to several parts of the setup; for
-example, the Libtool macro files can either be copied or symlinked into
-the package, or copied into `aclocal.m4'. As another example, an
-external, pre-configured `libtool' script may be used, by-passing most
-of the tests and package-specific setup for Libtool.
-
-* Menu:
-
-* Autoconf macros:: Autoconf macros exported by libtool.
-* Makefile rules:: Writing `Makefile' rules for libtool.
-* Using Automake:: Automatically supporting libtool.
-* Configuring:: Configuring libtool for a host system.
-* Distributing:: What files to distribute with your package.
-* Static-only libraries:: Sometimes shared libraries are just a pain.
-
-
-File: libtool.info, Node: Autoconf macros, Next: Makefile rules, Up: Integrating libtool
-
-5.1 Autoconf macros exported by libtool
-=======================================
-
-Libtool uses a number of macros to interrogate the host system when it
-is being built, and you can use some of them yourself too. Although
-there are a great many other macros in the libtool installed m4 files,
-these do not form part of the published interface, and are subject to
-change between releases.
-
-Macros in the `LT_CMD_' namespace check for various shell commands:
-
- -- Macro: LT_CMD_MAX_LEN
- Finds the longest command line that can be safely passed to
- `$SHELL' without being truncated, and store in the shell variable
- `$max_cmd_len'. It is only an approximate value, but command
- lines of this length or shorter are guaranteed not to be truncated.
-
-Macros in the `LT_FUNC_' namespace check characteristics of library
-functions:
-
- -- Macro: LT_FUNC_DLSYM_USCORE
- `AC_DEFINE' the preprocessor symbol `DLSYM_USCORE' if we have to
- add an underscore to symbol-names passed in to `dlsym'.
-
-Macros in the `LT_LIB_' namespace check characteristics of system
-libraries:
-
- -- Macro: LT_LIB_M
- Set `LIBM' to the math library or libraries required on this
- machine, if any.
-
- -- Macro: LT_LIB_DLLOAD
- This is the macro used by `libltdl' to determine which dlloaders
- to use on this machine, if any. Several shell variables are set
- (and `AC_SUBST'ed) depending on the dlload interfaces are
- available on this machine. `LT_DLLOADERS' contains a list of
- libtool libraries that can be used, and if necessary also sets
- `LIBADD_DLOPEN' if additional system libraries are required by the
- `dlopen' loader, and `LIBADD_SHL_LOAD' if additional system
- libraries are required by the `shl_load' loader, respectively.
- Finally some symbols are set in `config.h' depending on the
- loaders that are found to work: `HAVE_LIBDL', `HAVE_SHL_LOAD',
- `HAVE_DYLD', `HAVE_DLD'.
-
-Macros in the `LT_PATH_' namespace search the system for the full path
-to particular system commands:
-
- -- Macro: LT_PATH_LD
- Add a `--with-gnu-ld' option to `configure'. Try to find the path
- to the linker used by `$CC', and whether it is the GNU linker.
- The result is stored in the shell variable `$LD', which is
- `AC_SUBST'ed.
-
- -- Macro: LT_PATH_NM
- Try to find a BSD-compatible `nm' or a MS-compatible `dumpbin'
- command on this machine. The result is stored in the shell
- variable `$NM', which is `AC_SUBST'ed.
-
-Macros in the `LT_SYS_' namespace probe for system characteristics:
-
- -- Macro: LT_SYS_DLOPEN_SELF
- Tests whether a program can dlopen itself, and then also whether
- the same program can still dlopen itself when statically linked.
- Results are stored in the shell variables `$enable_dlopen_self' and
- `enable_dlopen_self_static' respectively.
-
- -- Macro: LT_SYS_DLOPEN_DEPLIBS
- Define the preprocessor symbol `LTDL_DLOPEN_DEPLIBS' if the OS
- needs help to load dependent libraries for `dlopen' (or
- equivalent).
-
- -- Macro: LT_SYS_DLSEARCH_PATH
- Define the preprocessor symbol `LT_DLSEARCH_PATH' to the system
- default library search path.
-
- -- Macro: LT_SYS_MODULE_EXT
- Define the preprocessor symbol `LT_MODULE_EXT' to the extension
- used for runtime loadable modules. If you use libltdl to open
- modules, then you can simply use the libtool library extension,
- `.la'.
-
- -- Macro: LT_SYS_MODULE_PATH
- Define the preprocessor symbol `LT_MODULE_PATH_VAR' to the name of
- the shell environment variable that determines the run-time module
- search path.
-
- -- Macro: LT_SYS_SYMBOL_USCORE
- Set the shell variable `sys_symbol_underscore' to `no' unless the
- compiler prefixes global symbols with an underscore.
-
-
-File: libtool.info, Node: Makefile rules, Next: Using Automake, Prev: Autoconf macros, Up: Integrating libtool
-
-5.2 Writing `Makefile' rules for libtool
-========================================
-
-Libtool is fully integrated with Automake (*note Introduction:
-(automake)Top.), starting with Automake version 1.2.
-
- If you want to use libtool in a regular `Makefile' (or
-`Makefile.in'), you are on your own. If you're not using Automake, and
-you don't know how to incorporate libtool into your package you need to
-do one of the following:
-
- 1. Download the latest Automake distribution from your nearest GNU
- mirror, install it, and start using it.
-
- 2. Learn how to write `Makefile' rules by hand. They're sometimes
- complex, but if you're clever enough to write rules for compiling
- your old libraries, then you should be able to figure out new
- rules for libtool libraries (hint: examine the `Makefile.in' in
- the `tests/demo' subdirectory of the libtool distribution... note
- especially that it was automatically generated from the
- `Makefile.am' by Automake).
-
-
-File: libtool.info, Node: Using Automake, Next: Configuring, Prev: Makefile rules, Up: Integrating libtool
-
-5.3 Using Automake with libtool
-===============================
-
-Libtool library support is implemented under the `LTLIBRARIES' primary.
-
- Here are some samples from the Automake `Makefile.am' in the libtool
-distribution's `demo' subdirectory.
-
- First, to link a program against a libtool library, just use the
-`program_LDADD'(1) variable:
-
- bin_PROGRAMS = hell hell_static
-
- # Build hell from main.c and libhello.la
- hell_SOURCES = main.c
- hell_LDADD = libhello.la
-
- # Create a statically linked version of hell.
- hell_static_SOURCES = main.c
- hell_static_LDADD = libhello.la
- hell_static_LDFLAGS = -static
-
- You may use the `program_LDFLAGS' variable to stuff in any flags you
-want to pass to libtool while linking `program' (such as `-static' to
-avoid linking uninstalled shared libtool libraries).
-
- Building a libtool library is almost as trivial... note the use of
-`libhello_la_LDFLAGS' to pass the `-version-info' (*note Versioning::)
-option to libtool:
-
- # Build a libtool library, libhello.la for installation in libdir.
- lib_LTLIBRARIES = libhello.la
- libhello_la_SOURCES = hello.c foo.c
- libhello_la_LDFLAGS = -version-info 3:12:1
-
- The `-rpath' option is passed automatically by Automake (except for
-libraries listed as `noinst_LTLIBRARIES'), so you should not specify it.
-
- *Note Building a Shared Library: (automake)A Shared Library, for
-more information.
-
- ---------- Footnotes ----------
-
- (1) Since GNU Automake 1.5, the flags `-dlopen' or `-dlpreopen'
-(*note Link mode::) can be employed with the `program_LDADD' variable.
-Unfortunately, older releases didn't accept these flags, so if you are
-stuck with an ancient Automake, we recommend quoting the flag itself,
-and setting `program_DEPENDENCIES' too:
-
- program_LDADD = "-dlopen" libfoo.la
- program_DEPENDENCIES = libfoo.la
-
-
-File: libtool.info, Node: Configuring, Next: Distributing, Prev: Using Automake, Up: Integrating libtool
-
-5.4 Configuring libtool
-=======================
-
-Libtool requires intimate knowledge of your compiler suite and operating
-system in order to be able to create shared libraries and link against
-them properly. When you install the libtool distribution, a
-system-specific libtool script is installed into your binary directory.
-
- However, when you distribute libtool with your own packages (*note
-Distributing::), you do not always know the compiler suite and
-operating system that are used to compile your package.
-
- For this reason, libtool must be "configured" before it can be used.
-This idea should be familiar to anybody who has used a GNU `configure'
-script. `configure' runs a number of tests for system features, then
-generates the `Makefile's (and possibly a `config.h' header file),
-after which you can run `make' and build the package.
-
- Libtool adds its own tests to your `configure' script in order to
-generate a libtool script for the installer's host machine.
-
-* Menu:
-
-* LT_INIT:: Configuring `libtool' in `configure.ac'.
-* Configure notes:: Platform-specific notes for configuration.
-
-
-File: libtool.info, Node: LT_INIT, Next: Configure notes, Up: Configuring
-
-5.4.1 The `LT_INIT' macro
--------------------------
-
-If you are using GNU Autoconf (or Automake), you should add a call to
-`LT_INIT' to your `configure.ac' file. This macro adds many new tests
-to the `configure' script so that the generated libtool script will
-understand the characteristics of the host. It's the most important of
-a number of macros defined by Libtool:
-
- -- Macro: LT_PREREQ (VERSION)
- Ensure that a recent enough version of Libtool is being used. If
- the version of Libtool used for `LT_INIT' is earlier than VERSION,
- print an error message to the standard error output and exit with
- failure (exit status is 63). For example:
-
- LT_PREREQ([2.4.2])
-
- -- Macro: LT_INIT (OPTIONS)
- -- Macro: AC_PROG_LIBTOOL
- -- Macro: AM_PROG_LIBTOOL
- Add support for the `--enable-shared', `--disable-shared',
- `--enable-static', `--disable-static', `--with-pic', and
- `--without-pic' `configure' flags.(1) `AC_PROG_LIBTOOL' and
- `AM_PROG_LIBTOOL' are deprecated names for older versions of this
- macro; `autoupdate' will upgrade your `configure.ac' files.
-
- By default, this macro turns on shared libraries if they are
- available, and also enables static libraries if they don't
- conflict with the shared libraries. You can modify these defaults
- by passing either `disable-shared' or `disable-static' in the
- option list to `LT_INIT', or using `AC_DISABLE_SHARED' or
- `AC_DISABLE_STATIC'.
-
- # Turn off shared libraries during beta-testing, since they
- # make the build process take too long.
- LT_INIT([disable-shared])
-
- The user may specify modified forms of the configure flags
- `--enable-shared' and `--enable-static' to choose whether shared
- or static libraries are built based on the name of the package.
- For example, to have shared `bfd' and `gdb' libraries built, but
- not shared `libg++', you can run all three `configure' scripts as
- follows:
-
- trick$ ./configure --enable-shared=bfd,gdb
-
- In general, specifying `--enable-shared=PKGS' is the same as
- configuring with `--enable-shared' every package named in the
- comma-separated PKGS list, and every other package with
- `--disable-shared'. The `--enable-static=PKGS' flag behaves
- similarly, but it uses `--enable-static' and `--disable-static'.
- The same applies to the `--enable-fast-install=PKGS' flag, which
- uses `--enable-fast-install' and `--disable-fast-install'.
-
- The package name `default' matches any packages that have not set
- their name in the `PACKAGE' environment variable.
-
- The `--with-pic' and `--without-pic' configure flags can be used
- to specify whether or not `libtool' uses PIC objects. By default,
- `libtool' uses PIC objects for shared libraries and non-PIC
- objects for static libraries. The `--with-pic' option also
- accepts a comma-separated list of package names. Specifying
- `--with-pic=PKGS' is the same as configuring every package in PKGS
- with `--with-pic' and every other package with the default
- configuration. The package name `default' is treated the same as
- for `--enable-shared' and `--enable-static'.
-
- This macro also sets the shell variable `LIBTOOL_DEPS', that you
- can use to automatically update the libtool script if it becomes
- out-of-date. In order to do that, add to your `configure.ac':
-
- LT_INIT
- AC_SUBST([LIBTOOL_DEPS])
-
- and, to `Makefile.in' or `Makefile.am':
-
- LIBTOOL_DEPS = @LIBTOOL_DEPS@
- libtool: $(LIBTOOL_DEPS)
- $(SHELL) ./config.status libtool
-
- If you are using GNU Automake, you can omit the assignment, as
- Automake will take care of it. You'll obviously have to create
- some dependency on `libtool'.
-
- Aside from `disable-static' and `disable-shared', there are other
- options that you can pass to `LT_INIT' to modify its behaviour.
- Here is a full list:
-
- `dlopen'
- Enable checking for dlopen support. This option should be
- used if the package makes use of the `-dlopen' and
- `-dlpreopen' libtool flags, otherwise libtool will assume
- that the system does not support dlopening.
-
- `win32-dll'
- This option should be used if the package has been ported to
- build clean dlls on win32 platforms. Usually this means that
- any library data items are exported with
- `__declspec(dllexport)' and imported with
- `__declspec(dllimport)'. If this macro is not used, libtool
- will assume that the package libraries are not dll clean and
- will build only static libraries on win32 hosts.
-
- Provision must be made to pass `-no-undefined' to `libtool'
- in link mode from the package `Makefile'. Naturally, if you
- pass `-no-undefined', you must ensure that all the library
- symbols *really are* defined at link time!
-
- `disable-fast-install'
- Change the default behaviour for `LT_INIT' to disable
- optimization for fast installation. The user may still
- override this default, depending on platform support, by
- specifying `--enable-fast-install' to `configure'.
-
- `shared'
- Change the default behaviour for `LT_INIT' to enable shared
- libraries. This is the default on all systems where Libtool
- knows how to create shared libraries. The user may still
- override this default by specifying `--disable-shared' to
- `configure'.
-
- `disable-shared'
- Change the default behaviour for `LT_INIT' to disable shared
- libraries. The user may still override this default by
- specifying `--enable-shared' to `configure'.
-
- `static'
- Change the default behaviour for `LT_INIT' to enable static
- libraries. This is the default on all systems where shared
- libraries have been disabled for some reason, and on most
- systems where shared libraries have been enabled. If shared
- libraries are enabled, the user may still override this
- default by specifying `--disable-static' to `configure'.
-
- `disable-static'
- Change the default behaviour for `LT_INIT' to disable static
- libraries. The user may still override this default by
- specifying `--enable-static' to `configure'.
-
- `pic-only'
- Change the default behaviour for `libtool' to try to use only
- PIC objects. The user may still override this default by
- specifying `--without-pic' to `configure'.
-
- `no-pic'
- Change the default behaviour of `libtool' to try to use only
- non-PIC objects. The user may still override this default by
- specifying `--with-pic' to `configure'.
-
-
-
- -- Macro: LT_LANG (LANGUAGE)
- Enable `libtool' support for the language given if it has not yet
- already been enabled. Languages accepted are "C++", "Fortran 77",
- "Java", "Go", and "Windows Resource".
-
- If Autoconf language support macros such as `AC_PROG_CXX' are used
- in your `configure.ac', Libtool language support will automatically
- be enabled.
-
- Conversely using `LT_LANG' to enable language support for Libtool
- will automatically enable Autoconf language support as well.
-
- Both of the following examples are therefore valid ways of adding
- C++ language support to Libtool.
-
- LT_INIT
- LT_LANG([C++])
-
- LT_INIT
- AC_PROG_CXX
-
-
- -- Macro: AC_LIBTOOL_DLOPEN
- This macro is deprecated, the `dlopen' option to `LT_INIT' should
- be used instead.
-
- -- Macro: AC_LIBTOOL_WIN32_DLL
- This macro is deprecated, the `win32-dll' option to `LT_INIT'
- should be used instead.
-
- -- Macro: AC_DISABLE_FAST_INSTALL
- This macro is deprecated, the `disable-fast-install' option to
- `LT_INIT' should be used instead.
-
- -- Macro: AC_DISABLE_SHARED
- -- Macro: AM_DISABLE_SHARED
- Change the default behaviour for `LT_INIT' to disable shared
- libraries. The user may still override this default by specifying
- `--enable-shared'. The option `disable-shared' to `LT_INIT' is a
- shorthand for this. `AM_DISABLE_SHARED' is a deprecated alias for
- `AC_DISABLE_SHARED'.
-
- -- Macro: AC_ENABLE_SHARED
- -- Macro: AM_ENABLE_SHARED
- Change the default behaviour for `LT_INIT' to enable shared
- libraries. This is the default on all systems where Libtool knows
- how to create shared libraries. The user may still override this
- default by specifying `--disable-shared'. The option `shared' to
- `LT_INIT' is a shorthand for this. `AM_ENABLE_SHARED' is a
- deprecated alias for `AC_ENABLE_SHARED'.
-
- -- Macro: AC_DISABLE_STATIC
- -- Macro: AM_DISABLE_STATIC
- Change the default behaviour for `LT_INIT' to disable static
- libraries. The user may still override this default by specifying
- `--enable-static'. The option `disable-static' to `LT_INIT' is a
- shorthand for this. `AM_DISABLE_STATIC' is a deprecated alias for
- `AC_DISABLE_STATIC'.
-
- -- Macro: AC_ENABLE_STATIC
- -- Macro: AM_ENABLE_STATIC
- Change the default behaviour for `LT_INIT' to enable static
- libraries. This is the default on all systems where shared
- libraries have been disabled for some reason, and on most systems
- where shared libraries have been enabled. If shared libraries are
- enabled, the user may still override this default by specifying
- `--disable-static'. The option `static' to `LT_INIT' is a
- shorthand for this. `AM_ENABLE_STATIC' is a deprecated alias for
- `AC_ENABLE_STATIC'.
-
- The tests in `LT_INIT' also recognize the following environment
-variables:
-
- -- Variable: CC
- The C compiler that will be used by the generated `libtool'. If
- this is not set, `LT_INIT' will look for `gcc' or `cc'.
-
- -- Variable: CFLAGS
- Compiler flags used to generate standard object files. If this is
- not set, `LT_INIT' will not use any such flags. It affects only
- the way `LT_INIT' runs tests, not the produced `libtool'.
-
- -- Variable: CPPFLAGS
- C preprocessor flags. If this is not set, `LT_INIT' will not use
- any such flags. It affects only the way `LT_INIT' runs tests, not
- the produced `libtool'.
-
- -- Variable: LD
- The system linker to use (if the generated `libtool' requires one).
- If this is not set, `LT_INIT' will try to find out what is the
- linker used by `CC'.
-
- -- Variable: LDFLAGS
- The flags to be used by `libtool' when it links a program. If
- this is not set, `LT_INIT' will not use any such flags. It
- affects only the way `LT_INIT' runs tests, not the produced
- `libtool'.
-
- -- Variable: LIBS
- The libraries to be used by `LT_INIT' when it links a program. If
- this is not set, `LT_INIT' will not use any such flags. It
- affects only the way `LT_INIT' runs tests, not the produced
- `libtool'.
-
- -- Variable: NM
- Program to use rather than checking for `nm'.
-
- -- Variable: RANLIB
- Program to use rather than checking for `ranlib'.
-
- -- Variable: LN_S
- A command that creates a link of a program, a soft-link if
- possible, a hard-link otherwise. `LT_INIT' will check for a
- suitable program if this variable is not set.
-
- -- Variable: DLLTOOL
- Program to use rather than checking for `dlltool'. Only meaningful
- for Cygwin/MS-Windows.
-
- -- Variable: OBJDUMP
- Program to use rather than checking for `objdump'. Only meaningful
- for Cygwin/MS-Windows.
-
- -- Variable: AS
- Program to use rather than checking for `as'. Only used on
- Cygwin/MS-Windows at the moment.
-
- -- Variable: MANIFEST_TOOL
- Program to use rather than checking for `mt', the Manifest Tool.
- Only used on Cygwin/MS-Windows at the moment.
-
- With 1.3 era libtool, if you wanted to know any details of what
-libtool had discovered about your architecture and environment, you had
-to run the script with `--config' and grep through the results. This
-idiom was supported up to and including 1.5.x era libtool, where it was
-possible to call the generated libtool script from `configure.ac' as
-soon as `LT_INIT' had completed. However, one of the features of
-libtool 1.4 was that the libtool configuration was migrated out of a
-separate `ltconfig' file, and added to the `LT_INIT' macro (nee
-`AC_PROG_LIBTOOL'), so the results of the configuration tests were
-available directly to code in `configure.ac', rendering the call out to
-the generated libtool script obsolete.
-
- Starting with libtool 2.0, the multipass generation of the libtool
-script has been consolidated into a single `config.status' pass, which
-happens after all the code in `configure.ac' has completed. The
-implication of this is that the libtool script does not exist during
-execution of code from `configure.ac', and so obviously it cannot be
-called for `--config' details anymore. If you are upgrading projects
-that used this idiom to libtool 2.0 or newer, you should replace those
-calls with direct references to the equivalent Autoconf shell variables
-that are set by the configure time tests before being passed to
-`config.status' for inclusion in the generated libtool script.
-
- -- Macro: LT_OUTPUT
- By default, the configured `libtool' script is generated by the
- call to `AC_OUTPUT' command, and there is rarely any need to use
- `libtool' from `configure'. However, sometimes it is necessary to
- run configure time compile and link tests using `libtool'. You
- can add `LT_OUTPUT' to your `configure.ac' any time after
- `LT_INIT' and any `LT_LANG' calls; that done, `libtool' will be
- created by a specially generated `config.lt' file, and available
- for use in later tests.
-
- Also, when `LT_OUTPUT' is used, for backwards compatibility with
- Automake regeneration rules, `config.status' will call `config.lt'
- to regenerate `libtool', rather than generating the file itself.
-
- When you invoke the `libtoolize' program (*note Invoking
-libtoolize::), it will tell you where to find a definition of
-`LT_INIT'. If you use Automake, the `aclocal' program will
-automatically add `LT_INIT' support to your `configure' script when it
-sees the invocation of `LT_INIT' in `configure.ac'.
-
- Because of these changes, and the runtime version compatibility
-checks Libtool now executes, we now advise *against* including a copy of
-`libtool.m4' (and brethren) in `acinclude.m4'. Instead, you should set
-your project macro directory with `AC_CONFIG_MACRO_DIR'. When you
-`libtoolize' your project, a copy of the relevant macro definitions
-will be placed in your `AC_CONFIG_MACRO_DIR', where `aclocal' can
-reference them directly from `aclocal.m4'.
-
- ---------- Footnotes ----------
-
- (1) `LT_INIT' requires that you define the `Makefile' variable
-`top_builddir' in your `Makefile.in'. Automake does this
-automatically, but Autoconf users should set it to the relative path to
-the top of your build directory (`../..', for example).
-
-
-File: libtool.info, Node: Configure notes, Prev: LT_INIT, Up: Configuring
-
-5.4.2 Platform-specific configuration notes
--------------------------------------------
-
-While Libtool tries to hide as many platform-specific features as
-possible, some have to be taken into account when configuring either
-the Libtool package or a libtoolized package.
-
- * You currently need GNU make to build the Libtool package itself.
-
- * On AIX there are two different styles of shared linking, one in
- which symbols are bound at link-time and one in which symbols are
- bound at runtime only, similar to ELF. In case of doubt use
- `LDFLAGS=-Wl,-brtl' for the latter style.
-
- * On AIX, native tools are to be preferred over binutils; especially
- for C++ code, if using the AIX Toolbox GCC 4.0 and binutils,
- configure with `AR=/usr/bin/ar LD=/usr/bin/ld NM='/usr/bin/nm -B''.
-
- * On AIX, the `/bin/sh' is very slow due to its inefficient handling
- of here-documents. A modern shell is preferable:
- CONFIG_SHELL=/bin/bash; export $CONFIG_SHELL
- $CONFIG_SHELL ./configure [...]
-
- * For C++ code with templates, it may be necessary to specify the
- way the compiler will generate the instantiations. For Portland
- pgCC version5, use `CXX='pgCC --one_instantiation_per_object'' and
- avoid parallel `make'.
-
- * On Darwin, for C++ code with templates you need two level shared
- libraries. Libtool builds these by default if
- `MACOSX_DEPLOYMENT_TARGET' is set to 10.3 or later at `configure'
- time. See `rdar://problem/4135857' for more information on this
- issue.
-
- * The default shell on UNICOS 9, a ksh 88e variant, is too buggy to
- correctly execute the libtool script. Users are advised to
- install a modern shell such as GNU bash.
-
- * Some HP-UX `sed' programs are horribly broken, and cannot handle
- libtool's requirements, so users may report unusual problems.
- There is no workaround except to install a working `sed' (such as
- GNU sed) on these systems.
-
- * The vendor-distributed NCR MP-RAS `cc' programs emits copyright on
- standard error that confuse tests on size of `conftest.err'. The
- workaround is to specify `CC' when run configure with `CC='cc
- -Hnocopyr''.
-
- * Any earlier DG/UX system with ELF executables, such as R3.10 or
- R4.10, is also likely to work, but hasn't been explicitly tested.
-
- * On Reliant Unix libtool has only been tested with the Siemens
- C-compiler and an old version of `gcc' provided by Marco Walther.
-
- * `libtool.m4', `ltdl.m4' and the `configure.ac' files are marked to
- use autoconf-mode, which is distributed with GNU Emacs 21,
- Autoconf itself, and all recent releases of XEmacs.
-
- * When building on some GNU/Linux systems for multilib targets
- `libtool' sometimes guesses the wrong paths that the linker and
- dynamic linker search by default. If this occurs, you may override
- libtool's guesses at `configure' time by setting the `autoconf'
- cache variables `lt_cv_sys_lib_search_path_spec' and
- `lt_cv_sys_lib_dlsearch_path_spec' respectively to the correct
- search paths.
-
-
-
-File: libtool.info, Node: Distributing, Next: Static-only libraries, Prev: Configuring, Up: Integrating libtool
-
-5.5 Including libtool in your package
-=====================================
-
-In order to use libtool, you need to include the following files with
-your package:
-
-`config.guess'
- Attempt to guess a canonical system name.
-
-`config.sub'
- Canonical system name validation subroutine script.
-
-`install-sh'
- BSD-compatible `install' replacement script.
-
-`ltmain.sh'
- A generic script implementing basic libtool functionality.
-
- Note that the libtool script itself should _not_ be included with
-your package. *Note Configuring::.
-
- You should use the `libtoolize' program, rather than manually
-copying these files into your package.
-
-* Menu:
-
-* Invoking libtoolize:: `libtoolize' command line options.
-* Autoconf and LTLIBOBJS:: Autoconf automates LTLIBOBJS generation.
-
-
-File: libtool.info, Node: Invoking libtoolize, Next: Autoconf and LTLIBOBJS, Up: Distributing
-
-5.5.1 Invoking `libtoolize'
----------------------------
-
-The `libtoolize' program provides a standard way to add libtool support
-to your package. In the future, it may implement better usage
-checking, or other features to make libtool even easier to use.
-
- The `libtoolize' program has the following synopsis:
-
- libtoolize [OPTION]...
-
-and accepts the following options:
-
-`--copy'
-`-c'
- Copy files from the libtool data directory rather than creating
- symlinks.
-
-`--debug'
- Dump a trace of shell script execution to standard output. This
- produces a lot of output, so you may wish to pipe it to `less' (or
- `more') or redirect to a file.
-
-`--dry-run'
-`-n'
- Don't run any commands that modify the file system, just print them
- out.
-
-`--force'
-`-f'
- Replace existing libtool files. By default, `libtoolize' won't
- overwrite existing files.
-
-`--help'
- Display a help message and exit.
-
-`--ltdl [TARGET-DIRECTORY-NAME]'
- Install libltdl in the TARGET-DIRECTORY-NAME subdirectory of your
- package. Normally, the directory is extracted from the argument
- to `LT_CONFIG_LTDL_DIR' in `configure.ac', though you can also
- specify a subdirectory name here if you are not using Autoconf for
- example. If `libtoolize' can't determine the target directory,
- `libltdl' is used as the default.
-
-`--no-warn'
- Normally, Libtoolize tries to diagnose use of deprecated libtool
- macros and other stylistic issues. If you are deliberately using
- outdated calling conventions, this option prevents Libtoolize from
- explaining how to update your project's Libtool conventions.
-
-`--nonrecursive'
- If passed in conjunction with `--ltdl', this option will cause the
- `libltdl' installed by `libtoolize' to be set up for use with a
- non-recursive `automake' build. To make use of it, you will need
- to add the following to the `Makefile.am' of the parent project:
-
- ## libltdl/Makefile.inc appends to the following variables
- ## so we set them here before including it:
- BUILT_SOURCES =
-
- AM_CPPFLAGS =
- AM_LDFLAGS =
-
- include_HEADERS =
- noinst_LTLIBRARIES =
- lib_LTLIBRARIES =
- EXTRA_LTLIBRARIES =
-
- EXTRA_DIST =
-
- CLEANFILES =
- MOSTLYCLEANFILES =
-
- include libltdl/Makefile.inc
-
-
-`--quiet'
-`-q'
- Work silently. `libtoolize --quiet' is used by GNU Automake to
- add libtool files to your package if necessary.
-
-`--recursive'
- If passed in conjunction with `--ltdl', this option will cause the
- `libtoolize' installed `libltdl' to be set up for use with a
- recursive `automake' build. To make use of it, you will need to
- adjust the parent project's `configure.ac':
-
- AC_CONFIG_FILES([libltdl/Makefile])
-
- and `Makefile.am':
-
- SUBDIRS += libltdl
-
-`--subproject'
- If passed in conjunction with `--ltdl', this option will cause the
- `libtoolize' installed `libltdl' to be set up for independent
- configuration and compilation as a self-contained subproject. To
- make use of it, you should arrange for your build to call
- `libltdl/configure', and then run `make' in the `libltdl'
- directory (or the subdirectory you put libltdl into). If your
- project uses Autoconf, you can use the supplied `LT_WITH_LTDL'
- macro, or else call `AC_CONFIG_SUBDIRS' directly.
-
- Previous releases of `libltdl' built exclusively in this mode, but
- now it is the default mode both for backwards compatibility and
- because, for example, it is suitable for use in projects that wish
- to use `libltdl', but not use the Autotools for their own build
- process.
-
-`--verbose'
-`-v'
- Work noisily! Give a blow by blow account of what `libtoolize' is
- doing.
-
-`--version'
- Print `libtoolize' version information and exit.
-
- Sometimes it can be useful to pass options to `libtoolize' even
-though it is called by another program, such as `autoreconf'. A
-limited number of options are parsed from the environment variable
-`LIBTOOLIZE_OPTIONS': currently `--debug', `--no-warn', `--quiet' and
-`--verbose'. Multiple options passed in `LIBTOOLIZE_OPTIONS' must be
-separated with a space, comma or a colon.
-
- By default, a warning is issued for unknown options found in
-`LIBTOOLIZE_OPTIONS' unless the first such option is `--no-warn'.
-Where `libtoolize' has always quit on receipt of an unknown option at
-the command line, this and all previous releases of `libtoolize' will
-continue unabated whatever the content of `LIBTOOLIZE_OPTIONS' (modulo
-some possible warning messages).
-
- trick$ LIBTOOLIZE_OPTIONS=--no-warn,--quiet autoreconf --install
-
- If `libtoolize' detects an explicit call to `AC_CONFIG_MACRO_DIR'
-(*note The Autoconf Manual: (autoconf)Input.) in your `configure.ac',
-it will put the Libtool macros in the specified directory.
-
- In the future other Autotools will automatically check the contents
-of `AC_CONFIG_MACRO_DIR', but at the moment it is more portable to add
-the macro directory to `ACLOCAL_AMFLAGS' in `Makefile.am', which is
-where the tools currently look. If `libtoolize' doesn't see
-`AC_CONFIG_MACRO_DIR', it too will honour the first `-I' argument in
-`ACLOCAL_AMFLAGS' when choosing a directory to store libtool
-configuration macros in. It is perfectly sensible to use both
-`AC_CONFIG_MACRO_DIR' and `ACLOCAL_AMFLAGS', as long as they are kept
-in synchronisation.
-
- ACLOCAL_AMFLAGS = -I m4
-
- When you bootstrap your project with `aclocal', then you will need
-to explicitly pass the same macro directory with `aclocal''s `-I' flag:
-
- trick$ aclocal -I m4
-
- If `libtoolize' detects an explicit call to `AC_CONFIG_AUX_DIR'
-(*note The Autoconf Manual: (autoconf)Input.) in your `configure.ac', it
-will put the other support files in the specified directory. Otherwise
-they too end up in the project root directory.
-
- Unless `--no-warn' is passed, `libtoolize' displays hints for adding
-libtool support to your package, as well.
-
-
-File: libtool.info, Node: Autoconf and LTLIBOBJS, Prev: Invoking libtoolize, Up: Distributing
-
-5.5.2 Autoconf and `LTLIBOBJS'
-------------------------------
-
-People used to add code like the following to their `configure.ac':
-
- LTLIBOBJS=`echo "$LIBOBJS" | sed 's/\.[^.]* /.lo /g;s/\.[^.]*$/.lo/'`
- AC_SUBST([LTLIBOBJS])
-
-This is no longer required (since Autoconf 2.54), and doesn't take
-Automake's deansification support into account either, so doesn't work
-correctly even with ancient Autoconfs!
-
- Provided you are using a recent (2.54 or better) incarnation of
-Autoconf, the call to `AC_OUTPUT' takes care of setting `LTLIBOBJS' up
-correctly, so you can simply delete such snippets from your
-`configure.ac' if you had them.
-
-
-File: libtool.info, Node: Static-only libraries, Prev: Distributing, Up: Integrating libtool
-
-5.6 Static-only libraries
-=========================
-
-When you are developing a package, it is often worthwhile to configure
-your package with the `--disable-shared' flag, or to override the
-defaults for `LT_INIT' by using the `disable-shared' option (*note The
-`LT_INIT' macro: LT_INIT.). This prevents libtool from building shared
-libraries, which has several advantages:
-
- * compilation is twice as fast, which can speed up your development
- cycle,
-
- * debugging is easier because you don't need to deal with any
- complexities added by shared libraries, and
-
- * you can see how libtool behaves on static-only platforms.
-
- You may want to put a small note in your package `README' to let
-other developers know that `--disable-shared' can save them time. The
-following example note is taken from the GIMP(1) distribution `README':
-
- The GIMP uses GNU Libtool in order to build shared libraries on a
- variety of systems. While this is very nice for making usable
- binaries, it can be a pain when trying to debug a program. For that
- reason, compilation of shared libraries can be turned off by
- specifying the `--disable-shared' option to `configure'.
-
- ---------- Footnotes ----------
-
- (1) GNU Image Manipulation Program, for those who haven't taken the
-plunge. See `http://www.gimp.org/'.
-
-
-File: libtool.info, Node: Other languages, Next: Versioning, Prev: Integrating libtool, Up: Top
-
-6 Using libtool with other languages
-************************************
-
-Libtool was first implemented in order to add support for writing shared
-libraries in the C language. However, over time, libtool is being
-integrated with other languages, so that programmers are free to reap
-the benefits of shared libraries in their favorite programming language.
-
- This chapter describes how libtool interacts with other languages,
-and what special considerations you need to make if you do not use C.
-
-* Menu:
-
-* C++ libraries:: Writing libraries for C++
-* Tags:: Tags
-
-
-File: libtool.info, Node: C++ libraries, Next: Tags, Up: Other languages
-
-6.1 Writing libraries for C++
-=============================
-
-Creating libraries of C++ code should be a fairly straightforward
-process, because its object files differ from C ones in only three ways:
-
- 1. Because of name mangling, C++ libraries are only usable by the C++
- compiler that created them. This decision was made by the
- designers of C++ in order to protect users from conflicting
- implementations of features such as constructors, exception
- handling, and RTTI.
-
- 2. On some systems, the C++ compiler must take special actions for the
- dynamic linker to run dynamic (i.e., run-time) initializers. This
- means that we should not call `ld' directly to link such
- libraries, and we should use the C++ compiler instead.
-
- 3. C++ compilers will link some Standard C++ library in by default,
- but libtool does not know which are these libraries, so it cannot
- even run the inter-library dependence analyzer to check how to
- link it in. Therefore, running `ld' to link a C++ program or
- library is deemed to fail.
-
- Because of these three issues, Libtool has been designed to always
-use the C++ compiler to compile and link C++ programs and libraries. In
-some instances the `main()' function of a program must also be compiled
-with the C++ compiler for static C++ objects to be properly initialized.
-
-
-File: libtool.info, Node: Tags, Prev: C++ libraries, Up: Other languages
-
-6.2 Tags
-========
-
-Libtool supports multiple languages through the use of tags.
-Technically a tag corresponds to a set of configuration variables
-associated with a language. These variables tell `libtool' how it
-should create objects and libraries for each language.
-
- Tags are defined at `configure'-time for each language activated in
-the package (see `LT_LANG' in *note LT_INIT::). Here is the
-correspondence between language names and tags names.
-
-Language name Tag name
-C CC
-C++ CXX
-Java GCJ
-Fortran 77 F77
-Fortran FC
-Go GO
-Windows Resource RC
-
- `libtool' tries to automatically infer which tag to use from the
-compiler command being used to compile or link. If it can't infer a
-tag, then it defaults to the configuration for the `C' language.
-
- The tag can also be specified using `libtool''s `--tag=TAG' option
-(*note Invoking libtool::). It is a good idea to do so in `Makefile'
-rules, because that will allow users to substitute the compiler without
-relying on `libtool' inference heuristics. When no tag is specified,
-`libtool' will default to `CC'; this tag always exists.
-
- Finally, the set of tags available in a particular project can be
-retrieved by tracing for the `LT_SUPPORTED_TAG' macro (*note Trace
-interface::).
-
-
-File: libtool.info, Node: Versioning, Next: Library tips, Prev: Other languages, Up: Top
-
-7 Library interface versions
-****************************
-
-The most difficult issue introduced by shared libraries is that of
-creating and resolving runtime dependencies. Dependencies on programs
-and libraries are often described in terms of a single name, such as
-`sed'. So, one may say "libtool depends on sed," and that is good
-enough for most purposes.
-
- However, when an interface changes regularly, we need to be more
-specific: "Gnus 5.1 requires Emacs 19.28 or above." Here, the
-description of an interface consists of a name, and a "version number."
-
- Even that sort of description is not accurate enough for some
-purposes. What if Emacs 20 changes enough to break Gnus 5.1?
-
- The same problem exists in shared libraries: we require a formal
-version system to describe the sorts of dependencies that programs have
-on shared libraries, so that the dynamic linker can guarantee that
-programs are linked only against libraries that provide the interface
-they require.
-
-* Menu:
-
-* Interfaces:: What are library interfaces?
-* Libtool versioning:: Libtool's versioning system.
-* Updating version info:: Changing version information before releases.
-* Release numbers:: Breaking binary compatibility for aesthetics.
-
-
-File: libtool.info, Node: Interfaces, Next: Libtool versioning, Up: Versioning
-
-7.1 What are library interfaces?
-================================
-
-Interfaces for libraries may be any of the following (and more):
-
- * global variables: both names and types
-
- * global functions: argument types and number, return types, and
- function names
-
- * standard input, standard output, standard error, and file formats
-
- * sockets, pipes, and other inter-process communication protocol
- formats
-
- Note that static functions do not count as interfaces, because they
-are not directly available to the user of the library.
-
-
-File: libtool.info, Node: Libtool versioning, Next: Updating version info, Prev: Interfaces, Up: Versioning
-
-7.2 Libtool's versioning system
-===============================
-
-Libtool has its own formal versioning system. It is not as flexible as
-some, but it is definitely the simplest of the more powerful versioning
-systems.
-
- Think of a library as exporting several sets of interfaces,
-arbitrarily represented by integers. When a program is linked against
-a library, it may use any subset of those interfaces.
-
- Libtool's description of the interfaces that a program uses is
-simple: it encodes the least and the greatest interface numbers in the
-resulting binary (FIRST-INTERFACE, LAST-INTERFACE).
-
- The dynamic linker is guaranteed that if a library supports _every_
-interface number between FIRST-INTERFACE and LAST-INTERFACE, then the
-program can be relinked against that library.
-
- Note that this can cause problems because libtool's compatibility
-requirements are actually stricter than is necessary.
-
- Say `libhello' supports interfaces 5, 16, 17, 18, and 19, and that
-libtool is used to link `test' against `libhello'.
-
- Libtool encodes the numbers 5 and 19 in `test', and the dynamic
-linker will only link `test' against libraries that support _every_
-interface between 5 and 19. So, the dynamic linker refuses to link
-`test' against `libhello'!
-
- In order to eliminate this problem, libtool only allows libraries to
-declare consecutive interface numbers. So, `libhello' can declare at
-most that it supports interfaces 16 through 19. Then, the dynamic
-linker will link `test' against `libhello'.
-
- So, libtool library versions are described by three integers:
-
-CURRENT
- The most recent interface number that this library implements.
-
-REVISION
- The implementation number of the CURRENT interface.
-
-AGE
- The difference between the newest and oldest interfaces that this
- library implements. In other words, the library implements all the
- interface numbers in the range from number `CURRENT - AGE' to
- `CURRENT'.
-
- If two libraries have identical CURRENT and AGE numbers, then the
-dynamic linker chooses the library with the greater REVISION number.
-
-
-File: libtool.info, Node: Updating version info, Next: Release numbers, Prev: Libtool versioning, Up: Versioning
-
-7.3 Updating library version information
-========================================
-
-If you want to use libtool's versioning system, then you must specify
-the version information to libtool using the `-version-info' flag
-during link mode (*note Link mode::).
-
- This flag accepts an argument of the form
-`CURRENT[:REVISION[:AGE]]'. So, passing `-version-info 3:12:1' sets
-CURRENT to 3, REVISION to 12, and AGE to 1.
-
- If either REVISION or AGE are omitted, they default to 0. Also note
-that AGE must be less than or equal to the CURRENT interface number.
-
- Here are a set of rules to help you update your library version
-information:
-
- 1. Start with version information of `0:0:0' for each libtool library.
-
- 2. Update the version information only immediately before a public
- release of your software. More frequent updates are unnecessary,
- and only guarantee that the current interface number gets larger
- faster.
-
- 3. If the library source code has changed at all since the last
- update, then increment REVISION (`C:R:A' becomes `C:r+1:A').
-
- 4. If any interfaces have been added, removed, or changed since the
- last update, increment CURRENT, and set REVISION to 0.
-
- 5. If any interfaces have been added since the last public release,
- then increment AGE.
-
- 6. If any interfaces have been removed or changed since the last
- public release, then set AGE to 0.
-
- *_Never_* try to set the interface numbers so that they correspond
-to the release number of your package. This is an abuse that only
-fosters misunderstanding of the purpose of library versions. Instead,
-use the `-release' flag (*note Release numbers::), but be warned that
-every release of your package will not be binary compatible with any
-other release.
-
- The following explanation may help to understand the above rules a
-bit better: consider that there are three possible kinds of reactions
-from users of your library to changes in a shared library:
-
- 1. Programs using the previous version may use the new version as
- drop-in replacement, and programs using the new version can also
- work with the previous one. In other words, no recompiling nor
- relinking is needed. In this case, bump REVISION only, don't touch
- CURRENT nor AGE.
-
- 2. Programs using the previous version may use the new version as
- drop-in replacement, but programs using the new version may use
- APIs not present in the previous one. In other words, a program
- linking against the new version may fail with "unresolved symbols"
- if linking against the old version at runtime: set REVISION to 0,
- bump CURRENT and AGE.
-
- 3. Programs may need to be changed, recompiled, relinked in order to
- use the new version. Bump CURRENT, set REVISION and AGE to 0.
-
-In the above description, _programs_ using the library in question may
-also be replaced by other libraries using it.
-
-
-File: libtool.info, Node: Release numbers, Prev: Updating version info, Up: Versioning
-
-7.4 Managing release information
-================================
-
-Often, people want to encode the name of the package release into the
-shared library so that it is obvious to the user which package their
-programs are linked against. This convention is used especially on
-GNU/Linux:
-
- trick$ ls /usr/lib/libbfd*
- /usr/lib/libbfd.a /usr/lib/libbfd.so.2.7.0.2
- /usr/lib/libbfd.so
- trick$
-
- On `trick', `/usr/lib/libbfd.so' is a symbolic link to
-`libbfd.so.2.7.0.2', which was distributed as a part of
-`binutils-2.7.0.2'.
-
- Unfortunately, this convention conflicts directly with libtool's
-idea of library interface versions, because the library interface
-rarely changes at the same time that the release number does, and the
-library suffix is never the same across all platforms.
-
- So, in order to accommodate both views, you can use the `-release'
-flag in order to set release information for libraries for which you do
-not want to use `-version-info'. For the `libbfd' example, the next
-release that uses libtool should be built with `-release 2.9.0', which
-will produce the following files on GNU/Linux:
-
- trick$ ls /usr/lib/libbfd*
- /usr/lib/libbfd-2.9.0.so /usr/lib/libbfd.a
- /usr/lib/libbfd.so
- trick$
-
- In this case, `/usr/lib/libbfd.so' is a symbolic link to
-`libbfd-2.9.0.so'. This makes it obvious that the user is dealing with
-`binutils-2.9.0', without compromising libtool's idea of interface
-versions.
-
- Note that this option causes a modification of the library name, so
-do not use it unless you want to break binary compatibility with any
-past library releases. In general, you should only use `-release' for
-package-internal libraries or for ones whose interfaces change very
-frequently.
-
-
-File: libtool.info, Node: Library tips, Next: Inter-library dependencies, Prev: Versioning, Up: Top
-
-8 Tips for interface design
-***************************
-
-Writing a good library interface takes a lot of practice and thorough
-understanding of the problem that the library is intended to solve.
-
- If you design a good interface, it won't have to change often, you
-won't have to keep updating documentation, and users won't have to keep
-relearning how to use the library.
-
- Here is a brief list of tips for library interface design that may
-help you in your exploits:
-
-Plan ahead
- Try to make every interface truly minimal, so that you won't need
- to delete entry points very often.
-
-Avoid interface changes
- Some people love redesigning and changing entry points just for
- the heck of it (note: _renaming_ a function is considered changing
- an entry point). Don't be one of those people. If you must
- redesign an interface, then try to leave compatibility functions
- behind so that users don't need to rewrite their existing code.
-
-Use opaque data types
- The fewer data type definitions a library user has access to, the
- better. If possible, design your functions to accept a generic
- pointer (that you can cast to an internal data type), and provide
- access functions rather than allowing the library user to directly
- manipulate the data. That way, you have the freedom to change the
- data structures without changing the interface.
-
- This is essentially the same thing as using abstract data types and
- inheritance in an object-oriented system.
-
-Use header files
- If you are careful to document each of your library's global
- functions and variables in header files, and include them in your
- library source files, then the compiler will let you know if you
- make any interface changes by accident (*note C header files::).
-
-Use the `static' keyword (or equivalent) whenever possible
- The fewer global functions your library has, the more flexibility
- you'll have in changing them. Static functions and variables may
- change forms as often as you like... your users cannot access
- them, so they aren't interface changes.
-
-Be careful with array dimensions
- The number of elements in a global array is part of an interface,
- even if the header just declares `extern int foo[];'. This is
- because on i386 and some other SVR4/ELF systems, when an
- application references data in a shared library the size of that
- data (whatever its type) is included in the application
- executable. If you might want to change the size of an array or
- string then provide a pointer not the actual array.
-
-* Menu:
-
-* C header files:: How to write portable include files.
-
-
-File: libtool.info, Node: C header files, Up: Library tips
-
-8.1 Writing C header files
-==========================
-
-Writing portable C header files can be difficult, since they may be read
-by different types of compilers:
-
-C++ compilers
- C++ compilers require that functions be declared with full
- prototypes, since C++ is more strongly typed than C. C functions
- and variables also need to be declared with the `extern "C"'
- directive, so that the names aren't mangled. *Note C++
- libraries::, for other issues relevant to using C++ with libtool.
-
-ANSI C compilers
- ANSI C compilers are not as strict as C++ compilers, but functions
- should be prototyped to avoid unnecessary warnings when the header
- file is `#include'd.
-
-non-ANSI C compilers
- Non-ANSI compilers will report errors if functions are prototyped.
-
- These complications mean that your library interface headers must use
-some C preprocessor magic in order to be usable by each of the above
-compilers.
-
- `foo.h' in the `tests/demo' subdirectory of the libtool distribution
-serves as an example for how to write a header file that can be safely
-installed in a system directory.
-
- Here are the relevant portions of that file:
-
- /* BEGIN_C_DECLS should be used at the beginning of your declarations,
- so that C++ compilers don't mangle their names. Use END_C_DECLS at
- the end of C declarations. */
- #undef BEGIN_C_DECLS
- #undef END_C_DECLS
- #ifdef __cplusplus
- # define BEGIN_C_DECLS extern "C" {
- # define END_C_DECLS }
- #else
- # define BEGIN_C_DECLS /* empty */
- # define END_C_DECLS /* empty */
- #endif
-
- /* PARAMS is a macro used to wrap function prototypes, so that
- compilers that don't understand ANSI C prototypes still work,
- and ANSI C compilers can issue warnings about type mismatches. */
- #undef PARAMS
- #if defined (__STDC__) || defined (_AIX) \
- || (defined (__mips) && defined (_SYSTYPE_SVR4)) \
- || defined(WIN32) || defined(__cplusplus)
- # define PARAMS(protos) protos
- #else
- # define PARAMS(protos) ()
- #endif
-
- These macros are used in `foo.h' as follows:
-
- #ifndef FOO_H
- #define FOO_H 1
-
- /* The above macro definitions. */
- #include "..."
-
- BEGIN_C_DECLS
-
- int foo PARAMS((void));
- int hello PARAMS((void));
-
- END_C_DECLS
-
- #endif /* !FOO_H */
-
- Note that the `#ifndef FOO_H' prevents the body of `foo.h' from
-being read more than once in a given compilation.
-
- Also the only thing that must go outside the
-`BEGIN_C_DECLS'/`END_C_DECLS' pair are `#include' lines. Strictly
-speaking it is only C symbol names that need to be protected, but your
-header files will be more maintainable if you have a single pair of
-these macros around the majority of the header contents.
-
- You should use these definitions of `PARAMS', `BEGIN_C_DECLS', and
-`END_C_DECLS' into your own headers. Then, you may use them to create
-header files that are valid for C++, ANSI, and non-ANSI compilers(1).
-
- Do not be naive about writing portable code. Following the tips
-given above will help you miss the most obvious problems, but there are
-definitely other subtle portability issues. You may need to cope with
-some of the following issues:
-
- * Pre-ANSI compilers do not always support the `void *' generic
- pointer type, and so need to use `char *' in its place.
-
- * The `const', `inline' and `signed' keywords are not supported by
- some compilers, especially pre-ANSI compilers.
-
- * The `long double' type is not supported by many compilers.
-
- ---------- Footnotes ----------
-
- (1) We used to recommend `__P', `__BEGIN_DECLS' and `__END_DECLS'.
-This was bad advice since symbols (even preprocessor macro names) that
-begin with an underscore are reserved for the use of the compiler.
-
-
-File: libtool.info, Node: Inter-library dependencies, Next: Dlopened modules, Prev: Library tips, Up: Top
-
-9 Inter-library dependencies
-****************************
-
-By definition, every shared library system provides a way for
-executables to depend on libraries, so that symbol resolution is
-deferred until runtime.
-
- An "inter-library dependency" is one in which a library depends on
-other libraries. For example, if the libtool library `libhello' uses
-the `cos' function, then it has an inter-library dependency on `libm',
-the math library that implements `cos'.
-
- Some shared library systems provide this feature in an
-internally-consistent way: these systems allow chains of dependencies of
-potentially infinite length.
-
- However, most shared library systems are restricted in that they only
-allow a single level of dependencies. In these systems, programs may
-depend on shared libraries, but shared libraries may not depend on other
-shared libraries.
-
- In any event, libtool provides a simple mechanism for you to declare
-inter-library dependencies: for every library `libNAME' that your own
-library depends on, simply add a corresponding `-lNAME' option to the
-link line when you create your library. To make an example of our
-`libhello' that depends on `libm':
-
- burger$ libtool --mode=link gcc -g -O -o libhello.la foo.lo hello.lo \
- -rpath /usr/local/lib -lm
- burger$
-
- When you link a program against `libhello', you don't need to
-specify the same `-l' options again: libtool will do that for you, in
-order to guarantee that all the required libraries are found. This
-restriction is only necessary to preserve compatibility with static
-library systems and simple dynamic library systems.
-
- Some platforms, such as Windows, do not even allow you this
-flexibility. In order to build a shared library, it must be entirely
-self-contained or it must have dependencies known at link time (that is,
-have references only to symbols that are found in the `.lo' files or
-the specified `-l' libraries), and you need to specify the
-`-no-undefined' flag. By default, libtool builds only static libraries
-on these kinds of platforms.
-
- The simple-minded inter-library dependency tracking code of libtool
-releases prior to 1.2 was disabled because it was not clear when it was
-possible to link one library with another, and complex failures would
-occur. A more complex implementation of this concept was re-introduced
-before release 1.3, but it has not been ported to all platforms that
-libtool supports. The default, conservative behavior is to avoid
-linking one library with another, introducing their inter-dependencies
-only when a program is linked with them.
-
-
-File: libtool.info, Node: Dlopened modules, Next: Using libltdl, Prev: Inter-library dependencies, Up: Top
-
-10 Dlopened modules
-*******************
-
-It can sometimes be confusing to discuss "dynamic linking", because the
-term is used to refer to two different concepts:
-
- 1. Compiling and linking a program against a shared library, which is
- resolved automatically at run time by the dynamic linker. In this
- process, dynamic linking is transparent to the application.
-
- 2. The application calling functions such as `dlopen' that load
- arbitrary, user-specified modules at runtime. This type of dynamic
- linking is explicitly controlled by the application.
-
- To mitigate confusion, this manual refers to the second type of
-dynamic linking as "dlopening" a module.
-
- The main benefit to dlopening object modules is the ability to access
-compiled object code to extend your program, rather than using an
-interpreted language. In fact, dlopen calls are frequently used in
-language interpreters to provide an efficient way to extend the
-language.
-
- Libtool provides support for dlopened modules. However, you should
-indicate that your package is willing to use such support, by using the
-`LT_INIT' option `dlopen' in `configure.ac'. If this option is not
-given, libtool will assume no dlopening mechanism is available, and
-will try to simulate it.
-
- This chapter discusses how you as a dlopen application developer
-might use libtool to generate dlopen-accessible modules.
-
-* Menu:
-
-* Building modules:: Creating dlopenable objects and libraries.
-* Dlpreopening:: Dlopening that works on static platforms.
-* Linking with dlopened modules:: Using dlopenable modules in libraries.
-* Finding the dlname:: Choosing the right file to `dlopen'.
-* Dlopen issues:: Unresolved problems that need your attention.
-
-
-File: libtool.info, Node: Building modules, Next: Dlpreopening, Up: Dlopened modules
-
-10.1 Building modules to dlopen
-===============================
-
-On some operating systems, a program symbol must be specially declared
-in order to be dynamically resolved with the `dlsym' (or equivalent)
-function. Libtool provides the `-export-dynamic' and `-module' link
-flags (*note Link mode::), for you to make that declaration. You need
-to use these flags if you are linking an application program that
-dlopens other modules or a libtool library that will also be dlopened.
-
- For example, if we wanted to build a shared library, `hello', that
-would later be dlopened by an application, we would add `-module' to
-the other link flags:
-
- burger$ libtool --mode=link gcc -module -o hello.la foo.lo \
- hello.lo -rpath /usr/local/lib -lm
- burger$
-
- If symbols from your _executable_ are needed to satisfy unresolved
-references in a library you want to dlopen you will have to use the flag
-`-export-dynamic'. You should use `-export-dynamic' while linking the
-executable that calls dlopen:
-
- burger$ libtool --mode=link gcc -export-dynamic -o helldl main.o
- burger$
-
-
-File: libtool.info, Node: Dlpreopening, Next: Linking with dlopened modules, Prev: Building modules, Up: Dlopened modules
-
-10.2 Dlpreopening
-=================
-
-Libtool provides special support for dlopening libtool object and
-libtool library files, so that their symbols can be resolved _even on
-platforms without any `dlopen' and `dlsym' functions_.
-
- Consider the following alternative ways of loading code into your
-program, in order of increasing "laziness":
-
- 1. Linking against object files that become part of the program
- executable, whether or not they are referenced. If an object file
- cannot be found, then the compile time linker refuses to create
- the executable.
-
- 2. Declaring a static library to the linker, so that it is searched
- at link time in order to satisfy any undefined references in the
- above object files. If the static library cannot be found, then
- the compile time linker refuses to create the executable.
-
- 3. Declaring a shared library to the runtime linker, so that it is
- searched at runtime in order to satisfy any undefined references
- in the above files. If the shared library cannot be found, then
- the dynamic linker aborts the program before it runs.
-
- 4. Dlopening a module, so that the application can resolve its own,
- dynamically-computed references. If there is an error opening the
- module, or the module is not found, then the application can
- recover without crashing.
-
- Libtool emulates `-dlopen' on static platforms by linking objects
-into the program at compile time, and creating data structures that
-represent the program's symbol table. In order to use this feature,
-you must declare the objects you want your application to dlopen by
-using the `-dlopen' or `-dlpreopen' flags when you link your program
-(*note Link mode::).
-
- -- Data Type: lt_dlsymlist typedef struct { const char *NAME;
- void *ADDRESS; } lt_dlsymlist
- The NAME attribute is a null-terminated character string of the
- symbol name, such as `"fprintf"'. The ADDRESS attribute is a
- generic pointer to the appropriate object, such as `&fprintf'.
-
- -- Variable: const lt_dlsymlist lt_preloaded_symbols[]
- An array of `lt_dlsymlist' structures, representing all the
- preloaded symbols linked into the program proper. For each module
- `-dlpreopen'ed by the Libtool linked program there is an element
- with the NAME of the module and an ADDRESS of `0', followed by all
- symbols exported from this file. For the executable itself the
- special name `@PROGRAM@' is used. The last element of all has a
- NAME and ADDRESS of `0'.
-
- To facilitate inclusion of symbol lists into libraries,
- `lt_preloaded_symbols' is `#define'd to a suitably unique name in
- `ltdl.h'.
-
- This variable may not be declared `const' on some systems due to
- relocation issues.
-
- Some compilers may allow identifiers that are not valid in ANSI C,
-such as dollar signs. Libtool only recognizes valid ANSI C symbols (an
-initial ASCII letter or underscore, followed by zero or more ASCII
-letters, digits, and underscores), so non-ANSI symbols will not appear
-in `lt_preloaded_symbols'.
-
- -- Function: int lt_dlpreload (const lt_dlsymlist *PRELOADED)
- Register the list of preloaded modules PRELOADED. If PRELOADED is
- `NULL', then all previously registered symbol lists, except the
- list set by `lt_dlpreload_default', are deleted. Return 0 on
- success.
-
- -- Function: int lt_dlpreload_default (const lt_dlsymlist *PRELOADED)
- Set the default list of preloaded modules to PRELOADED, which
- won't be deleted by `lt_dlpreload'. Note that this function does
- _not_ require libltdl to be initialized using `lt_dlinit' and can
- be used in the program to register the default preloaded modules.
- Instead of calling this function directly, most programs will use
- the macro `LTDL_SET_PRELOADED_SYMBOLS'.
-
- Return 0 on success.
-
- -- Macro: LTDL_SET_PRELOADED_SYMBOLS
- Set the default list of preloaded symbols. Should be used in your
- program to initialize libltdl's list of preloaded modules.
-
- #include <ltdl.h>
-
- int main() {
- /* ... */
- LTDL_SET_PRELOADED_SYMBOLS();
- /* ... */
- }
-
- -- Function Type: int lt_dlpreload_callback_func (lt_dlhandle HANDLE)
- Functions of this type can be passed to `lt_dlpreload_open', which
- in turn will call back into a function thus passed for each
- preloaded module that it opens.
-
- -- Function: int lt_dlpreload_open (const char *ORIGINATOR,
- lt_dlpreload_callback_func *FUNC)
- Load all of the preloaded modules for ORIGINATOR. For every
- module opened in this way, call FUNC.
-
- To open all of the modules preloaded into `libhell.la' (presumably
- from within the `libhell.a' initialisation code):
-
- #define preloaded_symbols lt_libhell_LTX_preloaded_symbols
-
- static int hell_preload_callback (lt_dlhandle handle);
-
- int
- hell_init (void)
- {
- ...
- if (lt_dlpreload (&preloaded_symbols) == 0)
- {
- lt_dlpreload_open ("libhell", preload_callback);
- }
- ...
- }
-
- Note that to prevent clashes between multiple preloaded modules,
- the preloaded symbols are accessed via a mangled symbol name: to
- get the symbols preloaded into `libhell', you must prefix
- `preloaded_symbols' with `lt_'; the originator name, `libhell' in
- this case; and `_LTX_'. That is,
- `lt_libhell_LTX_preloaded_symbols' here.
-
-
-File: libtool.info, Node: Linking with dlopened modules, Next: Finding the dlname, Prev: Dlpreopening, Up: Dlopened modules
-
-10.3 Linking with dlopened modules
-==================================
-
-When, say, an interpreter application uses dlopened modules to extend
-the list of methods it provides, an obvious abstraction for the
-maintainers of the interpreter is to have all methods (including the
-built in ones supplied with the interpreter) accessed through dlopen.
-For one thing, the dlopening functionality will be tested even during
-routine invocations. For another, only one subsystem has to be written
-for getting methods into the interpreter.
-
- The downside of this abstraction is, of course, that environments
-that provide only static linkage can't even load the intrinsic
-interpreter methods. Not so! We can statically link those methods by
-*dlpreopening* them.
-
- Unfortunately, since platforms such as AIX and cygwin require that
-all library symbols must be resolved at compile time, the interpreter
-maintainers will need to provide a library to both its own dlpreopened
-modules, and third-party modules loaded by dlopen. In itself, that is
-not so bad, except that the interpreter too must provide those same
-symbols otherwise it will be impossible to resolve all the symbols
-required by the modules as they are loaded. Things are even worse if
-the code that loads the modules for the interpreter is itself in a
-library - and that is usually the case for any non-trivial application.
-Modern platforms take care of this by automatically loading all of a
-module's dependency libraries as the module is loaded (libltdl can do
-this even on platforms that can't do it by themselves). In the end,
-this leads to problems with duplicated symbols and prevents modules
-from loading, and prevents the application from compiling when modules
-are preloaded.
-
- ,-------------. ,------------------. ,-----------------.
- | Interpreter |----> Module------------> Third-party |
- `-------------' | Loader | |Dlopened Modules |
- | | | `-----------------'
- |,-------v--------.| |
- || Dlpreopened || |
- || Modules || |
- |`----------------'| |
- | | | |
- |,-------v--------.| ,--------v--------.
- ||Module Interface|| |Module Interface |
- || Library || | Library |
- |`----------------'| `-----------------'
- `------------------'
-
- Libtool has the concept of "weak library interfaces" to circumvent
-this problem. Recall that the code that dlopens method-provider
-modules for the interpreter application resides in a library: All of
-the modules and the dlopener library itself should be linked against
-the common library that resolves the module symbols at compile time.
-To guard against duplicate symbol definitions, and for dlpreopened
-modules to work at all in this scenario, the dlopener library must
-declare that it provides a weak library interface to the common symbols
-in the library it shares with the modules. That way, when `libtool'
-links the *Module Loader* library with some *Dlpreopened Modules* that
-were in turn linked against the *Module Interface Library*, it knows
-that the *Module Loader* provides an already loaded *Module Interface
-Library* to resolve symbols for the *Dlpreopened Modules*, and doesn't
-ask the compiler driver to link an identical *Module Interface Library*
-dependency library too.
-
- In conjunction with Automake, the `Makefile.am' for the *Module
-Loader* might look like this:
-
- lib_LTLIBRARIES = libinterface.la libloader.la
-
- libinterface_la_SOURCES = interface.c interface.h
- libinterface_la_LDFLAGS = -version-info 3:2:1
-
- libloader_la_SOURCES = loader.c
- libloader_la_LDFLAGS = -weak libinterface.la \
- -version-info 3:2:1 \
- -dlpreopen ../modules/intrinsics.la
- libloader_la_LIBADD = $(libinterface_la_OBJECTS)
-
- And the `Makefile.am' for the `intrinsics.la' module in a sibling
-`modules' directory might look like this:
-
- AM_CPPFLAGS = -I$(srcdir)/../libloader
- AM_LDFLAGS = -no-undefined -module -avoid-version \
- -export-dynamic
-
- noinst_LTLIBRARIES = intrinsics.la
-
- intrinsics_la_LIBADD = ../libloader/libinterface.la
-
- ../libloader/libinterface.la:
- cd ../libloader && $(MAKE) $(AM_MAKEFLAGS) libinterface.la
-
- For a more complex example, see the sources of `libltdl' in the
-Libtool distribution, which is built with the help of the `-weak'
-option.
-
-
-File: libtool.info, Node: Finding the dlname, Next: Dlopen issues, Prev: Linking with dlopened modules, Up: Dlopened modules
-
-10.4 Finding the correct name to dlopen
-=======================================
-
-After a library has been linked with `-module', it can be dlopened.
-Unfortunately, because of the variation in library names, your package
-needs to determine the correct file to dlopen.
-
- The most straightforward and flexible implementation is to determine
-the name at runtime, by finding the installed `.la' file, and searching
-it for the following lines:
-
- # The name that we can `dlopen'.
- dlname='DLNAME'
-
- If DLNAME is empty, then the library cannot be dlopened. Otherwise,
-it gives the dlname of the library. So, if the library was installed
-as `/usr/local/lib/libhello.la', and the DLNAME was `libhello.so.3',
-then `/usr/local/lib/libhello.so.3' should be dlopened.
-
- If your program uses this approach, then it should search the
-directories listed in the `LD_LIBRARY_PATH'(1) environment variable, as
-well as the directory where libraries will eventually be installed.
-Searching this variable (or equivalent) will guarantee that your
-program can find its dlopened modules, even before installation,
-provided you have linked them using libtool.
-
- ---------- Footnotes ----------
-
- (1) `LIBPATH' on AIX, and `SHLIB_PATH' on HP-UX.
-
-
-File: libtool.info, Node: Dlopen issues, Prev: Finding the dlname, Up: Dlopened modules
-
-10.5 Unresolved dlopen issues
-=============================
-
-The following problems are not solved by using libtool's dlopen support:
-
- * Dlopen functions are generally only available on shared library
- platforms. If you want your package to be portable to static
- platforms, you have to use either libltdl (*note Using libltdl::)
- or develop your own alternatives to dlopening dynamic code. Most
- reasonable solutions involve writing wrapper functions for the
- `dlopen' family, which do package-specific tricks when dlopening
- is unsupported or not available on a given platform.
-
- * There are major differences in implementations of the `dlopen'
- family of functions. Some platforms do not even use the same
- function names (notably HP-UX, with its `shl_load' family).
-
- * The application developer must write a custom search function in
- order to discover the correct module filename to supply to
- `dlopen'.
-
-
-File: libtool.info, Node: Using libltdl, Next: Trace interface, Prev: Dlopened modules, Up: Top
-
-11 Using libltdl
-****************
-
-Libtool provides a small library, called `libltdl', that aims at hiding
-the various difficulties of dlopening libraries from programmers. It
-consists of a few headers and small C source files that can be
-distributed with applications that need dlopening functionality. On
-some platforms, whose dynamic linkers are too limited for a simple
-implementation of `libltdl' services, it requires GNU DLD, or it will
-only emulate dynamic linking with libtool's dlpreopening mechanism.
-
-libltdl supports currently the following dynamic linking mechanisms:
-
- * `dlopen' (POSIX compliant systems, GNU/Linux, etc.)
-
- * `shl_load' (HP-UX)
-
- * `LoadLibrary' (Win16 and Win32)
-
- * `load_add_on' (BeOS)
-
- * `NSAddImage' or `NSLinkModule' (Darwin and Mac OS X)
-
- * GNU DLD (emulates dynamic linking for static libraries)
-
- * libtool's dlpreopen (see *note Dlpreopening::)
-
-libltdl is licensed under the terms of the GNU Lesser General Public
-License, with the following exception:
-
- As a special exception to the GNU Lesser General Public License,
- if you distribute this file as part of a program or library that
- is built using GNU Libtool, you may include it under the same
- distribution terms that you use for the rest of that program.
-
-* Menu:
-
-* Libltdl interface:: How to use libltdl in your programs.
-* Modules for libltdl:: Creating modules that can be `dlopen'ed.
-* Thread Safety in libltdl:: Registering callbacks for multi-thread safety.
-* User defined module data:: Associating data with loaded modules.
-* Module loaders for libltdl:: Creating user defined module loaders.
-* Distributing libltdl:: How to distribute libltdl with your package.
-
-
-File: libtool.info, Node: Libltdl interface, Next: Modules for libltdl, Up: Using libltdl
-
-11.1 How to use libltdl in your programs
-========================================
-
-The libltdl API is similar to the POSIX dlopen interface, which is very
-simple but powerful.
-
-To use libltdl in your program you have to include the header file
-`ltdl.h':
-
- #include <ltdl.h>
-
-The early releases of libltdl used some symbols that violated the POSIX
-namespace conventions. These symbols are now deprecated, and have been
-replaced by those described here. If you have code that relies on the
-old deprecated symbol names, defining `LT_NON_POSIX_NAMESPACE' before
-you include `ltdl.h' provides conversion macros. Whichever set of
-symbols you use, the new API is not binary compatible with the last, so
-you will need to recompile your application in order to use this
-version of libltdl.
-
-Note that libltdl is not well tested in a multithreaded environment,
-though the intention is that it should work (*note Using libltdl in a
-multi threaded environment: Thread Safety in libltdl.). It was
-reported that GNU/Linux's glibc 2.0's `dlopen' with `RTLD_LAZY' (which
-libltdl uses by default) is not thread-safe, but this problem is
-supposed to be fixed in glibc 2.1. On the other hand, `RTLD_NOW' was
-reported to introduce problems in multi-threaded applications on
-FreeBSD. Working around these problems is left as an exercise for the
-reader; contributions are certainly welcome.
-
-The following macros are defined by including `ltdl.h':
-
- -- Macro: LT_PATHSEP_CHAR
- `LT_PATHSEP_CHAR' is the system-dependent path separator, that is,
- `;' on Windows and `:' everywhere else.
-
- -- Macro: LT_DIRSEP_CHAR
- If `LT_DIRSEP_CHAR' is defined, it can be used as directory
- separator in addition to `/'. On Windows, this contains `\'.
-
-The following types are defined in `ltdl.h':
-
- -- Type: lt_dlhandle
- `lt_dlhandle' is a module "handle". Every lt_dlopened module has
- a handle associated with it.
-
- -- Type: lt_dladvise
- `lt_dladvise' is used to control optional module loading modes.
- If it is not used, the default mode of the underlying system module
- loader is used.
-
- -- Type: lt_dlsymlist
- `lt_dlsymlist' is a symbol list for dlpreopened modules. This
- structure is described in *note Dlpreopening::.
-
-libltdl provides the following functions:
-
- -- Function: int lt_dlinit (void)
- Initialize libltdl. This function must be called before using
- libltdl and may be called several times. Return 0 on success,
- otherwise the number of errors.
-
- -- Function: int lt_dlexit (void)
- Shut down libltdl and close all modules. This function will only
- then shut down libltdl when it was called as many times as
- `lt_dlinit' has been successfully called. Return 0 on success,
- otherwise the number of errors.
-
- -- Function: lt_dlhandle lt_dlopen (const char *FILENAME)
- Open the module with the file name FILENAME and return a handle
- for it. `lt_dlopen' is able to open libtool dynamic modules,
- preloaded static modules, the program itself and native dynamic
- modules(1).
-
- Unresolved symbols in the module are resolved using its dependency
- libraries and previously dlopened modules. If the executable using
- this module was linked with the `-export-dynamic' flag, then the
- global symbols in the executable will also be used to resolve
- references in the module.
-
- If FILENAME is `NULL' and the program was linked with
- `-export-dynamic' or `-dlopen self', `lt_dlopen' will return a
- handle for the program itself, which can be used to access its
- symbols.
-
- If libltdl cannot find the library and the file name FILENAME does
- not have a directory component it will additionally look in the
- following search paths for the module (in the following order):
-
- 1. user-defined search path: This search path can be changed by
- the program using the functions `lt_dlsetsearchpath',
- `lt_dladdsearchdir' and `lt_dlinsertsearchdir'.
-
- 2. libltdl's search path: This search path is the value of the
- environment variable `LTDL_LIBRARY_PATH'.
-
- 3. system library search path: The system dependent library
- search path (e.g. on GNU/Linux it is `LD_LIBRARY_PATH').
-
- Each search path must be a list of absolute directories separated
- by `LT_PATHSEP_CHAR', for example, `"/usr/lib/mypkg:/lib/foo"'.
- The directory names may not contain the path separator.
-
- If the same module is loaded several times, the same handle is
- returned. If `lt_dlopen' fails for any reason, it returns `NULL'.
-
- -- Function: lt_dlhandle lt_dlopenext (const char *FILENAME)
- The same as `lt_dlopen', except that it tries to append different
- file name extensions to the file name. If the file with the file
- name FILENAME cannot be found libltdl tries to append the
- following extensions:
-
- 1. the libtool archive extension `.la'
-
- 2. the extension used for native dynamically loadable modules on
- the host platform, e.g., `.so', `.sl', etc.
-
- This lookup strategy was designed to allow programs that don't
- have knowledge about native dynamic libraries naming conventions
- to be able to `dlopen' such libraries as well as libtool modules
- transparently.
-
- -- Function: lt_dlhandle lt_dlopenadvise (const char *FILENAME,
- lt_dladvise ADVISE)
- The same as `lt_dlopen', except that it also requires an additional
- argument which may contain additional hints to the underlying
- system module loader. The ADVISE parameter is opaque and can only
- be accessed with the functions documented below.
-
- Note that this function does not change the content of ADVISE, so
- unlike the other calls in this API takes a direct `lt_dladvise'
- type, and not a pointer to the same.
-
- -- Function: int lt_dladvise_init (lt_dladvise *ADVISE)
- The ADVISE parameter can be used to pass hints to the module
- loader when using `lt_dlopenadvise' to perform the loading. The
- ADVISE parameter needs to be initialised by this function before
- it can be used. Any memory used by ADVISE needs to be recycled
- with `lt_dladvise_destroy' when it is no longer needed.
-
- On failure, `lt_dladvise_init' returns non-zero and sets an error
- message that can be retrieved with `lt_dlerror'.
-
- -- Function: int lt_dladvise_destroy (lt_dladvise *ADVISE)
- Recycle the memory used by ADVISE. For an example, see the
- documentation for `lt_dladvise_ext'.
-
- On failure, `lt_dladvise_destroy' returns non-zero and sets an
- error message that can be retrieved with `lt_dlerror'.
-
- -- Function: int lt_dladvise_ext (lt_dladvise *ADVISE)
- Set the `ext' hint on ADVISE. Passing an ADVISE parameter to
- `lt_dlopenadvise' with this hint set causes it to try to append
- different file name extensions like `lt_dlopenext'.
-
- The following example is equivalent to calling `lt_dlopenext
- (filename)':
-
- lt_dlhandle
- my_dlopenext (const char *filename)
- {
- lt_dlhandle handle = 0;
- lt_dladvise advise;
-
- if (!lt_dladvise_init (&advise) && !lt_dladvise_ext (&advise))
- handle = lt_dlopenadvise (filename, advise);
-
- lt_dladvise_destroy (&advise);
-
- return handle;
- }
-
- On failure, `lt_dladvise_ext' returns non-zero and sets an error
- message that can be retrieved with `lt_dlerror'.
-
- -- Function: int lt_dladvise_global (lt_dladvise *ADVISE)
- Set the `symglobal' hint on ADVISE. Passing an ADVISE parameter
- to `lt_dlopenadvise' with this hint set causes it to try to make
- the loaded module's symbols globally available for resolving
- unresolved symbols in subsequently loaded modules.
-
- If neither the `symglobal' nor the `symlocal' hints are set, or if
- a module is loaded without using the `lt_dlopenadvise' call in any
- case, then the visibility of the module's symbols will be as per
- the default for the underlying module loader and OS. Even if a
- suitable hint is passed, not all loaders are able to act upon it in
- which case `lt_dlgetinfo' will reveal whether the hint was actually
- followed.
-
- On failure, `lt_dladvise_global' returns non-zero and sets an error
- message that can be retrieved with `lt_dlerror'.
-
- -- Function: int lt_dladvise_local (lt_dladvise *ADVISE)
- Set the `symlocal' hint on ADVISE. Passing an ADVISE parameter to
- `lt_dlopenadvise' with this hint set causes it to try to keep the
- loaded module's symbols hidden so that they are not visible to
- subsequently loaded modules.
-
- If neither the `symglobal' nor the `symlocal' hints are set, or if
- a module is loaded without using the `lt_dlopenadvise' call in any
- case, then the visibility of the module's symbols will be as per
- the default for the underlying module loader and OS. Even if a
- suitable hint is passed, not all loaders are able to act upon it in
- which case `lt_dlgetinfo' will reveal whether the hint was actually
- followed.
-
- On failure, `lt_dladvise_local' returns non-zero and sets an error
- message that can be retrieved with `lt_dlerror'.
-
- -- Function: int lt_dladvise_resident (lt_dladvise *ADVISE)
- Set the `resident' hint on ADVISE. Passing an ADVISE parameter to
- `lt_dlopenadvise' with this hint set causes it to try to make the
- loaded module resident in memory, so that it cannot be unloaded
- with a later call to `lt_dlclose'.
-
- On failure, `lt_dladvise_resident' returns non-zero and sets an
- error message that can be retrieved with `lt_dlerror'.
-
- -- Function: int lt_dladvise_preload (lt_dladvise *ADVISE)
- Set the `preload' hint on ADVISE. Passing an ADVISE parameter to
- `lt_dlopenadvise' with this hint set causes it to load only
- preloaded modules, so that if a suitable preloaded module is not
- found, `lt_dlopenadvise' will return `NULL'.
-
- -- Function: int lt_dlclose (lt_dlhandle HANDLE)
- Decrement the reference count on the module HANDLE. If it drops
- to zero and no other module depends on this module, then the
- module is unloaded. Return 0 on success.
-
- -- Function: void * lt_dlsym (lt_dlhandle HANDLE, const char *NAME)
- Return the address in the module HANDLE, where the symbol given by
- the null-terminated string NAME is loaded. If the symbol cannot
- be found, `NULL' is returned.
-
- -- Function: const char * lt_dlerror (void)
- Return a human readable string describing the most recent error
- that occurred from any of libltdl's functions. Return `NULL' if
- no errors have occurred since initialization or since it was last
- called.
-
- -- Function: int lt_dladdsearchdir (const char *SEARCH_DIR)
- Append the search directory SEARCH_DIR to the current user-defined
- library search path. Return 0 on success.
-
- -- Function: int lt_dlinsertsearchdir (const char *BEFORE,
- const char *SEARCH_DIR)
- Insert the search directory SEARCH_DIR into the user-defined
- library search path, immediately before the element starting at
- address BEFORE. If BEFORE is `NULL', then SEARCH_DIR is appending
- as if `lt_dladdsearchdir' had been called. Return 0 on success.
-
- -- Function: int lt_dlsetsearchpath (const char *SEARCH_PATH)
- Replace the current user-defined library search path with
- SEARCH_PATH, which must be a list of absolute directories separated
- by `LT_PATHSEP_CHAR'. Return 0 on success.
-
- -- Function: const char * lt_dlgetsearchpath (void)
- Return the current user-defined library search path.
-
- -- Function: int lt_dlforeachfile (const char *SEARCH_PATH,
- int (*FUNC) (const char *FILENAME, void * DATA), void * DATA)
- In some applications you may not want to load individual modules
- with known names, but rather find all of the modules in a set of
- directories and load them all during initialisation. With this
- function you can have libltdl scan the `LT_PATHSEP_CHAR'-delimited
- directory list in SEARCH_PATH for candidates, and pass them, along
- with DATA to your own callback function, FUNC. If SEARCH_PATH is
- `NULL', then search all of the standard locations that `lt_dlopen'
- would examine. This function will continue to make calls to FUNC
- for each file that it discovers in SEARCH_PATH until one of these
- calls returns non-zero, or until the files are exhausted.
- `lt_dlforeachfile' returns the value returned by the last call
- made to FUNC.
-
- For example you could define FUNC to build an ordered "argv"-like
- vector of files using DATA to hold the address of the start of the
- vector.
-
- -- Function: int lt_dlmakeresident (lt_dlhandle HANDLE)
- Mark a module so that it cannot be `lt_dlclose'd. This can be
- useful if a module implements some core functionality in your
- project that would cause your code to crash if removed. Return 0
- on success.
-
- If you use `lt_dlopen (NULL)' to get a HANDLE for the running
- binary, that handle will always be marked as resident, and
- consequently cannot be successfully `lt_dlclose'd.
-
- -- Function: int lt_dlisresident (lt_dlhandle HANDLE)
- Check whether a particular module has been marked as resident,
- returning 1 if it has or 0 otherwise. If there is an error while
- executing this function, return -1 and set an error message for
- retrieval with `lt_dlerror'.
-
- ---------- Footnotes ----------
-
- (1) Some platforms, notably Mac OS X, differentiate between a
-runtime library that cannot be opened by `lt_dlopen' and a dynamic
-module that can. For maximum portability you should try to ensure that
-you only pass `lt_dlopen' objects that have been compiled with libtool's
-`-module' flag.
-
-
-File: libtool.info, Node: Modules for libltdl, Next: Thread Safety in libltdl, Prev: Libltdl interface, Up: Using libltdl
-
-11.2 Creating modules that can be `dlopen'ed
-============================================
-
-Libtool modules are created like normal libtool libraries with a few
-exceptions:
-
- You have to link the module with libtool's `-module' switch, and you
-should link any program that is intended to dlopen the module with
-`-dlopen MODULENAME.LA' where possible, so that libtool can dlpreopen
-the module on platforms that do not support dlopening. If the module
-depends on any other libraries, make sure you specify them either when
-you link the module or when you link programs that dlopen it. If you
-want to disable versioning (*note Versioning::) for a specific module
-you should link it with the `-avoid-version' switch. Note that libtool
-modules don't need to have a "lib" prefix. However, Automake 1.4 or
-higher is required to build such modules.
-
- Usually a set of modules provide the same interface, i.e. exports
-the same symbols, so that a program can dlopen them without having to
-know more about their internals: In order to avoid symbol conflicts all
-exported symbols must be prefixed with "modulename_LTX_" (MODULENAME is
-the name of the module). Internal symbols must be named in such a way
-that they won't conflict with other modules, for example, by prefixing
-them with "_modulename_". Although some platforms support having the
-same symbols defined more than once it is generally not portable and it
-makes it impossible to dlpreopen such modules.
-
- libltdl will automatically cut the prefix off to get the real name of
-the symbol. Additionally, it supports modules that do not use a prefix
-so that you can also dlopen non-libtool modules.
-
- `foo1.c' gives an example of a portable libtool module. Exported
-symbols are prefixed with "foo1_LTX_", internal symbols with "_foo1_".
-Aliases are defined at the beginning so that the code is more readable.
-
- /* aliases for the exported symbols */
- #define foo foo1_LTX_foo
- #define bar foo1_LTX_bar
-
- /* a global variable definition */
- int bar = 1;
-
- /* a private function */
- int _foo1_helper() {
- return bar;
- }
-
- /* an exported function */
- int foo() {
- return _foo1_helper();
- }
-
-The `Makefile.am' contains the necessary rules to build the module
-`foo1.la':
-
- ...
- lib_LTLIBRARIES = foo1.la
-
- foo1_la_SOURCES = foo1.c
- foo1_la_LDFLAGS = -module
- ...
-
-
-File: libtool.info, Node: Thread Safety in libltdl, Next: User defined module data, Prev: Modules for libltdl, Up: Using libltdl
-
-11.3 Using libltdl in a multi threaded environment
-==================================================
-
-Libltdl provides a wrapper around whatever dynamic run-time object
-loading mechanisms are provided by the host system, many of which are
-themselves not thread safe. Consequently libltdl cannot itself be
-consistently thread safe.
-
- If you wish to use libltdl in a multithreaded environment, then you
-must mutex lock around libltdl calls, since they may in turn be calling
-non-thread-safe system calls on some target hosts.
-
- Some old releases of libtool provided a mutex locking API that was
-unusable with POSIX threads, so callers were forced to lock around all
-libltdl API calls anyway. That mutex locking API was next to useless,
-and is not present in current releases.
-
- Some future release of libtool may provide a new POSIX thread
-compliant mutex locking API.
-
-
-File: libtool.info, Node: User defined module data, Next: Module loaders for libltdl, Prev: Thread Safety in libltdl, Up: Using libltdl
-
-11.4 Data associated with loaded modules
-========================================
-
-Some of the internal information about each loaded module that is
-maintained by libltdl is available to the user, in the form of this
-structure:
-
- -- Type: struct lt_dlinfo { char *FILENAME; char *NAME; int REF_COUNT;
- int IS_RESIDENT; int IS_SYMGLOBAL; int IS_SYMLOCAL;}
- `lt_dlinfo' is used to store information about a module. The
- FILENAME attribute is a null-terminated character string of the
- real module file name. If the module is a libtool module then
- NAME is its module name (e.g. `"libfoo"' for `"dir/libfoo.la"'),
- otherwise it is set to `NULL'. The REF_COUNT attribute is a
- reference counter that describes how often the same module is
- currently loaded. The remaining fields can be compared to any
- hints that were passed to `lt_dlopenadvise' to determine whether
- the underlying loader was able to follow them.
-
- The following function will return a pointer to libltdl's internal
-copy of this structure for the given HANDLE:
-
- -- Function: const lt_dlinfo * lt_dlgetinfo (lt_dlhandle HANDLE)
- Return a pointer to a struct that contains some information about
- the module HANDLE. The contents of the struct must not be
- modified. Return `NULL' on failure.
-
- Furthermore, in order to save you from having to keep a list of the
-handles of all the modules you have loaded, these functions allow you to
-iterate over libltdl's list of loaded modules:
-
- -- Type: lt_dlinterface_id
- The opaque type used to hold the module interface details for each
- registered libltdl client.
-
- -- Type: int lt_dlhandle_interface (lt_dlhandle HANDLE,
- const char *ID_STRING)
- Functions of this type are called to check that a handle conforms
- to a library's expected module interface when iterating over the
- global handle list. You should be careful to write a callback
- function of this type that can correctly identify modules that
- belong to this client, both to prevent other clients from
- accidentally finding your loaded modules with the iterator
- functions below, and vice versa. The best way to do this is to
- check that module HANDLE conforms to the interface specification
- of your loader using `lt_dlsym'.
-
- The callback may be given *every* module loaded by all the libltdl
- module clients in the current address space, including any modules
- loaded by other libraries such as libltdl itself, and should
- return non-zero if that module does not fulfill the interface
- requirements of your loader.
-
- int
- my_interface_cb (lt_dlhandle handle, const char *id_string)
- {
- char *(*module_id) (void) = NULL;
-
- /* A valid my_module must provide all of these symbols. */
- if (!((module_id = (char*(*)(void)) lt_dlsym ("module_version"))
- && lt_dlsym ("my_module_entrypoint")))
- return 1;
-
- if (strcmp (id_string, module_id()) != 0)
- return 1;
-
- return 0;
- }
-
- -- Function: lt_dlinterface_id lt_dlinterface_register
- (const char *ID_STRING, lt_dlhandle_interface *IFACE)
- Use this function to register your interface validator with
- libltdl, and in return obtain a unique key to store and retrieve
- per-module data. You supply an ID_STRING and IFACE so that the
- resulting `lt_dlinterface_id' can be used to filter the module
- handles returned by the iteration functions below. If IFACE is
- `NULL', all modules will be matched.
-
- -- Function: void lt_dlinterface_free (lt_dlinterface_id IFACE)
- Release the data associated with IFACE.
-
- -- Function: int lt_dlhandle_map (lt_dlinterface_id IFACE,
- int (*FUNC) (lt_dlhandle HANDLE, void * DATA), void * DATA)
- For each module that matches IFACE, call the function FUNC. When
- writing the FUNC callback function, the argument HANDLE is the
- handle of a loaded module, and DATA is the last argument passed to
- `lt_dlhandle_map'. As soon as FUNC returns a non-zero value for
- one of the handles, `lt_dlhandle_map' will stop calling FUNC and
- immediately return that non-zero value. Otherwise 0 is eventually
- returned when FUNC has been successfully called for all matching
- modules.
-
- -- Function: lt_dlhandle lt_dlhandle_iterate
- (lt_dlinterface_id IFACE, lt_dlhandle PLACE)
- Iterate over the module handles loaded by IFACE, returning the
- first matching handle in the list if PLACE is `NULL', and the next
- one on subsequent calls. If PLACE is the last element in the list
- of eligible modules, this function returns `NULL'.
-
- lt_dlhandle handle = 0;
- lt_dlinterface_id iface = my_interface_id;
-
- while ((handle = lt_dlhandle_iterate (iface, handle)))
- {
- ...
- }
-
- -- Function: lt_dlhandle lt_dlhandle_fetch (lt_dlinterface_id IFACE,
- const char *MODULE_NAME)
- Search through the module handles loaded by IFACE for a module
- named MODULE_NAME, returning its handle if found or else `NULL' if
- no such named module has been loaded by IFACE.
-
- However, you might still need to maintain your own list of loaded
-module handles (in parallel with the list maintained inside libltdl) if
-there were any other data that your application wanted to associate
-with each open module. Instead, you can use the following API calls to
-do that for you. You must first obtain a unique interface id from
-libltdl as described above, and subsequently always use it to retrieve
-the data you stored earlier. This allows different libraries to each
-store their own data against loaded modules, without interfering with
-one another.
-
- -- Function: void * lt_dlcaller_set_data (lt_dlinterface_id KEY,
- lt_dlhandle HANDLE, void * DATA)
- Set DATA as the set of data uniquely associated with KEY and
- HANDLE for later retrieval. This function returns the DATA
- previously associated with KEY and HANDLE if any. A result of 0,
- may indicate that a diagnostic for the last error (if any) is
- available from `lt_dlerror()'.
-
- For example, to correctly remove some associated data:
-
- void *stale = lt_dlcaller_set_data (key, handle, 0);
- if (stale != NULL)
- {
- free (stale);
- }
- else
- {
- char *error_msg = lt_dlerror ();
-
- if (error_msg != NULL)
- {
- my_error_handler (error_msg);
- return STATUS_FAILED;
- }
- }
-
- -- Function: void * lt_dlcaller_get_data (lt_dlinterface_id KEY,
- lt_dlhandle HANDLE)
- Return the address of the data associated with KEY and HANDLE, or
- else `NULL' if there is none.
-
- Old versions of libltdl also provided a simpler, but similar, API
-based around `lt_dlcaller_id'. Unfortunately, it had no provision for
-detecting whether a module belonged to a particular interface as
-libltdl didn't support multiple loaders in the same address space at
-that time. Those APIs are no longer supported as there would be no way
-to stop clients of the old APIs from seeing (and accidentally altering)
-modules loaded by other libraries.
-
-
-File: libtool.info, Node: Module loaders for libltdl, Next: Distributing libltdl, Prev: User defined module data, Up: Using libltdl
-
-11.5 How to create and register new module loaders
-==================================================
-
-Sometimes libltdl's many ways of gaining access to modules are not
-sufficient for the purposes of a project. You can write your own
-loader, and register it with libltdl so that `lt_dlopen' will be able
-to use it.
-
- Writing a loader involves writing at least three functions that can
-be called by `lt_dlopen', `lt_dlsym' and `lt_dlclose'. Optionally, you
-can provide a finalisation function to perform any cleanup operations
-when `lt_dlexit' executes, and a symbol prefix string that will be
-prepended to any symbols passed to `lt_dlsym'. These functions must
-match the function pointer types below, after which they can be
-allocated to an instance of `lt_user_dlloader' and registered.
-
- Registering the loader requires that you choose a name for it, so
-that it can be recognised by `lt_dlloader_find' and removed with
-`lt_dlloader_remove'. The name you choose must be unique, and not
-already in use by libltdl's builtin loaders:
-
-"dlopen"
- The system dynamic library loader, if one exists.
-
-"dld"
- The GNU dld loader, if `libdld' was installed when libltdl was
- built.
-
-"dlpreload"
- The loader for `lt_dlopen'ing of preloaded static modules.
-
- The prefix "dl" is reserved for loaders supplied with future
-versions of libltdl, so you should not use that for your own loader
-names.
-
-The following types are defined in `ltdl.h':
-
- -- Type: lt_module
- `lt_module' is a dlloader dependent module. The dynamic module
- loader extensions communicate using these low level types.
-
- -- Type: lt_dlloader
- `lt_dlloader' is a handle for module loader types.
-
- -- Type: lt_user_data
- `lt_user_data' is used for specifying loader instance data.
-
- -- Type: struct lt_user_dlloader {const char *SYM_PREFIX;
- lt_module_open *MODULE_OPEN; lt_module_close *MODULE_CLOSE;
- lt_find_sym *FIND_SYM; lt_dlloader_exit *DLLOADER_EXIT; }
- If you want to define a new way to open dynamic modules, and have
- the `lt_dlopen' API use it, you need to instantiate one of these
- structures and pass it to `lt_dlloader_add'. You can pass whatever
- you like in the DLLOADER_DATA field, and it will be passed back as
- the value of the first parameter to each of the functions
- specified in the function pointer fields.
-
- -- Type: lt_module lt_module_open (const char *FILENAME)
- The type of the loader function for an `lt_dlloader' module
- loader. The value set in the dlloader_data field of the `struct
- lt_user_dlloader' structure will be passed into this function in
- the LOADER_DATA parameter. Implementation of such a function
- should attempt to load the named module, and return an `lt_module'
- suitable for passing in to the associated `lt_module_close' and
- `lt_sym_find' function pointers. If the function fails it should
- return `NULL', and set the error message with `lt_dlseterror'.
-
- -- Type: int lt_module_close (lt_user_data LOADER_DATA,
- lt_module MODULE)
- The type of the unloader function for a user defined module loader.
- Implementation of such a function should attempt to release any
- resources tied up by the MODULE module, and then unload it from
- memory. If the function fails for some reason, set the error
- message with `lt_dlseterror' and return non-zero.
-
- -- Type: void * lt_find_sym (lt_module MODULE, const char *SYMBOL)
- The type of the symbol lookup function for a user defined module
- loader. Implementation of such a function should return the
- address of the named SYMBOL in the module MODULE, or else set the
- error message with `lt_dlseterror' and return `NULL' if lookup
- fails.
-
- -- Type: int lt_dlloader_exit (lt_user_data LOADER_DATA)
- The type of the finalisation function for a user defined module
- loader. Implementation of such a function should free any
- resources associated with the loader, including any user specified
- data in the `dlloader_data' field of the `lt_user_dlloader'. If
- non-`NULL', the function will be called by `lt_dlexit', and
- `lt_dlloader_remove'.
-
- For example:
-
- int
- register_myloader (void)
- {
- lt_user_dlloader dlloader;
-
- /* User modules are responsible for their own initialisation. */
- if (myloader_init () != 0)
- return MYLOADER_INIT_ERROR;
-
- dlloader.sym_prefix = NULL;
- dlloader.module_open = myloader_open;
- dlloader.module_close = myloader_close;
- dlloader.find_sym = myloader_find_sym;
- dlloader.dlloader_exit = myloader_exit;
- dlloader.dlloader_data = (lt_user_data)myloader_function;
-
- /* Add my loader as the default module loader. */
- if (lt_dlloader_add (lt_dlloader_next (NULL), &dlloader,
- "myloader") != 0)
- return ERROR;
-
- return OK;
- }
-
- Note that if there is any initialisation required for the loader, it
-must be performed manually before the loader is registered - libltdl
-doesn't handle user loader initialisation.
-
- Finalisation _is_ handled by libltdl however, and it is important to
-ensure the `dlloader_exit' callback releases any resources claimed
-during the initialisation phase.
-
-libltdl provides the following functions for writing your own module
-loaders:
-
- -- Function: int lt_dlloader_add (lt_dlloader *PLACE,
- lt_user_dlloader *DLLOADER, const char *LOADER_NAME)
- Add a new module loader to the list of all loaders, either as the
- last loader (if PLACE is `NULL'), else immediately before the
- loader passed as PLACE. LOADER_NAME will be returned by
- `lt_dlloader_name' if it is subsequently passed a newly registered
- loader. These LOADER_NAMEs must be unique, or
- `lt_dlloader_remove' and `lt_dlloader_find' cannot work. Returns
- 0 for success.
-
- /* Make myloader be the last one. */
- if (lt_dlloader_add (NULL, myloader) != 0)
- perror (lt_dlerror ());
-
- -- Function: int lt_dlloader_remove (const char *LOADER_NAME)
- Remove the loader identified by the unique name, LOADER_NAME.
- Before this can succeed, all modules opened by the named loader
- must have been closed. Returns 0 for success, otherwise an error
- message can be obtained from `lt_dlerror'.
-
- /* Remove myloader. */
- if (lt_dlloader_remove ("myloader") != 0)
- perror (lt_dlerror ());
-
- -- Function: lt_dlloader * lt_dlloader_next (lt_dlloader *PLACE)
- Iterate over the module loaders, returning the first loader if
- PLACE is `NULL', and the next one on subsequent calls. The handle
- is for use with `lt_dlloader_add'.
-
- /* Make myloader be the first one. */
- if (lt_dlloader_add (lt_dlloader_next (NULL), myloader) != 0)
- return ERROR;
-
- -- Function: lt_dlloader * lt_dlloader_find (const char *LOADER_NAME)
- Return the first loader with a matching LOADER_NAME identifier, or
- else `NULL', if the identifier is not found.
-
- The identifiers that may be used by libltdl itself, if the host
- architecture supports them are "dlopen"(1), "dld" and "dlpreload".
-
- /* Add a user loader as the next module loader to be tried if
- the standard dlopen loader were to fail when lt_dlopening. */
- if (lt_dlloader_add (lt_dlloader_find ("dlopen"), myloader) != 0)
- return ERROR;
-
- -- Function: const char * lt_dlloader_name (lt_dlloader *PLACE)
- Return the identifying name of PLACE, as obtained from
- `lt_dlloader_next' or `lt_dlloader_find'. If this function fails,
- it will return `NULL' and set an error for retrieval with
- `lt_dlerror'.
-
- -- Function: lt_user_data * lt_dlloader_data (lt_dlloader *PLACE)
- Return the address of the `dlloader_data' of PLACE, as obtained
- from `lt_dlloader_next' or `lt_dlloader_find'. If this function
- fails, it will return `NULL' and set an error for retrieval with
- `lt_dlerror'.
-
-11.5.1 Error handling within user module loaders
-------------------------------------------------
-
- -- Function: int lt_dladderror (const char *DIAGNOSTIC)
- This function allows you to integrate your own error messages into
- `lt_dlerror'. Pass in a suitable diagnostic message for return by
- `lt_dlerror', and an error identifier for use with `lt_dlseterror'
- is returned.
-
- If the allocation of an identifier fails, this function returns -1.
-
- int myerror = lt_dladderror ("Doh!");
- if (myerror < 0)
- perror (lt_dlerror ());
-
- -- Function: int lt_dlseterror (int ERRORCODE)
- When writing your own module loaders, you should use this function
- to raise errors so that they are propagated through the
- `lt_dlerror' interface. All of the standard errors used by
- libltdl are declared in `ltdl.h', or you can add more of your own
- with `lt_dladderror'. This function returns 0 on success.
-
- if (lt_dlseterror (LTDL_ERROR_NO_MEMORY) != 0)
- perror (lt_dlerror ());
-
----------- Footnotes ----------
-
- (1) This is used for the host dependent module loading API -
-`shl_load' and `LoadLibrary' for example
-
-
-File: libtool.info, Node: Distributing libltdl, Prev: Module loaders for libltdl, Up: Using libltdl
-
-11.6 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, or if you are using features of a very new version of
-libltdl that you don't expect your users to have yet. In such cases,
-you must decide which flavor of libltdl you want to use: a convenience
-library or an installable libtool library.
-
- The most simplistic way to add `libltdl' to your package is to copy
-all the `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
-`ltdl.m4'. You must ensure that they are available in `aclocal.m4'
-before you run Autoconf(1). Having made the macros available, you must
-add a call to the `LTDL_INIT' macro (after the call to `LT_INIT') to
-your package's `configure.ac' to perform the configure time checks
-required to build the library correctly. Unfortunately, this method
-has problems if you then try to link the package binaries with an
-installed libltdl, or a library that depends on libltdl, because of the
-duplicate symbol definitions. For example, ultimately linking against
-two different versions of libltdl, or against both a local convenience
-library and an installed libltdl is bad. Ensuring that only one copy
-of the libltdl sources are linked into any program is left as an
-exercise for the reader.
-
- -- Macro: LT_CONFIG_LTDL_DIR (DIRECTORY)
- Declare DIRECTORY to be the location of the `libltdl' source
- files, for `libtoolize --ltdl' to place them. *Note Invoking
- libtoolize::, for more details. Provided that you add an
- appropriate `LT_CONFIG_LTDL_DIR' call in your `configure.ac'
- before calling `libtoolize', the appropriate `libltdl' files will
- be installed automatically.
-
- -- Macro: LTDL_INIT (OPTIONS)
- -- Macro: LT_WITH_LTDL
- -- Macro: AC_WITH_LTDL
- `AC_WITH_LTDL' and `LT_WITH_LTDL' are deprecated names for older
- versions of this macro; `autoupdate' will update your
- `configure.ac' file.
-
- This macro adds the following options to the `configure' script:
-
- `--with-ltdl-include INSTALLED-LTDL-HEADER-DIR'
- The `LTDL_INIT' macro will look in the standard header file
- locations to find the installed `libltdl' headers. If
- `LTDL_INIT' can't find them by itself, the person who builds
- your package can use this option to tell `configure' where
- the installed `libltdl' headers are.
-
- `--with-ltdl-lib INSTALLED-LTDL-LIBRARY-DIR'
- Similarly, the person building your package can use this
- option to help `configure' find the installed `libltdl.la'.
-
- `--with-included-ltdl'
- If there is no installed `libltdl', or in any case if the
- person building your package would rather use the `libltdl'
- sources shipped with the package in the subdirectory named by
- `LT_CONFIG_LTDL_DIR', they should pass this option to
- `configure'.
-
- If the `--with-included-ltdl' is not passed at configure time, and
- an installed `libltdl' is not found(2), then `configure' will exit
- immediately with an error that asks the user to either specify the
- location of an installed `libltdl' using the `--with-ltdl-include'
- and `--with-ltdl-lib' options, or to build with the `libltdl'
- sources shipped with the package by passing `--with-included-ltdl'.
-
- If an installed `libltdl' is found, then `LIBLTDL' is set to the
- link flags needed to use it, and `LTDLINCL' to the preprocessor
- flags needed to find the installed headers, and `LTDLDEPS' will be
- empty. Note, however, that no version checking is performed. You
- should manually check for the `libltdl' features you need in
- `configure.ac':
-
- LT_INIT([dlopen])
- LTDL_INIT
-
- # The lt_dladvise_init symbol was added with libtool-2.2
- if test "x$with_included_ltdl" != "xyes"; then
- save_CFLAGS="$CFLAGS"
- save_LDFLAGS="$LDFLAGS"
- CFLAGS="$CFLAGS $LTDLINCL"
- LDFLAGS="$LDFLAGS $LIBLTDL"
- AC_CHECK_LIB([ltdl], [lt_dladvise_init],
- [],
- [AC_MSG_ERROR([installed libltdl is too old])])
- LDFLAGS="$save_LDFLAGS"
- CFLAGS="$save_CFLAGS"
- fi
-
- OPTIONS may include no more than one of the following build modes
- depending on how you want your project to build `libltdl':
- `nonrecursive', `recursive', or `subproject'. In order for
- `libtoolize' to detect this option correctly, if you supply one of
- these arguments, they must be given literally (i.e., macros or
- shell variables that expand to the correct ltdl mode will not
- work).
-
- `nonrecursive'
- This is how the Libtool project distribution builds the
- `libltdl' we ship and install. If you wish to use Automake
- to build `libltdl' without invoking a recursive make to
- descend into the `libltdl' subdirectory, then use this
- option. You will need to set your configuration up carefully
- to make this work properly, and you will need releases of
- Autoconf and Automake that support `subdir-objects' and
- `LIBOBJDIR' properly. In your `configure.ac', add:
-
- AM_INIT_AUTOMAKE([subdir-objects])
- AC_CONFIG_HEADERS([config.h])
- LT_CONFIG_LTDL_DIR([libltdl])
- LT_INIT([dlopen])
- LTDL_INIT([nonrecursive])
-
- You _have to_ use a config header, but it may have a name
- different than `config.h'.
-
- Also, add the following near the top of your `Makefile.am':
-
- AM_CPPFLAGS =
- AM_LDFLAGS =
-
- BUILT_SOURCES =
- EXTRA_DIST =
- CLEANFILES =
- MOSTLYCLEANFILES =
-
- include_HEADERS =
- noinst_LTLIBRARIES =
- lib_LTLIBRARIES =
- EXTRA_LTLIBRARIES =
-
- include libltdl/Makefile.inc
-
- Unless you build no other libraries from this `Makefile.am',
- you will also need to change `lib_LTLIBRARIES' to assign with
- `+=' so that the `libltdl' targets declared in `Makefile.inc'
- are not overwritten.
-
- `recursive'
- This build mode still requires that you use Automake, but (in
- contrast with `nonrecursive') uses the more usual device of
- starting another `make' process in the `libltdl'
- subdirectory. To use this mode, you should add to your
- `configure.ac':
-
- AM_INIT_AUTOMAKE
- AC_CONFIG_HEADERS([config.h])
- LT_CONFIG_LTDL_DIR([libltdl])
- LT_INIT([dlopen])
- LTDL_INIT([recursive])
- AC_CONFIG_FILES([libltdl/Makefile])
-
- Again, you _have to_ use a config header, but it may have a
- name different than `config.h' if you like.
-
- Also, add this to your `Makefile.am':
-
- SUBDIRS = libltdl
-
- `subproject'
- This mode is the default unless you explicitly add
- `recursive' or `nonrecursive' to your `LTDL_INIT' options;
- `subproject' is the only mode supported by previous releases
- of libltdl. Even if you do not use Autoconf in the parent
- project, then, in `subproject' mode, still `libltdl' contains
- all the necessary files to configure and build itself - you
- just need to arrange for your build system to call
- `libltdl/configure' with appropriate options, and then run
- `make' in the `libltdl' subdirectory.
-
- If you _are_ using Autoconf and Automake, then you will need
- to add the following to your `configure.ac':
-
- LT_CONFIG_LTDL_DIR([libltdl])
- LTDL_INIT
-
- and to `Makefile.am':
-
- SUBDIRS = libltdl
-
- Aside from setting the libltdl build mode, there are other keywords
- that you can pass to `LTDL_INIT' to modify its behavior when
- `--with-included-ltdl' has been given:
-
- `convenience'
- This is the default unless you explicitly add `installable' to
- your `LTDL_INIT' options.
-
- This keyword will cause options to be passed to the
- `configure' script in the subdirectory named by
- `LT_CONFIG_LTDL_DIR' in order to cause it to be built as a
- convenience library. If you're not using automake, you will
- need to define `top_build_prefix', `top_builddir', and
- `top_srcdir' in your makefile so that `LIBLTDL', `LTDLDEPS',
- and `LTDLINCL' expand correctly.
-
- 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 won't overwrite a pre-installed
- version of `libltdl' the system might already have in the
- installation directory. 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 the
- shared 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 single program with those
- libraries, because you may get duplicate symbols. In general
- you can safely use the convenience library in programs that
- don't depend on other libraries that might use `libltdl' too.
-
- `installable'
- This keyword will pass options to the `configure' script in
- the subdirectory named by `LT_CONFIG_LTDL_DIR' in order to
- cause it to be built as an installable library. If you're not
- using automake, you will need to define `top_build_prefix',
- `top_builddir' and `top_srcdir' in your makefile so that
- `LIBLTDL', `LTDLDEPS', and `LTDLINCL' are expanded properly.
-
- Be aware that you could overwrite another `libltdl' already
- installed to the same directory if you use this option.
-
- Whatever method you use, `LTDL_INIT' will define the shell variable
-`LIBLTDL' to the link flag that you should use to link with `libltdl',
-the shell variable `LTDLDEPS' to the files that can be used as a
-dependency in `Makefile' rules, and the shell variable `LTDLINCL' to
-the preprocessor flag that you should use to compile programs that
-include `ltdl.h'. So, when you want to link a program with libltdl, be
-it a convenience, installed or installable library, just use
-`$(LTDLINCL)' for preprocessing and compilation, and `$(LIBLTDL)' for
-linking.
-
- * If your package is built using an installed version of `libltdl',
- `LIBLTDL' will be set to the compiler flags needed to link against
- the installed library, `LTDLDEPS' will be empty, and `LTDLINCL'
- will be set to the compiler flags needed to find the `libltdl'
- header files.
-
- * If your package is built using the convenience libltdl, `LIBLTDL'
- and `LTDLDEPS' will be the pathname for the convenience version of
- libltdl (starting with `${top_builddir}/' or
- `${top_build_prefix}') and `LTDLINCL' will be `-I' followed by the
- directory that contains `ltdl.h' (starting with `${top_srcdir}/').
-
- * If an installable version of the included `libltdl' is being
- built, its pathname starting with `${top_builddir}/' or
- `${top_build_prefix}', will be stored in `LIBLTDL' and `LTDLDEPS',
- and `LTDLINCL' will be set just like in the case of convenience
- library.
-
- You should probably also use the `dlopen' option to `LT_INIT' in
-your `configure.ac', otherwise libtool will assume no dlopening
-mechanism is supported, and revert to dlpreopening, which is probably
-not what you want. Avoid using the `-static', `-static-libtool-libs',
-or `-all-static' switches when linking programs with libltdl. This
-will not work on all platforms, because the dlopening functions may not
-be available for static linking.
-
- The following example shows you how to embed an installable libltdl
-in your package. In order to use the convenience variant, just replace
-the `LTDL_INIT' option `installable' with `convenience'. We assume
-that libltdl was embedded using `libtoolize --ltdl'.
-
- configure.ac:
- ...
- # Name the subdirectory that contains libltdl sources
- LT_CONFIG_LTDL_DIR([libltdl])
-
- # Configure libtool with dlopen support if possible
- LT_INIT([dlopen])
-
- # Enable building of the installable libltdl library
- LTDL_INIT([installable])
- ...
-
- Makefile.am:
- ...
- SUBDIRS = libltdl
-
- AM_CPPFLAGS = $(LTDLINCL)
-
- myprog_LDFLAGS = -export-dynamic
- myprog_LDADD = $(LIBLTDL) -dlopen self -dlopen foo1.la
- myprog_DEPENDENCIES = $(LTDLDEPS) foo1.la
- ...
-
- -- Macro: LTDL_INSTALLABLE
- -- Macro: AC_LIBLTDL_INSTALLABLE
- These macros are deprecated, the `installable' option to
- `LTDL_INIT' should be used instead.
-
- -- Macro: LTDL_CONVENIENCE
- -- Macro: AC_LIBLTDL_CONVENIENCE
- These macros are deprecated, the `convenience' option to
- `LTDL_INIT' should be used instead.
-
- ---------- Footnotes ----------
-
- (1) We used to recommend adding the contents of `ltdl.m4' to
-`acinclude.m4', but with `aclocal' from a modern Automake (1.8 or
-newer) and this release of libltdl that is not only unnecessary but
-makes it easy to forget to upgrade `acinclude.m4' if you move to a
-different release of libltdl.
-
- (2) Even if libltdl is installed, `LTDL_INIT' may fail to detect it
-if libltdl depends on symbols provided by libraries other than the C
-library.
-
-
-File: libtool.info, Node: Trace interface, Next: FAQ, Prev: Using libltdl, Up: Top
-
-12 Libtool's trace interface
-****************************
-
-This section describes macros whose sole purpose is to be traced using
-Autoconf's `--trace' option (*note The Autoconf Manual:
-(autoconf)autoconf Invocation.) to query the Libtool configuration of a
-project. These macros are called by Libtool internals and should never
-be called by user code; they should only be traced.
-
- -- Macro: LT_SUPPORTED_TAG (TAG)
- This macro is called once for each language enabled in the
- package. Its only argument, TAG, is the tag-name corresponding to
- the language (*note Tags::).
-
- You can therefore retrieve the list of all tags enabled in a
- project using the following command:
- autoconf --trace 'LT_SUPPORTED_TAG:$1'
-
-
-File: libtool.info, Node: FAQ, Next: Troubleshooting, Prev: Trace interface, Up: Top
-
-13 Frequently Asked Questions about libtool
-*******************************************
-
-This chapter covers some questions that often come up on the mailing
-lists.
-
-* Menu:
-
-* Stripped link flags:: Dropped flags when creating a library
-
-
-File: libtool.info, Node: Stripped link flags, Up: FAQ
-
-13.1 Why does libtool strip link flags when creating a library?
-===============================================================
-
-When creating a shared library, but not when compiling or creating a
-program, `libtool' drops some flags from the command line provided by
-the user. This is done because flags unknown to `libtool' may
-interfere with library creation or require additional support from
-`libtool', and because omitting flags is usually the conservative
-choice for a successful build.
-
- If you encounter flags that you think are useful to pass, as a
-work-around you can prepend flags with `-Wc,' or `-Xcompiler ' to allow
-them to be passed through to the compiler driver (*note Link mode::).
-Another possibility is to add flags already to the compiler command at
-`configure' run time:
-
- ./configure CC='gcc -m64'
-
- If you think `libtool' should let some flag through by default,
-here's how you can test such an inclusion: grab the Libtool development
-tree, edit the `ltmain.m4sh' file in the `libltdl/config' subdirectory
-to pass through the flag (search for `Flags to be passed through'),
-re-bootstrap and build with the flags in question added to `LDFLAGS',
-`CFLAGS', `CXXFLAGS', etc. on the `configure' command line as
-appropriate. Run the testsuite as described in the `README' file and
-report results to the Libtool bug reporting address
-<bug-libtool@gnu.org>.
-
-
-File: libtool.info, Node: Troubleshooting, Next: Maintaining, Prev: FAQ, Up: Top
-
-14 Troubleshooting
-******************
-
-Libtool is under constant development, changing to remain up-to-date
-with modern operating systems. If libtool doesn't work the way you
-think it should on your platform, you should read this chapter to help
-determine what the problem is, and how to resolve it.
-
-* Menu:
-
-* Libtool test suite:: Libtool's self-tests.
-* Reporting bugs:: How to report problems with libtool.
-
-
-File: libtool.info, Node: Libtool test suite, Next: Reporting bugs, Up: Troubleshooting
-
-14.1 The libtool test suite
-===========================
-
-Libtool comes with two integrated sets of tests to check that your build
-is sane, that test its capabilities, and report obvious bugs in the
-libtool program. These tests, too, are constantly evolving, based on
-past problems with libtool, and known deficiencies in other operating
-systems.
-
- As described in the `README' file, you may run `make -k check' after
-you have built libtool (possibly before you install it) in order to
-make sure that it meets basic functional requirements.
-
-* Menu:
-
-* Test descriptions:: The contents of the old test suite.
-* When tests fail:: What to do when a test fails.
-
-
-File: libtool.info, Node: Test descriptions, Next: When tests fail, Up: Libtool test suite
-
-14.1.1 Description of test suite
---------------------------------
-
-Here is a list of the current programs in the old test suite, and what
-they test for:
-
-`cdemo-conf.test'
-`cdemo-make.test'
-`cdemo-exec.test'
-`cdemo-static.test'
-`cdemo-static-make.test'
-`cdemo-static-exec.test'
-`cdemo-shared.test'
-`cdemo-shared-make.test'
-`cdemo-shared-exec.test'
-`cdemo-undef.test'
-`cdemo-undef-make.test'
-`cdemo-undef-exec.test'
- These programs check to see that the `tests/cdemo' subdirectory of
- the libtool distribution can be configured and built correctly.
-
- The `tests/cdemo' subdirectory contains a demonstration of libtool
- convenience libraries, a mechanism that allows build-time static
- libraries to be created, in a way that their components can be
- later linked into programs or other libraries, even shared ones.
-
- The tests matching `cdemo-*make.test' and `cdemo-*exec.test' are
- executed three times, under three different libtool configurations:
- `cdemo-conf.test' configures `cdemo/libtool' to build both static
- and shared libraries (the default for platforms that support
- both), `cdemo-static.test' builds only static libraries
- (`--disable-shared'), and `cdemo-shared.test' builds only shared
- libraries (`--disable-static').
-
- The test `cdemo-undef.test' tests the generation of shared
- libraries with undefined symbols on systems that allow this.
-
-`demo-conf.test'
-`demo-make.test'
-`demo-exec.test'
-`demo-inst.test'
-`demo-unst.test'
-`demo-static.test'
-`demo-static-make.test'
-`demo-static-exec.test'
-`demo-static-inst.test'
-`demo-static-unst.test'
-`demo-shared.test'
-`demo-shared-make.test'
-`demo-shared-exec.test'
-`demo-shared-inst.test'
-`demo-shared-unst.test'
-`demo-nofast.test'
-`demo-nofast-make.test'
-`demo-nofast-exec.test'
-`demo-nofast-inst.test'
-`demo-nofast-unst.test'
-`demo-pic.test'
-`demo-pic-make.test'
-`demo-pic-exec.test'
-`demo-nopic.test'
-`demo-nopic-make.test'
-`demo-nopic-exec.test'
- These programs check to see that the `tests/demo' subdirectory of
- the libtool distribution can be configured, built, installed, and
- uninstalled correctly.
-
- The `tests/demo' subdirectory contains a demonstration of a trivial
- package that uses libtool. The tests matching `demo-*make.test',
- `demo-*exec.test', `demo-*inst.test' and `demo-*unst.test' are
- executed four times, under four different libtool configurations:
- `demo-conf.test' configures `demo/libtool' to build both static
- and shared libraries, `demo-static.test' builds only static
- libraries (`--disable-shared'), and `demo-shared.test' builds only
- shared libraries (`--disable-static'). `demo-nofast.test'
- configures `demo/libtool' to disable the fast-install mode
- (`--enable-fast-install=no'). `demo-pic.test' configures
- `demo/libtool' to prefer building PIC code (`--with-pic'),
- `demo-nopic.test' to prefer non-PIC code (`--without-pic').
-
-`demo-deplibs.test'
- Many systems cannot link static libraries into shared libraries.
- libtool uses a `deplibs_check_method' to prevent such cases. This
- tests checks whether libtool's `deplibs_check_method' works
- properly.
-
-`demo-hardcode.test'
- On all systems with shared libraries, the location of the library
- can be encoded in executables that are linked against it *note
- Linking executables::. This test checks the conditions under
- which your system linker hardcodes the library location, and
- guarantees that they correspond to libtool's own notion of how
- your linker behaves.
-
-`demo-relink.test'
-`depdemo-relink.test'
- These tests check whether variable `shlibpath_overrides_runpath' is
- properly set. If the test fails, it will indicate what the
- variable should have been set to.
-
-`demo-noinst-link.test'
- Checks whether libtool will not try to link with a previously
- installed version of a library when it should be linking with a
- just-built one.
-
-`depdemo-conf.test'
-`depdemo-make.test'
-`depdemo-exec.test'
-`depdemo-inst.test'
-`depdemo-unst.test'
-`depdemo-static.test'
-`depdemo-static-make.test'
-`depdemo-static-exec.test'
-`depdemo-static-inst.test'
-`depdemo-static-unst.test'
-`depdemo-shared.test'
-`depdemo-shared-make.test'
-`depdemo-shared-exec.test'
-`depdemo-shared-inst.test'
-`depdemo-shared-unst.test'
-`depdemo-nofast.test'
-`depdemo-nofast-make.test'
-`depdemo-nofast-exec.test'
-`depdemo-nofast-inst.test'
-`depdemo-nofast-unst.test'
- These programs check to see that the `tests/depdemo' subdirectory
- of the libtool distribution can be configured, built, installed,
- and uninstalled correctly.
-
- The `tests/depdemo' subdirectory contains a demonstration of
- inter-library dependencies with libtool. The test programs link
- some interdependent libraries.
-
- The tests matching `depdemo-*make.test', `depdemo-*exec.test',
- `depdemo-*inst.test' and `depdemo-*unst.test' are executed four
- times, under four different libtool configurations:
- `depdemo-conf.test' configures `depdemo/libtool' to build both
- static and shared libraries, `depdemo-static.test' builds only
- static libraries (`--disable-shared'), and `depdemo-shared.test'
- builds only shared libraries (`--disable-static').
- `depdemo-nofast.test' configures `depdemo/libtool' to disable the
- fast-install mode (`--enable-fast-install=no').
-
-`mdemo-conf.test'
-`mdemo-make.test'
-`mdemo-exec.test'
-`mdemo-inst.test'
-`mdemo-unst.test'
-`mdemo-static.test'
-`mdemo-static-make.test'
-`mdemo-static-exec.test'
-`mdemo-static-inst.test'
-`mdemo-static-unst.test'
-`mdemo-shared.test'
-`mdemo-shared-make.test'
-`mdemo-shared-exec.test'
-`mdemo-shared-inst.test'
-`mdemo-shared-unst.test'
- These programs check to see that the `tests/mdemo' subdirectory of
- the libtool distribution can be configured, built, installed, and
- uninstalled correctly.
-
- The `tests/mdemo' subdirectory contains a demonstration of a
- package that uses libtool and the system independent dlopen wrapper
- `libltdl' to load modules. The library `libltdl' provides a
- dlopen wrapper for various platforms (POSIX) including support for
- dlpreopened modules (*note Dlpreopening::).
-
- The tests matching `mdemo-*make.test', `mdemo-*exec.test',
- `mdemo-*inst.test' and `mdemo-*unst.test' are executed three
- times, under three different libtool configurations:
- `mdemo-conf.test' configures `mdemo/libtool' to build both static
- and shared libraries, `mdemo-static.test' builds only static
- libraries (`--disable-shared'), and `mdemo-shared.test' builds
- only shared libraries (`--disable-static').
-
-`mdemo-dryrun.test'
- This test checks whether libtool's `--dry-run' mode works properly.
-
-`mdemo2-conf.test'
-`mdemo2-exec.test'
-`mdemo2-make.test'
- These programs check to see that the `tests/mdemo2' subdirectory of
- the libtool distribution can be configured, built, and executed
- correctly.
-
- The `tests/mdemo2' directory contains a demonstration of a package
- that attempts to link with a library (from the `tests/mdemo'
- directory) that itself does dlopening of libtool modules.
-
-`link.test'
- This test guarantees that linking directly against a non-libtool
- static library works properly.
-
-`link-2.test'
- This test makes sure that files ending in `.lo' are never linked
- directly into a program file.
-
-`nomode.test'
- Check whether we can actually get help for libtool.
-
-`objectlist.test'
- Check that a nonexistent objectlist file is properly detected.
-
-`pdemo-conf.test'
-`pdemo-make.test'
-`pdemo-exec.test'
-`pdemo-inst.test'
- These programs check to see that the `tests/pdemo' subdirectory of
- the libtool distribution can be configured, built, and executed
- correctly.
-
- The `pdemo-conf.test' lowers the `max_cmd_len' variable in the
- generated libtool script to test the measures to evade command line
- length limitations.
-
-`quote.test'
- This program checks libtool's metacharacter quoting.
-
-`sh.test'
- Checks for some nonportable or dubious or undesired shell
- constructs in shell scripts.
-
-`suffix.test'
- When other programming languages are used with libtool (*note
- Other languages::), the source files may end in suffixes other
- than `.c'. This test validates that libtool can handle suffixes
- for all the file types that it supports, and that it fails when
- the suffix is invalid.
-
-`tagdemo-conf.test'
-`tagdemo-make.test'
-`tagdemo-exec.test'
-`tagdemo-static.test'
-`tagdemo-static-make.test'
-`tagdemo-static-exec.test'
-`tagdemo-shared.test'
-`tagdemo-shared-make.test'
-`tagdemo-shared-exec.test'
-`tagdemo-undef.test'
-`tagdemo-undef-make.test'
-`tagdemo-undef-exec.test'
- These programs check to see that the `tests/tagdemo' subdirectory
- of the libtool distribution can be configured, built, and executed
- correctly.
-
- The `tests/tagdemo' directory contains a demonstration of a package
- that uses libtool's multi-language support through configuration
- tags. It generates a library from C++ sources, which is then
- linked to a C++ program.
-
-`f77demo-conf.test'
-`f77demo-make.test'
-`f77demo-exec.test'
-`f77demo-static.test'
-`f77demo-static-make.test'
-`f77demo-static-exec.test'
-`f77demo-shared.test'
-`f77demo-shared-make.test'
-`f77demo-shared-exec.test'
- These programs check to see that the `tests/f77demo' subdirectory
- of the libtool distribution can be configured, built, and executed
- correctly.
-
- The `tests/f77demo' tests test Fortran 77 support in libtool by
- creating libraries from Fortran 77 sources, and mixed Fortran and C
- sources, and a Fortran 77 program to use the former library, and a
- C program to use the latter library.
-
-`fcdemo-conf.test'
-`fcdemo-make.test'
-`fcdemo-exec.test'
-`fcdemo-static.test'
-`fcdemo-static-make.test'
-`fcdemo-static-exec.test'
-`fcdemo-shared.test'
-`fcdemo-shared-make.test'
-`fcdemo-shared-exec.test'
- These programs check to see that the `tests/fcdemo' subdirectory
- of the libtool distribution can be configured, built, and executed
- correctly.
-
- The `tests/fcdemo' is similar to the `tests/f77demo' directory,
- except that Fortran 90 is used in combination with the `FC'
- interface provided by Autoconf and Automake.
-
-
- The new, Autotest-based test suite uses keywords to classify certain
-test groups:
-
-`CXX'
-`F77'
-`FC'
-`GCJ'
- The test group exercises one of these `libtool' language tags.
-
-`autoconf'
-`automake'
- These keywords denote that the respective external program is
- needed by the test group. The tests are typically skipped if the
- program is not installed. The `automake' keyword may also denote
- use of the `aclocal' program.
-
-`interactive'
- This test group may require user interaction on some systems.
- Typically, this means closing a popup window about a DLL load
- error on Windows.
-
-`libltdl'
- Denote that the `libltdl' library is exercised by the test group.
-
-`libtool'
-`libtoolize'
- Denote that the `libtool' or `libtoolize' scripts are exercised by
- the test group, respectively.
-
-`recursive'
- Denote that this test group may recursively re-invoke the test
- suite itself, with changed settings and maybe a changed `libtool'
- script. You may use the `INNER_TESTSUITEFLAGS' variable to pass
- additional settings to this recursive invocation. Typically,
- recursive invocations delimit the set of tests with another
- keyword, for example by passing `-k libtool' right before the
- expansion of the `INNER_TESTSUITEFLAGS' variable (without an
- intervening space, so you get the chance for further delimitation).
-
- Test groups with the keyword `recursive' should not be denoted with
- keywords, in order to avoid infinite recursion. As a consequence,
- recursive test groups themselves should never require user
- interaction, while the test groups they invoke may do so.
-
- There is a convenience target `check-noninteractive' that runs all
-tests from both test suites that do not cause user interaction on
-Windows. Conversely, the target `check-interactive' runs the
-complement of tests and might require closing popup windows about DLL
-load errors on Windows.
-
-
-File: libtool.info, Node: When tests fail, Prev: Test descriptions, Up: Libtool test suite
-
-14.1.2 When tests fail
-----------------------
-
-When the tests in the old test suite are run via `make check', output
-is caught in per-test `tests/TEST-NAME.log' files and summarized in the
-`test-suite.log' file. The exit status of each program tells the
-`Makefile' whether or not the test succeeded.
-
- If a test fails, it means that there is either a programming error in
-libtool, or in the test program itself.
-
- To investigate a particular test, you may run it directly, as you
-would a normal program. When the test is invoked in this way, it
-produces output that may be useful in determining what the problem is.
-
- The new, Autotest-based test suite produces as output a file
-`tests/testsuite.log' which contains information about failed tests.
-
- You can pass options to the test suite through the `make' variable
-`TESTSUITEFLAGS' (*note The Autoconf Manual: (autoconf)testsuite
-Invocation.).
-
-
-File: libtool.info, Node: Reporting bugs, Prev: Libtool test suite, Up: Troubleshooting
-
-14.2 Reporting bugs
-===================
-
-If you think you have discovered a bug in libtool, you should think
-twice: the libtool maintainer is notorious for passing the buck (or
-maybe that should be "passing the bug"). Libtool was invented to fix
-known deficiencies in shared library implementations, so, in a way, most
-of the bugs in libtool are actually bugs in other operating systems.
-However, the libtool maintainer would definitely be happy to add support
-for somebody else's buggy operating system. [I wish there was a good
-way to do winking smiley-faces in Texinfo.]
-
- Genuine bugs in libtool include problems with shell script
-portability, documentation errors, and failures in the test suite
-(*note Libtool test suite::).
-
- First, check the documentation and help screens to make sure that the
-behaviour you think is a problem is not already mentioned as a feature.
-
- Then, you should read the Emacs guide to reporting bugs (*note
-Reporting Bugs: (emacs)Bugs.). Some of the details listed there are
-specific to Emacs, but the principle behind them is a general one.
-
- Finally, send a bug report to the Libtool bug reporting address
-<bug-libtool@gnu.org> with any appropriate _facts_, such as test suite
-output (*note When tests fail::), all the details needed to reproduce
-the bug, and a brief description of why you think the behaviour is a
-bug. Be sure to include the word "libtool" in the subject line, as
-well as the version number you are using (which can be found by typing
-`libtool --version').
-
-
-File: libtool.info, Node: Maintaining, Next: GNU Free Documentation License, Prev: Troubleshooting, Up: Top
-
-15 Maintenance notes for libtool
-********************************
-
-This chapter contains information that the libtool maintainer finds
-important. It will be of no use to you unless you are considering
-porting libtool to new systems, or writing your own libtool.
-
-* Menu:
-
-* New ports:: How to port libtool to new systems.
-* Tested platforms:: When libtool was last tested.
-* Platform quirks:: Information about different library systems.
-* libtool script contents:: Configuration information that libtool uses.
-* Cheap tricks:: Making libtool maintainership easier.
-
-
-File: libtool.info, Node: New ports, Next: Tested platforms, Up: Maintaining
-
-15.1 Porting libtool to new systems
-===================================
-
-Before you embark on porting libtool to an unsupported system, it is
-worthwhile to send e-mail to the Libtool mailing list
-<libtool@gnu.org>, to make sure that you are not duplicating existing
-work.
-
- If you find that any porting documentation is missing, please
-complain! Complaints with patches and improvements to the
-documentation, or to libtool itself, are more than welcome.
-
-* Menu:
-
-* Information sources:: Where to find relevant documentation
-* Porting inter-library dependencies:: Implementation details explained
-
-
-File: libtool.info, Node: Information sources, Next: Porting inter-library dependencies, Up: New ports
-
-15.1.1 Information sources
---------------------------
-
-Once it is clear that a new port is necessary, you'll generally need the
-following information:
-
-canonical system name
- You need the output of `config.guess' for this system, so that you
- can make changes to the libtool configuration process without
- affecting other systems.
-
-man pages for `ld' and `cc'
- These generally describe what flags are used to generate PIC, to
- create shared libraries, and to link against only static
- libraries. You may need to follow some cross references to find
- the information that is required.
-
-man pages for `ld.so', `rtld', or equivalent
- These are a valuable resource for understanding how shared
- libraries are loaded on the system.
-
-man page for `ldconfig', or equivalent
- This page usually describes how to install shared libraries.
-
-output from `ls -l /lib /usr/lib'
- This shows the naming convention for shared libraries on the
- system, including which names should be symbolic links.
-
-any additional documentation
- Some systems have special documentation on how to build and install
- shared libraries.
-
- If you know how to program the Bourne shell, then you can complete
-the port yourself; otherwise, you'll have to find somebody with the
-relevant skills who will do the work. People on the libtool mailing
-list are usually willing to volunteer to help you with new ports, so
-you can send the information to them.
-
- To do the port yourself, you'll definitely need to modify the
-`libtool.m4' macros in order to make platform-specific changes to the
-configuration process. You should search that file for the `PORTME'
-keyword, which will give you some hints on what you'll need to change.
-In general, all that is involved is modifying the appropriate
-configuration variables (*note libtool script contents::).
-
- Your best bet is to find an already-supported system that is similar
-to yours, and make your changes based on that. In some cases, however,
-your system will differ significantly from every other supported system,
-and it may be necessary to add new configuration variables, and modify
-the `ltmain.in' script accordingly. Be sure to write to the mailing
-list before you make changes to `ltmain.in', since they may have advice
-on the most effective way of accomplishing what you want.
-
-
-File: libtool.info, Node: Porting inter-library dependencies, Prev: Information sources, Up: New ports
-
-15.1.2 Porting inter-library dependencies support
--------------------------------------------------
-
-Since version 1.2c, libtool has re-introduced the ability to do
-inter-library dependency on some platforms, thanks to a patch by Toshio
-Kuratomi <badger@prtr-13.ucsc.edu>. Here's a shortened version of the
-message that contained his patch:
-
- The basic architecture is this: in `libtool.m4', the person who
-writes libtool makes sure `$deplibs' is included in `$archive_cmds'
-somewhere and also sets the variable `$deplibs_check_method', and maybe
-`$file_magic_cmd' when `deplibs_check_method' is file_magic.
-
- `deplibs_check_method' can be one of five things:
-`file_magic [REGEX]'
- looks in the library link path for libraries that have the right
- libname. Then it runs `$file_magic_cmd' on the library and checks
- for a match against the extended regular expression REGEX. When
- `file_magic_test_file' is set by `libtool.m4', it is used as an
- argument to `$file_magic_cmd' in order to verify whether the
- regular expression matches its output, and warn the user otherwise.
-
-`test_compile'
- just checks whether it is possible to link a program out of a list
- of libraries, and checks which of those are listed in the output of
- `ldd'. It is currently unused, and will probably be dropped in the
- future.
-
-`pass_all'
- will pass everything without any checking. This may work on
- platforms in which code is position-independent by default and
- inter-library dependencies are properly supported by the dynamic
- linker, for example, on DEC OSF/1 3 and 4.
-
-`none'
- It causes deplibs to be reassigned `deplibs=""'. That way
- `archive_cmds' can contain deplibs on all platforms, but not have
- deplibs used unless needed.
-
-`unknown'
- is the default for all systems unless overridden in `libtool.m4'.
- It is the same as `none', but it documents that we really don't
- know what the correct value should be, and we welcome patches that
- improve it.
-
- Then in `ltmain.in' we have the real workhorse: a little
-initialization and postprocessing (to setup/release variables for use
-with eval echo libname_spec etc.) and a case statement that decides the
-method that is being used. This is the real code... I wish I could
-condense it a little more, but I don't think I can without function
-calls. I've mostly optimized it (moved things out of loops, etc.) but
-there is probably some fat left. I thought I should stop while I was
-ahead, work on whatever bugs you discover, etc. before thinking about
-more than obvious optimizations.
-
-
-File: libtool.info, Node: Tested platforms, Next: Platform quirks, Prev: New ports, Up: Maintaining
-
-15.2 Tested platforms
-=====================
-
-This table describes when libtool was last known to be tested on
-platforms where it claims to support shared libraries:
-
- -------------------------------------------------------
- canonical host name compiler libtool results
- (tools versions) release
- -------------------------------------------------------
- alpha-dec-osf5.1 cc 1.3e ok (1.910)
- alpha-dec-osf4.0f gcc 1.3e ok (1.910)
- alpha-dec-osf4.0f cc 1.3e ok (1.910)
- alpha-dec-osf3.2 gcc 0.8 ok
- alpha-dec-osf3.2 cc 0.8 ok
- alpha-dec-osf2.1 gcc 1.2f NS
- alpha*-unknown-linux-gnu gcc 1.3b ok
- (egcs-1.1.2, GNU ld 2.9.1.0.23)
- hppa2.0w-hp-hpux11.00 cc 1.2f ok
- hppa2.0-hp-hpux10.20 cc 1.3.2 ok
- hppa1.1-hp-hpux10.20 gcc 1.2f ok
- hppa1.1-hp-hpux10.20 cc 1.3c ok (1.821)
- hppa1.1-hp-hpux10.10 gcc 1.2f ok
- hppa1.1-hp-hpux10.10 cc 1.2f ok
- hppa1.1-hp-hpux9.07 gcc 1.2f ok
- hppa1.1-hp-hpux9.07 cc 1.2f ok
- hppa1.1-hp-hpux9.05 gcc 1.2f ok
- hppa1.1-hp-hpux9.05 cc 1.2f ok
- hppa1.1-hp-hpux9.01 gcc 1.2f ok
- hppa1.1-hp-hpux9.01 cc 1.2f ok
- i*86-*-beos gcc 1.2f ok
- i*86-*-bsdi4.0.1 gcc 1.3c ok
- (gcc-2.7.2.1)
- i*86-*-bsdi4.0 gcc 1.2f ok
- i*86-*-bsdi3.1 gcc 1.2e NS
- i*86-*-bsdi3.0 gcc 1.2e NS
- i*86-*-bsdi2.1 gcc 1.2e NS
- i*86-pc-cygwin gcc 1.3b NS
- (egcs-1.1 stock b20.1 compiler)
- i*86-*-dguxR4.20MU01 gcc 1.2 ok
- i*86-*-freebsd4.3 gcc 1.3e ok (1.912)
- i*86-*-freebsdelf4.0 gcc 1.3c ok
- (egcs-1.1.2)
- i*86-*-freebsdelf3.2 gcc 1.3c ok
- (gcc-2.7.2.1)
- i*86-*-freebsdelf3.1 gcc 1.3c ok
- (gcc-2.7.2.1)
- i*86-*-freebsdelf3.0 gcc 1.3c ok
- i*86-*-freebsd3.0 gcc 1.2e ok
- i*86-*-freebsd2.2.8 gcc 1.3c ok
- (gcc-2.7.2.1)
- i*86-*-freebsd2.2.6 gcc 1.3b ok
- (egcs-1.1 & gcc-2.7.2.1, native ld)
- i*86-*-freebsd2.1.5 gcc 0.5 ok
- i*86-*-netbsd1.5 gcc 1.3e ok (1.901)
- (egcs-1.1.2)
- i*86-*-netbsd1.4 gcc 1.3c ok
- (egcs-1.1.1)
- i*86-*-netbsd1.4.3A gcc 1.3e ok (1.901)
- i*86-*-netbsd1.3.3 gcc 1.3c ok
- (gcc-2.7.2.2+myc2)
- i*86-*-netbsd1.3.2 gcc 1.2e ok
- i*86-*-netbsd1.3I gcc 1.2e ok
- (egcs 1.1?)
- i*86-*-netbsd1.2 gcc 0.9g ok
- i*86-*-linux-gnu gcc 1.3e ok (1.901)
- (Red Hat 7.0, gcc "2.96")
- i*86-*-linux-gnu gcc 1.3e ok (1.911)
- (SuSE 7.0, gcc 2.95.2)
- i*86-*-linux-gnulibc1 gcc 1.2f ok
- i*86-*-openbsd2.5 gcc 1.3c ok
- (gcc-2.8.1)
- i*86-*-openbsd2.4 gcc 1.3c ok
- (gcc-2.8.1)
- i*86-*-solaris2.7 gcc 1.3b ok
- (egcs-1.1.2, native ld)
- i*86-*-solaris2.6 gcc 1.2f ok
- i*86-*-solaris2.5.1 gcc 1.2f ok
- i*86-ncr-sysv4.3.03 gcc 1.2f ok
- i*86-ncr-sysv4.3.03 cc 1.2e ok
- (cc -Hnocopyr)
- i*86-pc-sco3.2v5.0.5 cc 1.3c ok
- i*86-pc-sco3.2v5.0.5 gcc 1.3c ok
- (gcc 95q4c)
- i*86-pc-sco3.2v5.0.5 gcc 1.3c ok
- (egcs-1.1.2)
- i*86-sco-sysv5uw7.1.1 gcc 1.3e ok (1.901)
- (gcc-2.95.2, SCO linker)
- i*86-UnixWare7.1.0-sysv5 cc 1.3c ok
- i*86-UnixWare7.1.0-sysv5 gcc 1.3c ok
- (egcs-1.1.1)
- m68k-next-nextstep3 gcc 1.2f NS
- m68k-sun-sunos4.1.1 gcc 1.2f NS
- (gcc-2.5.7)
- m88k-dg-dguxR4.12TMU01 gcc 1.2 ok
- m88k-motorola-sysv4 gcc 1.3 ok
- (egcs-1.1.2)
- mips-sgi-irix6.5 gcc 1.2f ok
- (gcc-2.8.1)
- mips-sgi-irix6.4 gcc 1.2f ok
- mips-sgi-irix6.3 gcc 1.3b ok
- (egcs-1.1.2, native ld)
- mips-sgi-irix6.3 cc 1.3b ok
- (cc 7.0)
- mips-sgi-irix6.2 gcc 1.2f ok
- mips-sgi-irix6.2 cc 0.9 ok
- mips-sgi-irix5.3 gcc 1.2f ok
- (egcs-1.1.1)
- mips-sgi-irix5.3 gcc 1.2f NS
- (gcc-2.6.3)
- mips-sgi-irix5.3 cc 0.8 ok
- mips-sgi-irix5.2 gcc 1.3b ok
- (egcs-1.1.2, native ld)
- mips-sgi-irix5.2 cc 1.3b ok
- (cc 3.18)
- mips-sni-sysv4 cc 1.3.5 ok
- (Siemens C-compiler)
- mips-sni-sysv4 gcc 1.3.5 ok
- (gcc-2.7.2.3, GNU assembler 2.8.1, native ld)
- mipsel-unknown-openbsd2.1 gcc 1.0 ok
- powerpc-apple-darwin6.4 gcc 1.5 ok
- (apple dev tools released 12/2002)
- powerpc-ibm-aix4.3.1.0 gcc 1.2f ok
- (egcs-1.1.1)
- powerpc-ibm-aix4.2.1.0 gcc 1.2f ok
- (egcs-1.1.1)
- powerpc-ibm-aix4.1.5.0 gcc 1.2f ok
- (egcs-1.1.1)
- powerpc-ibm-aix4.1.5.0 gcc 1.2f NS
- (gcc-2.8.1)
- powerpc-ibm-aix4.1.4.0 gcc 1.0 ok
- powerpc-ibm-aix4.1.4.0 xlc 1.0i ok
- rs6000-ibm-aix4.1.5.0 gcc 1.2f ok
- (gcc-2.7.2)
- rs6000-ibm-aix4.1.4.0 gcc 1.2f ok
- (gcc-2.7.2)
- rs6000-ibm-aix3.2.5 gcc 1.0i ok
- rs6000-ibm-aix3.2.5 xlc 1.0i ok
- sparc-sun-solaris2.8 gcc 1.3e ok (1.913)
- (gcc-2.95.3 & native ld)
- sparc-sun-solaris2.7 gcc 1.3e ok (1.913)
- (gcc-2.95.3 & native ld)
- sparc-sun-solaris2.6 gcc 1.3e ok (1.913)
- (gcc-2.95.3 & native ld)
- sparc-sun-solaris2.5.1 gcc 1.3e ok (1.911)
- sparc-sun-solaris2.5 gcc 1.3b ok
- (egcs-1.1.2, GNU ld 2.9.1 & native ld)
- sparc-sun-solaris2.5 cc 1.3b ok
- (SC 3.0.1)
- sparc-sun-solaris2.4 gcc 1.0a ok
- sparc-sun-solaris2.4 cc 1.0a ok
- sparc-sun-solaris2.3 gcc 1.2f ok
- sparc-sun-sunos4.1.4 gcc 1.2f ok
- sparc-sun-sunos4.1.4 cc 1.0f ok
- sparc-sun-sunos4.1.3_U1 gcc 1.2f ok
- sparc-sun-sunos4.1.3C gcc 1.2f ok
- sparc-sun-sunos4.1.3 gcc 1.3b ok
- (egcs-1.1.2, GNU ld 2.9.1 & native ld)
- sparc-sun-sunos4.1.3 cc 1.3b ok
- sparc-unknown-bsdi4.0 gcc 1.2c ok
- sparc-unknown-linux-gnulibc1 gcc 1.2f ok
- sparc-unknown-linux-gnu gcc 1.3b ok
- (egcs-1.1.2, GNU ld 2.9.1.0.23)
- sparc64-unknown-linux-gnu gcc 1.2f ok
-
- Notes:
- - "ok" means "all tests passed".
- - "NS" means "Not Shared", but OK for static libraries
-
- Note: The vendor-distributed HP-UX `sed'(1) programs are horribly
-broken, and cannot handle libtool's requirements, so users may report
-unusual problems. There is no workaround except to install a working
-`sed' (such as GNU `sed') on these systems.
-
- Note: The vendor-distributed NCR MP-RAS `cc' programs emits
-copyright on standard error that confuse tests on size of
-`conftest.err'. The workaround is to specify `CC' when run `configure'
-with `CC='cc -Hnocopyr''.
-
-
-File: libtool.info, Node: Platform quirks, Next: libtool script contents, Prev: Tested platforms, Up: Maintaining
-
-15.3 Platform quirks
-====================
-
-This section is dedicated to the sanity of the libtool maintainers. It
-describes the programs that libtool uses, how they vary from system to
-system, and how to test for them.
-
- Because libtool is a shell script, it can be difficult to understand
-just by reading it from top to bottom. This section helps show why
-libtool does things a certain way. Combined with the scripts
-themselves, you should have a better sense of how to improve libtool, or
-write your own.
-
-* Menu:
-
-* References:: Finding more information.
-* Compilers:: Creating object files from source files.
-* Reloadable objects:: Binding object files together.
-* Multiple dependencies:: Removing duplicate dependent libraries.
-* Archivers:: Programs that create static archives.
-* Cross compiling:: Issues that arise when cross compiling.
-* File name conversion:: Converting file names between platforms.
-* Windows DLLs:: Windows header defines.
-
-
-File: libtool.info, Node: References, Next: Compilers, Up: Platform quirks
-
-15.3.1 References
------------------
-
-The following is a list of valuable documentation references:
-
- * SGI's IRIX Manual Pages can be found at
- `http://techpubs.sgi.com/cgi-bin/infosrch.cgi?cmd=browse&db=man'.
-
- * Sun's free service area
- (`http://www.sun.com/service/online/free.html') and documentation
- server (`http://docs.sun.com/').
-
- * Compaq's Tru64 UNIX online documentation is at
- (`http://tru64unix.compaq.com/faqs/publications/pub_page/doc_list.html')
- with C++ documentation at
- (`http://tru64unix.compaq.com/cplus/docs/index.htm').
-
- * Hewlett-Packard has online documentation at
- (`http://docs.hp.com/index.html').
-
- * IBM has online documentation at
- (`http://www.rs6000.ibm.com/resource/aix_resource/Pubs/').
-
-
-File: libtool.info, Node: Compilers, Next: Reloadable objects, Prev: References, Up: Platform quirks
-
-15.3.2 Compilers
-----------------
-
-The only compiler characteristics that affect libtool are the flags
-needed (if any) to generate PIC objects. In general, if a C compiler
-supports certain PIC flags, then any derivative compilers support the
-same flags. Until there are some noteworthy exceptions to this rule,
-this section will document only C compilers.
-
- The following C compilers have standard command line options,
-regardless of the platform:
-
-`gcc'
- This is the GNU C compiler, which is also the system compiler for
- many free operating systems (FreeBSD, GNU/Hurd, GNU/Linux, Lites,
- NetBSD, and OpenBSD, to name a few).
-
- The `-fpic' or `-fPIC' flags can be used to generate
- position-independent code. `-fPIC' is guaranteed to generate
- working code, but the code is slower on m68k, m88k, and Sparc
- chips. However, using `-fpic' on those chips imposes arbitrary
- size limits on the shared libraries.
-
- The rest of this subsection lists compilers by the operating system
-that they are bundled with:
-
-`aix3*'
-`aix4*'
- Most AIX compilers have no PIC flags, since AIX (with the
- exception of AIX for IA-64) runs on PowerPC and RS/6000 chips. (1)
-
-`hpux10*'
- Use `+Z' to generate PIC.
-
-`osf3*'
- Digital/UNIX 3.x does not have PIC flags, at least not on the
- PowerPC platform.
-
-`solaris2*'
- Use `-KPIC' to generate PIC.
-
-`sunos4*'
- Use `-PIC' to generate PIC.
-
- ---------- Footnotes ----------
-
- (1) All code compiled for the PowerPC and RS/6000 chips
-(`powerpc-*-*', `powerpcle-*-*', and `rs6000-*-*') is
-position-independent, regardless of the operating system or compiler
-suite. So, "regular objects" can be used to build shared libraries on
-these systems and no special PIC compiler flags are required.
-
-
-File: libtool.info, Node: Reloadable objects, Next: Multiple dependencies, Prev: Compilers, Up: Platform quirks
-
-15.3.3 Reloadable objects
--------------------------
-
-On all known systems, a reloadable object can be created by running `ld
--r -o OUTPUT.o INPUT1.o INPUT2.o'. This reloadable object may be
-treated as exactly equivalent to other objects.
-
-
-File: libtool.info, Node: Multiple dependencies, Next: Archivers, Prev: Reloadable objects, Up: Platform quirks
-
-15.3.4 Multiple dependencies
-----------------------------
-
-On most modern platforms the order in which dependent libraries are
-listed has no effect on object generation. In theory, there are
-platforms that require libraries that provide missing symbols to other
-libraries to be listed after those libraries whose symbols they provide.
-
- Particularly, if a pair of static archives each resolve some of the
-other's symbols, it might be necessary to list one of those archives
-both before and after the other one. Libtool does not currently cope
-with this situation well, since duplicate libraries are removed from
-the link line by default. Libtool provides the command line option
-`--preserve-dup-deps' to preserve all duplicate dependencies in cases
-where it is necessary.
-
-
-File: libtool.info, Node: Archivers, Next: Cross compiling, Prev: Multiple dependencies, Up: Platform quirks
-
-15.3.5 Archivers
-----------------
-
-On all known systems, building a static library can be accomplished by
-running `ar cru libNAME.a OBJ1.o OBJ2.o ...', where the `.a' file is
-the output library, and each `.o' file is an object file.
-
- On all known systems, if there is a program named `ranlib', then it
-must be used to "bless" the created library before linking against it,
-with the `ranlib libNAME.a' command. Some systems, like Irix, use the
-`ar ts' command, instead.
-
-
-File: libtool.info, Node: Cross compiling, Next: File name conversion, Prev: Archivers, Up: Platform quirks
-
-15.3.6 Cross compiling
-----------------------
-
-Most build systems support the ability to compile libraries and
-applications on one platform for use on a different platform, provided
-a compiler capable of generating the appropriate output is available.
-In such cross compiling scenarios, the platform on which the libraries
-or applications are compiled is called the "build platform", while the
-platform on which the libraries or applications are intended to be used
-or executed is called the "host platform". *note The GNU Build System:
-(automake)GNU Build System, of which libtool is a part, supports cross
-compiling via arguments passed to the configure script: `--build=...'
-and `--host=...'. However, when the build platform and host platform
-are very different, libtool is required to make certain accommodations
-to support these scenarios.
-
- In most cases, because the build platform and host platform differ,
-the cross-compiled libraries and executables can't be executed or
-tested on the build platform where they were compiled. The testsuites
-of most build systems will often skip any tests that involve executing
-such foreign executables when cross-compiling. However, if the build
-platform and host platform are sufficiently similar, it is often
-possible to run cross-compiled applications. Libtool's own testsuite
-often attempts to execute cross-compiled tests, but will mark any
-failures as _skipped_ since the failure might simply be due to the
-differences between the two platforms.
-
- In addition to cases where the host platform and build platform are
-extremely similar (e.g. `i586-pc-linux-gnu' and `i686-pc-linux-gnu'),
-there is another case in which cross-compiled host applications may be
-executed on the build platform. This is possible when the build
-platform supports an emulation or API-enhanced environment for the host
-platform. One example of this situation would be if the build platform
-were MinGW, and the host platform were Cygwin (or vice versa). Both of
-these platforms can actually operate within a single Windows instance,
-so Cygwin applications can be launched from a MinGW context, and vice
-versa--provided certain care is taken. Another example would be if the
-build platform were GNU/Linux on an x86 32bit processor, and the host
-platform were MinGW. In this situation, the Wine
-(http://www.winehq.org/) environment can be used to launch Windows
-applications from the GNU/Linux operating system; again, provided
-certain care is taken.
-
- One particular issue occurs when a Windows platform such as MinGW,
-Cygwin, or MSYS is the host or build platform, while the other platform
-is a Unix-style system. In these cases, there are often conflicts
-between the format of the file names and paths expected within host
-platform libraries and executables, and those employed on the build
-platform.
-
- This situation is best described using a concrete example: suppose
-the build platform is GNU/Linux with canonical triplet
-`i686-pc-linux-gnu'. Suppose further that the host platform is MinGW
-with canonical triplet `i586-pc-mingw32'. On the GNU/Linux platform
-there is a cross compiler following the usual naming conventions of
-such compilers, where the compiler name is prefixed by the host
-canonical triplet (or suitable alias). (For more information
-concerning canonical triplets and platform aliases, see *note
-Specifying Target Triplets: (autoconf)Specifying Target Triplets. and
-*note Canonicalizing: (autoconf)Canonicalizing.) In this case, the C
-compiler is named `i586-pc-mingw32-gcc'.
-
- As described in *note Wrapper executables::, for the MinGW host
-platform libtool uses a wrapper executable to set various environment
-variables before launching the actual program executable. Like the
-program executable, the wrapper executable is cross-compiled for the
-host platform (that is, for MinGW). As described above, ordinarily a
-host platform executable cannot be executed on the build platform, but
-in this case the Wine environment could be used to launch the MinGW
-application from GNU/Linux. However, the wrapper executable, as a host
-platform (MinGW) application, must set the `PATH' variable so that the
-true application's dependent libraries can be located--but the contents
-of the `PATH' variable must be structured for MinGW. Libtool must use
-the Wine file name mapping facilities to determine the correct value so
-that the wrapper executable can set the `PATH' variable to point to the
-correct location.
-
- For example, suppose we are compiling an application in `/var/tmp' on
-GNU/Linux, using separate source code and build directories:
-
- `/var/tmp/foo-1.2.3/app/' (application source code)
- `/var/tmp/foo-1.2.3/lib/' (library source code)
- `/var/tmp/BUILD/app/' (application build objects here)
- `/var/tmp/BUILD/lib/' (library build objects here)
-
- Since the library will be built in `/var/tmp/BUILD/lib', the wrapper
-executable (which will be in `/var/tmp/BUILD/app') must add that
-directory to `PATH' (actually, it must add the directory named OBJDIR
-under `/var/tmp/BUILD/lib', but we'll ignore that detail for now).
-However, Windows does not have a concept of Unix-style file or
-directory names such as `/var/tmp/BUILD/lib'. Therefore, Wine provides
-a mapping from Windows file names such as `C:\Program Files' to specific
-Unix-style file names. Wine also provides a utility that can be used
-to map Unix-style file names to Windows file names.
-
- In this case, the wrapper executable should actually add the value
-
- Z:\var\tmp\BUILD\lib
-
-to the `PATH'. libtool contains support for path conversions of this
-type, for a certain limited set of build and host platform
-combinations. In this case, libtool will invoke Wine's `winepath'
-utility to ensure that the correct `PATH' value is used. For more
-information, see *note File name conversion::.
-
-
-File: libtool.info, Node: File name conversion, Next: Windows DLLs, Prev: Cross compiling, Up: Platform quirks
-
-15.3.7 File name conversion
----------------------------
-
-In certain situations, libtool must convert file names and paths between
-formats appropriate to different platforms. Usually this occurs when
-cross-compiling, and affects only the ability to launch host platform
-executables on the build platform using an emulation or API-enhancement
-environment such as Wine. Failure to convert paths (*note File Name
-Conversion Failure::) will cause a warning to be issued, but rarely
-causes the build to fail--and should have no affect on the compiled
-products, once installed properly on the host platform. For more
-information, *note Cross compiling::.
-
- However, file name conversion may also occur in another scenario:
-when using a Unix emulation system on Windows (such as Cygwin or MSYS),
-combined with a native Windows compiler such as MinGW or MSVC. Only a
-limited set of such scenarios are currently supported; in other cases
-file name conversion is skipped. The lack of file name conversion
-usually means that uninstalled executables can't be launched, but only
-rarely causes the build to fail (*note File Name Conversion Failure::).
-
- libtool supports file name conversion in the following scenarios:
-
-build platform host platform Notes
----------------------------------------------------------------------------
-MinGW (MSYS) MinGW (Windows) *note Native MinGW File Name
- Conversion::
-Cygwin MinGW (Windows) *note Cygwin/Windows File Name
- Conversion::
-Unix + Wine MinGW (Windows) Requires Wine. *note Unix/Windows
- File Name Conversion::
-MinGW (MSYS) Cygwin Requires `LT_CYGPATH'. *note
- LT_CYGPATH::. Provided for testing
- purposes only.
-Unix + Wine Cygwin Requires both Wine and
- `LT_CYGPATH', but does not yet work
- with Cygwin 1.7.7 and Wine-1.2.
- See *note Unix/Windows File Name
- Conversion:: and *note LT_CYGPATH::.
-
-* Menu:
-
-* File Name Conversion Failure:: What happens when file name conversion fails
-* Native MinGW File Name Conversion:: MSYS file name conversion idiosyncrasies
-* Cygwin/Windows File Name Conversion:: Using `cygpath' to convert Cygwin file names
-* Unix/Windows File Name Conversion:: Using Wine to convert Unix paths
-* LT_CYGPATH:: Invoking `cygpath' from other environments
-* Cygwin to MinGW Cross:: Other notes concerning MinGW cross
-
-
-File: libtool.info, Node: File Name Conversion Failure, Next: Native MinGW File Name Conversion, Up: File name conversion
-
-15.3.7.1 File Name Conversion Failure
-.....................................
-
-In most cases, file name conversion is not needed or attempted.
-However, when libtool detects that a specific combination of build and
-host platform does require file name conversion, it is possible that
-the conversion may fail. In these cases, you may see a warning such as
-the following:
-
- Could not determine the host file name corresponding to
- `... a file name ...'
- Continuing, but uninstalled executables may not work.
-
-or
-
- Could not determine the host path corresponding to
- `... a path ...'
- Continuing, but uninstalled executables may not work.
-
-This should not cause the build to fail. At worst, it means that the
-wrapper executable will specify file names or paths appropriate for the
-build platform. Since those are not appropriate for the host platform,
-the uninstalled executables would not operate correctly, even when the
-wrapper executable is launched via the appropriate emulation or
-API-enhancement (e.g. Wine). Simply install the executables on the
-host platform, and execute them there.
-
-
-File: libtool.info, Node: Native MinGW File Name Conversion, Next: Cygwin/Windows File Name Conversion, Prev: File Name Conversion Failure, Up: File name conversion
-
-15.3.7.2 Native MinGW File Name Conversion
-..........................................
-
-MSYS is a Unix emulation environment for Windows, and is specifically
-designed such that in normal usage it _pretends_ to be MinGW or native
-Windows, but understands Unix-style file names and paths, and supports
-standard Unix tools and shells. Thus, "native" MinGW builds are
-actually an odd sort of cross-compile, from an MSYS Unix emulation
-environment "pretending" to be MinGW, to actual native Windows.
-
- When an MSYS shell launches a native Windows executable (as opposed
-to other _MSYS_ executables), it uses a system of heuristics to detect
-any command-line arguments that contain file names or paths. It
-automatically converts these file names from the MSYS (Unix-like)
-format, to the corresponding Windows file name, before launching the
-executable. However, this auto-conversion facility is only available
-when using the MSYS runtime library. The wrapper executable itself is
-a MinGW application (that is, it does not use the MSYS runtime
-library). The wrapper executable must set `PATH' to, and call
-`_spawnv' with, values that have already been converted from MSYS
-format to Windows. Thus, when libtool writes the source code for the
-wrapper executable, it must manually convert MSYS paths to Windows
-format, so that the Windows values can be hard-coded into the wrapper
-executable.
-
-
-File: libtool.info, Node: Cygwin/Windows File Name Conversion, Next: Unix/Windows File Name Conversion, Prev: Native MinGW File Name Conversion, Up: File name conversion
-
-15.3.7.3 Cygwin/Windows File Name Conversion
-............................................
-
-Cygwin provides a Unix emulation environment for Windows. As part of
-that emulation, it provides a file system mapping that presents the
-Windows file system in a Unix-compatible manner. Cygwin also provides
-a utility `cygpath' that can be used to convert file names and paths
-between the two representations. In a correctly configured Cygwin
-installation, `cygpath' is always present, and is in the `PATH'.
-
- Libtool uses `cygpath' to convert from Cygwin (Unix-style) file names
-and paths to Windows format when the build platform is Cygwin and the
-host platform is MinGW.
-
- When the host platform is Cygwin, but the build platform is MSYS or
-some Unix system, libtool also uses `cygpath' to convert from Windows
-to Cygwin format (after first converting from the build platform format
-to Windows format; see *note Native MinGW File Name Conversion:: and
-*note Unix/Windows File Name Conversion::). Because the build platform
-is not Cygwin, `cygpath' is not (and should not be) in the `PATH'.
-Therefore, in this configuration the environment variable `LT_CYGPATH'
-is required. *Note LT_CYGPATH::.
-
-
-File: libtool.info, Node: Unix/Windows File Name Conversion, Next: LT_CYGPATH, Prev: Cygwin/Windows File Name Conversion, Up: File name conversion
-
-15.3.7.4 Unix/Windows File Name Conversion
-..........................................
-
-Wine (http://www.winehq.org/) provides an interpretation environment for
-some Unix platforms in which Windows applications can be executed. It
-provides a mapping between the Unix file system and a virtual Windows
-file system used by the Windows programs. For the file name conversion
-to work, Wine must be installed and properly configured on the build
-platform, and the `winepath' application must be in the build
-platform's `PATH'. In addition, on 32bit GNU/Linux it is usually
-helpful if the binfmt extension is enabled.
-
-
-File: libtool.info, Node: LT_CYGPATH, Next: Cygwin to MinGW Cross, Prev: Unix/Windows File Name Conversion, Up: File name conversion
-
-15.3.7.5 LT_CYGPATH
-...................
-
-For some cross-compile configurations (where the host platform is
-Cygwin), the `cygpath' program is used to convert file names from the
-build platform notation to the Cygwin form (technically, this
-conversion is from Windows notation to Cygwin notation; the conversion
-from the build platform format to Windows notation is performed via
-other means). However, because the `cygpath' program is not (and
-should not be) in the `PATH' on the build platform, `LT_CYGPATH' must
-specify the full build platform file name (that is, the full Unix or
-MSYS file name) of the `cygpath' program.
-
- The reason `cygpath' should not be in the build platform `PATH' is
-twofold: first, `cygpath' is usually installed in the same directory as
-many other Cygwin executables, such as `sed', `cp', etc. If the build
-platform environment had this directory in its `PATH', then these
-Cygwin versions of common Unix utilities might be used in preference to
-the ones provided by the build platform itself, with deleterious
-effects. Second, especially when Cygwin-1.7 or later is used, multiple
-Cygwin installations can coexist within the same Windows instance.
-Each installation will have separate "mount tables" specified in
-`CYGROOT-N/etc/fstab'. These "mount tables" control how that instance
-of Cygwin will map Windows file names and paths to Cygwin form. Each
-installation's `cygpath' utility automatically deduces the appropriate
-`/etc/fstab' file. Since each `CYGROOT-N/etc/fstab' mount table may
-specify different mappings, it matters which `cygpath' is used.
-
- Note that `cygpath' is a Cygwin application; to execute this tool
-from Unix requires a working and properly configured Wine installation,
-as well as enabling the GNU/Linux `binfmt' extension. Furthermore, the
-Cygwin `setup.exe' tool should have been used, via Wine, to properly
-install Cygwin into the Wine file system (and registry).
-
- Unfortunately, Wine support for Cygwin is intermittent. Recent
-releases of Cygwin (1.7 and above) appear to require more Windows API
-support than Wine provides (as of Wine version 1.2); most Cygwin
-applications fail to execute. This includes `cygpath' itself. Hence,
-it is best _not_ to use the LT_CYGPATH machinery in libtool when
-performing Unix to Cygwin cross-compiles. Similarly, it is best _not_
-to enable the GNU/Linux binfmt support in this configuration, because
-while Wine will fail to execute the compiled Cygwin applications, it
-will still exit with status zero. This tends to confuse build systems
-and test suites (including libtool's own testsuite, resulting in
-spurious reported failures). Wine support for the older Cygwin-1.5
-series appears satisfactory, but the Cygwin team no longer supports
-Cygwin-1.5. It is hoped that Wine will eventually be improved such that
-Cygwin-1.7 will again operate correctly under Wine. Until then,
-libtool will report warnings as described in *note File Name Conversion
-Failure:: in these scenarios.
-
- However, `LT_CYGPATH' is also used for the MSYS to Cygwin cross
-compile scenario, and operates as expected.
-
-
-File: libtool.info, Node: Cygwin to MinGW Cross, Prev: LT_CYGPATH, Up: File name conversion
-
-15.3.7.6 Cygwin to MinGW Cross
-..............................
-
-There are actually three different scenarios that could all
-legitimately be called a "Cygwin to MinGW" cross compile. The current
-(and standard) definition is when there is a compiler that produces
-native Windows libraries and applications, but which itself is a Cygwin
-application, just as would be expected in any other cross compile setup.
-
- However, historically there were two other definitions, which we
-will refer to as the _fake_ one, and the _lying_ one.
-
- In the _fake_ Cygwin to MinGW cross compile case, you actually use a
-native MinGW compiler, but you do so from within a Cygwin environment:
-
- export PATH="/c/MinGW/bin:${PATH}"
- configure --build=i686-pc-cygwin \
- --host=mingw32 \
- NM=/c/MinGW/bin/nm.exe
-
- In this way, the build system "knows" that you are cross compiling,
-and the file name conversion logic will be used. However, because the
-tools (`mingw32-gcc', `nm', `ar') used are actually native Windows
-applications, they will not understand any Cygwin (that is, Unix-like)
-absolute file names passed as command line arguments (and, unlike MSYS,
-Cygwin does not automatically convert such arguments). However, so
-long as only relative file names are used in the build system, and
-non-Windows-supported Unix idioms such as symlinks and mount points are
-avoided, this scenario should work.
-
- If you must use absolute file names, you will have to force Libtool
-to convert file names for the toolchain in this case, by doing the
-following before you run configure:
-
- export lt_cv_to_tool_file_cmd=func_convert_file_cygwin_to_w32
-
- In the _lying_ Cygwin to MinGW cross compile case, you lie to the
-build system:
-
- export PATH="/c/MinGW/bin:${PATH}"
- configure --build=i686-pc-mingw32 \
- --host=i686-pc-mingw32 \
- --disable-dependency-tracking
-
-and claim that the build platform is MinGW, even though you are actually
-running under _Cygwin_ and not MinGW. In this case, libtool does _not_
-know that you are performing a cross compile, and thinks instead that
-you are performing a native MinGW build. However, as described in
-(*note Native MinGW File Name Conversion::), that scenario triggers an
-"MSYS to Windows" file name conversion. This, of course, is the wrong
-conversion since we are actually running under Cygwin. Also, the
-toolchain is expecting Windows file names (not Cygwin) but unless told
-so Libtool will feed Cygwin file names to the toolchain in this case.
-To force the correct file name conversions in this situation, you
-should do the following _before_ running configure:
-
- export lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
- export lt_cv_to_tool_file_cmd=func_convert_file_cygwin_to_w32
-
- Note that this relies on internal implementation details of libtool,
-and is subject to change. Also, `--disable-dependency-tracking' is
-required, because otherwise the MinGW GCC will generate dependency
-files that contain Windows file names. This, in turn, will confuse the
-Cygwin `make' program, which does not accept Windows file names:
-
- Makefile:1: *** target pattern contains no `%'. Stop.
-
- There have also always been a number of other details required for
-the _lying_ case to operate correctly, such as the use of so-called
-"identity mounts":
-
- # CYGWIN-ROOT/etc/fstab
- D:/foo /foo some_fs binary 0 0
- D:/bar /bar some_fs binary 0 0
- E:/grill /grill some_fs binary 0 0
-
- In this way, top-level directories of each drive are available using
-identical names within Cygwin.
-
- Note that you also need to ensure that the standard Unix directories
-(like `/bin', `/lib', `/usr', `/etc') appear in the root of a drive.
-This means that you must install Cygwin itself into the `C:/' root
-directory (or `D:/', or `E:/', etc)--instead of the recommended
-installation into `C:/cygwin/'. In addition, all file names used in
-the build system must be relative, symlinks should not be used within
-the source or build directory trees, and all `-M*' options to `gcc'
-except `-MMD' must be avoided.
-
- This is quite a fragile setup, but it has been in historical use,
-and so is documented here.
-
-
-File: libtool.info, Node: Windows DLLs, Prev: File name conversion, Up: Platform quirks
-
-15.3.8 Windows DLLs
--------------------
-
-This topic describes a couple of ways to portably create Windows Dynamic
-Link Libraries (DLLs). Libtool knows how to create DLLs using GNU tools
-and using Microsoft tools.
-
- A typical library has a "hidden" implementation with an interface
-described in a header file. On just about every system, the interface
-could be something like this:
-
- Example `foo.h':
-
- #ifndef FOO_H
- #define FOO_H
-
- int one (void);
- int two (void);
- extern int three;
-
- #endif /* FOO_H */
-
-And the implementation could be something like this:
-
- Example `foo.c':
-
- #include "foo.h"
-
- int one (void)
- {
- return 1;
- }
-
- int two (void)
- {
- return three - one ();
- }
-
- int three = 3;
-
- When using contemporary GNU tools to create the Windows DLL, the
-above code will work there too, thanks to its auto-import/auto-export
-features. But that is not the case when using older GNU tools or
-perhaps more interestingly when using proprietary tools. In those
-cases the code will need additional decorations on the interface
-symbols with `__declspec(dllimport)' and `__declspec(dllexport)'
-depending on whether the library is built or it's consumed and how it's
-built and consumed. However, it should be noted that it would have
-worked also with Microsoft tools, if only the variable `three' hadn't
-been there, due to the fact the Microsoft tools will automatically
-import functions (but sadly not variables) and Libtool will
-automatically export non-static symbols as described next.
-
- With Microsoft tools, Libtool digs through the object files that
-make up the library, looking for non-static symbols to automatically
-export. I.e., Libtool with Microsoft tools tries to mimic the
-auto-export feature of contemporary GNU tools. It should be noted that
-the GNU auto-export feature is turned off when an explicit
-`__declspec(dllexport)' is seen. The GNU tools do this to not make
-more symbols visible for projects that have already taken the trouble
-to decorate symbols. There is no similar way to limit which symbols
-are visible in the code when Libtool is using Microsoft tools. In
-order to limit symbol visibility in that case you need to use one of
-the options `-export-symbols' or `-export-symbols-regex'.
-
- No matching help with auto-import is provided by Libtool, which is
-why variables must be decorated to import them from a DLL for
-everything but contemporary GNU tools. As stated above, functions are
-automatically imported by both contemporary GNU tools and Microsoft
-tools, but for other proprietary tools the auto-import status of
-functions is unknown.
-
- When the objects that form the library are built, there are generally
-two copies built for each object. One copy is used when linking the DLL
-and one copy is used for the static library. On Windows systems, a pair
-of defines are commonly used to discriminate how the interface symbols
-should be decorated. The first define is `-DDLL_EXPORT' which is
-automatically provided by Libtool when `libtool' builds the copy of the
-object that is destined for the DLL. The second define is
-`-DLIBFOO_BUILD' (or similar) which is often added by the package
-providing the library and is used when building the library, but not
-when consuming the library.
-
- However, the matching double compile is not performed when consuming
-libraries. It is therefore not possible to reliably distinguish if the
-consumer is importing from a DLL or if it is going to use a static
-library.
-
- With contemporary GNU tools, auto-import often saves the day, but see
-the GNU ld documentation and its `--enable-auto-import' option for some
-corner cases when it does not (*note `--enable-auto-import':
-(ld)Options.).
-
- With Microsoft tools you typically get away with always compiling the
-code such that variables are expected to be imported from a DLL and
-functions are expected to be found in a static library. The tools will
-then automatically import the function from a DLL if that is where they
-are found. If the variables are not imported from a DLL as expected,
-but are found in a static library that is otherwise pulled in by some
-function, the linker will issue a warning (LNK4217) that a locally
-defined symbol is imported, but it still works. In other words, this
-scheme will not work to only consume variables from a library. There is
-also a price connected to this liberal use of imports in that an extra
-indirection is introduced when you are consuming the static version of
-the library. That extra indirection is unavoidable when the DLL is
-consumed, but it is not needed when consuming the static library.
-
- For older GNU tools and other proprietary tools there is no generic
-way to make it possible to consume either of the DLL or the static
-library without user intervention, the tools need to be told what is
-intended. One common assumption is that if a DLL is being built
-(`DLL_EXPORT' is defined) then that DLL is going to consume any
-dependent libraries as DLLs. If that assumption is made everywhere, it
-is possible to select how an end-user application is consuming
-libraries by adding a single flag `-DDLL_EXPORT' when a DLL build is
-required. This is of course an all or nothing deal, either everything
-as DLLs or everything as static libraries.
-
- To sum up the above, the header file of the foo library needs to be
-changed into something like this:
-
- Modified `foo.h':
-
- #ifndef FOO_H
- #define FOO_H
-
- #if defined _WIN32 && !defined __GNUC__
- # ifdef LIBFOO_BUILD
- # ifdef DLL_EXPORT
- # define LIBFOO_SCOPE __declspec (dllexport)
- # define LIBFOO_SCOPE_VAR extern __declspec (dllexport)
- # endif
- # elif defined _MSC_VER
- # define LIBFOO_SCOPE
- # define LIBFOO_SCOPE_VAR extern __declspec (dllimport)
- # elif defined DLL_EXPORT
- # define LIBFOO_SCOPE __declspec (dllimport)
- # define LIBFOO_SCOPE_VAR extern __declspec (dllimport)
- # endif
- #endif
- #ifndef LIBFOO_SCOPE
- # define LIBFOO_SCOPE
- # define LIBFOO_SCOPE_VAR extern
- #endif
-
- LIBFOO_SCOPE int one (void);
- LIBFOO_SCOPE int two (void);
- LIBFOO_SCOPE_VAR int three;
-
- #endif /* FOO_H */
-
- When the targets are limited to contemporary GNU tools and Microsoft
-tools, the above can be simplified to the following:
-
- Simplified `foo.h':
-
- #ifndef FOO_H
- #define FOO_H
-
- #if defined _WIN32 && !defined __GNUC__ && !defined LIBFOO_BUILD
- # define LIBFOO_SCOPE_VAR extern __declspec (dllimport)
- #else
- # define LIBFOO_SCOPE_VAR extern
- #endif
-
- int one (void);
- int two (void);
- LIBFOO_SCOPE_VAR int three;
-
- #endif /* FOO_H */
-
- This last simplified version can of course only work when Libtool is
-used to build the DLL, as no symbols would be exported otherwise (i.e.,
-when using Microsoft tools).
-
- It should be noted that there are various projects that attempt to
-relax these requirements by various low level tricks, but they are not
-discussed here. Examples are FlexDLL
-(http://alain.frisch.fr/flexdll.html) and edll
-(http://edll.sourceforge.net/).
-
-
-File: libtool.info, Node: libtool script contents, Next: Cheap tricks, Prev: Platform quirks, Up: Maintaining
-
-15.4 `libtool' script contents
-==============================
-
-Since version 1.4, the `libtool' script is generated by `configure'
-(*note Configuring::). In earlier versions, `configure' achieved this
-by calling a helper script called `ltconfig'. From libtool version 0.7
-to 1.0, this script simply set shell variables, then sourced the
-libtool backend, `ltmain.sh'. `ltconfig' from libtool version 1.1
-through 1.3 inlined the contents of `ltmain.sh' into the generated
-`libtool', which improved performance on many systems. The tests that
-`ltconfig' used to perform are now kept in `libtool.m4' where they can
-be written using Autoconf. This has the runtime performance benefits
-of inlined `ltmain.sh', _and_ improves the build time a little while
-considerably easing the amount of raw shell code that used to need
-maintaining.
-
- The convention used for naming variables that hold shell commands for
-delayed evaluation, is to use the suffix `_cmd' where a single line of
-valid shell script is needed, and the suffix `_cmds' where multiple
-lines of shell script *may* be delayed for later evaluation. By
-convention, `_cmds' variables delimit the evaluation units with the `~'
-character where necessary.
-
- Here is a listing of each of the configuration variables, and how
-they are used within `ltmain.sh' (*note Configuring::):
-
- -- Variable: AR
- The name of the system library archiver.
-
- -- Variable: CC
- The name of the compiler used to configure libtool. This will
- always contain the compiler for the current language (*note
- Tags::).
-
- -- Variable: ECHO
- An `echo' program that does not interpret backslashes as an escape
- character. It may be given only one argument, so due quoting is
- necessary.
-
- -- Variable: LD
- The name of the linker that libtool should use internally for
- reloadable linking and possibly shared libraries.
-
- -- Variable: LTCC
- -- Variable: LTCFLAGS
- The name of the C compiler and C compiler flags used to configure
- libtool.
-
- -- Variable: NM
- The name of a BSD- or MS-compatible program that produces listings
- of global symbols. For BSD `nm', the symbols should be in one the
- following formats:
-
- ADDRESS C GLOBAL-VARIABLE-NAME
- ADDRESS D GLOBAL-VARIABLE-NAME
- ADDRESS T GLOBAL-FUNCTION-NAME
-
- For MS `dumpbin', the symbols should be in one of the following
- formats:
-
- COUNTER SIZE UNDEF notype External | GLOBAL-VAR
- COUNTER ADDRESS SECTION notype External | GLOBAL-VAR
- COUNTER ADDRESS SECTION notype () External | GLOBAL-FUNC
-
- The SIZE of the global variables are not zero and the SECTION of
- the global functions are not "UNDEF". Symbols in "pick any"
- sections ("pick any" appears in the section header) are not global
- either.
-
- -- Variable: RANLIB
- Set to the name of the `ranlib' program, if any.
-
- -- Variable: allow_undefined_flag
- The flag that is used by `archive_cmds' in order to declare that
- there will be unresolved symbols in the resulting shared library.
- Empty, if no such flag is required. Set to `unsupported' if there
- is no way to generate a shared library with references to symbols
- that aren't defined in that library.
-
- -- Variable: always_export_symbols
- Whether libtool should automatically generate a list of exported
- symbols using `export_symbols_cmds' before linking an archive.
- Set to `yes' or `no'. Default is `no'.
-
- -- Variable: archive_cmds
- -- Variable: archive_expsym_cmds
- -- Variable: old_archive_cmds
- Commands used to create shared libraries, shared libraries with
- `-export-symbols' and static libraries, respectively.
-
- -- Variable: archiver_list_spec
- Specify filename containing input files for `AR'.
-
- -- Variable: old_archive_from_new_cmds
- If the shared library depends on a static library,
- `old_archive_from_new_cmds' contains the commands used to create
- that static library. If this variable is not empty,
- `old_archive_cmds' is not used.
-
- -- Variable: old_archive_from_expsyms_cmds
- If a static library must be created from the export symbol list in
- order to correctly link with a shared library,
- `old_archive_from_expsyms_cmds' contains the commands needed to
- create that static library. When these commands are executed, the
- variable `soname' contains the name of the shared library in
- question, and the `$objdir/$newlib' contains the path of the
- static library these commands should build. After executing these
- commands, libtool will proceed to link against `$objdir/$newlib'
- instead of `soname'.
-
- -- Variable: lock_old_archive_extraction
- Set to `yes' if the extraction of a static library requires locking
- the library file. This is required on Darwin.
-
- -- Variable: build
- -- Variable: build_alias
- -- Variable: build_os
- Set to the specified and canonical names of the system that
- libtool was built on.
-
- -- Variable: build_libtool_libs
- Whether libtool should build shared libraries on this system. Set
- to `yes' or `no'.
-
- -- Variable: build_old_libs
- Whether libtool should build static libraries on this system. Set
- to `yes' or `no'.
-
- -- Variable: compiler_c_o
- Whether the compiler supports the `-c' and `-o' options
- simultaneously. Set to `yes' or `no'.
-
- -- Variable: compiler_needs_object
- Whether the compiler has to see an object listed on the command
- line in order to successfully invoke the linker. If `no', then a
- set of convenience archives or a set of object file names can be
- passed via linker-specific options or linker scripts.
-
- -- Variable: dlopen_support
- Whether `dlopen' is supported on the platform. Set to `yes' or
- `no'.
-
- -- Variable: dlopen_self
- Whether it is possible to `dlopen' the executable itself. Set to
- `yes' or `no'.
-
- -- Variable: dlopen_self_static
- Whether it is possible to `dlopen' the executable itself, when it
- is linked statically (`-all-static'). Set to `yes' or `no'.
-
- -- Variable: exclude_expsyms
- List of symbols that should not be listed in the preloaded symbols.
-
- -- Variable: export_dynamic_flag_spec
- Compiler link flag that allows a dlopened shared library to
- reference symbols that are defined in the program.
-
- -- Variable: export_symbols_cmds
- Commands to extract exported symbols from `libobjs' to the file
- `export_symbols'.
-
- -- Variable: extract_expsyms_cmds
- Commands to extract the exported symbols list from a shared
- library. These commands are executed if there is no file
- `$objdir/$soname-def', and should write the names of the exported
- symbols to that file, for the use of
- `old_archive_from_expsyms_cmds'.
-
- -- Variable: fast_install
- Determines whether libtool will privilege the installer or the
- developer. The assumption is that installers will seldom run
- programs in the build tree, and the developer will seldom install.
- This is only meaningful on platforms where
- `shlibpath_overrides_runpath' is not `yes', so `fast_install' will
- be set to `needless' in this case. If `fast_install' set to
- `yes', libtool will create programs that search for installed
- libraries, and, if a program is run in the build tree, a new copy
- will be linked on-demand to use the yet-to-be-installed libraries.
- If set to `no', libtool will create programs that use the
- yet-to-be-installed libraries, and will link a new copy of the
- program at install time. The default value is `yes' or
- `needless', depending on platform and configuration flags, and it
- can be turned from `yes' to `no' with the configure flag
- `--disable-fast-install'.
-
- On some systems, the linker always hardcodes paths to dependent
- libraries into the output. In this case, `fast_install' is never
- set to `yes', and relinking at install time is triggered. This
- also means that `DESTDIR' installation does not work as expected.
-
- -- Variable: file_magic_glob
- How to find potential files when `deplibs_check_method' is
- `file_magic'. `file_magic_glob' is a `sed' expression, and the
- `sed' instance is fed potential file names that are transformed by
- the `file_magic_glob' expression. Useful when the shell does not
- support the shell option `nocaseglob', making `want_nocaseglob'
- inappropriate. Normally disabled (i.e. `file_magic_glob' is
- empty).
-
- -- Variable: finish_cmds
- Commands to tell the dynamic linker how to find shared libraries
- in a specific directory.
-
- -- Variable: finish_eval
- Same as `finish_cmds', except the commands are not displayed.
-
- -- Variable: global_symbol_pipe
- A pipeline that takes the output of `NM', and produces a listing of
- raw symbols followed by their C names. For example:
-
- $ eval "$NM progname | $global_symbol_pipe"
- D SYMBOL1 C-SYMBOL1
- T SYMBOL2 C-SYMBOL2
- C SYMBOL3 C-SYMBOL3
- ...
- $
-
- The first column contains the symbol type (used to tell data from
- code) but its meaning is system dependent.
-
- -- Variable: global_symbol_to_cdecl
- A pipeline that translates the output of `global_symbol_pipe' into
- proper C declarations. Since some platforms, such as HP/UX, have
- linkers that differentiate code from data, data symbols are
- declared as data, and code symbols are declared as functions.
-
- -- Variable: hardcode_action
- Either `immediate' or `relink', depending on whether shared
- library paths can be hardcoded into executables before they are
- installed, or if they need to be relinked.
-
- -- Variable: hardcode_direct
- Set to `yes' or `no', depending on whether the linker hardcodes
- directories if a library is directly specified on the command line
- (such as `DIR/libNAME.a') when `hardcode_libdir_flag_spec' is
- specified.
-
- -- Variable: hardcode_direct_absolute
- Some architectures hardcode "absolute" library directories that
- can not be overridden by `shlibpath_var' when `hardcode_direct' is
- `yes'. In that case set `hardcode_direct_absolute' to `yes', or
- otherwise `no'.
-
- -- Variable: hardcode_into_libs
- Whether the platform supports hardcoding of run-paths into
- libraries. If enabled, linking of programs will be much simpler
- but libraries will need to be relinked during installation. Set
- to `yes' or `no'.
-
- -- Variable: hardcode_libdir_flag_spec
- Flag to hardcode a `libdir' variable into a binary, so that the
- dynamic linker searches `libdir' for shared libraries at runtime.
- If it is empty, libtool will try to use some other hardcoding
- mechanism.
-
- -- Variable: hardcode_libdir_separator
- If the compiler only accepts a single `hardcode_libdir_flag', then
- this variable contains the string that should separate multiple
- arguments to that flag.
-
- -- Variable: hardcode_minus_L
- Set to `yes' or `no', depending on whether the linker hardcodes
- directories specified by `-L' flags into the resulting executable
- when `hardcode_libdir_flag_spec' is specified.
-
- -- Variable: hardcode_shlibpath_var
- Set to `yes' or `no', depending on whether the linker hardcodes
- directories by writing the contents of `$shlibpath_var' into the
- resulting executable when `hardcode_libdir_flag_spec' is
- specified. Set to `unsupported' if directories specified by
- `$shlibpath_var' are searched at run time, but not at link time.
-
- -- Variable: host
- -- Variable: host_alias
- -- Variable: host_os
- Set to the specified and canonical names of the system that
- libtool was configured for.
-
- -- Variable: include_expsyms
- List of symbols that must always be exported when using
- `export_symbols'.
-
- -- Variable: inherit_rpath
- Whether the linker adds runtime paths of dependency libraries to
- the runtime path list, requiring libtool to relink the output when
- installing. Set to `yes' or `no'. Default is `no'.
-
- -- Variable: install_override_mode
- Permission mode override for installation of shared libraries. If
- the runtime linker fails to load libraries with wrong permissions,
- then it may fail to execute programs that are needed during
- installation, because these need the library that has just been
- installed. In this case, it is necessary to pass the mode to
- `install' with `-m INSTALL_OVERRIDE_MODE'.
-
- -- Variable: libext
- The standard old archive suffix (normally `a').
-
- -- Variable: libname_spec
- The format of a library name prefix. On all Unix systems, static
- libraries are called `libNAME.a', but on some systems (such as
- OS/2 or MS-DOS), the library is just called `NAME.a'.
-
- -- Variable: library_names_spec
- A list of shared library names. The first is the name of the file,
- the rest are symbolic links to the file. The name in the list is
- the file name that the linker finds when given `-lNAME'.
-
- -- Variable: link_all_deplibs
- Whether libtool must link a program against all its dependency
- libraries. Set to `yes' or `no'. Default is `unknown', which is
- a synonym for `yes'.
-
- -- Variable: link_static_flag
- Linker flag (passed through the C compiler) used to prevent dynamic
- linking.
-
- -- Variable: macro_version
- -- Variable: macro_revision
- The release and revision from which the libtool.m4 macros were
- taken. This is used to ensure that macros and `ltmain.sh'
- correspond to the same Libtool version.
-
- -- Variable: max_cmd_len
- The approximate longest command line that can be passed to `$SHELL'
- without being truncated, as computed by `LT_CMD_MAX_LEN'.
-
- -- Variable: need_lib_prefix
- Whether we can `dlopen' modules without a `lib' prefix. Set to
- `yes' or `no'. By default, it is `unknown', which means the same
- as `yes', but documents that we are not really sure about it.
- `no' means that it is possible to `dlopen' a module without the
- `lib' prefix.
-
- -- Variable: need_version
- Whether versioning is required for libraries, i.e. whether the
- dynamic linker requires a version suffix for all libraries. Set
- to `yes' or `no'. By default, it is `unknown', which means the
- same as `yes', but documents that we are not really sure about it.
-
- -- Variable: need_locks
- Whether files must be locked to prevent conflicts when compiling
- simultaneously. Set to `yes' or `no'.
-
- -- Variable: nm_file_list_spec
- Specify filename containing input files for `NM'.
-
- -- Variable: no_builtin_flag
- Compiler flag to disable builtin functions that conflict with
- declaring external global symbols as `char'.
-
- -- Variable: no_undefined_flag
- The flag that is used by `archive_cmds' in order to declare that
- there will be no unresolved symbols in the resulting shared
- library. Empty, if no such flag is required.
-
- -- Variable: objdir
- The name of the directory that contains temporary libtool files.
-
- -- Variable: objext
- The standard object file suffix (normally `o').
-
- -- Variable: pic_flag
- Any additional compiler flags for building library object files.
-
- -- Variable: postinstall_cmds
- -- Variable: old_postinstall_cmds
- Commands run after installing a shared or static library,
- respectively.
-
- -- Variable: postuninstall_cmds
- -- Variable: old_postuninstall_cmds
- Commands run after uninstalling a shared or static library,
- respectively.
-
- -- Variable: postlink_cmds
- Commands necessary for finishing linking programs. `postlink_cmds'
- are executed immediately after the program is linked. Any
- occurrence of the string `@OUTPUT@' in `postlink_cmds' is replaced
- by the name of the created executable (i.e. not the wrapper, if a
- wrapper is generated) prior to execution. Similarly,
- `@TOOL_OUTPUT@' is replaced by the toolchain format of `@OUTPUT@'.
- Normally disabled (i.e. `postlink_cmds' empty).
-
- -- Variable: reload_cmds
- -- Variable: reload_flag
- Commands to create a reloadable object. Set `reload_cmds' to
- `false' on systems that cannot create reloadable objects.
-
- -- Variable: runpath_var
- The environment variable that tells the linker which directories to
- hardcode in the resulting executable.
-
- -- Variable: shlibpath_overrides_runpath
- Indicates whether it is possible to override the hard-coded library
- search path of a program with an environment variable. If this is
- set to no, libtool may have to create two copies of a program in
- the build tree, one to be installed and one to be run in the build
- tree only. When each of these copies is created depends on the
- value of `fast_install'. The default value is `unknown', which is
- equivalent to `no'.
-
- -- Variable: shlibpath_var
- The environment variable that tells the dynamic linker where to
- find shared libraries.
-
- -- Variable: soname_spec
- The name coded into shared libraries, if different from the real
- name of the file.
-
- -- Variable: striplib
- -- Variable: old_striplib
- Command to strip a shared (`striplib') or static (`old_striplib')
- library, respectively. If these variables are empty, the strip
- flag in the install mode will be ignored for libraries (*note
- Install mode::).
-
- -- Variable: sys_lib_dlsearch_path_spec
- Expression to get the run-time system library search path.
- Directories that appear in this list are never hard-coded into
- executables.
-
- -- Variable: sys_lib_search_path_spec
- Expression to get the compile-time system library search path.
- This variable is used by libtool when it has to test whether a
- certain library is shared or static. The directories listed in
- `shlibpath_var' are automatically appended to this list, every time
- libtool runs (i.e., not at configuration time), because some
- linkers use this variable to extend the library search path.
- Linker switches such as `-L' also augment the search path.
-
- -- Variable: thread_safe_flag_spec
- Linker flag (passed through the C compiler) used to generate
- thread-safe libraries.
-
- -- Variable: to_host_file_cmd
- If the toolchain is not native to the build platform (e.g. if you
- are using MSYS to drive the scripting, but are using the MinGW
- native Windows compiler) this variable describes how to convert
- file names from the format used by the build platform to the
- format used by host platform. Normally set to
- `func_convert_file_noop', libtool will autodetect most cases in
- which other values should be used. On rare occasions, it may be
- necessary to override the autodetected value (*note Cygwin to
- MinGW Cross::).
-
- -- Variable: to_tool_file_cmd
- If the toolchain is not native to the build platform (e.g. if you
- are using some Unix to drive the scripting together with a Windows
- toolchain running in Wine) this variable describes how to convert
- file names from the format used by the build platform to the
- format used by the toolchain. Normally set to
- `func_convert_file_noop'.
-
- -- Variable: version_type
- The library version numbering type. One of `libtool',
- `freebsd-aout', `freebsd-elf', `irix', `linux', `osf', `sunos',
- `windows', or `none'.
-
- -- Variable: want_nocaseglob
- Find potential files using the shell option `nocaseglob', when
- `deplibs_check_method' is `file_magic'. Normally set to `no'. Set
- to `yes' to enable the `nocaseglob' shell option when looking for
- potential file names in a case-insensitive manner.
-
- -- Variable: whole_archive_flag_spec
- Compiler flag to generate shared objects from convenience archives.
-
- -- Variable: wl
- The C compiler flag that allows libtool to pass a flag directly to
- the linker. Used as: `${wl}SOME-FLAG'.
-
- Variables ending in `_cmds' or `_eval' contain a `~'-separated list
-of commands that are `eval'ed one after another. If any of the
-commands return a nonzero exit status, libtool generally exits with an
-error message.
-
- Variables ending in `_spec' are `eval'ed before being used by
-libtool.
-
-
-File: libtool.info, Node: Cheap tricks, Prev: libtool script contents, Up: Maintaining
-
-15.5 Cheap tricks
-=================
-
-Here are a few tricks that you can use in order to make maintainership
-easier:
-
- * When people report bugs, ask them to use the `--config',
- `--debug', or `--features' flags, if you think they will help you.
- These flags are there to help you get information directly, rather
- than having to trust second-hand observation.
-
- * Rather than reconfiguring libtool every time I make a change to
- `ltmain.in', I keep a permanent `libtool' script in my `PATH',
- which sources `ltmain.in' directly.
-
- The following steps describe how to create such a script, where
- `/home/src/libtool' is the directory containing the libtool source
- tree, `/home/src/libtool/libtool' is a libtool script that has been
- configured for your platform, and `~/bin' is a directory in your
- `PATH':
-
- trick$ cd ~/bin
- trick$ sed 's%^\(macro_version=\).*$%\1@VERSION@%;
- s%^\(macro_revision=\).*$%\1@package_revision@%;
- /^# ltmain\.sh/q' /home/src/libtool/libtool > libtool
- trick$ echo '. /home/src/libtool/ltmain.in' >> libtool
- trick$ chmod +x libtool
- trick$ libtool --version
- ltmain.sh (GNU @PACKAGE@@TIMESTAMP@) @VERSION@
-
- Copyright (C) 2011 Free Software Foundation, Inc.
- This is free software; see the source for copying conditions. There is NO
- warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- trick$
-
- The output of the final `libtool --version' command shows that the
-`ltmain.in' script is being used directly. Now, modify `~/bin/libtool'
-or `/home/src/libtool/ltmain.in' directly in order to test new changes
-without having to rerun `configure'.
-