summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
Diffstat (limited to 'doc')
-rw-r--r--doc/._PLATFORMSbin0 -> 239 bytes
-rw-r--r--doc/._fdl.texibin0 -> 239 bytes
-rw-r--r--doc/._gendocs_templatebin0 -> 239 bytes
-rw-r--r--doc/._libtool.1bin0 -> 239 bytes
-rw-r--r--doc/._libtool.infobin0 -> 239 bytes
-rw-r--r--doc/._libtool.info-1bin0 -> 239 bytes
-rw-r--r--doc/._libtool.info-2bin0 -> 239 bytes
-rw-r--r--doc/._libtool.texibin0 -> 239 bytes
-rw-r--r--doc/._libtoolize.1bin0 -> 239 bytes
-rw-r--r--doc/._notes.texibin0 -> 239 bytes
-rw-r--r--doc/._notes.txtbin0 -> 239 bytes
-rw-r--r--doc/._stamp-vtibin0 -> 239 bytes
-rw-r--r--doc/._version.texibin0 -> 239 bytes
-rw-r--r--doc/PLATFORMS162
-rw-r--r--doc/fdl.texi505
-rw-r--r--doc/gendocs_template91
-rw-r--r--doc/libtool.1126
-rw-r--r--doc/libtool.info138
-rw-r--r--doc/libtool.info-17197
-rw-r--r--doc/libtool.info-2bin0 -> 51735 bytes
-rw-r--r--doc/libtool.texi7247
-rw-r--r--doc/libtoolize.1130
-rw-r--r--doc/notes.texi79
-rw-r--r--doc/notes.txt61
-rw-r--r--doc/stamp-vti4
-rw-r--r--doc/version.texi4
26 files changed, 15744 insertions, 0 deletions
diff --git a/doc/._PLATFORMS b/doc/._PLATFORMS
new file mode 100644
index 0000000..44b520c
--- /dev/null
+++ b/doc/._PLATFORMS
Binary files differ
diff --git a/doc/._fdl.texi b/doc/._fdl.texi
new file mode 100644
index 0000000..42b934b
--- /dev/null
+++ b/doc/._fdl.texi
Binary files differ
diff --git a/doc/._gendocs_template b/doc/._gendocs_template
new file mode 100644
index 0000000..c1c262b
--- /dev/null
+++ b/doc/._gendocs_template
Binary files differ
diff --git a/doc/._libtool.1 b/doc/._libtool.1
new file mode 100644
index 0000000..e5b04a5
--- /dev/null
+++ b/doc/._libtool.1
Binary files differ
diff --git a/doc/._libtool.info b/doc/._libtool.info
new file mode 100644
index 0000000..6f3fd89
--- /dev/null
+++ b/doc/._libtool.info
Binary files differ
diff --git a/doc/._libtool.info-1 b/doc/._libtool.info-1
new file mode 100644
index 0000000..24a8dbd
--- /dev/null
+++ b/doc/._libtool.info-1
Binary files differ
diff --git a/doc/._libtool.info-2 b/doc/._libtool.info-2
new file mode 100644
index 0000000..4f4bb21
--- /dev/null
+++ b/doc/._libtool.info-2
Binary files differ
diff --git a/doc/._libtool.texi b/doc/._libtool.texi
new file mode 100644
index 0000000..d522752
--- /dev/null
+++ b/doc/._libtool.texi
Binary files differ
diff --git a/doc/._libtoolize.1 b/doc/._libtoolize.1
new file mode 100644
index 0000000..ccf74e0
--- /dev/null
+++ b/doc/._libtoolize.1
Binary files differ
diff --git a/doc/._notes.texi b/doc/._notes.texi
new file mode 100644
index 0000000..f93086d
--- /dev/null
+++ b/doc/._notes.texi
Binary files differ
diff --git a/doc/._notes.txt b/doc/._notes.txt
new file mode 100644
index 0000000..2a78647
--- /dev/null
+++ b/doc/._notes.txt
Binary files differ
diff --git a/doc/._stamp-vti b/doc/._stamp-vti
new file mode 100644
index 0000000..5f3602b
--- /dev/null
+++ b/doc/._stamp-vti
Binary files differ
diff --git a/doc/._version.texi b/doc/._version.texi
new file mode 100644
index 0000000..0db77f9
--- /dev/null
+++ b/doc/._version.texi
Binary files differ
diff --git a/doc/PLATFORMS b/doc/PLATFORMS
new file mode 100644
index 0000000..eb8ee73
--- /dev/null
+++ b/doc/PLATFORMS
@@ -0,0 +1,162 @@
+-------------------------------------------------------
+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
diff --git a/doc/fdl.texi b/doc/fdl.texi
new file mode 100644
index 0000000..9c3bbe5
--- /dev/null
+++ b/doc/fdl.texi
@@ -0,0 +1,505 @@
+@c The GNU Free Documentation License.
+@center Version 1.3, 3 November 2008
+
+@c This file is intended to be included within another document,
+@c hence no sectioning command or @node.
+
+@display
+Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+@uref{http://fsf.org/}
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+@end display
+
+@enumerate 0
+@item
+PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document @dfn{free} in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of ``copyleft'', which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+
+@item
+APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The ``Document'', below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as ``you''. You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A ``Modified Version'' of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A ``Secondary Section'' is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject. (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The ``Invariant Sections'' are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+
+The ``Cover Texts'' are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A ``Transparent'' copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not ``Transparent'' is called ``Opaque''.
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, La@TeX{} input
+format, SGML or XML using a publicly available
+DTD, and standard-conforming simple HTML,
+PostScript or PDF designed for human modification. Examples
+of transparent image formats include PNG, XCF and
+JPG@. Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, SGML or
+XML for which the DTD and/or processing tools are
+not generally available, and the machine-generated HTML,
+PostScript or PDF produced by some word processors for
+output purposes only.
+
+The ``Title Page'' means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, ``Title Page'' means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+The ``publisher'' means any person or entity that distributes copies
+of the Document to the public.
+
+A section ``Entitled XYZ'' means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as ``Acknowledgements'',
+``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title''
+of such a section when you modify the Document means that it remains a
+section ``Entitled XYZ'' according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+@item
+VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+@item
+COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+@item
+MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+
+@enumerate A
+@item
+Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document). You may use the same title as a previous version
+if the original publisher of that version gives permission.
+
+@item
+List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+
+@item
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+
+@item
+Preserve all the copyright notices of the Document.
+
+@item
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+
+@item
+Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+
+@item
+Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document's license notice.
+
+@item
+Include an unaltered copy of this License.
+
+@item
+Preserve the section Entitled ``History'', Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page. If
+there is no section Entitled ``History'' in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+
+@item
+Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on. These may be placed in the ``History'' section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+
+@item
+For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+
+@item
+Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles. Section numbers
+or the equivalent are not considered part of the section titles.
+
+@item
+Delete any section Entitled ``Endorsements''. Such a section
+may not be included in the Modified Version.
+
+@item
+Do not retitle any existing section to be Entitled ``Endorsements'' or
+to conflict in title with any Invariant Section.
+
+@item
+Preserve any Warranty Disclaimers.
+@end enumerate
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled ``Endorsements'', provided it contains
+nothing but endorsements of your Modified Version by various
+parties---for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+@item
+COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled ``History''
+in the various original documents, forming one section Entitled
+``History''; likewise combine any sections Entitled ``Acknowledgements'',
+and any sections Entitled ``Dedications''. You must delete all
+sections Entitled ``Endorsements.''
+
+@item
+COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+@item
+AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an ``aggregate'' if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+@item
+TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled ``Acknowledgements'',
+``Dedications'', or ``History'', the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+@item
+TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense, or distribute it is void, and
+will automatically terminate your rights under this License.
+
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, receipt of a copy of some or all of the same material does
+not give you any rights to use it.
+
+@item
+FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns. See
+@uref{http://www.gnu.org/copyleft/}.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License ``or any later version'' applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation. If the Document
+specifies that a proxy can decide which future versions of this
+License can be used, that proxy's public statement of acceptance of a
+version permanently authorizes you to choose that version for the
+Document.
+
+@item
+RELICENSING
+
+``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any
+World Wide Web server that publishes copyrightable works and also
+provides prominent facilities for anybody to edit those works. A
+public wiki that anybody can edit is an example of such a server. A
+``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the
+site means any set of copyrightable works thus published on the MMC
+site.
+
+``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0
+license published by Creative Commons Corporation, a not-for-profit
+corporation with a principal place of business in San Francisco,
+California, as well as future copyleft versions of that license
+published by that same organization.
+
+``Incorporate'' means to publish or republish a Document, in whole or
+in part, as part of another Document.
+
+An MMC is ``eligible for relicensing'' if it is licensed under this
+License, and if all works that were first published under this License
+somewhere other than this MMC, and subsequently incorporated in whole
+or in part into the MMC, (1) had no cover texts or invariant sections,
+and (2) were thus incorporated prior to November 1, 2008.
+
+The operator of an MMC Site may republish an MMC contained in the site
+under CC-BY-SA on the same site at any time before August 1, 2009,
+provided the MMC is eligible for relicensing.
+
+@end enumerate
+
+@page
+@heading ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+@smallexample
+@group
+ Copyright (C) @var{year} @var{your name}.
+ 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, no Front-Cover Texts, and no Back-Cover
+ Texts. A copy of the license is included in the section entitled ``GNU
+ Free Documentation License''.
+@end group
+@end smallexample
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the ``with@dots{}Texts.''@: line with this:
+
+@smallexample
+@group
+ with the Invariant Sections being @var{list their titles}, with
+ the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
+ being @var{list}.
+@end group
+@end smallexample
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+
+@c Local Variables:
+@c ispell-local-pdict: "ispell-dict"
+@c End:
diff --git a/doc/gendocs_template b/doc/gendocs_template
new file mode 100644
index 0000000..df7faa3
--- /dev/null
+++ b/doc/gendocs_template
@@ -0,0 +1,91 @@
+<!--#include virtual="/server/header.html" -->
+<!-- Parent-Version: 1.77 -->
+<title>%%TITLE%% - GNU Project - Free Software Foundation</title>
+<!--#include virtual="/server/banner.html" -->
+<h2>%%TITLE%%</h2>
+
+<address>Free Software Foundation</address>
+<address>last updated %%DATE%%</address>
+
+<p>This manual (%%PACKAGE%%) is available in the following formats:</p>
+
+<ul>
+<li><a href="%%PACKAGE%%.html">HTML
+ (%%HTML_MONO_SIZE%%K bytes)</a> - entirely on one web page.</li>
+<li><a href="html_node/index.html">HTML</a> - with one web page per
+ node.</li>
+%%IF HTML_SECTION%%
+<li><a href="html_section/index.html">HTML</a> - with one web page per
+ section.</li>
+%%ENDIF HTML_SECTION%%
+%%IF HTML_CHAPTER%%
+<li><a href="html_chapter/index.html">HTML</a> - with one web page per
+ chapter.</li>
+%%ENDIF HTML_CHAPTER%%
+<li><a href="%%PACKAGE%%.html.gz">HTML compressed
+ (%%HTML_MONO_GZ_SIZE%%K gzipped characters)</a> - entirely on
+ one web page.</li>
+<li><a href="%%PACKAGE%%.html_node.tar.gz">HTML compressed
+ (%%HTML_NODE_TGZ_SIZE%%K gzipped tar file)</a> -
+ with one web page per node.</li>
+%%IF HTML_SECTION%%
+<li><a href="%%PACKAGE%%.html_section.tar.gz">HTML compressed
+ (%%HTML_SECTION_TGZ_SIZE%%K gzipped tar file)</a> -
+ with one web page per section.</li>
+%%ENDIF HTML_SECTION%%
+%%IF HTML_CHAPTER%%
+<li><a href="%%PACKAGE%%.html_chapter.tar.gz">HTML compressed
+ (%%HTML_CHAPTER_TGZ_SIZE%%K gzipped tar file)</a> -
+ with one web page per chapter.</li>
+%%ENDIF HTML_CHAPTER%%
+<li><a href="%%PACKAGE%%.info.tar.gz">Info document
+ (%%INFO_TGZ_SIZE%%K bytes gzipped tar file)</a>.</li>
+<li><a href="%%PACKAGE%%.txt">ASCII text
+ (%%ASCII_SIZE%%K bytes)</a>.</li>
+<li><a href="%%PACKAGE%%.txt.gz">ASCII text compressed
+ (%%ASCII_GZ_SIZE%%K bytes gzipped)</a>.</li>
+<li><a href="%%PACKAGE%%.dvi.gz">TeX dvi file
+ (%%DVI_GZ_SIZE%%K bytes gzipped)</a>.</li>
+<li><a href="%%PACKAGE%%.pdf">PDF file
+ (%%PDF_SIZE%%K bytes)</a>.</li>
+<li><a href="%%PACKAGE%%.texi.tar.gz">Texinfo source
+ (%%TEXI_TGZ_SIZE%%K bytes gzipped tar file).</a></li>
+</ul>
+
+<p>You can <a href="http://shop.fsf.org/">buy printed copies of
+some manuals</a> (among other items) from the Free Software Foundation;
+this helps support FSF activities.</p>
+
+<p>(This page generated by the <a href="%%SCRIPTURL%%">%%SCRIPTNAME%%
+script</a>.)</p>
+
+<!-- If needed, change the copyright block at the bottom. In general,
+ all pages on the GNU web server should have the section about
+ verbatim copying. Please do NOT remove this without talking
+ with the webmasters first.
+ Please make sure the copyright date is consistent with the document
+ and that it is like this: "2001, 2002", not this: "2001-2002". -->
+</div><!-- for id="content", starts in the include above -->
+<!--#include virtual="/server/footer.html" -->
+<div id="footer">
+<div class="unprintable">
+
+<p>Please send general FSF &amp; GNU inquiries to
+<a href="mailto:gnu@gnu.org">&lt;gnu@gnu.org&gt;</a>.
+There are also <a href="/contact/">other ways to contact</a>
+the FSF. Broken links and other corrections or suggestions can be sent
+to <a href="mailto:%%EMAIL%%">&lt;%%EMAIL%%&gt;</a>.</p>
+</div>
+
+<p>Copyright &copy; 2015 Free Software Foundation, Inc.</p>
+
+<p>This page is licensed under a <a rel="license"
+href="http://creativecommons.org/licenses/by-nd/3.0/us/">Creative
+Commons Attribution-NoDerivs 3.0 United States License</a>.</p>
+
+<!--#include virtual="/server/bottom-notes.html" -->
+
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/libtool.1 b/doc/libtool.1
new file mode 100644
index 0000000..6c02071
--- /dev/null
+++ b/doc/libtool.1
@@ -0,0 +1,126 @@
+.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.46.4.
+.TH LIBTOOL "1" "January 2015" "libtool 2.4.4.19-fda4" "User Commands"
+.SH NAME
+libtool \- manual page for libtool 2.4.4.19-fda4
+.SH SYNOPSIS
+.B libtool
+[\fI\,OPTION\/\fR]... [\fI\,MODE-ARG\/\fR]...
+.SH DESCRIPTION
+Provide generalized library\-building support services.
+.SH OPTIONS
+.TP
+\fB\-\-config\fR
+show all configuration variables
+.TP
+\fB\-\-debug\fR
+enable verbose shell tracing
+.TP
+\fB\-n\fR, \fB\-\-dry\-run\fR
+display commands without modifying any files
+.TP
+\fB\-\-features\fR
+display basic configuration information and exit
+.TP
+\fB\-\-mode\fR=\fI\,MODE\/\fR
+use operation mode MODE
+.TP
+\fB\-\-no\-warnings\fR
+equivalent to '\-Wnone'
+.TP
+\fB\-\-preserve\-dup\-deps\fR
+don't remove duplicate dependency libraries
+.TP
+\fB\-\-quiet\fR, \fB\-\-silent\fR
+don't print informational messages
+.TP
+\fB\-\-tag\fR=\fI\,TAG\/\fR
+use configuration variables from tag TAG
+.TP
+\fB\-v\fR, \fB\-\-verbose\fR
+print more informational messages than default
+.TP
+\fB\-\-version\fR
+print version information
+.TP
+\fB\-W\fR, \fB\-\-warnings\fR=\fI\,CATEGORY\/\fR
+report the warnings falling in CATEGORY [all]
+.TP
+\fB\-h\fR, \fB\-\-help\fR, \fB\-\-help\-all\fR
+print short, long, or detailed help message
+.SS "Warning categories include:"
+.TP
+\&'all'
+show all warnings
+.TP
+\&'none'
+turn off all the warnings
+.TP
+\&'error'
+warnings are treated as fatal errors
+.PP
+MODE must be one of the following:
+.TP
+clean
+remove files from the build directory
+.TP
+compile
+compile a source file into a libtool object
+.TP
+execute
+automatically set library path, then run a program
+.TP
+finish
+complete the installation of libtool libraries
+.TP
+install
+install libraries or executables
+.TP
+link
+create a library or an executable
+.TP
+uninstall
+remove libraries from an installed directory
+.PP
+MODE\-ARGS vary depending on the MODE. When passed as first option,
+\&'\-\-mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that.
+.PP
+GNU libtool home page: <http://www.gnu.org/s/libtool/>.
+.PP
+When reporting a bug, please describe a test case to reproduce it and
+include the following information:
+.TP
+host\-triplet:
+x86_64\-apple\-darwin14.0.0
+.TP
+shell:
+\fI\,/bin/sh\/\fP
+.TP
+compiler:
+gcc
+.IP
+compiler flags: \fB\-g\fR \fB\-O2\fR
+linker: \fI\,/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld\/\fP (gnu? no)
+version: libtool (GNU libtool) 2.4.4.19\-fda4
+automake: automake (GNU automake) 1.15
+autoconf: autoconf (GNU Autoconf) 2.69
+.SH AUTHOR
+Written by Gordon Matzigkeit, 1996
+.SH "REPORTING BUGS"
+Report bugs to <bug\-libtool@gnu.org>.
+.SH COPYRIGHT
+Copyright \(co 2014 Free Software Foundation, Inc.
+.br
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+.SH "SEE ALSO"
+The full documentation for
+.B libtool
+is maintained as a Texinfo manual. If the
+.B info
+and
+.B libtool
+programs are properly installed at your site, the command
+.IP
+.B info libtool
+.PP
+should give you access to the complete manual.
diff --git a/doc/libtool.info b/doc/libtool.info
new file mode 100644
index 0000000..09e00f6
--- /dev/null
+++ b/doc/libtool.info
@@ -0,0 +1,138 @@
+This is libtool.info, produced by makeinfo version 5.2 from
+libtool.texi.
+
+This manual is for GNU Libtool (version 2.4.5, 16 January 2015).
+
+ Copyright (C) 1996-2015 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".
+INFO-DIR-SECTION Software development
+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
+
+
+Indirect:
+libtool.info-1: 963
+libtool.info-2: 313087
+
+Tag Table:
+(Indirect)
+Node: Top963
+Node: Introduction8156
+Node: Motivation9962
+Node: Issues11282
+Node: Other implementations12760
+Node: Postmortem13303
+Node: Libtool paradigm14923
+Node: Using libtool15868
+Node: Creating object files17971
+Node: Linking libraries21707
+Ref: Linking libraries-Footnote-125520
+Node: Linking executables25661
+Ref: Linking executables-Footnote-130912
+Ref: Linking executables-Footnote-231205
+Node: Wrapper executables31286
+Node: Debugging executables33514
+Node: Installing libraries36328
+Ref: Installing libraries-Footnote-139490
+Node: Installing executables39561
+Node: Static libraries40397
+Node: Invoking libtool43675
+Node: Compile mode49331
+Node: Link mode52292
+Node: Execute mode61815
+Node: Install mode62595
+Node: Finish mode64966
+Node: Uninstall mode65828
+Node: Clean mode66269
+Node: Integrating libtool66728
+Node: Autoconf macros69558
+Node: Makefile rules73401
+Node: Using Automake74504
+Ref: Using Automake-Footnote-176085
+Node: Configuring76485
+Node: LT_INIT77719
+Ref: LT_INIT-Footnote-195086
+Node: Configure notes95339
+Node: Distributing98600
+Node: Invoking libtoolize99517
+Node: Autoconf and LTLIBOBJS105698
+Node: Static-only libraries106442
+Ref: Static-only libraries-Footnote-1107756
+Node: Other languages107865
+Node: C++ libraries108564
+Node: Tags109987
+Node: Versioning111400
+Node: Interfaces112768
+Node: Libtool versioning113401
+Node: Updating version info115614
+Node: Release numbers118645
+Node: Library tips120482
+Node: C header files123287
+Ref: C header files-Footnote-1126942
+Node: Inter-library dependencies127151
+Node: Dlopened modules129852
+Node: Building modules131739
+Node: Dlpreopening132940
+Node: Linking with dlopened modules138569
+Node: Finding the dlname143499
+Ref: Finding the dlname-Footnote-1144815
+Node: Dlopen issues144868
+Node: Using libltdl145909
+Node: Libltdl interface147741
+Ref: Libltdl interface-Footnote-1161342
+Node: Modules for libltdl161636
+Node: Thread Safety in libltdl164162
+Node: User defined module data165175
+Node: Module loaders for libltdl172661
+Ref: Module loaders for libltdl-Footnote-1181927
+Node: Distributing libltdl182033
+Ref: Distributing libltdl-Footnote-1195802
+Ref: Distributing libltdl-Footnote-2196098
+Node: Trace interface196248
+Node: FAQ197083
+Node: Stripped link flags197421
+Node: Troubleshooting198866
+Node: Libtool test suite199389
+Node: Test descriptions200158
+Node: When tests fail212539
+Node: Reporting bugs213542
+Node: Maintaining215160
+Node: New ports215903
+Node: Information sources216596
+Node: Porting inter-library dependencies219053
+Node: Tested platforms221769
+Node: Platform quirks230199
+Node: References231380
+Node: Compilers232230
+Ref: Compilers-Footnote-1233808
+Node: Reloadable objects234124
+Node: Multiple dependencies234483
+Node: Archivers235377
+Node: Cross compiling235967
+Node: File name conversion241951
+Node: File Name Conversion Failure244984
+Node: Native MinGW File Name Conversion246233
+Node: Cygwin/Windows File Name Conversion247794
+Node: Unix/Windows File Name Conversion249165
+Node: LT_CYGPATH249931
+Node: Cygwin to MinGW Cross253174
+Node: Windows DLLs257471
+Node: libtool script contents264746
+Node: Cheap tricks285106
+Node: GNU Free Documentation License286969
+Node: Combined Index313087
+
+End Tag Table
diff --git a/doc/libtool.info-1 b/doc/libtool.info-1
new file mode 100644
index 0000000..91016cc
--- /dev/null
+++ b/doc/libtool.info-1
@@ -0,0 +1,7197 @@
+This is libtool.info, produced by makeinfo version 5.2 from
+libtool.texi.
+
+This manual is for GNU Libtool (version 2.4.5, 16 January 2015).
+
+ Copyright (C) 1996-2015 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".
+INFO-DIR-SECTION Software development
+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
+
+
+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.5.
+
+ *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, 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 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.5
+ #
+ # 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.5
+ #
+ # 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 wher they will (eventually) 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 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 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 display 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 that '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.
+
+'-os2dllname NAME'
+ Use this to change the DLL base name on OS/2 to NAME, to keep
+ within the 8 character base name limit on this system.
+
+'-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 what 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 ensure 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 cannot 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 that 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 that 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 what 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 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 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.5])
+
+ -- 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!
+
+ 'aix-soname=aix'
+ 'aix-soname=svr4'
+ 'aix-soname=both'
+ Enable the '--with-aix-soname' to 'configure', which the user
+ can pass to override the given default.
+
+ By default (and *always* in releases prior to 2.4.4), Libtool
+ always behaves as if 'aix-soname=aix' is given, with no
+ 'configure' option for the user to override. Specifically,
+ when the '-brtl' linker flag is seen in 'LDFLAGS' at
+ build-time, static archives are built from static objects
+ only, otherwise, traditional AIX shared library archives of
+ shared objects using in-archive versioning are built (with the
+ '.a' file extension!). Similarly, with '-brtl' in 'LDFLAGS',
+ libtool shared archives are built from shared objects, without
+ any filename-based versioning; and without '-brtl' no shared
+ archives are built at all.
+
+ When 'aix-soname=svr4' option is given, or the
+ '--with-aix-soname=svr4' 'configure' option is passed, static
+ archives are always created from static objects, even without
+ '-brtl' in 'LDFLAGS'. Shared archives are made from shared
+ objects, and filename based versioning is enabled.
+
+ When 'aix-soname=both' option is given, or the
+ '--with-aix-soname=svr4' 'configure' option is passed, static
+ archives are built traditionally (as 'aix-soname=aix'), and
+ both kinds of shared archives are built. The '.la'
+ pseudo-archive specifies one or the other depending on whether
+ '-brtl' is specified in 'LDFLAGS' when the library is built.
+
+ '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.
+
+ -- Variable: LT_SYS_LIBRARY_PATH
+ Libtool has heuristics for the system search path for
+ runtime-loaded libraries. If the guessed default does not match
+ the setup of the host system, this variable can be used to modify
+ that path list, as follows ('LT_SYS_LIBRARY_PATH' is a
+ colon-delimited list like 'PATH'):
+ * 'path:' The heuristically determined paths will be appened
+ after the trailing colon;
+ * ':path' The heuristically determined paths will be prepended
+ before the leading colon;
+ * 'path::path' The heuristically determined paths will be
+ inserted between the double colons;
+ * 'path' With no dangling colons, the heuristically determined
+ paths will be ignored entirely.
+
+ 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_DIRS'. When you
+'libtoolize' your project, a copy of the relevant macro definitions will
+be placed in your 'AC_CONFIG_MACRO_DIRS', 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 where
+ symbols are bound at link-time and one where 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 for the dynamic
+ library path, you may use the 'LT_SYS_LIBRARY_PATH' environment
+ variable to adjust. Otherwise, at 'configure' time you may
+ override libtool's guesses by setting the 'autoconf' cache
+ variables 'lt_cv_sys_lib_search_path_spec' and
+ 'lt_cv_sys_lib_dlsearch_path_spec' respectively.
+
+
+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/ltdl.mk 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/ltdl.mk
+
+'--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_DIRS'
+(*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_DIRS', 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_DIRS', 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_DIRS' 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 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 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++ 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 what these libraries are, 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 what 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, and 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 what 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, to accommodate both views, you can use the '-release' flag 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 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 where 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, 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 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 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 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 (*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 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' (that 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 (*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 that 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, 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
+what 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 yes != "$with_included_ltdl"; 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/ltdl.mk
+
+ 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 'ltdl.mk' 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' 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' 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.in' 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) 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 under what conditions 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' that 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 what 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 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' 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 where 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 where 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 where the libraries or
+applications are compiled is called the "build platform", while the
+platform where 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 where 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. *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. *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; *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 where 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 what '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 what 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' 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 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
+ cannot 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' 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 what 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 where 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 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) 2014 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'.
+
+
+File: libtool.info, Node: GNU Free Documentation License, Next: Combined Index, Prev: Maintaining, Up: Top
+
+Appendix A GNU Free Documentation License
+*****************************************
+
+ Version 1.3, 3 November 2008
+
+ Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+ <http://fsf.org/>
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ 0. PREAMBLE
+
+ The purpose of this License is to make a manual, textbook, or other
+ functional and useful document "free" in the sense of freedom: to
+ assure everyone the effective freedom to copy and redistribute it,
+ with or without modifying it, either commercially or
+ noncommercially. Secondarily, this License preserves for the
+ author and publisher a way to get credit for their work, while not
+ being considered responsible for modifications made by others.
+
+ This License is a kind of "copyleft", which means that derivative
+ works of the document must themselves be free in the same sense.
+ It complements the GNU General Public License, which is a copyleft
+ license designed for free software.
+
+ We have designed this License in order to use it for manuals for
+ free software, because free software needs free documentation: a
+ free program should come with manuals providing the same freedoms
+ that the software does. But this License is not limited to
+ software manuals; it can be used for any textual work, regardless
+ of subject matter or whether it is published as a printed book. We
+ recommend this License principally for works whose purpose is
+ instruction or reference.
+
+ 1. APPLICABILITY AND DEFINITIONS
+
+ This License applies to any manual or other work, in any medium,
+ that contains a notice placed by the copyright holder saying it can
+ be distributed under the terms of this License. Such a notice
+ grants a world-wide, royalty-free license, unlimited in duration,
+ to use that work under the conditions stated herein. The
+ "Document", below, refers to any such manual or work. Any member
+ of the public is a licensee, and is addressed as "you". You accept
+ the license if you copy, modify or distribute the work in a way
+ requiring permission under copyright law.
+
+ A "Modified Version" of the Document means any work containing the
+ Document or a portion of it, either copied verbatim, or with
+ modifications and/or translated into another language.
+
+ A "Secondary Section" is a named appendix or a front-matter section
+ of the Document that deals exclusively with the relationship of the
+ publishers or authors of the Document to the Document's overall
+ subject (or to related matters) and contains nothing that could
+ fall directly within that overall subject. (Thus, if the Document
+ is in part a textbook of mathematics, a Secondary Section may not
+ explain any mathematics.) The relationship could be a matter of
+ historical connection with the subject or with related matters, or
+ of legal, commercial, philosophical, ethical or political position
+ regarding them.
+
+ The "Invariant Sections" are certain Secondary Sections whose
+ titles are designated, as being those of Invariant Sections, in the
+ notice that says that the Document is released under this License.
+ If a section does not fit the above definition of Secondary then it
+ is not allowed to be designated as Invariant. The Document may
+ contain zero Invariant Sections. If the Document does not identify
+ any Invariant Sections then there are none.
+
+ The "Cover Texts" are certain short passages of text that are
+ listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+ that says that the Document is released under this License. A
+ Front-Cover Text may be at most 5 words, and a Back-Cover Text may
+ be at most 25 words.
+
+ A "Transparent" copy of the Document means a machine-readable copy,
+ represented in a format whose specification is available to the
+ general public, that is suitable for revising the document
+ straightforwardly with generic text editors or (for images composed
+ of pixels) generic paint programs or (for drawings) some widely
+ available drawing editor, and that is suitable for input to text
+ formatters or for automatic translation to a variety of formats
+ suitable for input to text formatters. A copy made in an otherwise
+ Transparent file format whose markup, or absence of markup, has
+ been arranged to thwart or discourage subsequent modification by
+ readers is not Transparent. An image format is not Transparent if
+ used for any substantial amount of text. A copy that is not
+ "Transparent" is called "Opaque".
+
+ Examples of suitable formats for Transparent copies include plain
+ ASCII without markup, Texinfo input format, LaTeX input format,
+ SGML or XML using a publicly available DTD, and standard-conforming
+ simple HTML, PostScript or PDF designed for human modification.
+ Examples of transparent image formats include PNG, XCF and JPG.
+ Opaque formats include proprietary formats that can be read and
+ edited only by proprietary word processors, SGML or XML for which
+ the DTD and/or processing tools are not generally available, and
+ the machine-generated HTML, PostScript or PDF produced by some word
+ processors for output purposes only.
+
+ The "Title Page" means, for a printed book, the title page itself,
+ plus such following pages as are needed to hold, legibly, the
+ material this License requires to appear in the title page. For
+ works in formats which do not have any title page as such, "Title
+ Page" means the text near the most prominent appearance of the
+ work's title, preceding the beginning of the body of the text.
+
+ The "publisher" means any person or entity that distributes copies
+ of the Document to the public.
+
+ A section "Entitled XYZ" means a named subunit of the Document
+ whose title either is precisely XYZ or contains XYZ in parentheses
+ following text that translates XYZ in another language. (Here XYZ
+ stands for a specific section name mentioned below, such as
+ "Acknowledgements", "Dedications", "Endorsements", or "History".)
+ To "Preserve the Title" of such a section when you modify the
+ Document means that it remains a section "Entitled XYZ" according
+ to this definition.
+
+ The Document may include Warranty Disclaimers next to the notice
+ which states that this License applies to the Document. These
+ Warranty Disclaimers are considered to be included by reference in
+ this License, but only as regards disclaiming warranties: any other
+ implication that these Warranty Disclaimers may have is void and
+ has no effect on the meaning of this License.
+
+ 2. VERBATIM COPYING
+
+ You may copy and distribute the Document in any medium, either
+ commercially or noncommercially, provided that this License, the
+ copyright notices, and the license notice saying this License
+ applies to the Document are reproduced in all copies, and that you
+ add no other conditions whatsoever to those of this License. You
+ may not use technical measures to obstruct or control the reading
+ or further copying of the copies you make or distribute. However,
+ you may accept compensation in exchange for copies. If you
+ distribute a large enough number of copies you must also follow the
+ conditions in section 3.
+
+ You may also lend copies, under the same conditions stated above,
+ and you may publicly display copies.
+
+ 3. COPYING IN QUANTITY
+
+ If you publish printed copies (or copies in media that commonly
+ have printed covers) of the Document, numbering more than 100, and
+ the Document's license notice requires Cover Texts, you must
+ enclose the copies in covers that carry, clearly and legibly, all
+ these Cover Texts: Front-Cover Texts on the front cover, and
+ Back-Cover Texts on the back cover. Both covers must also clearly
+ and legibly identify you as the publisher of these copies. The
+ front cover must present the full title with all words of the title
+ equally prominent and visible. You may add other material on the
+ covers in addition. Copying with changes limited to the covers, as
+ long as they preserve the title of the Document and satisfy these
+ conditions, can be treated as verbatim copying in other respects.
+
+ If the required texts for either cover are too voluminous to fit
+ legibly, you should put the first ones listed (as many as fit
+ reasonably) on the actual cover, and continue the rest onto
+ adjacent pages.
+
+ If you publish or distribute Opaque copies of the Document
+ numbering more than 100, you must either include a machine-readable
+ Transparent copy along with each Opaque copy, or state in or with
+ each Opaque copy a computer-network location from which the general
+ network-using public has access to download using public-standard
+ network protocols a complete Transparent copy of the Document, free
+ of added material. If you use the latter option, you must take
+ reasonably prudent steps, when you begin distribution of Opaque
+ copies in quantity, to ensure that this Transparent copy will
+ remain thus accessible at the stated location until at least one
+ year after the last time you distribute an Opaque copy (directly or
+ through your agents or retailers) of that edition to the public.
+
+ It is requested, but not required, that you contact the authors of
+ the Document well before redistributing any large number of copies,
+ to give them a chance to provide you with an updated version of the
+ Document.
+
+ 4. MODIFICATIONS
+
+ You may copy and distribute a Modified Version of the Document
+ under the conditions of sections 2 and 3 above, provided that you
+ release the Modified Version under precisely this License, with the
+ Modified Version filling the role of the Document, thus licensing
+ distribution and modification of the Modified Version to whoever
+ possesses a copy of it. In addition, you must do these things in
+ the Modified Version:
+
+ A. Use in the Title Page (and on the covers, if any) a title
+ distinct from that of the Document, and from those of previous
+ versions (which should, if there were any, be listed in the
+ History section of the Document). You may use the same title
+ as a previous version if the original publisher of that
+ version gives permission.
+
+ B. List on the Title Page, as authors, one or more persons or
+ entities responsible for authorship of the modifications in
+ the Modified Version, together with at least five of the
+ principal authors of the Document (all of its principal
+ authors, if it has fewer than five), unless they release you
+ from this requirement.
+
+ C. State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+
+ D. Preserve all the copyright notices of the Document.
+
+ E. Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+
+ F. Include, immediately after the copyright notices, a license
+ notice giving the public permission to use the Modified
+ Version under the terms of this License, in the form shown in
+ the Addendum below.
+
+ G. Preserve in that license notice the full lists of Invariant
+ Sections and required Cover Texts given in the Document's
+ license notice.
+
+ H. Include an unaltered copy of this License.
+
+ I. Preserve the section Entitled "History", Preserve its Title,
+ and add to it an item stating at least the title, year, new
+ authors, and publisher of the Modified Version as given on the
+ Title Page. If there is no section Entitled "History" in the
+ Document, create one stating the title, year, authors, and
+ publisher of the Document as given on its Title Page, then add
+ an item describing the Modified Version as stated in the
+ previous sentence.
+
+ J. Preserve the network location, if any, given in the Document
+ for public access to a Transparent copy of the Document, and
+ likewise the network locations given in the Document for
+ previous versions it was based on. These may be placed in the
+ "History" section. You may omit a network location for a work
+ that was published at least four years before the Document
+ itself, or if the original publisher of the version it refers
+ to gives permission.
+
+ K. For any section Entitled "Acknowledgements" or "Dedications",
+ Preserve the Title of the section, and preserve in the section
+ all the substance and tone of each of the contributor
+ acknowledgements and/or dedications given therein.
+
+ L. Preserve all the Invariant Sections of the Document, unaltered
+ in their text and in their titles. Section numbers or the
+ equivalent are not considered part of the section titles.
+
+ M. Delete any section Entitled "Endorsements". Such a section
+ may not be included in the Modified Version.
+
+ N. Do not retitle any existing section to be Entitled
+ "Endorsements" or to conflict in title with any Invariant
+ Section.
+
+ O. Preserve any Warranty Disclaimers.
+
+ If the Modified Version includes new front-matter sections or
+ appendices that qualify as Secondary Sections and contain no
+ material copied from the Document, you may at your option designate
+ some or all of these sections as invariant. To do this, add their
+ titles to the list of Invariant Sections in the Modified Version's
+ license notice. These titles must be distinct from any other
+ section titles.
+
+ You may add a section Entitled "Endorsements", provided it contains
+ nothing but endorsements of your Modified Version by various
+ parties--for example, statements of peer review or that the text
+ has been approved by an organization as the authoritative
+ definition of a standard.
+
+ You may add a passage of up to five words as a Front-Cover Text,
+ and a passage of up to 25 words as a Back-Cover Text, to the end of
+ the list of Cover Texts in the Modified Version. Only one passage
+ of Front-Cover Text and one of Back-Cover Text may be added by (or
+ through arrangements made by) any one entity. If the Document
+ already includes a cover text for the same cover, previously added
+ by you or by arrangement made by the same entity you are acting on
+ behalf of, you may not add another; but you may replace the old
+ one, on explicit permission from the previous publisher that added
+ the old one.
+
+ The author(s) and publisher(s) of the Document do not by this
+ License give permission to use their names for publicity for or to
+ assert or imply endorsement of any Modified Version.
+
+ 5. COMBINING DOCUMENTS
+
+ You may combine the Document with other documents released under
+ this License, under the terms defined in section 4 above for
+ modified versions, provided that you include in the combination all
+ of the Invariant Sections of all of the original documents,
+ unmodified, and list them all as Invariant Sections of your
+ combined work in its license notice, and that you preserve all
+ their Warranty Disclaimers.
+
+ The combined work need only contain one copy of this License, and
+ multiple identical Invariant Sections may be replaced with a single
+ copy. If there are multiple Invariant Sections with the same name
+ but different contents, make the title of each such section unique
+ by adding at the end of it, in parentheses, the name of the
+ original author or publisher of that section if known, or else a
+ unique number. Make the same adjustment to the section titles in
+ the list of Invariant Sections in the license notice of the
+ combined work.
+
+ In the combination, you must combine any sections Entitled
+ "History" in the various original documents, forming one section
+ Entitled "History"; likewise combine any sections Entitled
+ "Acknowledgements", and any sections Entitled "Dedications". You
+ must delete all sections Entitled "Endorsements."
+
+ 6. COLLECTIONS OF DOCUMENTS
+
+ You may make a collection consisting of the Document and other
+ documents released under this License, and replace the individual
+ copies of this License in the various documents with a single copy
+ that is included in the collection, provided that you follow the
+ rules of this License for verbatim copying of each of the documents
+ in all other respects.
+
+ You may extract a single document from such a collection, and
+ distribute it individually under this License, provided you insert
+ a copy of this License into the extracted document, and follow this
+ License in all other respects regarding verbatim copying of that
+ document.
+
+ 7. AGGREGATION WITH INDEPENDENT WORKS
+
+ A compilation of the Document or its derivatives with other
+ separate and independent documents or works, in or on a volume of a
+ storage or distribution medium, is called an "aggregate" if the
+ copyright resulting from the compilation is not used to limit the
+ legal rights of the compilation's users beyond what the individual
+ works permit. When the Document is included in an aggregate, this
+ License does not apply to the other works in the aggregate which
+ are not themselves derivative works of the Document.
+
+ If the Cover Text requirement of section 3 is applicable to these
+ copies of the Document, then if the Document is less than one half
+ of the entire aggregate, the Document's Cover Texts may be placed
+ on covers that bracket the Document within the aggregate, or the
+ electronic equivalent of covers if the Document is in electronic
+ form. Otherwise they must appear on printed covers that bracket
+ the whole aggregate.
+
+ 8. TRANSLATION
+
+ Translation is considered a kind of modification, so you may
+ distribute translations of the Document under the terms of section
+ 4. Replacing Invariant Sections with translations requires special
+ permission from their copyright holders, but you may include
+ translations of some or all Invariant Sections in addition to the
+ original versions of these Invariant Sections. You may include a
+ translation of this License, and all the license notices in the
+ Document, and any Warranty Disclaimers, provided that you also
+ include the original English version of this License and the
+ original versions of those notices and disclaimers. In case of a
+ disagreement between the translation and the original version of
+ this License or a notice or disclaimer, the original version will
+ prevail.
+
+ If a section in the Document is Entitled "Acknowledgements",
+ "Dedications", or "History", the requirement (section 4) to
+ Preserve its Title (section 1) will typically require changing the
+ actual title.
+
+ 9. TERMINATION
+
+ You may not copy, modify, sublicense, or distribute the Document
+ except as expressly provided under this License. Any attempt
+ otherwise to copy, modify, sublicense, or distribute it is void,
+ and will automatically terminate your rights under this License.
+
+ However, if you cease all violation of this License, then your
+ license from a particular copyright holder is reinstated (a)
+ provisionally, unless and until the copyright holder explicitly and
+ finally terminates your license, and (b) permanently, if the
+ copyright holder fails to notify you of the violation by some
+ reasonable means prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+ reinstated permanently if the copyright holder notifies you of the
+ violation by some reasonable means, this is the first time you have
+ received notice of violation of this License (for any work) from
+ that copyright holder, and you cure the violation prior to 30 days
+ after your receipt of the notice.
+
+ Termination of your rights under this section does not terminate
+ the licenses of parties who have received copies or rights from you
+ under this License. If your rights have been terminated and not
+ permanently reinstated, receipt of a copy of some or all of the
+ same material does not give you any rights to use it.
+
+ 10. FUTURE REVISIONS OF THIS LICENSE
+
+ The Free Software Foundation may publish new, revised versions of
+ the GNU Free Documentation License from time to time. Such new
+ versions will be similar in spirit to the present version, but may
+ differ in detail to address new problems or concerns. See
+ <http://www.gnu.org/copyleft/>.
+
+ Each version of the License is given a distinguishing version
+ number. If the Document specifies that a particular numbered
+ version of this License "or any later version" applies to it, you
+ have the option of following the terms and conditions either of
+ that specified version or of any later version that has been
+ published (not as a draft) by the Free Software Foundation. If the
+ Document does not specify a version number of this License, you may
+ choose any version ever published (not as a draft) by the Free
+ Software Foundation. If the Document specifies that a proxy can
+ decide which future versions of this License can be used, that
+ proxy's public statement of acceptance of a version permanently
+ authorizes you to choose that version for the Document.
+
+ 11. RELICENSING
+
+ "Massive Multiauthor Collaboration Site" (or "MMC Site") means any
+ World Wide Web server that publishes copyrightable works and also
+ provides prominent facilities for anybody to edit those works. A
+ public wiki that anybody can edit is an example of such a server.
+ A "Massive Multiauthor Collaboration" (or "MMC") contained in the
+ site means any set of copyrightable works thus published on the MMC
+ site.
+
+ "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
+ license published by Creative Commons Corporation, a not-for-profit
+ corporation with a principal place of business in San Francisco,
+ California, as well as future copyleft versions of that license
+ published by that same organization.
+
+ "Incorporate" means to publish or republish a Document, in whole or
+ in part, as part of another Document.
+
+ An MMC is "eligible for relicensing" if it is licensed under this
+ License, and if all works that were first published under this
+ License somewhere other than this MMC, and subsequently
+ incorporated in whole or in part into the MMC, (1) had no cover
+ texts or invariant sections, and (2) were thus incorporated prior
+ to November 1, 2008.
+
+ The operator of an MMC Site may republish an MMC contained in the
+ site under CC-BY-SA on the same site at any time before August 1,
+ 2009, provided the MMC is eligible for relicensing.
+
+ADDENDUM: How to use this License for your documents
+====================================================
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and license
+notices just after the title page:
+
+ Copyright (C) YEAR YOUR NAME.
+ 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, no Front-Cover Texts, and no Back-Cover
+ Texts. A copy of the license is included in the section entitled ``GNU
+ Free Documentation License''.
+
+ If you have Invariant Sections, Front-Cover Texts and Back-Cover
+Texts, replace the "with...Texts." line with this:
+
+ with the Invariant Sections being LIST THEIR TITLES, with
+ the Front-Cover Texts being LIST, and with the Back-Cover Texts
+ being LIST.
+
+ If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+ If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of free
+software license, such as the GNU General Public License, to permit
+their use in free software.
+
diff --git a/doc/libtool.info-2 b/doc/libtool.info-2
new file mode 100644
index 0000000..52f0529
--- /dev/null
+++ b/doc/libtool.info-2
Binary files differ
diff --git a/doc/libtool.texi b/doc/libtool.texi
new file mode 100644
index 0000000..0298627
--- /dev/null
+++ b/doc/libtool.texi
@@ -0,0 +1,7247 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename libtool.info
+@settitle Libtool
+@c For double-sided printing, uncomment:
+@c @setchapternewpage odd
+@c Put everything in one index (arbitrarily chosen to be the concept index).
+
+@syncodeindex vr cp
+@syncodeindex fn cp
+@syncodeindex tp cp
+@synindex pg cp
+@c %**end of header
+
+@include version.texi
+@set BUGADDR the Libtool bug reporting address @email{bug-libtool@@gnu.org}
+@set MAILLIST the Libtool mailing list @email{libtool@@gnu.org}
+@set objdir .libs
+
+@copying
+This manual is for GNU Libtool (version @value{VERSION}, @value{UPDATED}).
+
+Copyright @copyright{} 1996-2015 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''.
+@end copying
+
+@dircategory Software development
+@direntry
+* Libtool: (libtool). Generic shared library support script.
+@end direntry
+
+@dircategory Individual utilities
+@direntry
+* libtool-invocation: (libtool)Invoking libtool. Running the @code{libtool} script.
+* libtoolize: (libtool)Invoking libtoolize. Adding libtool support.
+@end direntry
+
+@titlepage
+@title GNU Libtool
+@subtitle For version @value{VERSION}, @value{UPDATED}
+@author Gordon Matzigkeit
+@author Alexandre Oliva
+@author Thomas Tanner
+@author Gary V. Vaughan
+
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@contents
+
+@ifnottex
+@node Top, Introduction, (dir), (dir)
+@comment node-name, next, previous, up
+@top 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 @value{VERSION}.
+
+@xref{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 @code{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:: @code{dlopen}ing libtool-created libraries.
+* Using libltdl:: Libtool's portable @code{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.
+
+@detailmenu
+ --- 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 @command{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 @file{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 @code{libtool} in @file{configure.ac}.
+* Configure notes:: Platform-specific notes for configuration.
+
+Including libtool in your package
+
+* Invoking libtoolize:: @code{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 @code{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 @code{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 @command{cygpath} to convert Cygwin file names
+* Unix/Windows File Name Conversion:: Using Wine to convert Unix paths
+* LT_CYGPATH:: Invoking @command{cygpath} from other environments
+* Cygwin to MinGW Cross:: Other notes concerning MinGW cross
+
+@end detailmenu
+@end menu
+
+@end ifnottex
+
+@node Introduction
+@chapter 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@dots{} users don't need
+to read obscure documentation to have their favorite source
+package build shared libraries. They just run your package
+@code{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, @file{libhello}, in a
+generic way.
+
+@file{libhello} could be a shared library, a static library, or
+both@dots{} 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.
+@end menu
+
+@node Motivation
+@section Motivation for writing libtool
+
+@cindex motivation for writing libtool
+@cindex design philosophy
+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.
+
+@cindex specifications for libtool
+@cindex libtool specifications
+The following specifications were used in developing and evaluating this
+system:
+
+@enumerate
+@item
+The system must be as elegant as possible.
+
+@item
+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.
+
+@item
+Portability to other (non-GNU) architectures and tools is desirable.
+@end enumerate
+
+@node Issues
+@section Implementation issues
+
+@cindex tricky design issues
+@cindex design issues
+The following issues need to be addressed in any reusable shared library
+system, specifically libtool:
+
+@enumerate
+@item
+The package installer should be able to control what sort of libraries
+are built.
+
+@item
+It can be tricky to run dynamically linked programs whose libraries have
+not yet been installed. @code{LD_LIBRARY_PATH} must be set properly (if
+it is supported), or programs fail to run.
+
+@item
+The system must operate consistently even on hosts that don't support
+shared libraries.
+
+@item
+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.
+
+@item
+It is not always obvious with what prefix or suffix a shared library
+should be installed. This makes it difficult for @file{Makefile} rules,
+since they generally assume that file names are the same from host to
+host.
+
+@item
+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.
+
+@item
+The install @file{Makefile} target should warn the package installer to set
+the proper environment variables (@code{LD_LIBRARY_PATH} or equivalent),
+or run @command{ldconfig}.
+@end enumerate
+
+@node Other implementations
+@section 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.
+
+@node Postmortem
+@section A postmortem analysis of other implementations
+
+@cindex other implementations, flaws in
+@cindex reusability of library systems
+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.
+
+@cindex complexity of library systems
+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
+@emph{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 @file{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.
+
+@node Libtool paradigm
+@chapter 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.
+
+@cindex definition of libraries
+@cindex libraries, definition of
+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.
+
+@node Using libtool
+@chapter Using libtool
+
+@cindex examples of using libtool
+@cindex libtool examples
+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:
+
+@table @samp
+@item a23
+An Ultrix 4.2 platform with only static libraries.
+
+@item burger
+A NetBSD/i386 1.2 platform with shared libraries.
+@end table
+
+You can follow these examples on your own platform, using the
+preconfigured libtool script that was installed with libtool
+(@pxref{Configuring}).
+
+Source files for the following examples are taken from the @file{demo}
+subdirectory of the libtool distribution. Assume that we are building a
+library, @file{libhello}, out of the files @file{foo.c} and
+@file{hello.c}.
+
+Note that the @file{foo.c} source file uses the @code{cos} math library
+function, which is usually found in the standalone math library, and not
+the C library (@pxref{Trig Functions, , Trigonometric Functions, libc,
+The GNU C Library Reference Manual}). So, we need to add @option{-lm} to
+the end of the link line whenever we link @file{foo.lo} into an
+executable or a library (@pxref{Inter-library dependencies}).
+
+The same rule applies whenever you use functions that don't appear in
+the standard C library@dots{} you need to add the appropriate
+@option{-l@var{name}} 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
+@file{main.o} against @file{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.
+@end menu
+
+@node Creating object files
+@section Creating object files
+
+@cindex compiling object files
+@cindex object files, compiling
+To create an object file from a source file, the compiler is invoked
+with the @option{-c} flag (and any other desired flags):
+
+@example
+burger$ @kbd{gcc -g -O -c main.c}
+burger$
+@end example
+
+The above compiler command produces an object file, usually named
+@file{main.o}, from the source file @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:
+
+@example
+burger$ @kbd{gcc -g -O -c foo.c}
+burger$ @kbd{gcc -g -O -c hello.c}
+burger$
+@end example
+
+@cindex position-independent code
+@cindex PIC (position-independent code)
+Shared libraries, however, may only be built from
+@dfn{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.
+
+@cindex library object file
+@cindex @file{.lo} files
+@cindex object files, library
+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 @file{@value{objdir}} 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 @file{foo.c} and @file{hello.c},
+simply invoke libtool with the standard compilation command as
+arguments (@pxref{Compile mode}):
+
+@example
+a23$ @kbd{libtool --mode=compile gcc -g -O -c foo.c}
+gcc -g -O -c foo.c -o foo.o
+a23$ @kbd{libtool --mode=compile gcc -g -O -c hello.c}
+gcc -g -O -c hello.c -o hello.o
+a23$
+@end example
+
+Note that libtool silently creates an additional control file on each
+@samp{compile} invocation. The @file{.lo} file is the libtool object,
+which Libtool uses to determine what object file may be built into a
+shared library. On @samp{a23}, only static libraries are supported so
+the library objects look like this:
+
+@example
+# foo.lo - a libtool object file
+# Generated by ltmain.sh (GNU libtool) @value{VERSION}
+#
+# 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'
+@end example
+
+On shared library systems, libtool automatically generates an
+additional PIC object by inserting the appropriate PIC generation
+flags into the compilation command:
+
+@example
+burger$ @kbd{libtool --mode=compile gcc -g -O -c foo.c}
+mkdir @value{objdir}
+gcc -g -O -c foo.c -fPIC -DPIC -o @value{objdir}/foo.o
+gcc -g -O -c foo.c -o foo.o >/dev/null 2>&1
+burger$
+@end example
+
+Note that Libtool automatically created @file{@value{objdir}} directory
+upon its first execution, where PIC library object files will be stored.
+
+Since @samp{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:
+
+@example
+# foo.lo - a libtool object file
+# Generated by ltmain.sh (GNU libtool) @value{VERSION}
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='@value{objdir}/foo.o'
+
+# Name of the non-PIC object.
+non_pic_object='foo.o'
+@end example
+
+@cindex @option{-no-suppress}, libtool compile mode option
+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 @samp{#ifdef PIC} for example), you can turn off suppression with
+the @option{-no-suppress} option to libtool's compile mode:
+
+@example
+burger$ @kbd{libtool --mode=compile gcc -no-suppress -g -O -c hello.c}
+gcc -g -O -c hello.c -fPIC -DPIC -o @value{objdir}/hello.o
+gcc -g -O -c hello.c -o hello.o
+burger$
+@end example
+
+
+@node Linking libraries
+@section Linking libraries
+
+@pindex ar
+Without libtool, the programmer would invoke the @command{ar} command to
+create a static library:
+
+@example
+burger$ @kbd{ar cru libhello.a hello.o foo.o}
+burger$
+@end example
+
+@pindex ranlib
+But of course, that would be too simple, so many systems require that
+you run the @code{ranlib} command on the resulting library (to give it
+better karma, or something):
+
+@example
+burger$ @kbd{ranlib libhello.a}
+burger$
+@end example
+
+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
+@command{ar} (and possibly @code{ranlib}) commands.
+
+@cindex libtool libraries
+@cindex @file{.la} files
+Again, the libtool control file name (@file{.la} suffix) differs from
+the standard library name (@file{.a} suffix). The arguments to
+libtool are the same ones you would use to produce an executable named
+@file{libhello.la} with your compiler (@pxref{Link mode}):
+
+@example
+a23$ @kbd{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$
+@end example
+
+Aha! Libtool caught a common error@dots{} trying to build a library
+from standard objects instead of special @file{.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
+@file{libhello.la} with @file{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 @option{-lm} to the link command line because
+@file{foo.c} uses the @code{cos} math library function (@pxref{Using
+libtool}).
+
+Another complication in building shared libraries is that we need to
+specify the path to the directory wher they will (eventually) be
+installed (in this case, @file{/usr/local/lib})@footnote{If you don't
+specify an @code{rpath}, then libtool builds a libtool convenience
+archive, not a shared library (@pxref{Static libraries}).}:
+
+@example
+a23$ @kbd{libtool --mode=link gcc -g -O -o libhello.la foo.lo hello.lo \
+ -rpath /usr/local/lib -lm}
+ar cru @value{objdir}/libhello.a foo.o hello.o
+ranlib @value{objdir}/libhello.a
+creating libhello.la
+(cd @value{objdir} && rm -f libhello.la && ln -s ../libhello.la libhello.la)
+a23$
+@end example
+
+Now, let's try the same trick on the shared library platform:
+
+@example
+burger$ @kbd{libtool --mode=link gcc -g -O -o libhello.la foo.lo hello.lo \
+ -rpath /usr/local/lib -lm}
+rm -fr @value{objdir}/libhello.a @value{objdir}/libhello.la
+ld -Bshareable -o @value{objdir}/libhello.so.0.0 @value{objdir}/foo.o @value{objdir}/hello.o -lm
+ar cru @value{objdir}/libhello.a foo.o hello.o
+ranlib @value{objdir}/libhello.a
+creating libhello.la
+(cd @value{objdir} && rm -f libhello.la && ln -s ../libhello.la libhello.la)
+burger$
+@end example
+
+Now that's significantly cooler@dots{} Libtool just ran an obscure
+@command{ld} command to create a shared library, as well as the static
+library.
+
+@cindex @file{@value{objdir}} subdirectory
+Note how libtool creates extra files in the @file{@value{objdir}}
+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 @file{.la} file
+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 @option{-rpath}) as well as the dependency
+on the math library (@samp{-lm}).
+
+@node Linking executables
+@section Linking executables
+
+@cindex linking against installed libraries
+If you choose at this point to @dfn{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
+@option{-L} and @option{-l} flags to specify the library's location.
+
+@cindex buggy system linkers
+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.
+
+@cindex security problems with buggy linkers
+@cindex bugs, subtle ones caused by buggy linkers
+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.
+
+@cindex linking against uninstalled libraries
+Here's the old way of linking against an uninstalled library:
+
+@example
+burger$ @kbd{gcc -g -O -o hell.old main.o libhello.a -lm}
+burger$
+@end example
+
+Libtool's way is almost the same@footnote{However, you should avoid using
+@option{-L} or @option{-l} flags to link against an uninstalled libtool
+library. Just specify the relative path to the @file{.la} file, such as
+@file{../intl/libintl.la}. This is a design decision to eliminate any
+ambiguity when linking against uninstalled shared libraries.}
+(@pxref{Link mode}):
+
+@example
+a23$ @kbd{libtool --mode=link gcc -g -O -o hell main.o libhello.la}
+gcc -g -O -o hell main.o ./@value{objdir}/libhello.a -lm
+a23$
+@end example
+
+That looks too simple to be true. All libtool did was transform
+@file{libhello.la} to @file{./@value{objdir}/libhello.a}, but remember
+that @samp{a23} has no shared libraries. Notice that Libtool also
+remembered that @file{libhello.la} depends on @option{-lm}, so even
+though we didn't specify @option{-lm} on the libtool command
+line@footnote{
+@c
+And why should we? @file{main.o} doesn't directly depend on @option{-lm}
+after all.
+@c
+} Libtool has added it to the @command{gcc} link line for us.
+
+On @samp{burger} Libtool links against the uninstalled shared library:
+
+@example
+burger$ @kbd{libtool --mode=link gcc -g -O -o hell main.o libhello.la}
+gcc -g -O -o @value{objdir}/hell main.o -L./@value{objdir} -R/usr/local/lib -lhello -lm
+creating hell
+burger$
+@end example
+
+@cindex linking with installed libtool libraries
+Now assume @file{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:
+
+@example
+burger$ @kbd{gcc -g -O -o test test.o -L/usr/local/lib -lhello -lm}
+@end example
+
+However, unless @file{/usr/local/lib} is in the standard library search
+path, you won't be able to run @code{test}. However, if you use libtool
+to link the already-installed libtool library, it will do The Right
+Thing (TM) for you:
+
+@example
+burger$ @kbd{libtool --mode=link gcc -g -O -o test test.o \
+ /usr/local/lib/libhello.la}
+gcc -g -O -o @value{objdir}/test test.o -Wl,--rpath \
+ -Wl,/usr/local/lib /usr/local/lib/libhello.a -lm
+creating test
+burger$
+@end example
+
+Note that libtool added the necessary run-time path flag, as well as
+@option{-lm}, the library libhello.la depended upon. Nice, huh?
+
+@cindex wrapper scripts for programs
+@cindex program wrapper scripts
+Notice that the executable, @code{hell}, was actually created in the
+@file{@value{objdir}} subdirectory. Then, a wrapper script (or, on
+certain platforms, a wrapper executable @pxref{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
+@file{libhello}, by using the @samp{-R/usr/local/lib} compiler flag.
+Then, the wrapper script guarantees that the executable finds the
+correct shared library (the one in @file{./@value{objdir}}) until it is
+properly installed.
+
+Let's compare the two different programs:
+
+@example
+burger$ @kbd{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$ @kbd{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$
+@end example
+
+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?
+
+@example
+burger$ @kbd{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$ @kbd{ls -l @value{objdir}/hell @value{objdir}/libhello.*}
+-rwxr-xr-x 1 gord gord 11647 Nov 14 12:10 @value{objdir}/hell
+-rw-r--r-- 1 gord gord 4274 Nov 13 18:44 @value{objdir}/libhello.a
+-rwxr-xr-x 1 gord gord 12205 Nov 13 18:44 @value{objdir}/libhello.so.0.0
+burger$
+@end example
+
+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 @file{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.
+@end menu
+
+@node Wrapper executables
+@subsection Wrapper executables for uninstalled programs
+@cindex wrapper executables for uninstalled programs
+@cindex program wrapper executables
+
+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 @command{make} rules for the
+program, whose name ends in @code{$(EXEEXT)}. The actual program
+executable is created below @value{objdir}, and its name will end
+in @code{$(EXEEXT)} and may or may not contain an @code{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 @code{--lt-debug} (see below). When executing in
+debug mode, diagnostic information will be printed to @code{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 @code{--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 @code{--lt-}. (In fact, the
+wrapper executable will detect any command line options that begin with
+@code{--lt-} and abort with an error message if the option is not
+recognized). If this presents a problem, please contact the Libtool
+team at @value{BUGADDR}.
+
+These command line options include:
+
+@table @option
+@item --lt-dump-script
+Causes the wrapper to print a copy of the wrapper @emph{script}
+to @code{stdout}, and exit.
+
+@item --lt-debug
+Causes the wrapper to print diagnostic information to @code{stdout},
+before launching the program executable.
+
+@end table
+
+For consistency, both the wrapper @emph{script} and the wrapper
+@emph{executable} support these options.
+
+@node Debugging executables
+@section Debugging executables
+
+If @file{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:
+
+@example
+burger$ @kbd{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) @kbd{quit}
+burger$
+@end example
+
+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:
+
+@example
+burger$ @kbd{gdb @value{objdir}/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) @kbd{break main}
+Breakpoint 1 at 0x8048547: file main.c, line 29.
+(gdb) @kbd{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) @kbd{quit}
+burger$
+@end example
+
+Argh. Now GDB complains because it cannot find the shared library that
+@file{hell} is linked against. So, we must use libtool to
+properly set the library path and run the debugger. Fortunately, we can
+forget all about the @file{@value{objdir}} directory, and just run it on
+the executable wrapper (@pxref{Execute mode}):
+
+@example
+burger$ @kbd{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) @kbd{break main}
+Breakpoint 1 at 0x8048547: file main.c, line 29.
+(gdb) @kbd{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) @kbd{quit}
+The program is running. Quit anyway (and kill it)? (y or n) @kbd{y}
+burger$
+@end example
+
+@node Installing libraries
+@section Installing libraries
+
+@pindex strip
+Installing libraries on a non-libtool system is quite
+straightforward@dots{} just copy them into place:@footnote{Don't
+strip static libraries though, or they will be unusable.}
+
+@pindex su
+@example
+burger$ @kbd{su}
+Password: @kbd{********}
+burger# @kbd{cp libhello.a /usr/local/lib/libhello.a}
+burger#
+@end example
+
+Oops, don't forget the @command{ranlib} command:
+
+@example
+burger# @kbd{ranlib /usr/local/lib/libhello.a}
+burger#
+@end example
+
+@pindex install
+Libtool installation is quite simple, as well. Just use the
+@command{install} or @command{cp} command that you normally would
+(@pxref{Install mode}):
+
+@example
+a23# @kbd{libtool --mode=install cp libhello.la /usr/local/lib/libhello.la}
+cp libhello.la /usr/local/lib/libhello.la
+cp @value{objdir}/libhello.a /usr/local/lib/libhello.a
+ranlib /usr/local/lib/libhello.a
+a23#
+@end example
+
+Note that the libtool library @file{libhello.la} is also installed, to
+help libtool with uninstallation (@pxref{Uninstall mode}) and linking
+(@pxref{Linking executables}) and to help programs with dlopening
+(@pxref{Dlopened modules}).
+
+Here is the shared library example:
+
+@example
+burger# @kbd{libtool --mode=install install -c libhello.la \
+ /usr/local/lib/libhello.la}
+install -c @value{objdir}/libhello.so.0.0 /usr/local/lib/libhello.so.0.0
+install -c libhello.la /usr/local/lib/libhello.la
+install -c @value{objdir}/libhello.a /usr/local/lib/libhello.a
+ranlib /usr/local/lib/libhello.a
+burger#
+@end example
+
+@cindex stripping libraries
+@cindex libraries, stripping
+It is safe to specify the @option{-s} (strip symbols) flag if you use a
+BSD-compatible install program when installing libraries.
+Libtool will either ignore the @option{-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
+@option{-rpath} flag you used to build it.
+
+@cindex postinstallation
+@cindex installation, finishing
+@cindex libraries, finishing installation
+Then, running @samp{libtool -n finish @var{libdir}} can give you
+further hints on what to do (@pxref{Finish mode}):
+
+@example
+burger# @kbd{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#
+@end example
+
+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.
+
+@node Installing executables
+@section Installing executables
+
+If you used libtool to link any executables against uninstalled libtool
+libraries (@pxref{Linking executables}), you need to use libtool to
+install the executables after the libraries have been installed
+(@pxref{Installing libraries}).
+
+So, for our Ultrix example, we would run:
+
+@example
+a23# libtool --mode=install -c hell /usr/local/bin/hell
+install -c hell /usr/local/bin/hell
+a23#
+@end example
+
+On shared library systems that require wrapper scripts, libtool just
+ignores the wrapper script and installs the correct binary:
+
+@example
+burger# libtool --mode=install -c hell /usr/local/bin/hell
+install -c @value{objdir}/hell /usr/local/bin/hell
+burger#
+@end example
+
+
+@node Static libraries
+@section Linking static libraries
+
+@cindex static linking
+@cindex convenience libraries
+Why return to @command{ar} and @command{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 @command{ar} and
+@command{ranlib} commands (or the corresponding GNU Automake
+@samp{_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.
+
+@example
+burger$ @kbd{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$
+@end example
+
+Using libtool for static library installation protects your library from
+being accidentally stripped (if the installer used the @option{-s} flag),
+as well as automatically running the correct @command{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 @option{-rpath} flag and use @option{-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 @option{-rpath} and @option{-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 @code{noinst_LTLIBRARIES}
+instead of @code{lib_LTLIBRARIES} for convenience libraries, so that
+the @option{-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.
+
+@cindex standalone binaries
+Another common situation where static linking is desirable is in
+creating a standalone binary. Use libtool to do the linking and add the
+@option{-all-static} flag.
+
+@node Invoking libtool
+@chapter Invoking @command{libtool}
+@pindex libtool
+@cindex libtool command options
+@cindex options, libtool command
+@cindex command options, libtool
+
+The @command{libtool} program has the following synopsis:
+
+@example
+libtool [@var{option}]@dots{} [@var{mode-arg}]@dots{}
+@end example
+
+@noindent
+and accepts the following options:
+
+@table @option
+@item --config
+Display libtool configuration variables and exit.
+
+@item --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 @command{less} (or
+@command{more}) or redirect to a file.
+
+@item -n
+@itemx --dry-run
+Don't create, modify, or delete any files, just show what commands would
+be executed by libtool.
+
+@item --features
+Display basic configuration options. This provides a way for packages
+to determine whether shared or static libraries will be built.
+
+@item --finish
+Same as @option{--mode=finish}.
+
+@item -h
+Display short help message.
+
+@item --help
+Display a help message and exit. If @option{--mode=@var{mode}} is
+specified, then detailed help for @var{mode} is displayed.
+
+@item --help-all
+Display help for the general options as well as detailed help for each
+operation mode, and exit.
+
+@item --mode=@var{mode}
+Use @var{mode} as the operation mode. When using libtool from the
+command line, you can give just @var{mode} (or a unique abbreviation
+of it) as the first argument as a shorthand for the full
+@option{--mode=@var{mode}}. For example, the following are equivalent:
+
+@example
+$ @kbd{libtool --mode=execute --dry-run gdb prog.exe}
+$ @kbd{libtool execute --dry-run gdb prog.exe}
+$ @kbd{libtool exe --dry-run gdb prog.exe}
+$ @kbd{libtool e --dry-run gdb prog.exe}
+@end example
+
+@noindent
+@var{mode} must be set to one of the following:
+
+@table @option
+@item compile
+Compile a source file into a libtool object.
+
+@item execute
+Automatically set the library path so that another program can use
+uninstalled libtool-generated programs or libraries.
+
+@item link
+Create a library or an executable.
+
+@item install
+Install libraries or executables.
+
+@item finish
+Complete the installation of libtool libraries on the system.
+
+@item uninstall
+Delete installed libraries or executables.
+
+@item clean
+Delete uninstalled libraries or executables.
+@end table
+
+@item --tag=@var{tag}
+Use configuration variables from tag @var{tag} (@pxref{Tags}).
+
+@item --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.
+
+@item --quiet
+@itemx --silent
+Do not print out any progress or informational messages.
+
+@item -v
+@itemx --verbose
+Print out progress and informational messages (enabled by default),
+as well as additional messages not ordinary seen by default.
+
+@item --no-quiet
+@itemx --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 @option{--verbose} mode are shown.
+
+@item --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 @option{--no-quiet} are shown.
+
+Thus, there are now three different message levels (not counting
+@option{--debug}), depending on whether the normal messages and/or
+the additional verbose messages are displayed. Note that there is
+no mechanism to display verbose messages, without also displaying
+normal messages.
+
+@table @strong
+@item 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 @option{--no-verbose} and either option
+@option{--no-silent} or option @option{--no-quiet}.
+
+@item silent
+Neither normal messages nor verbose messages are displayed. This
+mode can be achieved using either option @option{--silent} or
+option @option{--quiet}.
+
+@item verbose
+Both normal messages and verbose messages are displayed. This mode
+can be achieved using either option @option{-v} or option
+@option{--verbose}.
+@end table
+
+@item --version
+Print libtool version information and exit.
+@end table
+
+The current @command{libtool} implementation is done with a shell script
+that needs to be invoked by the shell that @command{configure} chose for
+configuring @command{libtool} (@pxref{config.status Invocation, , The
+Autoconf Manual, autoconf, The Autoconf Manual}). This shell is set in
+the she-bang (@samp{#!}) line of the @command{libtool} script. Using a
+different shell may cause undefined behavior.
+
+The @var{mode-args} are a variable number of arguments, depending on the
+selected operation mode. In general, each @var{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.
+@end menu
+
+@node Compile mode
+@section Compile mode
+@cindex mode, compile
+@cindex compile mode
+
+For @dfn{compile} mode, @var{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 @option{-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.@: @samp{.c} for C source code) with the library object suffix,
+@samp{.lo}.
+
+If shared libraries are being built, any necessary PIC generation flags
+are substituted into the compilation command.
+
+The following components of @var{mode-args} are treated specially:
+
+@table @option
+@item -o
+Note that the @option{-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
+@example
+libtool --mode=compile gcc -c foo/x.c -o foo/x.lo
+@end example
+will do what you expect.
+
+Note, however, that, if the compiler does not support @option{-c} and
+@option{-o}, it is impossible to compile @file{foo/x.c} without
+overwriting an existing @file{./x.o}. Therefore, if you do have a
+source file @file{./x.c}, make sure you introduce dependencies in your
+@file{Makefile} to make sure @file{./x.o} (or @file{./x.lo}) is
+re-created after any sub-directory's @file{x.lo}:
+
+@example
+x.o x.lo: foo/x.lo bar/x.lo
+@end example
+
+@noindent
+This will also ensure that make won't try to use a temporarily corrupted
+@file{x.o} to create a program or library. It may cause needless
+recompilation on platforms that support @option{-c} and @option{-o}
+together, but it's the only way to make it safe for those that don't.
+
+@item -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 @option{-no-suppress} option is given in compile mode,
+libtool will show the compiler output for both objects.
+
+@item -prefer-pic
+Libtool will try to build only PIC objects.
+
+@item -prefer-non-pic
+Libtool will try to build only non-PIC objects.
+
+@item -shared
+Even if Libtool was configured with @option{--enable-static}, the object
+file Libtool builds will not be suitable for static linking. Libtool
+will signal an error if it was configured with @option{--disable-shared},
+or if the host does not support shared libraries.
+
+@item -static
+Even if libtool was configured with @option{--disable-static}, the
+object file Libtool builds @strong{will} be suitable for static
+linking.
+
+@item -Wc,@var{flag}
+@itemx -Xcompiler @var{flag}
+Pass a flag directly to the compiler. With @code{-Wc,}, multiple flags
+may be separated by commas, whereas @code{-Xcompiler } passes through
+commas unchanged.
+@end table
+
+@node Link mode
+@section Link mode
+@cindex link mode
+@cindex mode, link
+
+@dfn{Link} mode links together object files (including library
+objects) to form another library or to create an executable program.
+
+@var{mode-args} consist of a command using the C compiler to create an
+output file (with the @option{-o} flag) from several object files.
+
+The following components of @var{mode-args} are treated specially:
+
+@table @option
+@cindex undefined symbols, allowing
+@cindex unresolved symbols, allowing
+@item -all-static
+If @var{output-file} is a program, then do not link it against any
+shared libraries at all. If @var{output-file} is a library, then only
+create a static library. In general, this flag cannot be used together
+with @samp{disable-static} (@pxref{LT_INIT}).
+
+@item -avoid-version
+Tries to avoid versioning (@pxref{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.
+
+@item -bindir
+Pass the absolute name of the directory for installing executable
+programs (@pxref{Directory Variables, , Directory Variables, standards,
+The GNU Coding Standards}). @command{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 @env{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, @option{-bindir} is ignored. The default value used
+is @file{@var{libdir}/../bin} for libraries installed to
+@file{@var{libdir}}. You should not use @option{-bindir} for modules.
+
+@item -dlopen @var{file}
+Same as @option{-dlpreopen @var{file}}, if native dlopening is not
+supported on the host platform (@pxref{Dlopened modules}) or if
+the program is linked with @option{-static},
+@option{-static-libtool-libs}, or @option{-all-static}. Otherwise, no
+effect. If @var{file} is @code{self} Libtool will make sure that the
+program can @code{dlopen} itself, either by enabling
+@option{-export-dynamic} or by falling back to @option{-dlpreopen self}.
+
+@item -dlpreopen @var{file}
+Link @var{file} into the output program, and add its symbols to the
+list of preloaded symbols (@pxref{Dlpreopening}). If @var{file} is
+@code{self}, the symbols of the program itself will be added to
+preloaded symbol lists. If @var{file} is @code{force} Libtool will
+make sure that a preloaded symbol list is always @emph{defined},
+regardless of whether it's empty or not.
+
+@item -export-dynamic
+Allow symbols from @var{output-file} to be resolved with @code{dlsym}
+(@pxref{Dlopened modules}).
+
+@item -export-symbols @var{symfile}
+Tells the linker to export only the symbols listed in @var{symfile}.
+The symbol file should end in @file{.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.
+
+@item -export-symbols-regex @var{regex}
+Same as @option{-export-symbols}, except that only symbols matching
+the regular expression @var{regex} are exported.
+By default all symbols are exported.
+
+@item -L@var{libdir}
+Search @var{libdir} for required libraries that have already been
+installed.
+
+@item -l@var{name}
+@var{output-file} requires the installed library @file{lib@var{name}}.
+This option is required even when @var{output-file} is not an
+executable.
+
+@item -module
+Creates a library that can be dlopened (@pxref{Dlopened modules}).
+This option doesn't work for programs.
+Module names don't need to be prefixed with @samp{lib}.
+In order to prevent name clashes, however, @file{lib@var{name}} and @file{@var{name}}
+must not be used at the same time in your package.
+
+@item -no-fast-install
+Disable fast-install mode for the executable @var{output-file}. Useful
+if the program won't be necessarily installed.
+
+@item -no-install
+Link an executable @var{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.
+
+@item -no-undefined
+Declare that @var{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 (@pxref{Inter-library
+dependencies}), and using this parameter allows @command{libtool} to
+assume that this will not happen.
+
+@item -o @var{output-file}
+Create @var{output-file} from the specified objects and libraries.
+
+@item -objectlist @var{file}
+Use a list of object files found in @var{file} to specify objects.
+
+@item -os2dllname @var{name}
+Use this to change the DLL base name on OS/2 to @var{name}, to keep
+within the 8 character base name limit on this system.
+
+@item -precious-files-regex @var{regex}
+Prevents removal of files from the temporary output directory whose
+names match this regular expression. You might specify @samp{\.bbg?$}
+to keep those files created with @code{gcc -ftest-coverage} for example.
+
+@item -release @var{release}
+Specify that the library was generated by release @var{release} of your
+package, so that users can easily tell what 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 @option{-version-info} flag instead (@pxref{Versioning}).
+
+@item -rpath @var{libdir}
+If @var{output-file} is a library, it will eventually be installed in
+@var{libdir}. If @var{output-file} is a program, add @var{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 @var{output-file} is a Windows (or
+other PE platform) DLL, the @file{.la} control file will be installed in
+@var{libdir}, but see @option{-bindir} above for the eventual destination
+of the @file{.dll} or other library file itself.
+
+@item -R @var{libdir}
+If @var{output-file} is a program, add @var{libdir} to its run-time
+path. If @var{output-file} is a library, add @option{-R@var{libdir}} to its
+@var{dependency_libs}, so that, whenever the library is linked into a
+program, @var{libdir} will be added to its run-time path.
+
+@item -shared
+If @var{output-file} is a program, then link it against any
+uninstalled shared libtool libraries (this is the default behavior).
+If @var{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 @option{--disable-shared}, or if the host does not support shared
+libraries.
+
+@item -shrext @var{suffix}
+If @var{output-file} is a libtool library, replace the system's standard
+file name extension for shared libraries with @var{suffix} (most systems
+use @file{.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.
+
+@item -static
+If @var{output-file} is a program, then do not link it against any
+uninstalled shared libtool libraries. If @var{output-file} is a
+library, then only create a static library.
+
+@item -static-libtool-libs
+If @var{output-file} is a program, then do not link it against any
+shared libtool libraries. If @var{output-file} is a library, then only
+create a static library.
+
+@item -version-info @var{current}[:@var{revision}[:@var{age}]]
+If @var{output-file} is a libtool library, use interface version
+information @var{current}, @var{revision}, and @var{age} to build it
+(@pxref{Versioning}). Do @strong{not} use this flag to specify package
+release information, rather see the @option{-release} flag.
+
+@item -version-number @var{major}[:@var{minor}[:@var{revision}]]
+If @var{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 @option{-version-info} flag
+instead.
+
+@item -weak @var{libname}
+if @var{output-file} is a libtool library, declare that it provides a
+weak @var{libname} interface. This is a hint to libtool that there is
+no need to append @var{libname} to the list of dependency libraries of
+@var{output-file}, because linking against @var{output-file} already
+supplies the same interface (@pxref{Linking with dlopened modules}).
+
+@item -Wc,@var{flag}
+@itemx -Xcompiler @var{flag}
+Pass a linker-specific flag directly to the compiler. With @code{-Wc,},
+multiple flags may be separated by commas, whereas @code{-Xcompiler }
+passes through commas unchanged.
+
+@item -Wl,@var{flag}
+@itemx -Xlinker @var{flag}
+Pass a linker-specific flag directly to the linker.
+
+@item -XCClinker @var{flag}
+Pass a link-specific flag to the compiler driver (@code{CC}) during linking.
+@end table
+
+If the @var{output-file} ends in @file{.la}, then a libtool library is
+created, which must be built only from library objects (@file{.lo} files).
+The @option{-rpath} option is required. In the current implementation,
+libtool libraries may not depend on other uninstalled libtool libraries
+(@pxref{Inter-library dependencies}).
+
+If the @var{output-file} ends in @file{.a}, then a standard library is
+created using @code{ar} and possibly @code{ranlib}.
+
+@cindex partial linking
+@cindex linking, partial
+If @var{output-file} ends in @file{.o} or @file{.lo}, then a reloadable object
+file is created from the input files (generally using @samp{ld -r}).
+This method is often called @dfn{partial linking}.
+
+Otherwise, an executable program is created.
+
+@node Execute mode
+@section Execute mode
+@cindex execute mode
+@cindex mode, execute
+
+For @dfn{execute} mode, the library path is automatically set, then a
+program is executed.
+
+The first of the @var{mode-args} is treated as a program name, with the
+rest as arguments to that program.
+
+The following components of @var{mode-args} are treated specially:
+
+@table @option
+@item -dlopen @var{file}
+Add the directory containing @var{file} to the library path.
+@end table
+
+This mode sets the library path environment variable according to any
+@option{-dlopen} flags.
+
+If any of the @var{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.
+
+@node Install mode
+@section Install mode
+@cindex install mode
+@cindex mode, install
+
+In @dfn{install} mode, libtool interprets most of the elements of
+@var{mode-args} as an installation command beginning with
+@command{cp}, or a BSD-compatible @command{install} program.
+
+The following components of @var{mode-args} are treated specially:
+
+@table @option
+@item -inst-prefix-dir @var{inst-prefix-dir}
+When installing into a temporary staging area, rather than the
+final @code{prefix}, this argument is used to reflect the
+temporary path, in much the same way @command{automake} uses
+@env{DESTDIR}. For instance, if @code{prefix} is @file{/usr/local},
+but @var{inst-prefix-dir} is @file{/tmp}, then the object will be
+installed under @file{/tmp/usr/local/}. If the installed object
+is a libtool library, then the internal fields of that library
+will reflect only @code{prefix}, not @var{inst-prefix-dir}:
+
+@example
+# Directory that this library needs to be installed in:
+libdir='/usr/local/lib'
+@end example
+
+not
+
+@example
+# Directory that this library needs to be installed in:
+libdir='/tmp/usr/local/lib'
+@end example
+
+@code{inst-prefix} is also used to ensure that if the installed
+object must be relinked upon installation, that it is relinked
+against the libraries in @var{inst-prefix-dir}/@code{prefix},
+not @code{prefix}.
+
+In truth, this option is not really intended for use when calling
+libtool directly; it is automatically used when @code{libtool --mode=install}
+calls @code{libtool --mode=relink}. Libtool does this by
+analyzing the destination path given in the original
+@code{libtool --mode=install} command and comparing it to the
+expected installation path established during @code{libtool --mode=link}.
+
+Thus, end-users need change nothing, and @command{automake}-style
+@code{make install DESTDIR=/tmp} will Just Work(tm) most of the time.
+For systems where fast installation cannot be turned on, relinking
+may be needed. In this case, a @samp{DESTDIR} install will fail.
+
+Currently it is not generally possible to install into a temporary
+staging area that contains needed third-party libraries that are
+not yet visible at their final location.
+@end table
+
+The rest of the @var{mode-args} are interpreted as arguments to the
+@command{cp} or @command{install} command.
+
+The command is run, and any necessary unprivileged post-installation
+commands are also completed.
+
+@node Finish mode
+@section Finish mode
+@cindex finish mode
+@cindex mode, finish
+
+@dfn{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 @var{mode-arg}. Running this command may require superuser
+privileges, and the @option{--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 @var{mode-arg} is a @file{.la} file.
+
+@node Uninstall mode
+@section Uninstall mode
+@cindex uninstall mode
+@cindex mode, uninstall
+
+@dfn{Uninstall} mode deletes installed libraries, executables and objects.
+
+The first @var{mode-arg} is the name of the program to use to delete
+files (typically @command{/bin/rm}).
+
+The remaining @var{mode-args} are either flags for the deletion program
+(beginning with a @samp{-}), or the names of files to delete.
+
+@node Clean mode
+@section Clean mode
+@cindex clean mode
+@cindex mode, clean
+
+@dfn{Clean} mode deletes uninstalled libraries, executables, objects
+and libtool's temporary files associated with them.
+
+The first @var{mode-arg} is the name of the program to use to delete
+files (typically @command{/bin/rm}).
+
+The remaining @var{mode-args} are either flags for the deletion program
+(beginning with a @samp{-}), or the names of files to delete.
+
+@node Integrating libtool
+@chapter 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 that Libtool may be integrated in your
+package, described in the following sections. Typically, the Libtool
+macro files as well as @file{ltmain.sh} are copied into your package
+using @command{libtoolize} and @command{aclocal} after setting up the
+@file{configure.ac} and toplevel @file{Makefile.am}, then
+@command{autoconf} adds the needed tests to the @file{configure} script.
+These individual steps are often automated with @command{autoreconf}.
+
+Here is a diagram showing how such a typical Libtool configuration works
+when preparing a package for distribution, assuming that @file{m4} has
+been chosen as location for additional Autoconf macros, and
+@file{build-aux} as location for auxiliary build tools (@pxref{Input,,
+The Autoconf Manual, autoconf, The Autoconf Manual}):
+
+@example
+@group
+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/]
+@end group
+@end example
+
+During configuration, the @file{libtool} script is generated either
+through @command{config.status} or @command{config.lt}:
+
+@example
+@group
+ .--> config.status* --.
+configure* --+ +--> libtool
+ `--> [config.lt*] ----' ^
+ |
+ltmain.sh --------------------------------'
+@end group
+@end example
+
+At @command{make} run time, @command{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 @file{aclocal.m4}. As another example, an
+external, pre-configured @command{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 @file{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.
+@end menu
+
+@node Autoconf macros
+@section 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.
+
+@noindent
+Macros in the @samp{LT_CMD_} namespace check for various shell
+commands:
+
+@defmac LT_CMD_MAX_LEN
+Finds the longest command line that can be safely passed to
+@samp{$SHELL} without being truncated, and store in the shell variable
+@samp{$max_cmd_len}. It is only an approximate value, but command
+lines of this length or shorter are guaranteed not to be truncated.
+@end defmac
+
+@noindent
+Macros in the @samp{LT_FUNC_} namespace check characteristics of
+library functions:
+
+@defmac LT_FUNC_DLSYM_USCORE
+@samp{AC_DEFINE} the preprocessor symbol @samp{DLSYM_USCORE} if we
+have to add an underscore to symbol-names passed in to @samp{dlsym}.
+@end defmac
+
+@noindent
+Macros in the @samp{LT_LIB_} namespace check characteristics of system
+libraries:
+
+@defmac LT_LIB_M
+Set @samp{LIBM} to the math library or libraries required on this
+machine, if any.
+@end defmac
+
+@defmac LT_LIB_DLLOAD
+This is the macro used by @samp{libltdl} to determine what dlloaders
+to use on this machine, if any. Several shell variables are set (and
+@samp{AC_SUBST}ed) depending on the dlload interfaces are available on
+this machine. @samp{LT_DLLOADERS} contains a list of libtool
+libraries that can be used, and if necessary also sets
+@samp{LIBADD_DLOPEN} if additional system libraries are required by
+the @samp{dlopen} loader, and @samp{LIBADD_SHL_LOAD} if additional
+system libraries are required by the @samp{shl_load} loader,
+respectively. Finally some symbols are set in @file{config.h}
+depending on the loaders that are found to work: @samp{HAVE_LIBDL},
+@samp{HAVE_SHL_LOAD}, @samp{HAVE_DYLD}, @samp{HAVE_DLD}.
+@end defmac
+
+@noindent
+Macros in the @samp{LT_PATH_} namespace search the system for the full
+path to particular system commands:
+
+@defmac LT_PATH_LD
+Add a @option{--with-gnu-ld} option to @file{configure}. Try to find
+the path to the linker used by @samp{$CC}, and whether it is the
+GNU linker. The result is stored in the shell variable
+@samp{$LD}, which is @code{AC_SUBST}ed.
+@end defmac
+
+@defmac LT_PATH_NM
+Try to find a BSD-compatible @command{nm} or a MS-compatible
+@command{dumpbin} command on this machine. The result is stored in the
+shell variable @samp{$NM}, which is @code{AC_SUBST}ed.
+@end defmac
+
+@noindent
+Macros in the @samp{LT_SYS_} namespace probe for system
+characteristics:
+
+@defmac 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 @samp{$enable_dlopen_self} and
+@samp{enable_dlopen_self_static} respectively.
+@end defmac
+
+@defmac LT_SYS_DLOPEN_DEPLIBS
+Define the preprocessor symbol @samp{LTDL_DLOPEN_DEPLIBS} if the
+OS needs help to load dependent libraries for @samp{dlopen} (or
+equivalent).
+@end defmac
+
+@defmac LT_SYS_DLSEARCH_PATH
+Define the preprocessor symbol @samp{LT_DLSEARCH_PATH} to the system
+default library search path.
+@end defmac
+
+@defmac LT_SYS_MODULE_EXT
+Define the preprocessor symbol @samp{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,
+@file{.la}.
+@end defmac
+
+@defmac LT_SYS_MODULE_PATH
+Define the preprocessor symbol @samp{LT_MODULE_PATH_VAR} to the name
+of the shell environment variable that determines the run-time module
+search path.
+@end defmac
+
+@defmac LT_SYS_SYMBOL_USCORE
+Set the shell variable @samp{sys_symbol_underscore} to @samp{no}
+unless the compiler prefixes global symbols with an underscore.
+@end defmac
+
+
+@node Makefile rules
+@section Writing @file{Makefile} rules for libtool
+@cindex Makefile
+@cindex Makefile.am
+@cindex Makefile.in
+
+Libtool is fully integrated with Automake (@pxref{Top,, Introduction,
+automake, The Automake Manual}), starting with Automake version 1.2.
+
+If you want to use libtool in a regular @file{Makefile} (or
+@file{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:
+
+@enumerate 1
+@item
+Download the latest Automake distribution from your nearest GNU
+mirror, install it, and start using it.
+
+@item
+Learn how to write @file{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 @file{Makefile.in} in the @file{tests/demo}
+subdirectory of the libtool distribution@dots{} note especially that it
+was automatically generated from the @file{Makefile.am} by Automake).
+@end enumerate
+
+@node Using Automake
+@section Using Automake with libtool
+
+@vindex LTLIBRARIES
+Libtool library support is implemented under the @samp{LTLIBRARIES}
+primary.
+
+Here are some samples from the Automake @file{Makefile.am} in the
+libtool distribution's @file{demo} subdirectory.
+
+First, to link a program against a libtool library, just use the
+@samp{program_LDADD}@footnote{@c
+@c
+Since GNU Automake 1.5, the flags @option{-dlopen}
+or @option{-dlpreopen} (@pxref{Link mode}) can be employed with the
+@samp{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
+@samp{program_DEPENDENCIES} too:
+
+@example
+program_LDADD = "-dlopen" libfoo.la
+program_DEPENDENCIES = libfoo.la
+@end example
+@c
+} variable:
+
+@example
+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
+@end example
+
+You may use the @samp{program_LDFLAGS} variable to stuff in any flags
+you want to pass to libtool while linking @file{program} (such as
+@option{-static} to avoid linking uninstalled shared libtool libraries).
+
+Building a libtool library is almost as trivial@dots{} note the use of
+@samp{libhello_la_LDFLAGS} to pass the @option{-version-info}
+(@pxref{Versioning}) option to libtool:
+
+@example
+# 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
+@end example
+
+The @option{-rpath} option is passed automatically by Automake (except for
+libraries listed as @code{noinst_LTLIBRARIES}), so you
+should not specify it.
+
+@xref{A Shared Library, Building a Shared Library, The Automake Manual,
+automake, The Automake Manual}, for more information.
+
+@node Configuring
+@section Configuring libtool
+@cindex configuring libtool
+
+Libtool requires intimate knowledge of your compiler suite and operating
+system 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
+(@pxref{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 @dfn{configured} before it can be
+used. This idea should be familiar to anybody who has used a GNU
+@code{configure} script. @code{configure} runs a number of tests for
+system features, then generates the @file{Makefile}s (and possibly a
+@file{config.h} header file), after which you can run @code{make} and
+build the package.
+
+Libtool adds its own tests to your @code{configure} script to
+generate a libtool script for the installer's host machine.
+
+@menu
+* LT_INIT:: Configuring @code{libtool} in @file{configure.ac}.
+* Configure notes:: Platform-specific notes for configuration.
+@end menu
+
+@node LT_INIT
+@subsection The @code{LT_INIT} macro
+
+If you are using GNU Autoconf (or Automake), you should add a call to
+@code{LT_INIT} to your @file{configure.ac} file. This macro
+adds many new tests to the @code{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:
+
+@defmac LT_PREREQ (@var{version})
+Ensure that a recent enough version of Libtool is being used. If the
+version of Libtool used for @code{LT_INIT} is earlier than
+@var{version}, print an error message to the standard
+error output and exit with failure (exit status is 63). For example:
+
+@example
+LT_PREREQ([@value{VERSION}])
+@end example
+@end defmac
+
+@defmac LT_INIT (@var{options})
+@defmacx AC_PROG_LIBTOOL
+@defmacx AM_PROG_LIBTOOL
+Add support for the @option{--enable-shared}, @option{--disable-shared},
+@option{--enable-static}, @option{--disable-static}, @option{--with-pic}, and
+@option{--without-pic} @code{configure} flags.@footnote{@code{LT_INIT} requires
+that you define the @file{Makefile} variable @code{top_builddir} in your
+@file{Makefile.in}. Automake does this automatically, but Autoconf
+users should set it to the relative path to the top of your build
+directory (@file{../..}, for example).} @code{AC_PROG_LIBTOOL} and
+@code{AM_PROG_LIBTOOL} are deprecated names for older versions of this macro;
+@code{autoupdate} will upgrade your @file{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
+@code{disable-shared} or @code{disable-static} in the option list to
+@code{LT_INIT}, or using @code{AC_DISABLE_SHARED} or @code{AC_DISABLE_STATIC}.
+
+@example
+# Turn off shared libraries during beta-testing, since they
+# make the build process take too long.
+LT_INIT([disable-shared])
+@end example
+
+The user may specify modified forms of the configure flags
+@option{--enable-shared} and @option{--enable-static} to choose whether
+shared or static libraries are built based on the name of the package.
+For example, to have shared @samp{bfd} and @samp{gdb} libraries built,
+but not shared @samp{libg++}, you can run all three @code{configure}
+scripts as follows:
+
+@example
+trick$ ./configure --enable-shared=bfd,gdb
+@end example
+
+In general, specifying @option{--enable-shared=@var{pkgs}} is the same as
+configuring with @option{--enable-shared} every package named in the
+comma-separated @var{pkgs} list, and every other package with
+@option{--disable-shared}. The @option{--enable-static=@var{pkgs}} flag
+behaves similarly, but it uses @option{--enable-static} and
+@option{--disable-static}. The same applies to the
+@option{--enable-fast-install=@var{pkgs}} flag, which uses
+@option{--enable-fast-install} and @option{--disable-fast-install}.
+
+The package name @samp{default} matches any packages that have not set
+their name in the @code{PACKAGE} environment variable.
+
+The @option{--with-pic} and @option{--without-pic} configure flags can be used
+to specify whether or not @command{libtool} uses PIC objects. By default,
+@command{libtool} uses PIC objects for shared libraries and non-PIC objects for
+static libraries. The @option{--with-pic} option also accepts a comma-separated
+list of package names. Specifying @option{--with-pic=@var{pkgs}} is the same
+as configuring every package in @var{pkgs} with @option{--with-pic} and every
+other package with the default configuration. The package name @samp{default}
+is treated the same as for @option{--enable-shared} and
+@option{--enable-static}.
+
+This macro also sets the shell variable @code{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 @file{configure.ac}:
+
+@example
+LT_INIT
+AC_SUBST([LIBTOOL_DEPS])
+@end example
+
+and, to @file{Makefile.in} or @file{Makefile.am}:
+
+@example
+LIBTOOL_DEPS = @@LIBTOOL_DEPS@@
+libtool: $(LIBTOOL_DEPS)
+ $(SHELL) ./config.status libtool
+@end example
+
+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 @file{libtool}.
+
+Aside from @code{disable-static} and @code{disable-shared}, there are
+other options that you can pass to @code{LT_INIT} to modify its
+behaviour. Here is a full list:
+
+@table @samp
+@item dlopen
+Enable checking for dlopen support. This option should be used if
+the package makes use of the @option{-dlopen} and @option{-dlpreopen}
+libtool flags, otherwise libtool will assume that the system does not
+support dlopening.
+
+@item 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 @code{__declspec(dllexport)} and imported with
+@code{__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 @option{-no-undefined} to @code{libtool}
+in link mode from the package @code{Makefile}. Naturally, if you pass
+@option{-no-undefined}, you must ensure that all the library symbols
+@strong{really are} defined at link time!
+
+@item aix-soname=aix
+@itemx aix-soname=svr4
+@itemx aix-soname=both
+Enable the @option{--with-aix-soname} to @command{configure}, which the
+user can pass to override the given default.
+
+By default (and @strong{always} in releases prior to 2.4.4), Libtool always
+behaves as if @code{aix-soname=aix} is given, with no @command{configure}
+option for the user to override. Specifically, when the @option{-brtl} linker
+flag is seen in @code{LDFLAGS} at build-time, static archives are built from
+static objects only, otherwise, traditional AIX shared library archives of
+shared objects using in-archive versioning are built (with the @code{.a} file
+extension!). Similarly, with @option{-brtl} in @code{LDFLAGS}, libtool
+shared archives are built from shared objects, without any filename-based
+versioning; and without @option{-brtl} no shared archives are built at all.
+
+When @code{aix-soname=svr4} option is given, or the
+@option{--with-aix-soname=svr4} @command{configure} option is passed, static
+archives are always created from static objects, even without @option{-brtl}
+in @code{LDFLAGS}. Shared archives are made from shared objects, and filename
+based versioning is enabled.
+
+When @code{aix-soname=both} option is given, or the
+@option{--with-aix-soname=svr4} @command{configure} option is passed, static
+archives are built traditionally (as @option{aix-soname=aix}), and both
+kinds of shared archives are built. The @code{.la} pseudo-archive specifies
+one or the other depending on whether @option{-brtl} is specified in
+@code{LDFLAGS} when the library is built.
+
+@item disable-fast-install
+Change the default behaviour for @code{LT_INIT} to disable
+optimization for fast installation. The user may still override this
+default, depending on platform support, by specifying
+@option{--enable-fast-install} to @command{configure}.
+
+@item shared
+Change the default behaviour for @code{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
+@option{--disable-shared} to @command{configure}.
+
+@item disable-shared
+Change the default behaviour for @code{LT_INIT} to disable
+shared libraries. The user may still override this default by
+specifying @option{--enable-shared} to @command{configure}.
+
+@item static
+Change the default behaviour for @code{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 @option{--disable-static} to
+@command{configure}.
+
+@item disable-static
+Change the default behaviour for @code{LT_INIT} to disable
+static libraries. The user may still override this default by
+specifying @option{--enable-static} to @command{configure}.
+
+@item pic-only
+Change the default behaviour for @command{libtool} to try to use only
+PIC objects. The user may still override this default by specifying
+@option{--without-pic} to @command{configure}.
+
+@item no-pic
+Change the default behaviour of @command{libtool} to try to use only
+non-PIC objects. The user may still override this default by
+specifying @option{--with-pic} to @command{configure}.
+
+@end table
+
+@end defmac
+
+@defmac LT_LANG (@var{language})
+Enable @command{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 @code{AC_PROG_CXX} are
+used in your @file{configure.ac}, Libtool language support will automatically
+be enabled.
+
+Conversely using @code{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.
+
+@example
+LT_INIT
+LT_LANG([C++])
+@end example
+
+@example
+LT_INIT
+AC_PROG_CXX
+@end example
+
+@end defmac
+
+@defmac AC_LIBTOOL_DLOPEN
+This macro is deprecated, the @samp{dlopen} option to @code{LT_INIT} should be
+used instead.
+@end defmac
+
+@defmac AC_LIBTOOL_WIN32_DLL
+This macro is deprecated, the @samp{win32-dll} option to @code{LT_INIT} should
+be used instead.
+@end defmac
+
+@defmac AC_DISABLE_FAST_INSTALL
+This macro is deprecated, the @samp{disable-fast-install} option to @code{LT_INIT}
+should be used instead.
+@end defmac
+
+@defmac AC_DISABLE_SHARED
+@defmacx AM_DISABLE_SHARED
+Change the default behaviour for @code{LT_INIT} to disable shared libraries.
+The user may still override this default by specifying @samp{--enable-shared}.
+The option @samp{disable-shared} to @code{LT_INIT} is a shorthand for this.
+@code{AM_DISABLE_SHARED} is a deprecated alias for @code{AC_DISABLE_SHARED}.
+@end defmac
+
+@defmac AC_ENABLE_SHARED
+@defmacx AM_ENABLE_SHARED
+Change the default behaviour for @code{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
+@samp{--disable-shared}. The option @samp{shared} to @code{LT_INIT} is a
+shorthand for this.
+@code{AM_ENABLE_SHARED} is a deprecated alias for @code{AC_ENABLE_SHARED}.
+@end defmac
+
+@defmac AC_DISABLE_STATIC
+@defmacx AM_DISABLE_STATIC
+Change the default behaviour for @code{LT_INIT} to disable static libraries.
+The user may still override this default by specifying @samp{--enable-static}.
+The option @samp{disable-static} to @code{LT_INIT} is a shorthand for this.
+@code{AM_DISABLE_STATIC} is a deprecated alias for @code{AC_DISABLE_STATIC}.
+@end defmac
+
+@defmac AC_ENABLE_STATIC
+@defmacx AM_ENABLE_STATIC
+Change the default behaviour for @code{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 @samp{--disable-static}. The option @samp{static} to @code{LT_INIT}
+is a shorthand for this.
+@code{AM_ENABLE_STATIC} is a deprecated alias for @code{AC_ENABLE_STATIC}.
+@end defmac
+
+The tests in @code{LT_INIT} also recognize the following
+environment variables:
+
+@defvar CC
+The C compiler that will be used by the generated @code{libtool}. If
+this is not set, @code{LT_INIT} will look for @command{gcc} or
+@command{cc}.
+@end defvar
+
+@defvar CFLAGS
+Compiler flags used to generate standard object files. If this is not
+set, @code{LT_INIT} will not use any such flags. It affects
+only the way @code{LT_INIT} runs tests, not the produced
+@code{libtool}.
+@end defvar
+
+@defvar CPPFLAGS
+C preprocessor flags. If this is not set, @code{LT_INIT} will
+not use any such flags. It affects only the way @code{LT_INIT}
+runs tests, not the produced @code{libtool}.
+@end defvar
+
+@defvar LD
+The system linker to use (if the generated @code{libtool} requires one).
+If this is not set, @code{LT_INIT} will try to find out what is
+the linker used by @code{CC}.
+@end defvar
+
+@defvar LDFLAGS
+The flags to be used by @code{libtool} when it links a program. If
+this is not set, @code{LT_INIT} will not use any such flags. It
+affects only the way @code{LT_INIT} runs tests, not the produced
+@code{libtool}.
+@end defvar
+
+@defvar LIBS
+The libraries to be used by @code{LT_INIT} when it links a
+program. If this is not set, @code{LT_INIT} will not use any
+such flags. It affects only the way @code{LT_INIT} runs tests,
+not the produced @code{libtool}.
+@end defvar
+
+@defvar NM
+Program to use rather than checking for @command{nm}.
+@end defvar
+
+@defvar RANLIB
+Program to use rather than checking for @command{ranlib}.
+@end defvar
+
+@defvar LN_S
+A command that creates a link of a program, a soft-link if possible, a
+hard-link otherwise. @code{LT_INIT} will check for a suitable
+program if this variable is not set.
+@end defvar
+
+@defvar DLLTOOL
+Program to use rather than checking for @command{dlltool}. Only meaningful
+for Cygwin/MS-Windows.
+@end defvar
+
+@defvar OBJDUMP
+Program to use rather than checking for @command{objdump}. Only meaningful
+for Cygwin/MS-Windows.
+@end defvar
+
+@defvar AS
+Program to use rather than checking for @command{as}. Only used on
+Cygwin/MS-Windows at the moment.
+@end defvar
+
+@defvar MANIFEST_TOOL
+Program to use rather than checking for @command{mt}, the Manifest Tool.
+Only used on Cygwin/MS-Windows at the moment.
+@end defvar
+
+@defvar LT_SYS_LIBRARY_PATH
+Libtool has heuristics for the system search path for runtime-loaded
+libraries. If the guessed default does not match the setup of the host
+system, this variable can be used to modify that path list, as follows
+(@code{LT_SYS_LIBRARY_PATH} is a colon-delimited list like @code{PATH}):
+@itemize @bullet
+@item @code{path:}
+The heuristically determined paths will be appened after the trailing
+colon;
+@item @code{:path}
+The heuristically determined paths will be prepended before the leading
+colon;
+@item @code{path::path}
+The heuristically determined paths will be inserted between the double
+colons;
+@item @code{path}
+With no dangling colons, the heuristically determined paths will be
+ignored entirely.
+@end itemize
+@end defvar
+
+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 @option{--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 @file{configure.ac} as soon as @code{LT_INIT} had
+completed. However, one of the features of libtool 1.4 was that the
+libtool configuration was migrated out of a separate @file{ltconfig}
+file, and added to the @code{LT_INIT} macro (nee @code{AC_PROG_LIBTOOL}),
+so the results of the configuration tests were available directly to code in
+@file{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 @file{config.status} pass,
+which happens after all the code in @file{configure.ac} has
+completed. The implication of this is that the libtool script does
+not exist during execution of code from @file{configure.ac}, and so
+obviously it cannot be called for @option{--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 @file{config.status} for inclusion in the
+generated libtool script.
+
+@defmac LT_OUTPUT
+By default, the configured @file{libtool} script is generated by the
+call to @code{AC_OUTPUT} command, and there is rarely any need to use
+@file{libtool} from @file{configure}. However, sometimes it is
+necessary to run configure time compile and link tests using
+@file{libtool}. You can add @code{LT_OUTPUT} to your
+@file{configure.ac} any time after @code{LT_INIT} and any
+@code{LT_LANG} calls; that done, @file{libtool} will be created by a
+specially generated @file{config.lt} file, and available for use in
+later tests.
+
+Also, when @code{LT_OUTPUT} is used, for backwards compatibility with
+Automake regeneration rules, @file{config.status} will call
+@file{config.lt} to regenerate @file{libtool}, rather than generating
+the file itself.
+@end defmac
+
+@pindex aclocal
+When you invoke the @command{libtoolize} program (@pxref{Invoking
+libtoolize}), it will tell you where to find a definition of
+@code{LT_INIT}. If you use Automake, the @command{aclocal} program
+will automatically add @code{LT_INIT} support to your
+@file{configure} script when it sees the invocation of @code{LT_INIT}
+in @file{configure.ac}.
+
+Because of these changes, and the runtime version compatibility checks
+Libtool now executes, we now advise @strong{against} including a copy of
+@file{libtool.m4} (and brethren) in @file{acinclude.m4}. Instead,
+you should set your project macro directory with
+@code{AC_CONFIG_MACRO_DIRS}. When you @command{libtoolize} your
+project, a copy of the relevant macro definitions will be placed in
+your @code{AC_CONFIG_MACRO_DIRS}, where @command{aclocal} can reference
+them directly from @file{aclocal.m4}.
+
+
+@node Configure notes
+@subsection 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.
+
+@include notes.texi
+
+
+@node Distributing
+@section Including libtool in your package
+
+In order to use libtool, you need to include the following files with
+your package:
+
+@table @file
+@item config.guess
+@pindex config.guess
+Attempt to guess a canonical system name.
+
+@item config.sub
+@pindex config.sub
+Canonical system name validation subroutine script.
+
+@item install-sh
+@pindex install-sh
+BSD-compatible @command{install} replacement script.
+
+@item ltmain.sh
+@pindex ltmain.sh
+A generic script implementing basic libtool functionality.
+@end table
+
+Note that the libtool script itself should @emph{not} be included with
+your package. @xref{Configuring}.
+
+You should use the @command{libtoolize} program, rather than manually
+copying these files into your package.
+
+@menu
+* Invoking libtoolize:: @code{libtoolize} command line options.
+* Autoconf and LTLIBOBJS:: Autoconf automates LTLIBOBJS generation.
+@end menu
+
+@node Invoking libtoolize
+@subsection Invoking @command{libtoolize}
+@pindex libtoolize
+@cindex libtoolize command options
+@cindex command options, libtoolize
+@cindex options, libtoolize command
+
+The @command{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 @command{libtoolize} program has the following synopsis:
+
+@example
+libtoolize [@var{option}]@dots{}
+@end example
+
+@noindent
+and accepts the following options:
+
+@table @option
+
+@item --copy
+@itemx -c
+Copy files from the libtool data directory rather than creating
+symlinks.
+
+@item --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 @command{less} (or
+@command{more}) or redirect to a file.
+
+@item --dry-run
+@itemx -n
+Don't run any commands that modify the file system, just print them
+out.
+
+@item --force
+@itemx -f
+Replace existing libtool files. By default, @command{libtoolize} won't
+overwrite existing files.
+
+@item --help
+Display a help message and exit.
+
+@item --ltdl [@var{target-directory-name}]
+Install libltdl in the @var{target-directory-name} subdirectory of
+your package. Normally, the directory is extracted from the argument
+to @code{LT_CONFIG_LTDL_DIR} in @file{configure.ac}, though you can
+also specify a subdirectory name here if you are not using Autoconf
+for example. If @command{libtoolize} can't determine the target
+directory, @samp{libltdl} is used as the default.
+
+@item --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.
+
+@item --nonrecursive
+If passed in conjunction with @option{--ltdl}, this option will cause
+the @command{libltdl} installed by @samp{libtoolize} to be set up for
+use with a non-recursive @command{automake} build. To make use of it,
+you will need to add the following to the @file{Makefile.am} of the
+parent project:
+
+@example
+## libltdl/ltdl.mk @r{appends to the following variables}
+## @r{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/ltdl.mk
+@end example
+
+@noindent
+
+@item --quiet
+@itemx -q
+Work silently. @samp{libtoolize --quiet} is used by GNU Automake
+to add libtool files to your package if necessary.
+
+@item --recursive
+If passed in conjunction with @option{--ltdl}, this option will cause
+the @command{libtoolize} installed @samp{libltdl} to be set up for use
+with a recursive @command{automake} build. To make use of it, you
+will need to adjust the parent project's @file{configure.ac}:
+
+@example
+AC_CONFIG_FILES([libltdl/Makefile])
+@end example
+
+@noindent
+and @file{Makefile.am}:
+
+@example
+SUBDIRS += libltdl
+@end example
+
+@item --subproject
+If passed in conjunction with @option{--ltdl}, this option will cause
+the @command{libtoolize} installed @samp{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 @command{libltdl/configure}, and then run @command{make} in the
+@file{libltdl} directory (or the subdirectory you put libltdl into).
+If your project uses Autoconf, you can use the supplied
+@samp{LT_WITH_LTDL} macro, or else call @samp{AC_CONFIG_SUBDIRS}
+directly.
+
+Previous releases of @samp{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 @samp{libltdl}, but not use the Autotools for their own build
+process.
+
+@item --verbose
+@itemx -v
+Work noisily! Give a blow by blow account of what
+@command{libtoolize} is doing.
+
+@item --version
+Print @command{libtoolize} version information and exit.
+@end table
+
+@cindex LIBTOOLIZE_OPTIONS
+Sometimes it can be useful to pass options to @command{libtoolize} even
+though it is called by another program, such as @command{autoreconf}. A
+limited number of options are parsed from the environment variable
+@code{LIBTOOLIZE_OPTIONS}: currently @option{--debug}, @option{--no-warn},
+@option{--quiet} and @option{--verbose}. Multiple options passed in
+@code{LIBTOOLIZE_OPTIONS} must be separated with a space, comma or a
+colon.
+
+By default, a warning is issued for unknown options found in
+@code{LIBTOOLIZE_OPTIONS} unless the first such option is
+@option{--no-warn}. Where @command{libtoolize} has always quit
+on receipt of an unknown option at the command line, this and all
+previous releases of @command{libtoolize} will continue unabated whatever
+the content of @code{LIBTOOLIZE_OPTIONS} (modulo some possible warning
+messages).
+
+@example
+trick$ @kbd{LIBTOOLIZE_OPTIONS=--no-warn,--quiet autoreconf --install}
+@end example
+
+@findex AC_CONFIG_MACRO_DIRS
+If @command{libtoolize} detects an explicit call to
+@code{AC_CONFIG_MACRO_DIRS} (@pxref{Input, , The Autoconf Manual,
+autoconf, The Autoconf Manual}) in your @file{configure.ac}, it will
+put the Libtool macros in the specified directory.
+
+In the future other Autotools will automatically check the contents of
+@code{AC_CONFIG_MACRO_DIRS}, but at the moment it is more portable to
+add the macro directory to @code{ACLOCAL_AMFLAGS} in
+@file{Makefile.am}, which is where the tools currently look. If
+@command{libtoolize} doesn't see @code{AC_CONFIG_MACRO_DIRS}, it too
+will honour the first @samp{-I} argument in @code{ACLOCAL_AMFLAGS}
+when choosing a directory to store libtool configuration macros in.
+It is perfectly sensible to use both @code{AC_CONFIG_MACRO_DIRS} and
+@code{ACLOCAL_AMFLAGS}, as long as they are kept in synchronisation.
+
+@example
+ACLOCAL_AMFLAGS = -I m4
+@end example
+
+When you bootstrap your project with @command{aclocal}, then you will
+need to explicitly pass the same macro directory with
+@command{aclocal}'s @samp{-I} flag:
+
+@example
+trick$ @kbd{aclocal -I m4}
+@end example
+
+@findex AC_CONFIG_AUX_DIR
+If @command{libtoolize} detects an explicit call to
+@code{AC_CONFIG_AUX_DIR} (@pxref{Input, , The Autoconf Manual,
+autoconf, The Autoconf Manual}) in your @file{configure.ac}, it
+will put the other support files in the specified directory.
+Otherwise they too end up in the project root directory.
+
+Unless @option{--no-warn} is passed, @command{libtoolize} displays
+hints for adding libtool support to your package, as well.
+
+@node Autoconf and LTLIBOBJS
+@subsection Autoconf and @code{LTLIBOBJS}
+
+People used to add code like the following to their
+@file{configure.ac}:
+
+@cindex LTLIBOBJS
+@example
+LTLIBOBJS=`echo "$LIBOBJS" | sed 's/\.[^.]* /.lo /g;s/\.[^.]*$/.lo/'`
+AC_SUBST([LTLIBOBJS])
+@end example
+
+@noindent
+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 @code{AC_OUTPUT} takes care of setting
+@code{LTLIBOBJS} up correctly, so you can simply delete such snippets
+from your @file{configure.ac} if you had them.
+
+
+@node Static-only libraries
+@section Static-only libraries
+@cindex debugging libraries
+@cindex developing libraries
+@cindex double-compilation, avoiding
+@cindex avoiding shared libraries
+@cindex eliding shared libraries
+@cindex using shared libraries, not
+@cindex shared libraries, not using
+@cindex time, saving
+@cindex saving time
+
+When you are developing a package, it is often worthwhile to configure
+your package with the @option{--disable-shared} flag, or to override the
+defaults for @code{LT_INIT} by using the @code{disable-shared} option
+(@pxref{LT_INIT, , The @code{LT_INIT} macro}). This prevents libtool
+from building shared libraries, which has several advantages:
+
+@itemize @bullet
+@item
+compilation is twice as fast, which can speed up your development cycle,
+
+@item
+debugging is easier because you don't need to deal with any complexities
+added by shared libraries, and
+
+@item
+you can see how libtool behaves on static-only platforms.
+@end itemize
+
+You may want to put a small note in your package @file{README} to let
+other developers know that @option{--disable-shared} can save them time.
+The following example note is taken from the GIMP@footnote{GNU Image
+Manipulation Program, for those who haven't taken the plunge. See
+@url{http://www.gimp.org/}.} distribution @file{README}:
+
+@example
+The GIMP uses GNU Libtool 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 @option{--disable-shared} option to @file{configure}.
+@end example
+
+
+@node Other languages
+@chapter Using libtool with other languages
+@cindex C, not using
+@cindex languages, non-C
+@cindex C++, using
+
+Libtool was first implemented 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
+@end menu
+
+@node C++ libraries
+@section Writing libraries for C++
+@c FIXME: in the TOC, the ++ is too large (seems to be math mode)
+@cindex trouble with C++
+@cindex pitfalls using C++
+@cindex C++, pitfalls
+
+Creating libraries of C++ code should be a fairly straightforward
+process, because its object files differ from C ones in only three ways:
+
+@enumerate 1
+@item
+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++ to protect users from conflicting implementations of
+features such as constructors, exception handling, and RTTI.
+
+@item
+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 @command{ld} directly to link such libraries, and
+we should use the C++ compiler instead.
+
+@item
+C++ compilers will link some Standard C++ library in by default, but
+libtool does not know what these libraries are, so it cannot even run
+the inter-library dependence analyzer to check how to link it in.
+Therefore, running @command{ld} to link a C++ program or library is deemed
+to fail.
+@end enumerate
+
+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 @code{main()} function of a program must also be
+compiled with the C++ compiler for static C++ objects to be properly
+initialized.
+
+@node Tags
+@section Tags
+@cindex tag names
+@cindex language names
+@cindex inferring 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 @command{libtool} how it should create
+objects and libraries for each language.
+
+Tags are defined at @command{configure}-time for each language activated
+in the package (see @code{LT_LANG} in @ref{LT_INIT}). Here is the
+correspondence between language names and tags names.
+
+@multitable {Windows Resource} {Tag name}
+@item Language name @tab Tag name
+@item C @tab CC
+@item C++ @tab CXX
+@item Java @tab GCJ
+@item Fortran 77 @tab F77
+@item Fortran @tab FC
+@item Go @tab GO
+@item Windows Resource @tab RC
+@end multitable
+
+@command{libtool} tries to automatically infer what 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 @code{C} language.
+
+The tag can also be specified using @command{libtool}'s
+@option{--tag=@var{tag}} option (@pxref{Invoking libtool}). It is a good
+idea to do so in @file{Makefile} rules, because that will allow users to
+substitute the compiler without relying on @command{libtool} inference
+heuristics. When no tag is specified, @command{libtool} will default
+to @code{CC}; this tag always exists.
+
+Finally, the set of tags available in a particular project can be
+retrieved by tracing for the @code{LT_SUPPORTED_TAG} macro (@pxref{Trace
+interface}).
+
+@node Versioning
+@chapter Library interface versions
+@cindex dynamic dependencies
+@cindex dependency versioning
+@cindex shared library 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
+@command{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.
+@end menu
+
+@node Interfaces
+@section What are library interfaces?
+@cindex library interfaces
+
+Interfaces for libraries may be any of the following (and more):
+
+@itemize @bullet
+@item
+global variables: both names and types
+
+@item
+global functions: argument types and number, return types, and function names
+
+@item
+standard input, standard output, standard error, and file formats
+
+@item
+sockets, pipes, and other inter-process communication protocol formats
+@end itemize
+
+Note that static functions do not count as interfaces, because they are
+not directly available to the user of the library.
+
+@node Libtool versioning
+@section Libtool's versioning system
+@cindex libtool library versions
+@cindex formal versioning
+@cindex versioning, formal
+
+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 (@var{first-interface}, @var{last-interface}).
+
+The dynamic linker is guaranteed that if a library supports @emph{every}
+interface number between @var{first-interface} and @var{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 @file{libhello} supports interfaces 5, 16, 17, 18, and 19, and that
+libtool is used to link @file{test} against @file{libhello}.
+
+Libtool encodes the numbers 5 and 19 in @file{test}, and the dynamic
+linker will only link @file{test} against libraries that support
+@emph{every} interface between 5 and 19. So, the dynamic linker refuses
+to link @file{test} against @file{libhello}!
+
+In order to eliminate this problem, libtool only allows libraries to
+declare consecutive interface numbers. So, @file{libhello} can declare at
+most that it supports interfaces 16 through 19. Then, the dynamic
+linker will link @file{test} against @file{libhello}.
+
+So, libtool library versions are described by three integers:
+
+@table @var
+@item current
+The most recent interface number that this library implements.
+
+@item revision
+The implementation number of the @var{current} interface.
+
+@item 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 @code{@var{current} -
+@var{age}} to @code{@var{current}}.
+@end table
+
+If two libraries have identical @var{current} and @var{age} numbers,
+then the dynamic linker chooses the library with the greater
+@var{revision} number.
+
+@node Updating version info
+@section Updating library version information
+
+If you want to use libtool's versioning system, then you must specify
+the version information to libtool using the @option{-version-info} flag
+during link mode (@pxref{Link mode}).
+
+This flag accepts an argument of the form
+@samp{@var{current}[:@var{revision}[:@var{age}]]}. So, passing
+@option{-version-info 3:12:1} sets @var{current} to 3, @var{revision} to
+12, and @var{age} to 1.
+
+If either @var{revision} or @var{age} are omitted, they default to 0.
+Also note that @var{age} must be less than or equal to the @var{current}
+interface number.
+
+Here are a set of rules to help you update your library version
+information:
+
+@enumerate 1
+@item
+Start with version information of @samp{0:0:0} for each libtool library.
+
+@item
+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.
+
+@item
+If the library source code has changed at all since the last update,
+then increment @var{revision} (@samp{@var{c}:@var{r}:@var{a}} becomes
+@samp{@var{c}:@math{r+1}:@var{a}}).
+
+@item
+If any interfaces have been added, removed, or changed since the last
+update, increment @var{current}, and set @var{revision} to 0.
+
+@item
+If any interfaces have been added since the last public release, then
+increment @var{age}.
+
+@item
+If any interfaces have been removed or changed since the last public
+release, then set @var{age} to 0.
+@end enumerate
+
+@strong{@emph{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 @option{-release} flag (@pxref{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:
+
+@enumerate 1
+@item
+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 @var{revision} only, don't touch
+@var{current} nor @var{age}.
+
+@item
+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 @var{revision} to 0, bump @var{current}
+and @var{age}.
+
+@item
+Programs may need to be changed, recompiled, and relinked in order to use
+the new version. Bump @var{current}, set @var{revision} and @var{age}
+to 0.
+@end enumerate
+
+@noindent
+In the above description, @emph{programs} using the library in question
+may also be replaced by other libraries using it.
+
+
+@node Release numbers
+@section 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 what package their
+programs are linked against. This convention is used especially on
+GNU/Linux:
+
+@example
+trick$ @kbd{ls /usr/lib/libbfd*}
+/usr/lib/libbfd.a /usr/lib/libbfd.so.2.7.0.2
+/usr/lib/libbfd.so
+trick$
+@end example
+
+On @samp{trick}, @file{/usr/lib/libbfd.so} is a symbolic link to
+@file{libbfd.so.2.7.0.2}, which was distributed as a part of
+@samp{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, to accommodate both views, you can use the @option{-release}
+flag to set release information for libraries for which you do not
+want to use @option{-version-info}. For the @file{libbfd} example, the
+next release that uses libtool should be built with @samp{-release
+2.9.0}, which will produce the following files on GNU/Linux:
+
+@example
+trick$ @kbd{ls /usr/lib/libbfd*}
+/usr/lib/libbfd-2.9.0.so /usr/lib/libbfd.a
+/usr/lib/libbfd.so
+trick$
+@end example
+
+In this case, @file{/usr/lib/libbfd.so} is a symbolic link to
+@file{libbfd-2.9.0.so}. This makes it obvious that the user is dealing
+with @samp{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 @option{-release} for
+package-internal libraries or for ones whose interfaces change very
+frequently.
+
+@node Library tips
+@chapter Tips for interface design
+@cindex library interfaces, design
+@cindex design of library interfaces
+
+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:
+
+@table @asis
+@item Plan ahead
+Try to make every interface truly minimal, so that you won't need to
+delete entry points very often.
+
+@item Avoid interface changes
+@cindex renaming interface functions
+Some people love redesigning and changing entry points just for the heck
+of it (note: @emph{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.
+
+@item Use opaque data types
+@cindex 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.
+
+@item Use header files
+@cindex 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 (@pxref{C header files}).
+
+@item Use the @code{static} keyword (or equivalent) whenever possible
+@cindex global functions
+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@dots{} your users cannot access them, so they
+aren't interface changes.
+
+@item Be careful with array dimensions
+The number of elements in a global array is part of an interface, even
+if the header just declares @code{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.
+@end table
+
+@menu
+* C header files:: How to write portable include files.
+@end menu
+
+@node C header files
+@section Writing C header files
+@cindex portable C headers
+@cindex C header files, portable
+@cindex include files, portable
+
+Writing portable C header files can be difficult, since they may be read
+by different types of compilers:
+
+@table @asis
+@item 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 @code{extern "C"} directive, so that the
+names aren't mangled. @xref{C++ libraries}, for other issues relevant
+to using C++ with libtool.
+
+@item 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 @code{#include}d.
+
+@item non-ANSI C compilers
+Non-ANSI compilers will report errors if functions are prototyped.
+@end table
+
+These complications mean that your library interface headers must use
+some C preprocessor magic to be usable by each of the above compilers.
+
+@file{foo.h} in the @file{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:
+
+@example
+/* 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
+@end example
+
+These macros are used in @file{foo.h} as follows:
+
+@example
+#ifndef FOO_H
+#define FOO_H 1
+
+/* The above macro definitions. */
+#include "@dots{}"
+
+BEGIN_C_DECLS
+
+int foo PARAMS((void));
+int hello PARAMS((void));
+
+END_C_DECLS
+
+#endif /* !FOO_H */
+@end example
+
+Note that the @file{#ifndef FOO_H} prevents the body of @file{foo.h}
+from being read more than once in a given compilation.
+
+Also the only thing that must go outside the
+@code{BEGIN_C_DECLS}/@code{END_C_DECLS} pair are @code{#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 @code{PARAMS}, @code{BEGIN_C_DECLS},
+and @code{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@footnote{We used to recommend @code{__P},
+@code{__BEGIN_DECLS} and @code{__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.}.
+
+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:
+
+@itemize @bullet
+@item
+Pre-ANSI compilers do not always support the @code{void *} generic
+pointer type, and so need to use @code{char *} in its place.
+
+@item
+The @code{const}, @code{inline} and @code{signed} keywords are not
+supported by some compilers, especially pre-ANSI compilers.
+
+@item
+The @code{long double} type is not supported by many compilers.
+@end itemize
+
+
+@node Inter-library dependencies
+@chapter Inter-library dependencies
+@cindex dependencies between libraries
+@cindex 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 @dfn{inter-library dependency} is where a library depends on
+other libraries. For example, if the libtool library @file{libhello}
+uses the @code{cos} function, then it has an inter-library dependency
+on @file{libm}, the math library that implements @code{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 @file{lib@var{name}} that
+your own library depends on, simply add a corresponding
+@code{-l@var{name}} option to the link line when you create your
+library. To make an example of our @file{libhello} that depends on
+@file{libm}:
+
+@example
+burger$ @kbd{libtool --mode=link gcc -g -O -o libhello.la foo.lo hello.lo \
+ -rpath /usr/local/lib -lm}
+burger$
+@end example
+
+When you link a program against @file{libhello}, you don't need to
+specify the same @samp{-l} options again: libtool will do that for you,
+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 @file{.lo} files
+or the specified @samp{-l} libraries), and you need to specify the
+@option{-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.
+
+@node Dlopened modules
+@chapter Dlopened modules
+@findex dlopen
+@findex dlsym
+@findex dlclose
+@findex shl_load
+@cindex dynamic linking, applications
+@cindex dlopening modules
+@cindex modules, dynamic
+@cindex application-level dynamic linking
+
+It can sometimes be confusing to discuss @dfn{dynamic linking}, because
+the term is used to refer to two different concepts:
+
+@enumerate 1
+@item
+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.
+
+@item
+The application calling functions such as @code{dlopen} that load
+arbitrary, user-specified modules at runtime. This type of dynamic
+linking is explicitly controlled by the application.
+@end enumerate
+
+To mitigate confusion, this manual refers to the second type of dynamic
+linking as @dfn{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
+@code{LT_INIT} option @samp{dlopen} in @file{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 @code{dlopen}.
+* Dlopen issues:: Unresolved problems that need your attention.
+@end menu
+
+@node Building modules
+@section Building modules to dlopen
+
+On some operating systems, a program symbol must be specially declared
+in order to be dynamically resolved with the @code{dlsym} (or
+equivalent) function. Libtool provides the @option{-export-dynamic} and
+@option{-module} link flags (@pxref{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, @file{hello},
+that would later be dlopened by an application, we would add
+@option{-module} to the other link flags:
+
+@example
+burger$ @kbd{libtool --mode=link gcc -module -o hello.la foo.lo \
+ hello.lo -rpath /usr/local/lib -lm}
+burger$
+@end example
+
+If symbols from your @emph{executable} are needed to satisfy unresolved
+references in a library you want to dlopen you will have to use the flag
+@option{-export-dynamic}. You should use @option{-export-dynamic} while
+linking the executable that calls dlopen:
+
+@example
+burger$ @kbd{libtool --mode=link gcc -export-dynamic -o helldl main.o}
+burger$
+@end example
+
+@node Dlpreopening
+@section Dlpreopening
+
+Libtool provides special support for dlopening libtool object and
+libtool library files, so that their symbols can be resolved
+@emph{even on platforms without any @code{dlopen} and @code{dlsym}
+functions}.
+
+Consider the following alternative ways of loading code into your
+program, in order of increasing ``laziness'':
+
+@enumerate 1
+@item
+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.
+
+@item
+Declaring a static library to the linker, so that it is searched at link
+time 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.
+
+@item
+Declaring a shared library to the runtime linker, so that it is searched
+at runtime 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.
+
+@item
+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.
+@end enumerate
+
+Libtool emulates @option{-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 @option{-dlopen} or @option{-dlpreopen} flags when you link your
+program (@pxref{Link mode}).
+
+@deftp {Data Type} {lt_dlsymlist} typedef struct @
+ @{ @w{const char *@var{name};} @w{void *@var{address};} @} lt_dlsymlist
+The @var{name} attribute is a null-terminated character string of the
+symbol name, such as @code{"fprintf"}. The @var{address} attribute is a
+generic pointer to the appropriate object, such as @code{&fprintf}.
+@end deftp
+
+@deftypevar {const lt_dlsymlist } lt_preloaded_symbols[]
+An array of @code{lt_dlsymlist} structures, representing all the preloaded
+symbols linked into the program proper. For each module
+@option{-dlpreopen}ed by the Libtool linked program
+there is an element with the @var{name} of the module and an @var{address}
+of @code{0}, followed by all symbols exported from this file.
+For the executable itself the special name @samp{@@PROGRAM@@} is used.
+The last element of all has a @var{name} and @var{address} of
+@code{0}.
+
+To facilitate inclusion of symbol lists into libraries,
+@code{lt_preloaded_symbols} is @samp{#define}d to a suitably unique name
+in @file{ltdl.h}.
+
+This variable may not be declared @code{const} on some systems due to
+relocation issues.
+@end deftypevar
+
+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 @code{lt_preloaded_symbols}.
+
+@deftypefun int lt_dlpreload (const lt_dlsymlist *@var{preloaded})
+Register the list of preloaded modules @var{preloaded}.
+If @var{preloaded} is @code{NULL}, then all previously registered
+symbol lists, except the list set by @code{lt_dlpreload_default},
+are deleted. Return 0 on success.
+@end deftypefun
+
+@deftypefun int lt_dlpreload_default (const lt_dlsymlist *@var{preloaded})
+Set the default list of preloaded modules to @var{preloaded}, which
+won't be deleted by @code{lt_dlpreload}. Note that this function does
+@emph{not} require libltdl to be initialized using @code{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 @code{LTDL_SET_PRELOADED_SYMBOLS}.
+
+Return 0 on success.
+@end deftypefun
+
+@defmac 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.
+
+@example
+#include <ltdl.h>
+
+int main() @{
+ /* ... */
+ LTDL_SET_PRELOADED_SYMBOLS();
+ /* ... */
+@}
+@end example
+@end defmac
+
+@deftypefn {Function Type} {int} lt_dlpreload_callback_func (lt_dlhandle @var{handle})
+Functions of this type can be passed to @code{lt_dlpreload_open},
+which in turn will call back into a function thus passed for each
+preloaded module that it opens.
+@end deftypefn
+
+@deftypefun int lt_dlpreload_open (@w{const char *@var{originator},} @w{lt_dlpreload_callback_func *@var{func})}
+Load all of the preloaded modules for @var{originator}. For every
+module opened in this way, call @var{func}.
+
+@noindent
+To open all of the modules preloaded into @file{libhell.la}
+(presumably from within the @file{libhell.a} initialisation code):
+
+@example
+#define preloaded_symbols lt_libhell_LTX_preloaded_symbols
+
+static int hell_preload_callback (lt_dlhandle handle);
+
+int
+hell_init (void)
+@{
+ @dots{}
+ if (lt_dlpreload (&preloaded_symbols) == 0)
+ @{
+ lt_dlpreload_open ("libhell", preload_callback);
+ @}
+ @dots{}
+@}
+@end example
+
+@noindent
+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 @samp{libhell}, you must prefix
+@samp{preloaded_symbols} with @samp{lt_}; the originator name,
+@samp{libhell} in this case; and @samp{_LTX_}. That is,
+@samp{lt_libhell_LTX_preloaded_symbols} here.
+@end deftypefun
+
+
+@node Linking with dlopened modules
+@section Linking with dlopened modules
+@cindex linking, dlopen
+@cindex linking, dlpreopen
+
+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
+@strong{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.
+
+@example
+,-------------. ,------------------. ,-----------------.
+| Interpreter |----> Module------------> Third-party |
+`-------------' | Loader | |Dlopened Modules |
+ | | | `-----------------'
+ |,-------v--------.| |
+ || Dlpreopened || |
+ || Modules || |
+ |`----------------'| |
+ | | | |
+ |,-------v--------.| ,--------v--------.
+ ||Module Interface|| |Module Interface |
+ || Library || | Library |
+ |`----------------'| `-----------------'
+ `------------------'
+@end example
+
+Libtool has the concept of @dfn{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
+@command{libtool} links the @strong{Module Loader} library with some
+@strong{Dlpreopened Modules} that were in turn linked against the
+@strong{Module Interface Library}, it knows that the @strong{Module
+Loader} provides an already loaded @strong{Module Interface Library}
+to resolve symbols for the @strong{Dlpreopened Modules}, and doesn't
+ask the compiler driver to link an identical @strong{Module Interface
+Library} dependency library too.
+
+In conjunction with Automake, the @file{Makefile.am} for the
+@strong{Module Loader} might look like this:
+
+@example
+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)
+@end example
+
+And the @file{Makefile.am} for the @file{intrinsics.la} module in a
+sibling @file{modules} directory might look like this:
+
+@example
+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
+@end example
+
+@cindex @option{-weak} option
+For a more complex example, see the sources of @file{libltdl} in the
+Libtool distribution, which is built with the help of the @option{-weak}
+option.
+
+
+@node Finding the dlname
+@section Finding the correct name to dlopen
+@cindex names of dynamic modules
+@cindex dynamic modules, names
+
+After a library has been linked with @option{-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 @file{.la} file, and searching
+it for the following lines:
+
+@example
+# The name that we can @code{dlopen}.
+dlname='@var{dlname}'
+@end example
+
+If @var{dlname} is empty, then the library cannot be dlopened.
+Otherwise, it gives the dlname of the library. So, if the library was
+installed as @file{/usr/local/lib/libhello.la}, and the @var{dlname} was
+@file{libhello.so.3}, then @file{/usr/local/lib/libhello.so.3} should be
+dlopened.
+
+If your program uses this approach, then it should search the
+directories listed in the @code{LD_LIBRARY_PATH}@footnote{@code{LIBPATH}
+on AIX, and @code{SHLIB_PATH} on HP-UX.} 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.
+
+@node Dlopen issues
+@section Unresolved dlopen issues
+@cindex pitfalls with dlopen
+@cindex dlopening, pitfalls
+@cindex trouble with dlopen
+
+The following problems are not solved by using libtool's dlopen support:
+
+@itemize @bullet
+@item
+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 (@pxref{Using libltdl}) or develop your
+own alternatives to dlopening dynamic code.
+Most reasonable solutions involve writing wrapper functions for the
+@code{dlopen} family, which do package-specific tricks when dlopening
+is unsupported or not available on a given platform.
+
+@item
+There are major differences in implementations of the @code{dlopen}
+family of functions. Some platforms do not even use the same function
+names (notably HP-UX, with its @code{shl_load} family).
+
+@item
+The application developer must write a custom search function
+to discover the correct module filename to supply to @code{dlopen}.
+@end itemize
+
+@node Using libltdl
+@chapter Using libltdl
+@findex libltdl
+@findex dlopen
+@findex dlsym
+@findex dlclose
+@findex dlerror
+@findex shl_load
+@cindex dynamic linking, applications
+@cindex dlopening modules
+@cindex modules, dynamic
+@cindex application-level dynamic linking
+
+Libtool provides a small library, called @file{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 @file{libltdl} services, it requires GNU DLD, or it
+will only emulate dynamic linking with libtool's dlpreopening mechanism.
+
+@noindent
+libltdl supports currently the following dynamic linking mechanisms:
+
+@itemize @bullet
+@item
+@code{dlopen} (POSIX compliant systems, GNU/Linux, etc.)
+@item
+@code{shl_load} (HP-UX)
+@item
+@code{LoadLibrary} (Win16 and Win32)
+@item
+@code{load_add_on} (BeOS)
+@item
+@code{NSAddImage} or @code{NSLinkModule} (Darwin and Mac OS X)
+@item
+GNU DLD (emulates dynamic linking for static libraries)
+@item
+libtool's dlpreopen (@pxref{Dlpreopening})
+@end itemize
+
+@noindent
+libltdl is licensed under the terms of the GNU Lesser General
+Public License, with the following exception:
+
+@quotation
+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.
+@end quotation
+
+@menu
+* Libltdl interface:: How to use libltdl in your programs.
+* Modules for libltdl:: Creating modules that can be @code{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.
+@end menu
+
+@node Libltdl interface
+@section How to use libltdl in your programs
+
+@noindent
+The libltdl API is similar to the POSIX dlopen interface,
+which is very simple but powerful.
+
+@noindent
+To use libltdl in your program you have to include the header file @file{ltdl.h}:
+
+@example
+#include <ltdl.h>
+@end example
+
+@noindent
+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
+@samp{LT_NON_POSIX_NAMESPACE} before you include @file{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 to use this version of libltdl.
+
+@noindent
+Note that libltdl is not well tested in a multithreaded environment,
+though the intention is that it should work (@pxref{Thread Safety
+in libltdl, , Using libltdl in a multi threaded environment}). It was
+reported that GNU/Linux's glibc 2.0's @code{dlopen} with
+@samp{RTLD_LAZY} (that libltdl uses by default) is not thread-safe,
+but this problem is supposed to be fixed in glibc 2.1. On the other
+hand, @samp{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.
+
+@noindent
+The following macros are defined by including @file{ltdl.h}:
+
+@defmac LT_PATHSEP_CHAR
+@code{LT_PATHSEP_CHAR} is the system-dependent path separator,
+that is, @samp{;} on Windows and @samp{:} everywhere else.
+@end defmac
+
+@defmac LT_DIRSEP_CHAR
+If @code{LT_DIRSEP_CHAR} is defined, it can be used as directory
+separator in addition to @samp{/}. On Windows, this contains
+@samp{\}.
+@end defmac
+
+
+@noindent
+The following types are defined in @file{ltdl.h}:
+
+@deftp {Type} lt_dlhandle
+@code{lt_dlhandle} is a module ``handle''.
+Every lt_dlopened module has a handle associated with it.
+@end deftp
+
+@deftp {Type} lt_dladvise
+@code{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.
+@end deftp
+
+@deftp {Type} lt_dlsymlist
+@code{lt_dlsymlist} is a symbol list for dlpreopened modules
+(@pxref{Dlpreopening}).
+@end deftp
+
+@page
+@noindent
+libltdl provides the following functions:
+
+@deftypefun 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.
+@end deftypefun
+
+@deftypefun 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 @code{lt_dlinit} has been successfully called.
+Return 0 on success, otherwise the number of errors.
+@end deftypefun
+
+@deftypefun lt_dlhandle lt_dlopen (const char *@var{filename})
+Open the module with the file name @var{filename} and return a
+handle for it. @code{lt_dlopen} is able to open libtool dynamic
+modules, preloaded static modules, the program itself and
+native dynamic modules@footnote{Some platforms, notably Mac OS X,
+differentiate between a runtime library that cannot be opened by
+@code{lt_dlopen} and a dynamic module that can. For maximum
+portability you should try to ensure that you only pass
+@code{lt_dlopen} objects that have been compiled with libtool's
+@option{-module} flag.}.
+
+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 @option{-export-dynamic} flag, then the
+global symbols in the executable will also be used to resolve
+references in the module.
+
+If @var{filename} is @code{NULL} and the program was linked with
+@option{-export-dynamic} or @option{-dlopen self}, @code{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 @var{filename} does
+not have a directory component it will additionally look in the
+following search paths for the module (in the following order):
+
+@enumerate 1
+@item user-defined search path:
+This search path can be changed by the program using the
+functions @code{lt_dlsetsearchpath}, @code{lt_dladdsearchdir} and
+@code{lt_dlinsertsearchdir}.
+
+@item libltdl's search path:
+This search path is the value of the environment variable
+@env{LTDL_LIBRARY_PATH}.
+
+@item system library search path:
+The system dependent library search path
+(e.g.@: on GNU/Linux it is @env{LD_LIBRARY_PATH}).
+@end enumerate
+
+Each search path must be a list of absolute directories separated by
+@code{LT_PATHSEP_CHAR}, for example, @code{"/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 @code{lt_dlopen} fails for any reason, it returns @code{NULL}.
+@end deftypefun
+
+@deftypefun lt_dlhandle lt_dlopenext (const char *@var{filename})
+The same as @code{lt_dlopen}, except that it tries to append
+different file name extensions to the file name.
+If the file with the file name @var{filename} cannot be found
+libltdl tries to append the following extensions:
+
+@enumerate 1
+@item the libtool archive extension @file{.la}
+@item the extension used for native dynamically loadable modules on the host platform, e.g., @file{.so}, @file{.sl}, etc.
+@end enumerate
+
+This lookup strategy was designed to allow programs that don't
+have knowledge about native dynamic libraries naming conventions
+to be able to @code{dlopen} such libraries as well as libtool modules
+transparently.
+@end deftypefun
+
+@deftypefun lt_dlhandle lt_dlopenadvise (const char *@var{filename}, @w{lt_dladvise @var{advise}})
+The same as @code{lt_dlopen}, except that it also requires an additional
+argument that may contain additional hints to the underlying system
+module loader. The @var{advise} parameter is opaque and can only be
+accessed with the functions documented below.
+
+Note that this function does not change the content of @var{advise}, so
+unlike the other calls in this API takes a direct @code{lt_dladvise}
+type, and not a pointer to the same.
+@end deftypefun
+
+@deftypefun int lt_dladvise_init (lt_dladvise *@var{advise})
+The @var{advise} parameter can be used to pass hints to the module
+loader when using @code{lt_dlopenadvise} to perform the loading.
+The @var{advise} parameter needs to be initialised by this function
+before it can be used. Any memory used by @var{advise} needs to be
+recycled with @code{lt_dladvise_destroy} when it is no longer needed.
+
+On failure, @code{lt_dladvise_init} returns non-zero and sets an error
+message that can be retrieved with @code{lt_dlerror}.
+@end deftypefun
+
+@deftypefun int lt_dladvise_destroy (lt_dladvise *@var{advise})
+Recycle the memory used by @var{advise}. For an example, see the
+documentation for @code{lt_dladvise_ext}.
+
+On failure, @code{lt_dladvise_destroy} returns non-zero and sets an error
+message that can be retrieved with @code{lt_dlerror}.
+@end deftypefun
+
+@deftypefun int lt_dladvise_ext (lt_dladvise *@var{advise})
+Set the @code{ext} hint on @var{advise}. Passing an @var{advise}
+parameter to @code{lt_dlopenadvise} with this hint set causes it to
+try to append different file name extensions like @code{lt_dlopenext}.
+
+The following example is equivalent to calling
+@code{lt_dlopenext (filename)}:
+
+@example
+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;
+@}
+@end example
+
+On failure, @code{lt_dladvise_ext} returns non-zero and sets an error
+message that can be retrieved with @code{lt_dlerror}.
+@end deftypefun
+
+@deftypefun int lt_dladvise_global (lt_dladvise *@var{advise})
+Set the @code{symglobal} hint on @var{advise}. Passing an @var{advise}
+parameter to @code{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 @code{symglobal} nor the @code{symlocal} hints are set,
+or if a module is loaded without using the @code{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 @code{lt_dlgetinfo} will reveal whether the hint was actually
+followed.
+
+On failure, @code{lt_dladvise_global} returns non-zero and sets an error
+message that can be retrieved with @code{lt_dlerror}.
+@end deftypefun
+
+@deftypefun int lt_dladvise_local (lt_dladvise *@var{advise})
+Set the @code{symlocal} hint on @var{advise}. Passing an @var{advise}
+parameter to @code{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 @code{symglobal} nor the @code{symlocal} hints are set,
+or if a module is loaded without using the @code{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 @code{lt_dlgetinfo} will reveal whether the hint was actually
+followed.
+
+On failure, @code{lt_dladvise_local} returns non-zero and sets an error
+message that can be retrieved with @code{lt_dlerror}.
+@end deftypefun
+
+@deftypefun int lt_dladvise_resident (lt_dladvise *@var{advise})
+Set the @code{resident} hint on @var{advise}. Passing an @var{advise}
+parameter to @code{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 @code{lt_dlclose}.
+
+On failure, @code{lt_dladvise_resident} returns non-zero and sets an error
+message that can be retrieved with @code{lt_dlerror}.
+@end deftypefun
+
+@deftypefun int lt_dladvise_preload (lt_dladvise *@var{advise})
+Set the @code{preload} hint on @var{advise}. Passing an @var{advise}
+parameter to @code{lt_dlopenadvise} with this hint set causes it to
+load only preloaded modules, so that if a suitable preloaded module is
+not found, @code{lt_dlopenadvise} will return @code{NULL}.
+@end deftypefun
+
+@deftypefun int lt_dlclose (lt_dlhandle @var{handle})
+Decrement the reference count on the module @var{handle}.
+If it drops to zero and no other module depends on this module,
+then the module is unloaded.
+Return 0 on success.
+@end deftypefun
+
+@deftypefun {void *} lt_dlsym (lt_dlhandle @var{handle}, const char *@var{name})
+Return the address in the module @var{handle}, where the symbol given
+by the null-terminated string @var{name} is loaded.
+If the symbol cannot be found, @code{NULL} is returned.
+@end deftypefun
+
+@deftypefun {const char *} lt_dlerror (void)
+Return a human readable string describing the most
+recent error that occurred from any of libltdl's functions.
+Return @code{NULL} if no errors have occurred since initialization
+or since it was last called.
+@end deftypefun
+
+@deftypefun int lt_dladdsearchdir (const char *@var{search_dir})
+Append the search directory @var{search_dir} to the current user-defined
+library search path. Return 0 on success.
+@end deftypefun
+
+@deftypefun int lt_dlinsertsearchdir (@w{const char *@var{before}}, @w{const char *@var{search_dir}})
+Insert the search directory @var{search_dir} into the user-defined library
+search path, immediately before the element starting at address
+@var{before}. If @var{before} is @samp{NULL}, then @var{search_dir} is
+appending as if @code{lt_dladdsearchdir} had been called. Return 0 on success.
+@end deftypefun
+
+@deftypefun int lt_dlsetsearchpath (const char *@var{search_path})
+Replace the current user-defined library search path with
+@var{search_path}, which must be a list of absolute directories separated
+by @code{LT_PATHSEP_CHAR}. Return 0 on success.
+@end deftypefun
+
+@deftypefun {const char *} lt_dlgetsearchpath (void)
+Return the current user-defined library search path.
+@end deftypefun
+
+@deftypefun int lt_dlforeachfile (@w{const char *@var{search_path}}, @w{int (*@var{func}) (const char *@var{filename}, void * @var{data})}, @w{void * @var{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 @code{LT_PATHSEP_CHAR}-delimited directory list
+in @var{search_path} for candidates, and pass them, along with
+@var{data} to your own callback function, @var{func}. If @var{search_path} is
+@samp{NULL}, then search all of the standard locations that
+@code{lt_dlopen} would examine. This function will continue to make
+calls to @var{func} for each file that it discovers in @var{search_path}
+until one of these calls returns non-zero, or until the files are
+exhausted. @samp{lt_dlforeachfile} returns the value returned by the last
+call made to @var{func}.
+
+For example you could define @var{func} to build an ordered
+@dfn{argv}-like vector of files using @var{data} to hold the address of
+the start of the vector.
+@end deftypefun
+
+@deftypefun int lt_dlmakeresident (lt_dlhandle @var{handle})
+Mark a module so that it cannot be @samp{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 @samp{lt_dlopen (NULL)} to get a @var{handle} for the running
+binary, that handle will always be marked as resident, and consequently
+cannot be successfully @samp{lt_dlclose}d.
+@end deftypefun
+
+@deftypefun int lt_dlisresident (lt_dlhandle @var{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
+@code{lt_dlerror}.
+@end deftypefun
+
+@node Modules for libltdl
+@section Creating modules that can be @code{dlopen}ed
+
+Libtool modules are created like normal libtool libraries with a few
+exceptions:
+
+You have to link the module with libtool's @option{-module} switch,
+and you should link any program that is intended to dlopen the module with
+@option{-dlopen @var{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 (@pxref{Versioning}) for a specific module
+you should link it with the @option{-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_" (@var{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.
+
+@file{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.
+
+@example
+/* 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();
+@}
+@end example
+
+@noindent
+The @file{Makefile.am} contains the necessary rules to build the
+module @file{foo1.la}:
+
+@example
+...
+lib_LTLIBRARIES = foo1.la
+
+foo1_la_SOURCES = foo1.c
+foo1_la_LDFLAGS = -module
+...
+@end example
+
+
+@node Thread Safety in libltdl
+@section 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.
+
+@node User defined module data
+@section 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:
+
+@deftypefn {Type} {struct} lt_dlinfo @{ @w{char *@var{filename};} @
+ @w{char *@var{name};} @w{int @var{ref_count};} @
+ @w{int @var{is_resident};} @w{int @var{is_symglobal};} @
+ @w{int @var{is_symlocal};}@}
+@code{lt_dlinfo} is used to store information about a module.
+The @var{filename} attribute is a null-terminated character string of
+the real module file name. If the module is a libtool module then
+@var{name} is its module name (e.g.@: @code{"libfoo"} for
+@code{"dir/libfoo.la"}), otherwise it is set to @code{NULL}. The
+@var{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 @code{lt_dlopenadvise}
+to determine whether the underlying loader was able to follow them.
+@end deftypefn
+
+The following function will return a pointer to libltdl's internal copy
+of this structure for the given @var{handle}:
+
+@deftypefun {const lt_dlinfo *} lt_dlgetinfo (@w{lt_dlhandle @var{handle}})
+Return a pointer to a struct that contains some information about
+the module @var{handle}. The contents of the struct must not be modified.
+Return @code{NULL} on failure.
+@end deftypefun
+
+Furthermore, 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:
+
+@deftp {Type} lt_dlinterface_id
+The opaque type used to hold the module interface details for each
+registered libltdl client.
+@end deftp
+
+@deftypefn {Type} int lt_dlhandle_interface (@w{lt_dlhandle @var{handle},} @
+ @w{const char *@var{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 @var{handle} conforms
+to the interface specification of your loader using @code{lt_dlsym}.
+
+The callback may be given @strong{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.
+
+@example
+int
+my_interface_cb (lt_dlhandle handle, const char *id_string)
+@{
+ char *(*module_id) (void) = NULL;
+
+ /* @r{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;
+@}
+@end example
+@end deftypefn
+
+@deftypefun lt_dlinterface_id lt_dlinterface_register @
+ (@w{const char *@var{id_string}}, @w{lt_dlhandle_interface *@var{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 @var{id_string} and @var{iface} so that the resulting
+@code{lt_dlinterface_id} can be used to filter the module handles
+returned by the iteration functions below. If @var{iface} is @code{NULL},
+all modules will be matched.
+@end deftypefun
+
+@deftypefun void lt_dlinterface_free (@w{lt_dlinterface_id @var{iface}})
+Release the data associated with @var{iface}.
+@end deftypefun
+
+@deftypefun int lt_dlhandle_map (@w{lt_dlinterface_id @var{iface}}, @
+ @w{int (*@var{func}) (lt_dlhandle @var{handle}, void * @var{data})}, @
+ @w{void * @var{data}})
+For each module that matches @var{iface}, call the function
+@var{func}. When writing the @var{func} callback function, the
+argument @var{handle} is the handle of a loaded module, and
+@var{data} is the last argument passed to @code{lt_dlhandle_map}. As
+soon as @var{func} returns a non-zero value for one of the handles,
+@code{lt_dlhandle_map} will stop calling @var{func} and immediately
+return that non-zero value. Otherwise 0 is eventually returned when
+@var{func} has been successfully called for all matching modules.
+@end deftypefun
+
+@deftypefun lt_dlhandle lt_dlhandle_iterate (@w{lt_dlinterface_id @
+ @var{iface}}, @w{lt_dlhandle @var{place}})
+Iterate over the module handles loaded by @var{iface}, returning the
+first matching handle in the list if @var{place} is @code{NULL}, and
+the next one on subsequent calls. If @var{place} is the last element
+in the list of eligible modules, this function returns @code{NULL}.
+
+@example
+lt_dlhandle handle = 0;
+lt_dlinterface_id iface = my_interface_id;
+
+while ((handle = lt_dlhandle_iterate (iface, handle)))
+ @{
+ @dots{}
+ @}
+@end example
+@end deftypefun
+
+@deftypefun lt_dlhandle lt_dlhandle_fetch (@w{lt_dlinterface_id @var{iface}}, @w{const char *@var{module_name}})
+Search through the module handles loaded by @var{iface} for a module named
+@var{module_name}, returning its handle if found or else @code{NULL}
+if no such named module has been loaded by @var{iface}.
+@end deftypefun
+
+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.
+
+@deftypefun {void *} lt_dlcaller_set_data (@w{lt_dlinterface_id @var{key}}, @w{lt_dlhandle @var{handle}}, @w{void * @var{data}})
+Set @var{data} as the set of data uniquely associated with @var{key} and
+@var{handle} for later retrieval. This function returns the @var{data}
+previously associated with @var{key} and @var{handle} if any. A result of
+0, may indicate that a diagnostic for the last error (if any) is available
+from @code{lt_dlerror()}.
+
+For example, to correctly remove some associated data:
+
+@example
+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;
+ @}
+ @}
+@end example
+@end deftypefun
+
+@deftypefun {void *} lt_dlcaller_get_data (@w{lt_dlinterface_id @var{key}}, @w{lt_dlhandle @var{handle}})
+Return the address of the data associated with @var{key} and
+@var{handle}, or else @code{NULL} if there is none.
+@end deftypefun
+
+Old versions of libltdl also provided a simpler, but similar, API
+based around @code{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.
+
+
+@node Module loaders for libltdl
+@section 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 @code{lt_dlopen} will be
+able to use it.
+
+Writing a loader involves writing at least three functions that can be
+called by @code{lt_dlopen}, @code{lt_dlsym} and @code{lt_dlclose}.
+Optionally, you can provide a finalisation function to perform any
+cleanup operations when @code{lt_dlexit} executes, and a symbol prefix
+string that will be prepended to any symbols passed to @code{lt_dlsym}.
+These functions must match the function pointer types below, after
+which they can be allocated to an instance of @code{lt_user_dlloader}
+and registered.
+
+Registering the loader requires that you choose a name for it, so that it
+can be recognised by @code{lt_dlloader_find} and removed with
+@code{lt_dlloader_remove}. The name you choose must be unique, and not
+already in use by libltdl's builtin loaders:
+
+@table @asis
+@item "dlopen"
+The system dynamic library loader, if one exists.
+@item "dld"
+The GNU dld loader, if @file{libdld} was installed when libltdl was
+built.
+@item "dlpreload"
+The loader for @code{lt_dlopen}ing of preloaded static modules.
+@end table
+
+The prefix "dl" is reserved for loaders supplied with future versions of
+libltdl, so you should not use that for your own loader names.
+
+@noindent
+The following types are defined in @file{ltdl.h}:
+
+@deftp {Type} lt_module
+@code{lt_module} is a dlloader dependent module.
+The dynamic module loader extensions communicate using these low
+level types.
+@end deftp
+
+@deftp {Type} lt_dlloader
+@code{lt_dlloader} is a handle for module loader types.
+@end deftp
+
+@deftp {Type} lt_user_data
+@code{lt_user_data} is used for specifying loader instance data.
+@end deftp
+
+@deftypefn {Type} {struct} lt_user_dlloader @{@w{const char *@var{sym_prefix};} @w{lt_module_open *@var{module_open};} @w{lt_module_close *@var{module_close};} @w{lt_find_sym *@var{find_sym};} @w{lt_dlloader_exit *@var{dlloader_exit};} @}
+If you want to define a new way to open dynamic modules, and have the
+@code{lt_dlopen} API use it, you need to instantiate one of these
+structures and pass it to @code{lt_dlloader_add}. You can pass whatever
+you like in the @var{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.
+@end deftypefn
+
+@deftypefn {Type} lt_module lt_module_open (@w{const char *@var{filename}})
+The type of the loader function for an @code{lt_dlloader} module
+loader. The value set in the dlloader_data field of the @code{struct
+lt_user_dlloader} structure will be passed into this function in the
+@var{loader_data} parameter. Implementation of such a function should
+attempt to load the named module, and return an @code{lt_module}
+suitable for passing in to the associated @code{lt_module_close} and
+@code{lt_sym_find} function pointers. If the function fails it should
+return @code{NULL}, and set the error message with @code{lt_dlseterror}.
+@end deftypefn
+
+@deftypefn {Type} int lt_module_close (@w{lt_user_data @var{loader_data},} @w{lt_module @var{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 @var{module} module, and then unload it
+from memory. If the function fails for some reason, set the error
+message with @code{lt_dlseterror} and return non-zero.
+@end deftypefn
+
+@deftypefn {Type} {void *} lt_find_sym (@w{lt_module @var{module},} @w{const char *@var{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
+@var{symbol} in the module @var{module}, or else set the error message
+with @code{lt_dlseterror} and return @code{NULL} if lookup fails.
+@end deftypefn
+
+@deftypefn {Type} int lt_dlloader_exit (@w{lt_user_data @var{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
+@code{dlloader_data} field of the @code{lt_user_dlloader}. If non-@code{NULL},
+the function will be called by @code{lt_dlexit}, and
+@code{lt_dlloader_remove}.
+@end deftypefn
+
+For example:
+
+@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;
+@}
+@end example
+
+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 @emph{is} handled by libltdl however, and it is important
+to ensure the @code{dlloader_exit} callback releases any resources claimed
+during the initialisation phase.
+
+@page
+@noindent
+libltdl provides the following functions for writing your own module
+loaders:
+
+@deftypefun int lt_dlloader_add (@w{lt_dlloader *@var{place},} @
+ @w{lt_user_dlloader *@var{dlloader},} @w{const char *@var{loader_name}})
+Add a new module loader to the list of all loaders, either as the
+last loader (if @var{place} is @code{NULL}), else immediately before the
+loader passed as @var{place}. @var{loader_name} will be returned by
+@code{lt_dlloader_name} if it is subsequently passed a newly
+registered loader. These @var{loader_name}s must be unique, or
+@code{lt_dlloader_remove} and @code{lt_dlloader_find} cannot
+work. Returns 0 for success.
+
+@example
+/* Make myloader be the last one. */
+if (lt_dlloader_add (NULL, myloader) != 0)
+ perror (lt_dlerror ());
+@end example
+@end deftypefun
+
+@deftypefun int lt_dlloader_remove (@w{const char *@var{loader_name}})
+Remove the loader identified by the unique name, @var{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 @code{lt_dlerror}.
+
+@example
+/* Remove myloader. */
+if (lt_dlloader_remove ("myloader") != 0)
+ perror (lt_dlerror ());
+@end example
+@end deftypefun
+
+@deftypefun {lt_dlloader *} lt_dlloader_next (@w{lt_dlloader *@var{place}})
+Iterate over the module loaders, returning the first loader if @var{place} is
+@code{NULL}, and the next one on subsequent calls. The handle is for use with
+@code{lt_dlloader_add}.
+
+@example
+/* Make myloader be the first one. */
+if (lt_dlloader_add (lt_dlloader_next (NULL), myloader) != 0)
+ return ERROR;
+@end example
+@end deftypefun
+
+@deftypefun {lt_dlloader *} lt_dlloader_find (@w{const char *@var{loader_name}})
+Return the first loader with a matching @var{loader_name} identifier, or else
+@code{NULL}, if the identifier is not found.
+
+The identifiers that may be used by libltdl itself, if the host
+architecture supports them are @dfn{dlopen}@footnote{This is used for
+the host dependent module loading API -- @code{shl_load} and
+@code{LoadLibrary} for example}, @dfn{dld} and @dfn{dlpreload}.
+
+@example
+/* 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;
+@end example
+@end deftypefun
+
+@deftypefun {const char *} lt_dlloader_name (@w{lt_dlloader *@var{place}})
+Return the identifying name of @var{place}, as obtained from
+@code{lt_dlloader_next} or @code{lt_dlloader_find}. If this function fails,
+it will return @code{NULL} and set an error for retrieval with
+@code{lt_dlerror}.
+@end deftypefun
+
+@deftypefun {lt_user_data *} lt_dlloader_data (@w{lt_dlloader *@var{place}})
+Return the address of the @code{dlloader_data} of @var{place}, as
+obtained from @code{lt_dlloader_next} or @code{lt_dlloader_find}. If
+this function fails, it will return @code{NULL} and set an error for
+retrieval with @code{lt_dlerror}.
+@end deftypefun
+
+@subsection Error handling within user module loaders
+
+@deftypefun int lt_dladderror (@w{const char *@var{diagnostic}})
+This function allows you to integrate your own error messages into
+@code{lt_dlerror}. Pass in a suitable diagnostic message for return by
+@code{lt_dlerror}, and an error identifier for use with
+@code{lt_dlseterror} is returned.
+
+If the allocation of an identifier fails, this function returns -1.
+
+@example
+int myerror = lt_dladderror ("doh!");
+if (myerror < 0)
+ perror (lt_dlerror ());
+@end example
+@end deftypefun
+
+@deftypefun int lt_dlseterror (@w{int @var{errorcode}})
+When writing your own module loaders, you should use this function to
+raise errors so that they are propagated through the @code{lt_dlerror}
+interface. All of the standard errors used by libltdl are declared in
+@file{ltdl.h}, or you can add more of your own with
+@code{lt_dladderror}. This function returns 0 on success.
+
+@example
+if (lt_dlseterror (LTDL_ERROR_NO_MEMORY) != 0)
+ perror (lt_dlerror ());
+@end example
+@end deftypefun
+
+@node Distributing libltdl
+@section How to distribute libltdl with your package
+
+Even though libltdl is installed together with libtool, you may wish
+to include libltdl in the distribution of your package, for the
+convenience of users of your package that don't have libtool or
+libltdl installed, 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 what flavor of libltdl you want to use: a
+convenience library or an installable libtool library.
+
+The most simplistic way to add @code{libltdl} to your package is to
+copy all the @file{libltdl} source files to a subdirectory within
+your package and to build and link them along with the rest of your
+sources. To help you do this, the m4 macros for Autoconf are
+available in @file{ltdl.m4}. You must ensure that they are available
+in @file{aclocal.m4} before you run Autoconf@footnote{@c
+@c
+We used to recommend adding the contents of @file{ltdl.m4} to
+@file{acinclude.m4}, but with @command{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 @file{acinclude.m4}
+if you move to a different release of libltdl.
+@c
+}. Having made the macros available, you must add a call to the
+@samp{LTDL_INIT} macro (after the call to @samp{LT_INIT})
+to your package's @file{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.
+
+@defmac LT_CONFIG_LTDL_DIR (@var{directory})
+Declare @var{directory} to be the location of the @code{libltdl}
+source files, for @command{libtoolize --ltdl} to place
+them. @xref{Invoking libtoolize}, for more details. Provided that you
+add an appropriate @code{LT_CONFIG_LTDL_DIR} call in your
+@file{configure.ac} before calling @command{libtoolize}, the
+appropriate @code{libltdl} files will be installed automatically.
+@end defmac
+
+@defmac LTDL_INIT (@var{options})
+@defmacx LT_WITH_LTDL
+@defmacx AC_WITH_LTDL
+@code{AC_WITH_LTDL} and @code{LT_WITH_LTDL} are deprecated names for
+older versions of this macro; @command{autoupdate} will update your
+@file{configure.ac} file.
+
+This macro adds the following options to the @command{configure}
+script:
+
+@table @option
+@item --with-ltdl-include @var{installed-ltdl-header-dir}
+The @code{LTDL_INIT} macro will look in the standard header file
+locations to find the installed @code{libltdl} headers. If
+@code{LTDL_INIT} can't find them by itself, the person who builds
+your package can use this option to tell @command{configure} where
+the installed @code{libltdl} headers are.
+
+@item --with-ltdl-lib @var{installed-ltdl-library-dir}
+Similarly, the person building your package can use this option to
+help @command{configure} find the installed @file{libltdl.la}.
+
+@item --with-included-ltdl
+If there is no installed @code{libltdl}, or in any case if the
+person building your package would rather use the @code{libltdl}
+sources shipped with the package in the subdirectory named by
+@code{LT_CONFIG_LTDL_DIR}, they should pass this option to
+@command{configure}.
+@end table
+
+If the @option{--with-included-ltdl} is not passed at
+configure time, and an installed @code{libltdl} is not
+found@footnote{@c
+@c
+Even if libltdl is installed, @samp{LTDL_INIT} may fail
+to detect it if libltdl depends on symbols provided by libraries
+other than the C library.
+@c
+}, then @command{configure} will exit immediately with an error that
+asks the user to either specify the location of an installed
+@code{libltdl} using the @option{--with-ltdl-include} and
+@option{--with-ltdl-lib} options, or to build with the
+@code{libltdl} sources shipped with the package by passing
+@option{--with-included-ltdl}.
+
+If an installed @code{libltdl} is found, then @code{LIBLTDL} is set to
+the link flags needed to use it, and @code{LTDLINCL} to the preprocessor
+flags needed to find the installed headers, and @code{LTDLDEPS} will
+be empty. Note, however, that no version checking is performed. You
+should manually check for the @code{libltdl} features you need in
+@file{configure.ac}:
+
+@example
+LT_INIT([dlopen])
+LTDL_INIT
+
+# The lt_dladvise_init symbol was added with libtool-2.2
+if test yes != "$with_included_ltdl"; 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
+@end example
+
+@var{options} may include no more than one of the following build
+modes depending on how you want your project to build @code{libltdl}:
+@samp{nonrecursive}, @samp{recursive}, or @samp{subproject}. In order
+for @command{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).
+
+@table @samp
+@item nonrecursive
+This is how the Libtool project distribution builds the @code{libltdl}
+we ship and install. If you wish to use Automake to build
+@code{libltdl} without invoking a recursive make to descend into the
+@code{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
+@code{subdir-objects} and @code{LIBOBJDIR} properly. In your
+@file{configure.ac}, add:
+
+@example
+AM_INIT_AUTOMAKE([subdir-objects])
+AC_CONFIG_HEADERS([config.h])
+LT_CONFIG_LTDL_DIR([libltdl])
+LT_INIT([dlopen])
+LTDL_INIT([nonrecursive])
+@end example
+
+@noindent
+You @emph{have to} use a config header, but it may have a name different
+than @file{config.h}.
+
+Also, add the following near the top of your @file{Makefile.am}:
+
+@example
+AM_CPPFLAGS =
+AM_LDFLAGS =
+
+BUILT_SOURCES =
+EXTRA_DIST =
+CLEANFILES =
+MOSTLYCLEANFILES =
+
+include_HEADERS =
+noinst_LTLIBRARIES =
+lib_LTLIBRARIES =
+EXTRA_LTLIBRARIES =
+
+include libltdl/ltdl.mk
+@end example
+
+@noindent
+Unless you build no other libraries from this @file{Makefile.am},
+you will also need to change @code{lib_LTLIBRARIES} to assign with
+@samp{+=} so that the @code{libltdl} targets declared in
+@file{ltdl.mk} are not overwritten.
+
+@item recursive
+This build mode still requires that you use Automake, but (in contrast
+with @samp{nonrecursive}) uses the more usual device of starting another
+@code{make} process in the @file{libltdl} subdirectory. To use this
+mode, you should add to your @file{configure.ac}:
+
+@example
+AM_INIT_AUTOMAKE
+AC_CONFIG_HEADERS([config.h])
+LT_CONFIG_LTDL_DIR([libltdl])
+LT_INIT([dlopen])
+LTDL_INIT([recursive])
+AC_CONFIG_FILES([libltdl/Makefile])
+@end example
+
+@noindent
+Again, you @emph{have to} use a config header, but it may have a name
+different than @file{config.h} if you like.
+
+Also, add this to your @file{Makefile.am}:
+
+@example
+SUBDIRS = libltdl
+@end example
+
+@item subproject
+This mode is the default unless you explicitly add @code{recursive} or
+@code{nonrecursive} to your @code{LTDL_INIT} options; @code{subproject}
+is the only mode supported by previous releases of libltdl. Even if you
+do not use Autoconf in the parent project, then, in @samp{subproject}
+mode, still @code{libltdl} contains all the necessary files to configure
+and build itself -- you just need to arrange for your build system to
+call @file{libltdl/configure} with appropriate options, and then run
+@code{make} in the @code{libltdl} subdirectory.
+
+If you @emph{are} using Autoconf and Automake, then you will need to add
+the following to your @file{configure.ac}:
+
+@example
+LT_CONFIG_LTDL_DIR([libltdl])
+LTDL_INIT
+@end example
+
+@noindent
+and to @file{Makefile.am}:
+
+@example
+SUBDIRS = libltdl
+@end example
+@end table
+
+Aside from setting the libltdl build mode, there are other keywords
+that you can pass to @code{LTDL_INIT} to modify its behavior when
+@option{--with-included-ltdl} has been given:
+
+@table @samp
+@item convenience
+This is the default unless you explicitly add @code{installable} to
+your @code{LTDL_INIT} options.
+
+This keyword will cause options to be passed to the @command{configure}
+script in the subdirectory named by @code{LT_CONFIG_LTDL_DIR}
+to cause it to be built as a convenience library. If you're not
+using automake, you will need to define @code{top_build_prefix},
+@code{top_builddir}, and @code{top_srcdir} in your makefile so that
+@code{LIBLTDL}, @code{LTDLDEPS}, and @code{LTDLINCL} expand correctly.
+
+One advantage of the convenience library is that it is not installed,
+so the fact that you use @code{libltdl} will not be apparent to the
+user, and it won't overwrite a pre-installed version of
+@code{libltdl} the system might already have in the installation
+directory. On the other hand, if you want to upgrade @code{libltdl}
+for any reason (e.g.@: a bugfix) you'll have to recompile your package
+instead of just replacing the shared installed version of
+@code{libltdl}. However, if your programs or libraries are linked
+with other libraries that use such a pre-installed version of
+@code{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 @code{libltdl} too.
+
+@item installable
+This keyword will pass options to the @command{configure}
+script in the subdirectory named by @code{LT_CONFIG_LTDL_DIR}
+to cause it to be built as an installable library. If you're not
+using automake, you will need to define @code{top_build_prefix},
+@code{top_builddir} and @code{top_srcdir} in your makefile so that
+@code{LIBLTDL}, @code{LTDLDEPS}, and @code{LTDLINCL} are expanded
+properly.
+
+Be aware that you could overwrite another @code{libltdl} already
+installed to the same directory if you use this option.
+@end table
+@end defmac
+
+Whatever method you use, @samp{LTDL_INIT} will define the shell variable
+@code{LIBLTDL} to the link flag that you should use to link with
+@code{libltdl}, the shell variable @code{LTDLDEPS} to the files that
+can be used as a dependency in @file{Makefile} rules, and the shell
+variable @code{LTDLINCL} to the preprocessor flag that you should use to
+compile programs that include @file{ltdl.h}. So, when you want to link a
+program with libltdl, be it a convenience, installed or installable
+library, just use @samp{$(LTDLINCL)} for preprocessing and compilation,
+and @samp{$(LIBLTDL)} for linking.
+
+@itemize @bullet
+@item
+If your package is built using an installed version of @code{libltdl},
+@code{LIBLTDL} will be set to the compiler flags needed to link against
+the installed library, @code{LTDLDEPS} will be empty, and @code{LTDLINCL}
+will be set to the compiler flags needed to find the @code{libltdl}
+header files.
+
+@item
+If your package is built using the convenience libltdl, @code{LIBLTDL}
+and @code{LTDLDEPS} will be the pathname for the convenience version of
+libltdl (starting with @samp{$@{top_builddir@}/} or
+@samp{$@{top_build_prefix@}}) and @code{LTDLINCL} will be @option{-I}
+followed by the directory that contains @file{ltdl.h} (starting with
+@samp{$@{top_srcdir@}/}).
+
+@item
+If an installable version of the included @code{libltdl} is being
+built, its pathname starting with @samp{$@{top_builddir@}/} or
+@samp{$@{top_build_prefix@}}, will be stored in @code{LIBLTDL} and
+@code{LTDLDEPS}, and @code{LTDLINCL} will be set just like in the case of
+convenience library.
+@end itemize
+
+You should probably also use the @samp{dlopen} option to @code{LT_INIT}
+in your @file{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 @option{-static},
+@option{-static-libtool-libs}, or @option{-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
+@code{LTDL_INIT} option @samp{installable} with @samp{convenience}. We
+assume that libltdl was embedded using @samp{libtoolize --ltdl}.
+
+configure.ac:
+@example
+...
+# 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])
+...
+@end example
+
+Makefile.am:
+@example
+...
+SUBDIRS = libltdl
+
+AM_CPPFLAGS = $(LTDLINCL)
+
+myprog_LDFLAGS = -export-dynamic
+myprog_LDADD = $(LIBLTDL) -dlopen self -dlopen foo1.la
+myprog_DEPENDENCIES = $(LTDLDEPS) foo1.la
+...
+@end example
+
+@defmac LTDL_INSTALLABLE
+@defmacx AC_LIBLTDL_INSTALLABLE
+These macros are deprecated, the @samp{installable} option to
+@code{LTDL_INIT} should be used instead.
+@end defmac
+
+@defmac LTDL_CONVENIENCE
+@defmacx AC_LIBLTDL_CONVENIENCE
+These macros are deprecated, the @samp{convenience} option to
+@code{LTDL_INIT} should be used instead.
+@end defmac
+
+
+@node Trace interface
+@chapter Libtool's trace interface
+@cindex trace interface
+@cindex autoconf traces
+
+This section describes macros whose sole purpose is to be traced using
+Autoconf's @option{--trace} option (@pxref{autoconf Invocation, , The
+Autoconf Manual, autoconf, The Autoconf Manual}) 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.
+
+@defmac LT_SUPPORTED_TAG (@var{tag})
+This macro is called once for each language enabled in the package. Its
+only argument, @var{tag}, is the tag-name corresponding to the language
+(@pxref{Tags}).
+
+You can therefore retrieve the list of all tags enabled in a project
+using the following command:
+@example
+autoconf --trace 'LT_SUPPORTED_TAG:$1'
+@end example
+@end defmac
+
+
+@node FAQ
+@chapter 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
+@end menu
+
+@node Stripped link flags
+@section Why does libtool strip link flags when creating a library?
+
+When creating a shared library, but not when compiling or creating
+a program, @command{libtool} drops some flags from the command line
+provided by the user. This is done because flags unknown to
+@command{libtool} may interfere with library creation or require
+additional support from @command{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 @code{-Wc,} or @code{-Xcompiler }
+to allow them to be passed through to the compiler driver
+(@pxref{Link mode}). Another possibility is to add flags already
+to the compiler command at @command{configure} run time:
+
+@example
+./configure CC='gcc -m64'
+@end example
+
+If you think @command{libtool} should let some flag through by default,
+here's how you can test such an inclusion: grab the Libtool development
+tree, edit the @file{ltmain.in} file in the @file{libltdl/config}
+subdirectory to pass through the flag (search for @samp{Flags to be
+passed through}), re-bootstrap and build with the flags in question
+added to @code{LDFLAGS}, @code{CFLAGS}, @code{CXXFLAGS}, etc. on the
+@command{configure} command line as appropriate. Run the testsuite
+as described in the @file{README} file and report results to
+@value{BUGADDR}.
+
+@node Troubleshooting
+@chapter Troubleshooting
+@cindex troubleshooting
+@cindex problems, solving
+@cindex solving problems
+@cindex problems, blaming somebody else for
+
+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.
+@end menu
+
+@node Libtool test suite
+@section The libtool test suite
+@cindex 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 @file{README} file, you may run @kbd{make -k check}
+after you have built libtool (possibly before you install it)
+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.
+@end menu
+
+@node Test descriptions
+@subsection Description of test suite
+
+Here is a list of the current programs in the old test suite, and what
+they test for:
+
+@table @file
+
+@item cdemo-conf.test
+@itemx cdemo-make.test
+@itemx cdemo-exec.test
+@itemx cdemo-static.test
+@itemx cdemo-static-make.test
+@itemx cdemo-static-exec.test
+@itemx cdemo-shared.test
+@itemx cdemo-shared-make.test
+@itemx cdemo-shared-exec.test
+@itemx cdemo-undef.test
+@itemx cdemo-undef-make.test
+@itemx cdemo-undef-exec.test
+@pindex cdemo-conf.test
+@pindex cdemo-make.test
+@pindex cdemo-exec.test
+@pindex cdemo-static.test
+@pindex cdemo-static-make.test
+@pindex cdemo-static-exec.test
+@pindex cdemo-shared.test
+@pindex cdemo-shared-make.test
+@pindex cdemo-shared-exec.test
+@pindex cdemo-undef.test
+@pindex cdemo-undef-make.test
+@pindex cdemo-undef-exec.test
+These programs check to see that the @file{tests/cdemo} subdirectory of
+the libtool distribution can be configured and built correctly.
+
+The @file{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 @file{cdemo-*make.test} and @file{cdemo-*exec.test}
+are executed three times, under three different libtool configurations:
+@file{cdemo-conf.test} configures @file{cdemo/libtool} to build both
+static and shared libraries (the default for platforms that support
+both), @file{cdemo-static.test} builds only static libraries
+(@samp{--disable-shared}), and @file{cdemo-shared.test} builds only
+shared libraries (@samp{--disable-static}).
+
+The test @file{cdemo-undef.test} tests the generation of shared
+libraries with undefined symbols on systems that allow this.
+
+@item demo-conf.test
+@itemx demo-make.test
+@itemx demo-exec.test
+@itemx demo-inst.test
+@itemx demo-unst.test
+@itemx demo-static.test
+@itemx demo-static-make.test
+@itemx demo-static-exec.test
+@itemx demo-static-inst.test
+@itemx demo-static-unst.test
+@itemx demo-shared.test
+@itemx demo-shared-make.test
+@itemx demo-shared-exec.test
+@itemx demo-shared-inst.test
+@itemx demo-shared-unst.test
+@itemx demo-nofast.test
+@itemx demo-nofast-make.test
+@itemx demo-nofast-exec.test
+@itemx demo-nofast-inst.test
+@itemx demo-nofast-unst.test
+@itemx demo-pic.test
+@itemx demo-pic-make.test
+@itemx demo-pic-exec.test
+@itemx demo-nopic.test
+@itemx demo-nopic-make.test
+@itemx demo-nopic-exec.test
+@pindex demo-conf.test
+@pindex demo-make.test
+@pindex demo-exec.test
+@pindex demo-inst.test
+@pindex demo-unst.test
+@pindex demo-static.test
+@pindex demo-static-make.test
+@pindex demo-static-exec.test
+@pindex demo-static-inst.test
+@pindex demo-static-unst.test
+@pindex demo-shared.test
+@pindex demo-shared-make.test
+@pindex demo-shared-exec.test
+@pindex demo-shared-inst.test
+@pindex demo-shared-unst.test
+@pindex demo-nofast.test
+@pindex demo-nofast-make.test
+@pindex demo-nofast-exec.test
+@pindex demo-nofast-inst.test
+@pindex demo-nofast-unst.test
+@pindex demo-pic.test
+@pindex demo-pic-make.test
+@pindex demo-pic-exec.test
+@pindex demo-nopic.test
+@pindex demo-nopic-make.test
+@pindex demo-nopic-exec.test
+These programs check to see that the @file{tests/demo} subdirectory of
+the libtool distribution can be configured, built, installed, and
+uninstalled correctly.
+
+The @file{tests/demo} subdirectory contains a demonstration of a trivial
+package that uses libtool. The tests matching @file{demo-*make.test},
+@file{demo-*exec.test}, @file{demo-*inst.test} and
+@file{demo-*unst.test} are executed four times, under four different
+libtool configurations: @file{demo-conf.test} configures
+@file{demo/libtool} to build both static and shared libraries,
+@file{demo-static.test} builds only static libraries
+(@option{--disable-shared}), and @file{demo-shared.test} builds only
+shared libraries (@option{--disable-static}).
+@file{demo-nofast.test} configures @file{demo/libtool} to
+disable the fast-install mode (@option{--enable-fast-install=no}).
+@file{demo-pic.test} configures @file{demo/libtool} to
+prefer building PIC code (@option{--with-pic}), @file{demo-nopic.test}
+to prefer non-PIC code (@option{--without-pic}).
+
+@item demo-deplibs.test
+@pindex demo-deplibs.test
+Many systems cannot link static libraries into shared libraries.
+libtool uses a @code{deplibs_check_method} to prevent such cases.
+This tests checks whether libtool's @code{deplibs_check_method}
+works properly.
+
+@item demo-hardcode.test
+@pindex demo-hardcode.test
+On all systems with shared libraries, the location of the library can be
+encoded in executables that are linked against it @pxref{Linking
+executables}. This test checks under what conditions your system
+linker hardcodes the library location, and guarantees that they
+correspond to libtool's own notion of how your linker behaves.
+
+@item demo-relink.test
+@itemx depdemo-relink.test
+@pindex demo-relink.test
+@pindex depdemo-relink.test
+These tests check whether variable @code{shlibpath_overrides_runpath} is
+properly set. If the test fails, it will indicate what the variable should
+have been set to.
+
+@item demo-noinst-link.test
+@pindex 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.
+
+@item depdemo-conf.test
+@itemx depdemo-make.test
+@itemx depdemo-exec.test
+@itemx depdemo-inst.test
+@itemx depdemo-unst.test
+@itemx depdemo-static.test
+@itemx depdemo-static-make.test
+@itemx depdemo-static-exec.test
+@itemx depdemo-static-inst.test
+@itemx depdemo-static-unst.test
+@itemx depdemo-shared.test
+@itemx depdemo-shared-make.test
+@itemx depdemo-shared-exec.test
+@itemx depdemo-shared-inst.test
+@itemx depdemo-shared-unst.test
+@itemx depdemo-nofast.test
+@itemx depdemo-nofast-make.test
+@itemx depdemo-nofast-exec.test
+@itemx depdemo-nofast-inst.test
+@itemx depdemo-nofast-unst.test
+@pindex depdemo-conf.test
+@pindex depdemo-make.test
+@pindex depdemo-exec.test
+@pindex depdemo-inst.test
+@pindex depdemo-unst.test
+@pindex depdemo-static.test
+@pindex depdemo-static-make.test
+@pindex depdemo-static-exec.test
+@pindex depdemo-static-inst.test
+@pindex depdemo-static-unst.test
+@pindex depdemo-shared.test
+@pindex depdemo-shared-make.test
+@pindex depdemo-shared-exec.test
+@pindex depdemo-shared-inst.test
+@pindex depdemo-shared-unst.test
+@pindex depdemo-nofast.test
+@pindex depdemo-nofast-make.test
+@pindex depdemo-nofast-exec.test
+@pindex depdemo-nofast-inst.test
+@pindex depdemo-nofast-unst.test
+These programs check to see that the @file{tests/depdemo} subdirectory
+of the libtool distribution can be configured, built, installed, and
+uninstalled correctly.
+
+The @file{tests/depdemo} subdirectory contains a demonstration of
+inter-library dependencies with libtool. The test programs link some
+interdependent libraries.
+
+The tests matching @file{depdemo-*make.test}, @file{depdemo-*exec.test},
+@file{depdemo-*inst.test} and @file{depdemo-*unst.test} are executed
+four times, under four different libtool configurations:
+@file{depdemo-conf.test} configures @file{depdemo/libtool} to build both
+static and shared libraries, @file{depdemo-static.test} builds only static
+libraries (@option{--disable-shared}), and @file{depdemo-shared.test} builds
+only shared libraries (@option{--disable-static}).
+@file{depdemo-nofast.test} configures @file{depdemo/libtool} to
+disable the fast-install mode (@option{--enable-fast-install=no}).
+
+@item mdemo-conf.test
+@itemx mdemo-make.test
+@itemx mdemo-exec.test
+@itemx mdemo-inst.test
+@itemx mdemo-unst.test
+@itemx mdemo-static.test
+@itemx mdemo-static-make.test
+@itemx mdemo-static-exec.test
+@itemx mdemo-static-inst.test
+@itemx mdemo-static-unst.test
+@itemx mdemo-shared.test
+@itemx mdemo-shared-make.test
+@itemx mdemo-shared-exec.test
+@itemx mdemo-shared-inst.test
+@itemx mdemo-shared-unst.test
+@pindex mdemo-conf.test
+@pindex mdemo-make.test
+@pindex mdemo-exec.test
+@pindex mdemo-inst.test
+@pindex mdemo-unst.test
+@pindex mdemo-static.test
+@pindex mdemo-static-make.test
+@pindex mdemo-static-exec.test
+@pindex mdemo-static-inst.test
+@pindex mdemo-static-unst.test
+@pindex mdemo-shared.test
+@pindex mdemo-shared-make.test
+@pindex mdemo-shared-exec.test
+@pindex mdemo-shared-inst.test
+@pindex mdemo-shared-unst.test
+These programs check to see that the @file{tests/mdemo} subdirectory of
+the libtool distribution can be configured, built, installed, and
+uninstalled correctly.
+
+The @file{tests/mdemo} subdirectory contains a demonstration of a
+package that uses libtool and the system independent dlopen wrapper
+@file{libltdl} to load modules. The library @file{libltdl} provides a
+dlopen wrapper for various platforms (POSIX)
+including support for dlpreopened modules (@pxref{Dlpreopening}).
+
+The tests matching @file{mdemo-*make.test}, @file{mdemo-*exec.test},
+@file{mdemo-*inst.test} and @file{mdemo-*unst.test} are executed
+three times, under three different libtool configurations:
+@file{mdemo-conf.test} configures @file{mdemo/libtool} to build both
+static and shared libraries, @file{mdemo-static.test} builds only static
+libraries (@option{--disable-shared}), and @file{mdemo-shared.test} builds
+only shared libraries (@option{--disable-static}).
+
+@item mdemo-dryrun.test
+@pindex mdemo-dryrun.test
+This test checks whether libtool's @option{--dry-run} mode works properly.
+
+@item mdemo2-conf.test
+@itemx mdemo2-exec.test
+@itemx mdemo2-make.test
+@pindex mdemo2-conf.test
+@pindex mdemo2-exec.test
+@pindex mdemo2-make.test
+These programs check to see that the @file{tests/mdemo2} subdirectory of
+the libtool distribution can be configured, built, and executed
+correctly.
+
+The @file{tests/mdemo2} directory contains a demonstration of a package
+that attempts to link with a library (from the @file{tests/mdemo}
+directory) that itself does dlopening of libtool modules.
+
+@item link.test
+@pindex link.test
+This test guarantees that linking directly against a non-libtool static
+library works properly.
+
+@item link-2.test
+@pindex link-2.test
+This test makes sure that files ending in @file{.lo} are never linked
+directly into a program file.
+
+@item nomode.test
+@pindex nomode.test
+Check whether we can actually get help for libtool.
+
+@item objectlist.test
+@pindex objectlist.test
+Check that a nonexistent objectlist file is properly detected.
+
+@item pdemo-conf.test
+@itemx pdemo-make.test
+@itemx pdemo-exec.test
+@itemx pdemo-inst.test
+@pindex pdemo-conf.test
+@pindex pdemo-make.test
+@pindex pdemo-exec.test
+@pindex pdemo-inst.test
+These programs check to see that the @file{tests/pdemo} subdirectory of
+the libtool distribution can be configured, built, and executed
+correctly.
+
+The @file{pdemo-conf.test} lowers the @code{max_cmd_len} variable in the
+generated libtool script to test the measures to evade command line
+length limitations.
+
+@item quote.test
+@pindex quote.test
+This program checks libtool's metacharacter quoting.
+
+@item sh.test
+@pindex sh.test
+Checks for some nonportable or dubious or undesired shell constructs in
+shell scripts.
+
+@item suffix.test
+@pindex suffix.test
+When other programming languages are used with libtool (@pxref{Other
+languages}), the source files may end in suffixes other than @file{.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.
+
+@item tagdemo-conf.test
+@itemx tagdemo-make.test
+@itemx tagdemo-exec.test
+@itemx tagdemo-static.test
+@itemx tagdemo-static-make.test
+@itemx tagdemo-static-exec.test
+@itemx tagdemo-shared.test
+@itemx tagdemo-shared-make.test
+@itemx tagdemo-shared-exec.test
+@itemx tagdemo-undef.test
+@itemx tagdemo-undef-make.test
+@itemx tagdemo-undef-exec.test
+@pindex tagdemo-conf.test
+@pindex tagdemo-make.test
+@pindex tagdemo-exec.test
+@pindex tagdemo-static.test
+@pindex tagdemo-static-make.test
+@pindex tagdemo-static-exec.test
+@pindex tagdemo-shared.test
+@pindex tagdemo-shared-make.test
+@pindex tagdemo-shared-exec.test
+@pindex tagdemo-undef.test
+@pindex tagdemo-undef-make.test
+@pindex tagdemo-undef-exec.test
+These programs check to see that the @file{tests/tagdemo} subdirectory
+of the libtool distribution can be configured, built, and executed
+correctly.
+
+The @file{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.
+
+@item f77demo-conf.test
+@itemx f77demo-make.test
+@itemx f77demo-exec.test
+@itemx f77demo-static.test
+@itemx f77demo-static-make.test
+@itemx f77demo-static-exec.test
+@itemx f77demo-shared.test
+@itemx f77demo-shared-make.test
+@itemx f77demo-shared-exec.test
+@pindex f77demo-conf.test
+@pindex f77demo-make.test
+@pindex f77demo-exec.test
+@pindex f77demo-static.test
+@pindex f77demo-static-make.test
+@pindex f77demo-static-exec.test
+@pindex f77demo-shared.test
+@pindex f77demo-shared-make.test
+@pindex f77demo-shared-exec.test
+These programs check to see that the @file{tests/f77demo} subdirectory
+of the libtool distribution can be configured, built, and executed
+correctly.
+
+The @file{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.
+
+@item fcdemo-conf.test
+@itemx fcdemo-make.test
+@itemx fcdemo-exec.test
+@itemx fcdemo-static.test
+@itemx fcdemo-static-make.test
+@itemx fcdemo-static-exec.test
+@itemx fcdemo-shared.test
+@itemx fcdemo-shared-make.test
+@itemx fcdemo-shared-exec.test
+@pindex fcdemo-conf.test
+@pindex fcdemo-make.test
+@pindex fcdemo-exec.test
+@pindex fcdemo-static.test
+@pindex fcdemo-static-make.test
+@pindex fcdemo-static-exec.test
+@pindex fcdemo-shared.test
+@pindex fcdemo-shared-make.test
+@pindex fcdemo-shared-exec.test
+These programs check to see that the @file{tests/fcdemo} subdirectory
+of the libtool distribution can be configured, built, and executed
+correctly.
+
+The @file{tests/fcdemo} is similar to the @file{tests/f77demo}
+directory, except that Fortran 90 is used in combination with the
+@samp{FC} interface provided by Autoconf and Automake.
+
+@end table
+
+The new, Autotest-based test suite uses keywords to classify certain
+test groups:
+
+@table @samp
+@item CXX
+@itemx F77
+@itemx FC
+@itemx GCJ
+The test group exercises one of these @command{libtool} language tags.
+
+@item autoconf
+@itemx 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 @samp{automake} keyword may also denote use of the
+@command{aclocal} program.
+
+@item 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.
+
+@item libltdl
+Denote that the @file{libltdl} library is exercised by the test group.
+
+@item libtool
+@itemx libtoolize
+Denote that the @command{libtool} or @command{libtoolize} scripts are
+exercised by the test group, respectively.
+
+@item recursive
+Denote that this test group may recursively re-invoke the test suite
+itself, with changed settings and maybe a changed @command{libtool}
+script. You may use the @env{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 @code{-k libtool} right before the expansion of the
+@env{INNER_TESTSUITEFLAGS} variable (without an intervening space, so
+you get the chance for further delimitation).
+
+Test groups with the keyword @samp{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.
+@end table
+
+@cindex @samp{check-interactive}
+@cindex @samp{check-noninteractive}
+There is a convenience target @samp{check-noninteractive} that runs
+all tests from both test suites that do not cause user interaction on
+Windows. Conversely, the target @samp{check-interactive} runs the
+complement of tests and might require closing popup windows about DLL
+load errors on Windows.
+
+
+@node When tests fail
+@subsection When tests fail
+@cindex failed tests
+@cindex tests, failed
+
+When the tests in the old test suite are run via @command{make check},
+output is caught in per-test @file{tests/@var{test-name}.log} files
+and summarized in the @file{test-suite.log} file. The exit status of each
+program tells the @file{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
+@file{tests/testsuite.log} that contains information about failed
+tests.
+
+You can pass options to the test suite through the @command{make}
+variable @env{TESTSUITEFLAGS} (@pxref{testsuite Invocation, ,
+The Autoconf Manual, autoconf, The Autoconf Manual}).
+
+
+@node Reporting bugs
+@section Reporting bugs
+@cindex bug reports
+@cindex reporting bugs
+@cindex problem reports
+
+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 (@pxref{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 (@pxref{Bugs, ,
+Reporting Bugs, emacs, The Emacs Manual}). 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 @value{BUGADDR} with any appropriate
+@emph{facts}, such as test suite output (@pxref{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 @kbd{libtool --version}).
+
+@node Maintaining
+@chapter 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.
+@end menu
+
+@node New ports
+@section Porting libtool to new systems
+
+Before you embark on porting libtool to an unsupported system, it is
+worthwhile to send e-mail to @value{MAILLIST}, 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
+@end menu
+
+@node Information sources
+@subsection Information sources
+
+Once it is clear that a new port is necessary, you'll generally need the
+following information:
+
+@table @asis
+@item canonical system name
+You need the output of @code{config.guess} for this system, so that you
+can make changes to the libtool configuration process without affecting
+other systems.
+
+@item man pages for @command{ld} and @command{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.
+
+@item man pages for @command{ld.so}, @command{rtld}, or equivalent
+These are a valuable resource for understanding how shared libraries are
+loaded on the system.
+
+@item man page for @command{ldconfig}, or equivalent
+This page usually describes how to install shared libraries.
+
+@item output from @kbd{ls -l /lib /usr/lib}
+This shows the naming convention for shared libraries on the system,
+including what names should be symbolic links.
+
+@item any additional documentation
+Some systems have special documentation on how to build and install
+shared libraries.
+@end table
+
+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
+@code{libtool.m4} macros to make platform-specific changes to
+the configuration process. You should search that file for the
+@code{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 (@pxref{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 @code{ltmain.in} script accordingly. Be sure to write to the
+mailing list before you make changes to @code{ltmain.in}, since they may
+have advice on the most effective way of accomplishing what you want.
+
+@node Porting inter-library dependencies
+@subsection Porting inter-library dependencies support
+@cindex inter-library dependency
+@vindex deplibs_check_method
+
+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 @email{badger@@prtr-13.ucsc.edu}. Here's a shortened version
+of the message that contained his patch:
+
+The basic architecture is this: in @file{libtool.m4}, the person who
+writes libtool makes sure @samp{$deplibs} is included in
+@samp{$archive_cmds} somewhere and also sets the variable
+@samp{$deplibs_check_method}, and maybe @samp{$file_magic_cmd} when
+@samp{deplibs_check_method} is file_magic.
+
+@samp{deplibs_check_method} can be one of five things:
+@table @samp
+@item file_magic [@var{regex}]
+@vindex file_magic
+@vindex file_magic_cmd
+@vindex file_magic_test_file
+looks in the library link path for libraries that have the right
+libname. Then it runs @samp{$file_magic_cmd} on the library and checks
+for a match against the extended regular expression @var{regex}. When
+@code{file_magic_test_file} is set by @file{libtool.m4}, it is used as an
+argument to @samp{$file_magic_cmd} to verify whether the
+regular expression matches its output, and warn the user otherwise.
+
+@item test_compile
+@vindex 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
+@code{ldd}. It is currently unused, and will probably be dropped in the
+future.
+
+@item pass_all
+@vindex pass_all
+will pass everything without any checking. This may work on platforms
+where 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.
+
+@item none
+@vindex none
+It causes deplibs to be reassigned @samp{deplibs=""}. That way
+@samp{archive_cmds} can contain deplibs on all platforms, but not have
+deplibs used unless needed.
+
+@item unknown
+@vindex unknown
+is the default for all systems unless overridden in @file{libtool.m4}.
+It is the same as @samp{none}, but it documents that we really don't
+know what the correct value should be, and we welcome patches that
+improve it.
+@end table
+
+Then in @file{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@dots{} 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.
+
+@node Tested platforms
+@section Tested platforms
+
+This table describes when libtool was last known to be tested on
+platforms where it claims to support shared libraries:
+
+@example
+@include PLATFORMS
+@end example
+
+Note: The vendor-distributed HP-UX @command{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
+@command{sed} (such as GNU @command{sed}) on these systems.
+
+Note: The vendor-distributed NCR MP-RAS @command{cc} programs emits
+copyright on standard error that confuse tests on size of
+@file{conftest.err}. The workaround is to specify @code{CC}
+when run @code{configure} with @kbd{CC='cc -Hnocopyr'}.
+
+@node Platform quirks
+@section 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.
+@end menu
+
+@node References
+@subsection References
+
+The following is a list of valuable documentation references:
+
+@itemize @bullet
+@item
+SGI's IRIX Manual Pages can be found at@*
+@url{http://techpubs.sgi.com/cgi-bin/infosrch.cgi?cmd=browse&db=man}.
+
+@item
+Sun's free service area
+(@url{http://www.sun.com/service/online/free.html}) and documentation
+server (@url{http://docs.sun.com/}).
+
+@item
+Compaq's Tru64 UNIX online documentation is at@*
+(@url{http://tru64unix.compaq.com/faqs/publications/pub_page/doc_list.html})
+with C++ documentation at@*
+(@url{http://tru64unix.compaq.com/cplus/docs/index.htm}).
+
+@item
+Hewlett-Packard has online documentation at
+(@url{http://docs.hp.com/index.html}).
+
+@item
+IBM has online documentation at
+(@url{http://www.rs6000.ibm.com/resource/aix_resource/Pubs/}).
+@end itemize
+
+@node Compilers
+@subsection 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:
+
+@table @code
+@item 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 @option{-fpic} or @option{-fPIC} flags can be used to generate
+position-independent code. @option{-fPIC} is guaranteed to generate
+working code, but the code is slower on m68k, m88k, and SPARC chips.
+However, using @option{-fpic} on those chips imposes arbitrary size limits
+on the shared libraries.
+@end table
+
+The rest of this subsection lists compilers by the operating system that
+they are bundled with:
+
+@c FIXME these should all be better-documented
+
+@table @code
+@item aix3*
+@itemx 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. @footnote{All code compiled
+for the PowerPC and RS/6000 chips (@code{powerpc-*-*}, @code{powerpcle-*-*},
+and @code{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.}
+
+@item hpux10*
+Use @samp{+Z} to generate PIC.
+
+@item osf3*
+Digital/UNIX 3.x does not have PIC flags, at least not on the PowerPC
+platform.
+
+@item solaris2*
+Use @option{-KPIC} to generate PIC.
+
+@item sunos4*
+Use @option{-PIC} to generate PIC.
+@end table
+
+@node Reloadable objects
+@subsection Reloadable objects
+
+On all known systems, a reloadable object can be created by running
+@kbd{ld -r -o @var{output}.o @var{input1}.o @var{input2}.o}. This
+reloadable object may be treated as exactly equivalent to other
+objects.
+
+@node Multiple dependencies
+@subsection Multiple dependencies
+
+On most modern platforms the order where 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
+@option{--preserve-dup-deps} to preserve all duplicate dependencies
+in cases where it is necessary.
+
+@node Archivers
+@subsection Archivers
+
+On all known systems, building a static library can be accomplished by
+running @kbd{ar cru lib@var{name}.a @var{obj1}.o @var{obj2}.o @dots{}},
+where the @file{.a} file is the output library, and each @file{.o} file is an
+object file.
+
+On all known systems, if there is a program named @command{ranlib}, then it
+must be used to ``bless'' the created library before linking against it,
+with the @kbd{ranlib lib@var{name}.a} command. Some systems, like Irix,
+use the @code{ar ts} command, instead.
+
+@node Cross compiling
+@subsection Cross compiling
+@cindex cross compile
+
+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 where the libraries or applications are compiled
+is called the @dfn{build platform}, while the platform where the libraries
+or applications are intended to be used or executed is called the
+@dfn{host platform}.
+@ref{GNU Build System,, The GNU Build System, automake, The Automake Manual},
+of which libtool is a part, supports cross compiling via arguments passed to
+the configure script: @option{--build=...} and @option{--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 @emph{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. @samp{i586-pc-linux-gnu} and @samp{i686-pc-linux-gnu}), there is
+another case where 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
+@uref{http://www.winehq.org/, Wine} 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 @samp{i686-pc-linux-gnu}. Suppose
+further that the host platform is MinGW with canonical triplet
+@samp{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
+@ref{Specifying Target Triplets,, Specifying Target Triplets, autoconf,
+The Autoconf Manual} and @ref{Canonicalizing,, Canonicalizing, autoconf,
+The Autoconf Manual}) In this case, the C compiler is named
+@samp{i586-pc-mingw32-gcc}.
+
+As described in @ref{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 @env{PATH} variable so
+that the true application's dependent libraries can be located---but the
+contents of the @env{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 @env{PATH} variable to point to the
+correct location.
+
+For example, suppose we are compiling an application in @file{/var/tmp} on
+GNU/Linux, using separate source code and build directories:
+
+@example
+@multitable @columnfractions 0.5 0.5
+@item @file{/var/tmp/foo-1.2.3/app/} @tab (application source code)
+@item @file{/var/tmp/foo-1.2.3/lib/} @tab (library source code)
+@item @file{/var/tmp/BUILD/app/} @tab (application build objects here)
+@item @file{/var/tmp/BUILD/lib/} @tab (library build objects here)
+@end multitable
+@end example
+
+Since the library will be built in @file{/var/tmp/BUILD/lib}, the wrapper
+executable (which will be in @file{/var/tmp/BUILD/app}) must add that
+directory to @env{PATH} (actually, it must add the directory named
+@var{objdir} under @file{/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 @file{/var/tmp/BUILD/lib}. Therefore, Wine provides
+a mapping from Windows file names such as @file{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
+
+@example
+Z:\var\tmp\BUILD\lib
+@end example
+
+@noindent
+to the @env{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 @command{winepath} utility to ensure that
+the correct @env{PATH} value is used. @xref{File name conversion}.
+
+@node File name conversion
+@subsection File name conversion
+@cindex file name conversion
+@cindex path 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
+(@pxref{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,
+@pxref{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
+(@pxref{File Name Conversion Failure}).
+
+libtool supports file name conversion in the following scenarios:
+
+@multitable @columnfractions .25 .25 .5
+@headitem build platform @tab host platform @tab Notes
+@item MinGW (MSYS) @tab MinGW (Windows)
+@tab @pxref{Native MinGW File Name Conversion}
+
+@item Cygwin @tab MinGW (Windows)
+@tab @pxref{Cygwin/Windows File Name Conversion}
+
+@item Unix + Wine @tab MinGW (Windows)
+@tab Requires Wine. @xref{Unix/Windows File Name Conversion}.
+
+@item MinGW (MSYS) @tab Cygwin
+@tab Requires @env{LT_CYGPATH}. @xref{LT_CYGPATH}. Provided for testing
+purposes only.
+
+@item Unix + Wine @tab Cygwin
+@tab Requires both Wine and @env{LT_CYGPATH}, but does not yet work with
+Cygwin 1.7.7 and Wine-1.2.
+@xref{Unix/Windows File Name Conversion}, and @ref{LT_CYGPATH}.
+@end multitable
+
+@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 @command{cygpath} to convert Cygwin file names
+* Unix/Windows File Name Conversion:: Using Wine to convert Unix paths
+* LT_CYGPATH:: Invoking @command{cygpath} from other environments
+* Cygwin to MinGW Cross:: Other notes concerning MinGW cross
+@end menu
+
+@node File Name Conversion Failure
+@subsubsection File Name Conversion Failure
+@cindex File Name Conversion - Failure
+@cindex Path 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:
+
+@example
+Could not determine the host file name corresponding to
+ `... a file name ...'
+Continuing, but uninstalled executables may not work.
+@end example
+
+@noindent
+or
+
+@example
+Could not determine the host path corresponding to
+ `... a path ...'
+Continuing, but uninstalled executables may not work.
+@end example
+
+@noindent
+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.
+
+@node Native MinGW File Name Conversion
+@subsubsection Native MinGW File Name Conversion
+@cindex File Name Conversion - MinGW
+@cindex Path Conversion - MinGW
+@cindex MSYS
+
+MSYS is a Unix emulation environment for Windows, and is specifically designed
+such that in normal usage it @emph{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
+@emph{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
+@env{PATH} to, and call @code{_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.
+
+@node Cygwin/Windows File Name Conversion
+@subsubsection Cygwin/Windows File Name Conversion
+@cindex File Name Conversion - Cygwin to Windows
+@cindex Path Conversion - Cygwin to Windows
+
+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
+@command{cygpath} that can be used to convert file names and paths between
+the two representations. In a correctly configured Cygwin installation,
+@command{cygpath} is always present, and is in the @env{PATH}.
+
+Libtool uses @command{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 @command{cygpath} to convert from Windows to Cygwin
+format (after first converting from the build platform format to Windows format;
+@xref{Native MinGW File Name Conversion}, and
+@ref{Unix/Windows File Name Conversion}.) Because the build platform is not
+Cygwin, @command{cygpath} is not (and should not be) in the @env{PATH}.
+Therefore, in this configuration the environment variable @env{LT_CYGPATH} is
+required. @xref{LT_CYGPATH}.
+
+@node Unix/Windows File Name Conversion
+@subsubsection Unix/Windows File Name Conversion
+@cindex File Name Conversion - Unix to Windows
+@cindex Path Conversion - Unix to Windows
+
+
+@uref{http://www.winehq.org/, Wine} provides an interpretation environment for
+some Unix platforms where 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
+@command{winepath} application must be in the build platform's @env{PATH}. In
+addition, on 32bit GNU/Linux it is usually helpful if the binfmt extension is
+enabled.
+
+@node LT_CYGPATH
+@subsubsection LT_CYGPATH
+@cindex LT_CYGPATH
+
+For some cross-compile configurations (where the host platform is Cygwin), the
+@command{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
+@command{cygpath} program is not (and should not be) in the @env{PATH} on
+the build platform, @env{LT_CYGPATH} must specify the full build platform
+file name (that is, the full Unix or MSYS file name) of the @command{cygpath}
+program.
+
+The reason @command{cygpath} should not be in the build platform @env{PATH} is
+twofold: first, @command{cygpath} is usually installed in the same directory as
+many other Cygwin executables, such as @command{sed}, @command{cp}, etc. If
+the build platform environment had this directory in its @env{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 @file{@var{CYGROOT-N}/etc/fstab}. These
+@dfn{mount tables} control how that instance of Cygwin will map Windows file
+names and paths to Cygwin form. Each installation's @command{cygpath} utility
+automatically deduces the appropriate @file{/etc/fstab} file. Since each
+@file{@var{CYGROOT-N}/etc/fstab} mount table may specify different mappings, it
+matters what @command{cygpath} is used.
+
+Note that @command{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 @code{binfmt} extension. Furthermore, the Cygwin
+@command{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 @command{cygpath} itself. Hence, it is best @emph{not} to use
+the LT_CYGPATH machinery in libtool when performing Unix to Cygwin
+cross-compiles. Similarly, it is best @emph{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 @pxref{File Name Conversion Failure} in these
+scenarios.
+
+However, @env{LT_CYGPATH} is also used for the MSYS to Cygwin cross compile
+scenario, and operates as expected.
+
+@node Cygwin to MinGW Cross
+@subsubsection Cygwin to MinGW Cross
+@cindex 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 @emph{fake} one, and the @emph{lying} one.
+
+In the @emph{fake} Cygwin to MinGW cross compile case, you actually use a
+native MinGW compiler, but you do so from within a Cygwin environment:
+
+@example
+@kbd{export PATH="/c/MinGW/bin:$@{PATH@}"}
+@kbd{configure --build=i686-pc-cygwin \
+ --host=mingw32 \
+ NM=/c/MinGW/bin/nm.exe}
+@end example
+
+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
+(@command{mingw32-gcc}, @command{nm}, @command{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:
+
+@example
+@kbd{export lt_cv_to_tool_file_cmd=func_convert_file_cygwin_to_w32}
+@end example
+@cindex lt_cv_to_tool_file_cmd
+@cindex func_convert_file_cygwin_to_w32
+
+In the @emph{lying} Cygwin to MinGW cross compile case, you lie to the
+build system:
+
+@example
+@kbd{export PATH="/c/MinGW/bin:$@{PATH@}"}
+@kbd{configure --build=i686-pc-mingw32 \
+ --host=i686-pc-mingw32 \
+ --disable-dependency-tracking}
+@end example
+
+@noindent
+and claim that the build platform is MinGW, even though you are actually
+running under @emph{Cygwin} and not MinGW. In this case, libtool does
+@emph{not} know that you are performing a cross compile, and thinks instead
+that you are performing a native MinGW build. However, as described in
+(@pxref{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 @emph{before}
+running configure:
+
+@example
+@kbd{export lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32}
+@kbd{export lt_cv_to_tool_file_cmd=func_convert_file_cygwin_to_w32}
+@end example
+@cindex lt_cv_to_host_file_cmd
+@cindex lt_cv_to_tool_file_cmd
+@cindex func_convert_file_cygwin_to_w32
+
+Note that this relies on internal implementation details of libtool, and
+is subject to change. Also, @code{--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 @command{make}
+program, which does not accept Windows file names:
+
+@example
+Makefile:1: *** target pattern contains no `%'. Stop.
+@end example
+
+There have also always been a number of other details required for the
+@emph{lying} case to operate correctly, such as the use of so-called
+@dfn{identity mounts}:
+
+@example
+# @var{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
+@end example
+
+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 @file{/bin}, @file{/lib}, @file{/usr}, @file{/etc}) appear in the root
+of a drive. This means that you must install Cygwin itself into the @file{C:/}
+root directory (or @file{D:/}, or @file{E:/}, etc)---instead of the
+recommended installation into @file{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 @option{-M*} options to
+@command{gcc} except @option{-MMD} must be avoided.
+
+This is quite a fragile setup, but it has been in historical use, and so is
+documented here.
+
+@node Windows DLLs
+@subsection Windows DLLs
+@cindex 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 @file{foo.h}:
+
+@example
+#ifndef FOO_H
+#define FOO_H
+
+int one (void);
+int two (void);
+extern int three;
+
+#endif /* FOO_H */
+@end example
+
+@noindent
+And the implementation could be something like this:
+
+Example @file{foo.c}:
+
+@example
+#include "foo.h"
+
+int one (void)
+@{
+ return 1;
+@}
+
+int two (void)
+@{
+ return three - one ();
+@}
+
+int three = 3;
+@end example
+
+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
+@code{__declspec(dllimport)} and @code{__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 @code{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 @code{__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 what 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 @option{-export-symbols} or
+@option{-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 @samp{-DDLL_EXPORT}, which is
+automatically provided by Libtool when @command{libtool} builds the copy
+of the object that is destined for the DLL. The second define is
+@samp{-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 @option{--enable-auto-import} option
+for some corner cases when it does not
+(@pxref{Options, @option{--enable-auto-import}, Options specific to
+i386 PE targets, ld, Using ld@comma{} the GNU linker}).
+
+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 (@samp{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 @samp{-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 @file{foo.h}:
+
+@example
+#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 */
+@end example
+
+When the targets are limited to contemporary GNU tools and Microsoft
+tools, the above can be simplified to the following:
+
+Simplified @file{foo.h}:
+
+@example
+#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 */
+@end example
+
+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
+@uref{http://alain.frisch.fr/@/flexdll.html, FlexDLL} and
+@uref{http://edll.sourceforge.net/, edll}.
+
+
+@node libtool script contents
+@section @code{libtool} script contents
+@cindex implementation of libtool
+@cindex libtool implementation
+
+Since version 1.4, the @code{libtool} script is generated by
+@code{configure} (@pxref{Configuring}). In earlier versions,
+@code{configure} achieved this by calling a helper script called
+@file{ltconfig}. From libtool version 0.7 to 1.0, this script
+simply set shell variables, then sourced the libtool backend,
+@code{ltmain.sh}. @code{ltconfig} from libtool version 1.1 through 1.3
+inlined the contents of @code{ltmain.sh} into the generated
+@code{libtool}, which improved performance on many systems. The tests
+that @file{ltconfig} used to perform are now kept in @file{libtool.m4}
+where they can be written using Autoconf. This has the runtime
+performance benefits of inlined @code{ltmain.sh}, @emph{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 @code{_cmd} where a single
+line of valid shell script is needed, and the suffix @code{_cmds} where
+multiple lines of shell script @strong{may} be delayed for later
+evaluation. By convention, @code{_cmds} variables delimit the
+evaluation units with the @code{~} character where necessary.
+
+Here is a listing of each of the configuration variables, and how they
+are used within @code{ltmain.sh} (@pxref{Configuring}):
+
+@defvar AR
+The name of the system library archiver.
+@end defvar
+
+@defvar CC
+The name of the compiler used to configure libtool. This will always
+contain the compiler for the current language (@pxref{Tags}).
+@end defvar
+
+@defvar ECHO
+An @command{echo} program that does not interpret backslashes as an
+escape character. It may be given only one argument, so due quoting
+is necessary.
+@end defvar
+
+@defvar LD
+The name of the linker that libtool should use internally for reloadable
+linking and possibly shared libraries.
+@end defvar
+
+@defvar LTCC
+@defvarx LTCFLAGS
+The name of the C compiler and C compiler flags used to configure
+libtool.
+@end defvar
+
+@defvar NM
+The name of a BSD- or MS-compatible program that produces listings of
+global symbols.
+For BSD @command{nm}, the symbols should be in one the following formats:
+
+@example
+@var{address} C @var{global-variable-name}
+@var{address} D @var{global-variable-name}
+@var{address} T @var{global-function-name}
+@end example
+
+For MS @command{dumpbin}, the symbols should be in one of the following
+formats:
+
+@example
+@var{counter} @var{size} UNDEF notype External | @var{global-var}
+@var{counter} @var{address} @var{section} notype External | @var{global-var}
+@var{counter} @var{address} @var{section} notype () External | @var{global-func}
+@end example
+
+The @var{size} of the global variables are not zero and the @var{section}
+of the global functions are not "UNDEF". Symbols in "pick any" sections
+("pick any" appears in the section header) are not global either.
+@end defvar
+
+@defvar RANLIB
+Set to the name of the @command{ranlib} program, if any.
+@end defvar
+
+@defvar allow_undefined_flag
+The flag that is used by @samp{archive_cmds} to declare that
+there will be unresolved symbols in the resulting shared library.
+Empty, if no such flag is required. Set to @samp{unsupported} if there
+is no way to generate a shared library with references to symbols that
+aren't defined in that library.
+@end defvar
+
+@defvar always_export_symbols
+Whether libtool should automatically generate a list of exported symbols
+using @code{export_symbols_cmds} before linking an archive.
+Set to @samp{yes} or @samp{no}. Default is @samp{no}.
+@end defvar
+
+@defvar archive_cmds
+@defvarx archive_expsym_cmds
+@defvarx old_archive_cmds
+Commands used to create shared libraries, shared libraries with
+@option{-export-symbols} and static libraries, respectively.
+@end defvar
+
+@defvar archiver_list_spec
+Specify filename containing input files for @code{AR}.
+@end defvar
+
+@defvar old_archive_from_new_cmds
+If the shared library depends on a static library,
+@samp{old_archive_from_new_cmds} contains the commands used to create that
+static library. If this variable is not empty, @samp{old_archive_cmds} is
+not used.
+@end defvar
+
+@defvar old_archive_from_expsyms_cmds
+If a static library must be created from the export symbol list to
+correctly link with a shared library, @samp{old_archive_from_expsyms_cmds}
+contains the commands needed to create that static library. When these
+commands are executed, the variable @code{soname} contains the name of the
+shared library in question, and the @samp{$objdir/$newlib} contains the
+path of the static library these commands should build. After executing
+these commands, libtool will proceed to link against @samp{$objdir/$newlib}
+instead of @code{soname}.
+@end defvar
+
+@defvar lock_old_archive_extraction
+Set to @samp{yes} if the extraction of a static library requires locking
+the library file. This is required on Darwin.
+@end defvar
+
+@defvar build
+@defvarx build_alias
+@defvarx build_os
+Set to the specified and canonical names of the system that libtool was
+built on.
+@end defvar
+
+@defvar build_libtool_libs
+Whether libtool should build shared libraries on this system. Set to
+@samp{yes} or @samp{no}.
+@end defvar
+
+@defvar build_old_libs
+Whether libtool should build static libraries on this system. Set to
+@samp{yes} or @samp{no}.
+@end defvar
+
+@defvar compiler_c_o
+Whether the compiler supports the @option{-c} and @option{-o} options
+simultaneously. Set to @samp{yes} or @samp{no}.
+@end defvar
+
+@defvar compiler_needs_object
+Whether the compiler has to see an object listed on the command line in
+order to successfully invoke the linker. If @samp{no}, then a set of
+convenience archives or a set of object file names can be passed via
+linker-specific options or linker scripts.
+@end defvar
+
+@defvar dlopen_support
+Whether @code{dlopen} is supported on the platform.
+Set to @samp{yes} or @samp{no}.
+@end defvar
+
+@defvar dlopen_self
+Whether it is possible to @code{dlopen} the executable itself.
+Set to @samp{yes} or @samp{no}.
+@end defvar
+
+@defvar dlopen_self_static
+Whether it is possible to @code{dlopen} the executable itself, when it
+is linked statically (@option{-all-static}). Set to @samp{yes} or
+@samp{no}.
+@end defvar
+
+@defvar exclude_expsyms
+List of symbols that should not be listed in the preloaded symbols.
+@end defvar
+
+@defvar export_dynamic_flag_spec
+Compiler link flag that allows a dlopened shared library to reference
+symbols that are defined in the program.
+@end defvar
+
+@defvar export_symbols_cmds
+Commands to extract exported symbols from @code{libobjs} to the
+file @code{export_symbols}.
+@end defvar
+
+@defvar extract_expsyms_cmds
+Commands to extract the exported symbols list from a shared library.
+These commands are executed if there is no file @samp{$objdir/$soname-def},
+and should write the names of the exported symbols to that file, for
+the use of @samp{old_archive_from_expsyms_cmds}.
+@end defvar
+
+@defvar 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 @code{shlibpath_overrides_runpath} is
+not @samp{yes}, so @code{fast_install} will be set to @samp{needless} in
+this case. If @code{fast_install} set to @samp{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 @samp{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
+@samp{yes} or @samp{needless}, depending on platform and configuration
+flags, and it can be turned from @samp{yes} to @samp{no} with the
+configure flag @option{--disable-fast-install}.
+
+On some systems, the linker always hardcodes paths to dependent libraries
+into the output. In this case, @code{fast_install} is never set to @samp{yes},
+and relinking at install time is triggered. This also means that @env{DESTDIR}
+installation does not work as expected.
+@end defvar
+
+@defvar file_magic_glob
+How to find potential files when @code{deplibs_check_method} is
+@samp{file_magic}. @code{file_magic_glob} is a @code{sed} expression,
+and the @code{sed} instance is fed potential file names that are
+transformed by the @code{file_magic_glob} expression. Useful when the
+shell does not support the shell option @code{nocaseglob}, making
+@code{want_nocaseglob} inappropriate. Normally disabled (i.e.
+@code{file_magic_glob} is empty).
+@end defvar
+
+@defvar finish_cmds
+Commands to tell the dynamic linker how to find shared libraries in a
+specific directory.
+@end defvar
+
+@defvar finish_eval
+Same as @code{finish_cmds}, except the commands are not displayed.
+@end defvar
+
+@defvar global_symbol_pipe
+A pipeline that takes the output of @code{NM}, and produces a listing of
+raw symbols followed by their C names. For example:
+
+@example
+$ @kbd{eval "$NM progname | $global_symbol_pipe"}
+D @var{symbol1} @var{C-symbol1}
+T @var{symbol2} @var{C-symbol2}
+C @var{symbol3} @var{C-symbol3}
+@dots{}
+$
+@end example
+
+The first column contains the symbol type (used to tell data from code)
+but its meaning is system dependent.
+@end defvar
+
+@defvar global_symbol_to_cdecl
+A pipeline that translates the output of @code{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.
+@end defvar
+
+@defvar hardcode_action
+Either @samp{immediate} or @samp{relink}, depending on whether shared
+library paths can be hardcoded into executables before they are installed,
+or if they need to be relinked.
+@end defvar
+
+@defvar hardcode_direct
+Set to @samp{yes} or @samp{no}, depending on whether the linker
+hardcodes directories if a library is directly specified on the command
+line (such as @samp{@var{dir}/lib@var{name}.a}) when
+@code{hardcode_libdir_flag_spec} is specified.
+@end defvar
+
+@defvar hardcode_direct_absolute
+Some architectures hardcode "absolute" library directories that cannot
+be overridden by @code{shlibpath_var} when @code{hardcode_direct} is
+@samp{yes}. In that case set @code{hardcode_direct_absolute} to
+@samp{yes}, or otherwise @samp{no}.
+@end defvar
+
+@defvar 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 @samp{yes} or @samp{no}.
+@end defvar
+
+@defvar hardcode_libdir_flag_spec
+Flag to hardcode a @code{libdir} variable into a binary, so that the
+dynamic linker searches @code{libdir} for shared libraries at runtime.
+If it is empty, libtool will try to use some other hardcoding mechanism.
+@end defvar
+
+@defvar hardcode_libdir_separator
+If the compiler only accepts a single @code{hardcode_libdir_flag}, then
+this variable contains the string that should separate multiple
+arguments to that flag.
+@end defvar
+
+@defvar hardcode_minus_L
+Set to @samp{yes} or @samp{no}, depending on whether the linker
+hardcodes directories specified by @option{-L} flags into the resulting
+executable when @code{hardcode_libdir_flag_spec} is specified.
+@end defvar
+
+@defvar hardcode_shlibpath_var
+Set to @samp{yes} or @samp{no}, depending on whether the linker
+hardcodes directories by writing the contents of @samp{$shlibpath_var}
+into the resulting executable when @code{hardcode_libdir_flag_spec} is
+specified. Set to @samp{unsupported} if directories specified by
+@samp{$shlibpath_var} are searched at run time, but not at link time.
+@end defvar
+
+@defvar host
+@defvarx host_alias
+@defvarx host_os
+Set to the specified and canonical names of the system that libtool was
+configured for.
+@end defvar
+
+@defvar include_expsyms
+List of symbols that must always be exported when using @code{export_symbols}.
+@end defvar
+
+@defvar 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 @samp{yes} or @samp{no}. Default is @samp{no}.
+@end defvar
+
+@defvar 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 @command{install} with
+@option{-m @var{install_override_mode}}.
+@end defvar
+
+@defvar libext
+The standard old archive suffix (normally @samp{a}).
+@end defvar
+
+@defvar libname_spec
+The format of a library name prefix. On all Unix systems, static
+libraries are called @samp{lib@var{name}.a}, but on some systems (such
+as OS/2 or MS-DOS), the library is just called @samp{@var{name}.a}.
+@end defvar
+
+@defvar 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 @option{-l@var{name}}.
+@end defvar
+
+@defvar link_all_deplibs
+Whether libtool must link a program against all its dependency libraries.
+Set to @samp{yes} or @samp{no}. Default is @samp{unknown}, which is
+a synonym for @samp{yes}.
+@end defvar
+
+@defvar link_static_flag
+Linker flag (passed through the C compiler) used to prevent dynamic
+linking.
+@end defvar
+
+@defvar macro_version
+@defvarx macro_revision
+The release and revision from which the libtool.m4 macros were
+taken. This is used to ensure that macros and @code{ltmain.sh}
+correspond to the same Libtool version.
+@end defvar
+
+@defvar max_cmd_len
+The approximate longest command line that can be passed to @samp{$SHELL}
+without being truncated, as computed by @samp{LT_CMD_MAX_LEN}.
+@end defvar
+
+@defvar need_lib_prefix
+Whether we can @code{dlopen} modules without a @samp{lib} prefix.
+Set to @samp{yes} or @samp{no}. By default, it is @samp{unknown}, which
+means the same as @samp{yes}, but documents that we are not really sure
+about it. @samp{no} means that it is possible to @code{dlopen} a
+module without the @samp{lib} prefix.
+@end defvar
+
+@defvar need_version
+Whether versioning is required for libraries, i.e.@: whether the
+dynamic linker requires a version suffix for all libraries.
+Set to @samp{yes} or @samp{no}. By default, it is @samp{unknown}, which
+means the same as @samp{yes}, but documents that we are not really sure
+about it.
+@end defvar
+
+@defvar need_locks
+Whether files must be locked to prevent conflicts when compiling
+simultaneously. Set to @samp{yes} or @samp{no}.
+@end defvar
+
+@defvar nm_file_list_spec
+Specify filename containing input files for @code{NM}.
+@end defvar
+
+@defvar no_builtin_flag
+Compiler flag to disable builtin functions that conflict with declaring
+external global symbols as @code{char}.
+@end defvar
+
+@defvar no_undefined_flag
+The flag that is used by @samp{archive_cmds} to declare that
+there will be no unresolved symbols in the resulting shared library.
+Empty, if no such flag is required.
+@end defvar
+
+@defvar objdir
+The name of the directory that contains temporary libtool files.
+@end defvar
+
+@defvar objext
+The standard object file suffix (normally @samp{o}).
+@end defvar
+
+@defvar pic_flag
+Any additional compiler flags for building library object files.
+@end defvar
+
+@defvar postinstall_cmds
+@defvarx old_postinstall_cmds
+Commands run after installing a shared or static library, respectively.
+@end defvar
+
+@defvar postuninstall_cmds
+@defvarx old_postuninstall_cmds
+Commands run after uninstalling a shared or static library, respectively.
+@end defvar
+
+@defvar postlink_cmds
+Commands necessary for finishing linking programs. @code{postlink_cmds}
+are executed immediately after the program is linked. Any occurrence of
+the string @code{@@OUTPUT@@} in @code{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, @code{@@TOOL_OUTPUT@@} is
+replaced by the toolchain format of @code{@@OUTPUT@@}. Normally disabled
+(i.e.@: @code{postlink_cmds} empty).
+@end defvar
+
+@defvar reload_cmds
+@defvarx reload_flag
+Commands to create a reloadable object. Set @code{reload_cmds} to
+@samp{false} on systems that cannot create reloadable objects.
+@end defvar
+
+@defvar runpath_var
+The environment variable that tells the linker what directories to
+hardcode in the resulting executable.
+@end defvar
+
+@defvar 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
+@code{fast_install}. The default value is @samp{unknown}, which is
+equivalent to @samp{no}.
+@end defvar
+
+@defvar shlibpath_var
+The environment variable that tells the dynamic linker where to find
+shared libraries.
+@end defvar
+
+@defvar soname_spec
+The name coded into shared libraries, if different from the real name of
+the file.
+@end defvar
+
+@defvar striplib
+@defvarx old_striplib
+Command to strip a shared (@code{striplib}) or static (@code{old_striplib})
+library, respectively. If these variables are empty, the strip flag
+in the install mode will be ignored for libraries (@pxref{Install mode}).
+@end defvar
+
+@defvar 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.
+@end defvar
+
+@defvar 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
+@code{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 @option{-L} also augment the search path.
+@end defvar
+
+@defvar thread_safe_flag_spec
+Linker flag (passed through the C compiler) used to generate thread-safe
+libraries.
+@end defvar
+
+@defvar 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
+@samp{func_convert_file_noop}, libtool will autodetect most cases where
+other values should be used. On rare occasions, it may be necessary to override
+the autodetected value (@pxref{Cygwin to MinGW Cross}).
+@end defvar
+
+@defvar 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 @samp{func_convert_file_noop}.
+@end defvar
+
+@defvar version_type
+The library version numbering type. One of @samp{libtool},
+@samp{freebsd-aout}, @samp{freebsd-elf}, @samp{irix}, @samp{linux},
+@samp{osf}, @samp{sunos}, @samp{windows}, or @samp{none}.
+@end defvar
+
+@defvar want_nocaseglob
+Find potential files using the shell option @code{nocaseglob}, when
+@code{deplibs_check_method} is @samp{file_magic}. Normally set to
+@samp{no}. Set to @samp{yes} to enable the @code{nocaseglob} shell
+option when looking for potential file names in a case-insensitive
+manner.
+@end defvar
+
+@defvar whole_archive_flag_spec
+Compiler flag to generate shared objects from convenience archives.
+@end defvar
+
+@defvar wl
+The C compiler flag that allows libtool to pass a flag directly to the
+linker. Used as: @code{$@{wl@}@var{some-flag}}.
+@end defvar
+
+Variables ending in @samp{_cmds} or @samp{_eval} contain a
+@samp{~}-separated list of commands that are @code{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 @samp{_spec} are @code{eval}ed before being used by
+libtool.
+
+@node Cheap tricks
+@section Cheap tricks
+
+Here are a few tricks that you can use to make maintainership
+easier:
+
+@itemize @bullet
+@item
+When people report bugs, ask them to use the @option{--config},
+@option{--debug}, or @option{--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.
+
+@item
+Rather than reconfiguring libtool every time I make a change to
+@code{ltmain.in}, I keep a permanent @code{libtool} script in my
+@env{PATH}, which sources @code{ltmain.in} directly.
+
+The following steps describe how to create such a script, where
+@code{/home/src/libtool} is the directory containing the libtool source
+tree, @code{/home/src/libtool/libtool} is a libtool script that has been
+configured for your platform, and @code{~/bin} is a directory in your
+@env{PATH}:
+
+@smallexample
+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) 2014 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$
+@end smallexample
+@end itemize
+
+The output of the final @samp{libtool --version} command shows that the
+@code{ltmain.in} script is being used directly. Now, modify
+@code{~/bin/libtool} or @code{/home/src/libtool/ltmain.in} directly in
+order to test new changes without having to rerun @code{configure}.
+
+@node GNU Free Documentation License
+@appendix GNU Free Documentation License
+
+@cindex FDL, GNU Free Documentation License
+
+@include fdl.texi
+
+@page
+@node Combined Index
+@unnumbered Combined Index
+
+@printindex cp
+
+@bye
diff --git a/doc/libtoolize.1 b/doc/libtoolize.1
new file mode 100644
index 0000000..0c3f9b5
--- /dev/null
+++ b/doc/libtoolize.1
@@ -0,0 +1,130 @@
+.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.46.4.
+.TH LIBTOOLIZE "1" "January 2015" "libtoolize 2.4.4.19-fda4" "User Commands"
+.SH NAME
+libtoolize \- manual page for libtoolize 2.4.4.19-fda4
+.SH SYNOPSIS
+.B libtoolize
+[\fI\,OPTION\/\fR]...
+.SH DESCRIPTION
+Prepare a package to use libtool.
+.SH OPTIONS
+.TP
+\fB\-c\fR, \fB\-\-copy\fR
+copy files rather than symlinking them
+.TP
+\fB\-\-debug\fR
+enable verbose shell tracing
+.TP
+\fB\-n\fR, \fB\-\-dry\-run\fR
+print commands rather than running them
+.TP
+\fB\-f\fR, \fB\-\-force\fR
+replace existing files
+.TP
+\fB\-i\fR, \fB\-\-install\fR
+copy missing auxiliary files
+.TP
+\fB\-\-ltdl\fR[=\fI\,DIR\/\fR]
+install libltdl sources [default: libltdl]
+.TP
+\fB\-\-no\-warnings\fR
+equivalent to '\-Wnone'
+.TP
+\fB\-\-nonrecursive\fR
+prepare ltdl for non\-recursive make
+.TP
+\fB\-q\fR, \fB\-\-quiet\fR
+work silently
+.TP
+\fB\-\-recursive\fR
+prepare ltdl for recursive make
+.TP
+\fB\-\-subproject\fR
+prepare ltdl to configure and build independently
+.TP
+\fB\-v\fR, \fB\-\-verbose\fR
+verbosely report processing
+.TP
+\fB\-\-version\fR
+print version information and exit
+.TP
+\fB\-W\fR, \fB\-\-warnings\fR=\fI\,CATEGORY\/\fR
+report the warnings falling in CATEGORY [all]
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+print short or long help message
+.SS "Warning categories include:"
+.TP
+\&'all'
+show all warnings
+.TP
+\&'none'
+turn off all the warnings
+.TP
+\&'error'
+warnings are treated as fatal errors
+.TP
+\&'environment'
+show warnings about LIBTOOLIZE_OPTIONS content
+.TP
+\&'file'
+show warnings about file copying and linking
+.PP
+The following space or comma delimited options can be passed to libtoolize
+via the environment variable LIBTOOLIZE_OPTIONS, unknown environment
+options are ignored:
+.TP
+\fB\-\-debug\fR
+enable verbose shell tracing
+.TP
+\fB\-\-no\-warnings\fR
+don't display warning messages
+.TP
+\fB\-\-quiet\fR
+work silently
+.TP
+\fB\-\-verbose\fR
+verbosely report processing
+.PP
+You must 'cd' to the top directory of your package before you run
+\&'libtoolize'.
+.PP
+When reporting a bug, please describe a test case to reproduce it and
+include the following information:
+.TP
+host\-triplet:
+x86_64\-apple\-darwin14.0.0
+.TP
+version:
+libtoolize (GNU libtool) 2.4.4.19\-fda4
+.TP
+automake:
+automake (GNU automake) 1.15
+.TP
+autoconf:
+autoconf (GNU Autoconf) 2.69
+.SH AUTHOR
+Written by Gary V. Vaughan <gary@gnu.org>, 2003
+.SH "REPORTING BUGS"
+Report bugs to <bug\-libtool@gnu.org>.
+.br
+GNU libtool home page: <http://www.gnu.org/software/libtool/>.
+.br
+General help using GNU software: <http://www.gnu.org/gethelp/>.
+.SH COPYRIGHT
+Copyright \(co 2015 Free Software Foundation, Inc.
+.br
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+.SH "SEE ALSO"
+The full documentation for
+.B libtoolize
+is maintained as a Texinfo manual. If the
+.B info
+and
+.B libtoolize
+programs are properly installed at your site, the command
+.IP
+.B info libtoolize
+.PP
+should give you access to the complete manual.
diff --git a/doc/notes.texi b/doc/notes.texi
new file mode 100644
index 0000000..1fa8a0b
--- /dev/null
+++ b/doc/notes.texi
@@ -0,0 +1,79 @@
+@itemize
+
+@item
+You currently need GNU make to build the Libtool package itself.
+
+@item
+On AIX there are two different styles of shared linking, one where symbols
+are bound at link-time and one where symbols are bound at runtime only,
+similar to ELF@. In case of doubt use @code{LDFLAGS=-Wl,-brtl} for the latter style.
+
+@item
+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
+@code{AR=/usr/bin/ar LD=/usr/bin/ld NM='/usr/bin/nm -B'}.
+
+@item
+On AIX, the @command{/bin/sh} is very slow due to its inefficient handling
+of here-documents. A modern shell is preferable:
+@example
+CONFIG_SHELL=/bin/bash; export $CONFIG_SHELL
+$CONFIG_SHELL ./configure [...]
+@end example
+
+@item
+For C++ code with templates, it may be necessary to specify the way the compiler
+will generate the instantiations. For Portland pgCC version5, use
+@code{CXX='pgCC --one_instantiation_per_object'} and avoid parallel @command{make}.
+
+@item
+On Darwin, for C++ code with templates you need two level shared libraries.
+Libtool builds these by default if @env{MACOSX_DEPLOYMENT_TARGET} is set to
+10.3 or later at @command{configure} time. See @url{rdar://problem/4135857}
+for more information on this issue.
+
+@c @item
+@c FreeBSD @command{make} does not conform to @sc{posix} in its handling
+@c of file modification times, which causes it to loop while building libtool.
+@c Consider using a different @command{such} as GNU make instead.
+
+@item
+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.
+
+@item
+Some HP-UX @command{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 @command{sed} (such as GNU sed)
+on these systems.
+
+@item
+The vendor-distributed NCR MP-RAS @command{cc} programs emits copyright
+on standard error that confuse tests on size of @file{conftest.err}. The
+workaround is to specify @env{CC} when run configure with
+@code{CC='cc -Hnocopyr'}.
+
+@item
+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.
+
+@item
+On Reliant Unix libtool has only been tested with the Siemens C-compiler
+and an old version of @command{gcc} provided by Marco Walther.
+
+@item
+@file{libtool.m4}, @file{ltdl.m4} and the @file{configure.ac} files are marked
+to use autoconf-mode, which is distributed with GNU Emacs 21, Autoconf itself,
+and all recent releases of XEmacs.
+
+@item
+When building on some GNU/Linux systems for multilib targets @command{libtool}
+sometimes guesses the wrong paths that the linker and dynamic linker search by
+default. If this occurs for the dynamic library path, you may use the
+@code{LT_SYS_LIBRARY_PATH} environment variable to adjust. Otherwise, at
+@command{configure} time you may override libtool's guesses by setting the
+@command{autoconf} cache variables @code{lt_cv_sys_lib_search_path_spec} and
+@code{lt_cv_sys_lib_dlsearch_path_spec} respectively.
+
+@end itemize
diff --git a/doc/notes.txt b/doc/notes.txt
new file mode 100644
index 0000000..b1c85f4
--- /dev/null
+++ b/doc/notes.txt
@@ -0,0 +1,61 @@
+ * You currently need GNU make to build the Libtool package itself.
+
+ * On AIX there are two different styles of shared linking, one where
+ symbols are bound at link-time and one where 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 for the dynamic
+ library path, you may use the `LT_SYS_LIBRARY_PATH' environment
+ variable to adjust. Otherwise, at `configure' time you may
+ override libtool's guesses by setting the `autoconf' cache
+ variables `lt_cv_sys_lib_search_path_spec' and
+ `lt_cv_sys_lib_dlsearch_path_spec' respectively.
+
+
diff --git a/doc/stamp-vti b/doc/stamp-vti
new file mode 100644
index 0000000..0efbb44
--- /dev/null
+++ b/doc/stamp-vti
@@ -0,0 +1,4 @@
+@set UPDATED 16 January 2015
+@set UPDATED-MONTH January 2015
+@set EDITION 2.4.5
+@set VERSION 2.4.5
diff --git a/doc/version.texi b/doc/version.texi
new file mode 100644
index 0000000..0efbb44
--- /dev/null
+++ b/doc/version.texi
@@ -0,0 +1,4 @@
+@set UPDATED 16 January 2015
+@set UPDATED-MONTH January 2015
+@set EDITION 2.4.5
+@set VERSION 2.4.5