import latest libltdl
This commit is contained in:
parent
f26219863a
commit
0191e3d3eb
50 changed files with 49751 additions and 0 deletions
515
libltdl/COPYING.LIB
Normal file
515
libltdl/COPYING.LIB
Normal file
|
@ -0,0 +1,515 @@
|
||||||
|
|
||||||
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
|
Version 2.1, February 1999
|
||||||
|
|
||||||
|
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
[This is the first released version of the Lesser GPL. It also counts
|
||||||
|
as the successor of the GNU Library Public License, version 2, hence
|
||||||
|
the version number 2.1.]
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
Licenses are intended to guarantee your freedom to share and change
|
||||||
|
free software--to make sure the software is free for all its users.
|
||||||
|
|
||||||
|
This license, the Lesser General Public License, applies to some
|
||||||
|
specially designated software packages--typically libraries--of the
|
||||||
|
Free Software Foundation and other authors who decide to use it. You
|
||||||
|
can use it too, but we suggest you first think carefully about whether
|
||||||
|
this license or the ordinary General Public License is the better
|
||||||
|
strategy to use in any particular case, based on the explanations
|
||||||
|
below.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom of use,
|
||||||
|
not price. Our General Public Licenses are designed to make sure that
|
||||||
|
you have the freedom to distribute copies of free software (and charge
|
||||||
|
for this service if you wish); that you receive source code or can get
|
||||||
|
it if you want it; that you can change the software and use pieces of
|
||||||
|
it in new free programs; and that you are informed that you can do
|
||||||
|
these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
distributors to deny you these rights or to ask you to surrender these
|
||||||
|
rights. These restrictions translate to certain responsibilities for
|
||||||
|
you if you distribute copies of the library or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of the library, whether gratis
|
||||||
|
or for a fee, you must give the recipients all the rights that we gave
|
||||||
|
you. You must make sure that they, too, receive or can get the source
|
||||||
|
code. If you link other code with the library, you must provide
|
||||||
|
complete object files to the recipients, so that they can relink them
|
||||||
|
with the library after making changes to the library and recompiling
|
||||||
|
it. And you must show them these terms so they know their rights.
|
||||||
|
|
||||||
|
We protect your rights with a two-step method: (1) we copyright the
|
||||||
|
library, and (2) we offer you this license, which gives you legal
|
||||||
|
permission to copy, distribute and/or modify the library.
|
||||||
|
|
||||||
|
To protect each distributor, we want to make it very clear that
|
||||||
|
there is no warranty for the free library. Also, if the library is
|
||||||
|
modified by someone else and passed on, the recipients should know
|
||||||
|
that what they have is not the original version, so that the original
|
||||||
|
author's reputation will not be affected by problems that might be
|
||||||
|
introduced by others.
|
||||||
|
^L
|
||||||
|
Finally, software patents pose a constant threat to the existence of
|
||||||
|
any free program. We wish to make sure that a company cannot
|
||||||
|
effectively restrict the users of a free program by obtaining a
|
||||||
|
restrictive license from a patent holder. Therefore, we insist that
|
||||||
|
any patent license obtained for a version of the library must be
|
||||||
|
consistent with the full freedom of use specified in this license.
|
||||||
|
|
||||||
|
Most GNU software, including some libraries, is covered by the
|
||||||
|
ordinary GNU General Public License. This license, the GNU Lesser
|
||||||
|
General Public License, applies to certain designated libraries, and
|
||||||
|
is quite different from the ordinary General Public License. We use
|
||||||
|
this license for certain libraries in order to permit linking those
|
||||||
|
libraries into non-free programs.
|
||||||
|
|
||||||
|
When a program is linked with a library, whether statically or using
|
||||||
|
a shared library, the combination of the two is legally speaking a
|
||||||
|
combined work, a derivative of the original library. The ordinary
|
||||||
|
General Public License therefore permits such linking only if the
|
||||||
|
entire combination fits its criteria of freedom. The Lesser General
|
||||||
|
Public License permits more lax criteria for linking other code with
|
||||||
|
the library.
|
||||||
|
|
||||||
|
We call this license the "Lesser" General Public License because it
|
||||||
|
does Less to protect the user's freedom than the ordinary General
|
||||||
|
Public License. It also provides other free software developers Less
|
||||||
|
of an advantage over competing non-free programs. These disadvantages
|
||||||
|
are the reason we use the ordinary General Public License for many
|
||||||
|
libraries. However, the Lesser license provides advantages in certain
|
||||||
|
special circumstances.
|
||||||
|
|
||||||
|
For example, on rare occasions, there may be a special need to
|
||||||
|
encourage the widest possible use of a certain library, so that it
|
||||||
|
becomes
|
||||||
|
a de-facto standard. To achieve this, non-free programs must be
|
||||||
|
allowed to use the library. A more frequent case is that a free
|
||||||
|
library does the same job as widely used non-free libraries. In this
|
||||||
|
case, there is little to gain by limiting the free library to free
|
||||||
|
software only, so we use the Lesser General Public License.
|
||||||
|
|
||||||
|
In other cases, permission to use a particular library in non-free
|
||||||
|
programs enables a greater number of people to use a large body of
|
||||||
|
free software. For example, permission to use the GNU C Library in
|
||||||
|
non-free programs enables many more people to use the whole GNU
|
||||||
|
operating system, as well as its variant, the GNU/Linux operating
|
||||||
|
system.
|
||||||
|
|
||||||
|
Although the Lesser General Public License is Less protective of the
|
||||||
|
users' freedom, it does ensure that the user of a program that is
|
||||||
|
linked with the Library has the freedom and the wherewithal to run
|
||||||
|
that program using a modified version of the Library.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow. Pay close attention to the difference between a
|
||||||
|
"work based on the library" and a "work that uses the library". The
|
||||||
|
former contains code derived from the library, whereas the latter must
|
||||||
|
be combined with the library in order to run.
|
||||||
|
^L
|
||||||
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License Agreement applies to any software library or other
|
||||||
|
program which contains a notice placed by the copyright holder or
|
||||||
|
other authorized party saying it may be distributed under the terms of
|
||||||
|
this Lesser General Public License (also called "this License").
|
||||||
|
Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
A "library" means a collection of software functions and/or data
|
||||||
|
prepared so as to be conveniently linked with application programs
|
||||||
|
(which use some of those functions and data) to form executables.
|
||||||
|
|
||||||
|
The "Library", below, refers to any such software library or work
|
||||||
|
which has been distributed under these terms. A "work based on the
|
||||||
|
Library" means either the Library or any derivative work under
|
||||||
|
copyright law: that is to say, a work containing the Library or a
|
||||||
|
portion of it, either verbatim or with modifications and/or translated
|
||||||
|
straightforwardly into another language. (Hereinafter, translation is
|
||||||
|
included without limitation in the term "modification".)
|
||||||
|
|
||||||
|
"Source code" for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For a library, complete source code means
|
||||||
|
all the source code for all modules it contains, plus any associated
|
||||||
|
interface definition files, plus the scripts used to control
|
||||||
|
compilation
|
||||||
|
and installation of the library.
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running a program using the Library is not restricted, and output from
|
||||||
|
such a program is covered only if its contents constitute a work based
|
||||||
|
on the Library (independent of the use of the Library in a tool for
|
||||||
|
writing it). Whether that is true depends on what the Library does
|
||||||
|
and what the program that uses the Library does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Library's
|
||||||
|
complete source code as you receive it, in any medium, provided that
|
||||||
|
you conspicuously and appropriately publish on each copy an
|
||||||
|
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||||
|
all the notices that refer to this License and to the absence of any
|
||||||
|
warranty; and distribute a copy of this License along with the
|
||||||
|
Library.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy,
|
||||||
|
and you may at your option offer warranty protection in exchange for a
|
||||||
|
fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Library or any portion
|
||||||
|
of it, thus forming a work based on the Library, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) The modified work must itself be a software library.
|
||||||
|
|
||||||
|
b) You must cause the files modified to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
c) You must cause the whole of the work to be licensed at no
|
||||||
|
charge to all third parties under the terms of this License.
|
||||||
|
|
||||||
|
d) If a facility in the modified Library refers to a function or a
|
||||||
|
table of data to be supplied by an application program that uses
|
||||||
|
the facility, other than as an argument passed when the facility
|
||||||
|
is invoked, then you must make a good faith effort to ensure that,
|
||||||
|
in the event an application does not supply such function or
|
||||||
|
table, the facility still operates, and performs whatever part of
|
||||||
|
its purpose remains meaningful.
|
||||||
|
|
||||||
|
(For example, a function in a library to compute square roots has
|
||||||
|
a purpose that is entirely well-defined independent of the
|
||||||
|
application. Therefore, Subsection 2d requires that any
|
||||||
|
application-supplied function or table used by this function must
|
||||||
|
be optional: if the application does not supply it, the square
|
||||||
|
root function must still compute square roots.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Library,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Library, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote
|
||||||
|
it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Library.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Library
|
||||||
|
with the Library (or with a work based on the Library) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||||
|
License instead of this License to a given copy of the Library. To do
|
||||||
|
this, you must alter all the notices that refer to this License, so
|
||||||
|
that they refer to the ordinary GNU General Public License, version 2,
|
||||||
|
instead of to this License. (If a newer version than version 2 of the
|
||||||
|
ordinary GNU General Public License has appeared, then you can specify
|
||||||
|
that version instead if you wish.) Do not make any other change in
|
||||||
|
these notices.
|
||||||
|
^L
|
||||||
|
Once this change is made in a given copy, it is irreversible for
|
||||||
|
that copy, so the ordinary GNU General Public License applies to all
|
||||||
|
subsequent copies and derivative works made from that copy.
|
||||||
|
|
||||||
|
This option is useful when you wish to copy part of the code of
|
||||||
|
the Library into a program that is not a library.
|
||||||
|
|
||||||
|
4. You may copy and distribute the Library (or a portion or
|
||||||
|
derivative of it, under Section 2) in object code or executable form
|
||||||
|
under the terms of Sections 1 and 2 above provided that you accompany
|
||||||
|
it with the complete corresponding machine-readable source code, which
|
||||||
|
must be distributed under the terms of Sections 1 and 2 above on a
|
||||||
|
medium customarily used for software interchange.
|
||||||
|
|
||||||
|
If distribution of object code is made by offering access to copy
|
||||||
|
from a designated place, then offering equivalent access to copy the
|
||||||
|
source code from the same place satisfies the requirement to
|
||||||
|
distribute the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
5. A program that contains no derivative of any portion of the
|
||||||
|
Library, but is designed to work with the Library by being compiled or
|
||||||
|
linked with it, is called a "work that uses the Library". Such a
|
||||||
|
work, in isolation, is not a derivative work of the Library, and
|
||||||
|
therefore falls outside the scope of this License.
|
||||||
|
|
||||||
|
However, linking a "work that uses the Library" with the Library
|
||||||
|
creates an executable that is a derivative of the Library (because it
|
||||||
|
contains portions of the Library), rather than a "work that uses the
|
||||||
|
library". The executable is therefore covered by this License.
|
||||||
|
Section 6 states terms for distribution of such executables.
|
||||||
|
|
||||||
|
When a "work that uses the Library" uses material from a header file
|
||||||
|
that is part of the Library, the object code for the work may be a
|
||||||
|
derivative work of the Library even though the source code is not.
|
||||||
|
Whether this is true is especially significant if the work can be
|
||||||
|
linked without the Library, or if the work is itself a library. The
|
||||||
|
threshold for this to be true is not precisely defined by law.
|
||||||
|
|
||||||
|
If such an object file uses only numerical parameters, data
|
||||||
|
structure layouts and accessors, and small macros and small inline
|
||||||
|
functions (ten lines or less in length), then the use of the object
|
||||||
|
file is unrestricted, regardless of whether it is legally a derivative
|
||||||
|
work. (Executables containing this object code plus portions of the
|
||||||
|
Library will still fall under Section 6.)
|
||||||
|
|
||||||
|
Otherwise, if the work is a derivative of the Library, you may
|
||||||
|
distribute the object code for the work under the terms of Section 6.
|
||||||
|
Any executables containing that work also fall under Section 6,
|
||||||
|
whether or not they are linked directly with the Library itself.
|
||||||
|
^L
|
||||||
|
6. As an exception to the Sections above, you may also combine or
|
||||||
|
link a "work that uses the Library" with the Library to produce a
|
||||||
|
work containing portions of the Library, and distribute that work
|
||||||
|
under terms of your choice, provided that the terms permit
|
||||||
|
modification of the work for the customer's own use and reverse
|
||||||
|
engineering for debugging such modifications.
|
||||||
|
|
||||||
|
You must give prominent notice with each copy of the work that the
|
||||||
|
Library is used in it and that the Library and its use are covered by
|
||||||
|
this License. You must supply a copy of this License. If the work
|
||||||
|
during execution displays copyright notices, you must include the
|
||||||
|
copyright notice for the Library among them, as well as a reference
|
||||||
|
directing the user to the copy of this License. Also, you must do one
|
||||||
|
of these things:
|
||||||
|
|
||||||
|
a) Accompany the work with the complete corresponding
|
||||||
|
machine-readable source code for the Library including whatever
|
||||||
|
changes were used in the work (which must be distributed under
|
||||||
|
Sections 1 and 2 above); and, if the work is an executable linked
|
||||||
|
with the Library, with the complete machine-readable "work that
|
||||||
|
uses the Library", as object code and/or source code, so that the
|
||||||
|
user can modify the Library and then relink to produce a modified
|
||||||
|
executable containing the modified Library. (It is understood
|
||||||
|
that the user who changes the contents of definitions files in the
|
||||||
|
Library will not necessarily be able to recompile the application
|
||||||
|
to use the modified definitions.)
|
||||||
|
|
||||||
|
b) Use a suitable shared library mechanism for linking with the
|
||||||
|
Library. A suitable mechanism is one that (1) uses at run time a
|
||||||
|
copy of the library already present on the user's computer system,
|
||||||
|
rather than copying library functions into the executable, and (2)
|
||||||
|
will operate properly with a modified version of the library, if
|
||||||
|
the user installs one, as long as the modified version is
|
||||||
|
interface-compatible with the version that the work was made with.
|
||||||
|
|
||||||
|
c) Accompany the work with a written offer, valid for at
|
||||||
|
least three years, to give the same user the materials
|
||||||
|
specified in Subsection 6a, above, for a charge no more
|
||||||
|
than the cost of performing this distribution.
|
||||||
|
|
||||||
|
d) If distribution of the work is made by offering access to copy
|
||||||
|
from a designated place, offer equivalent access to copy the above
|
||||||
|
specified materials from the same place.
|
||||||
|
|
||||||
|
e) Verify that the user has already received a copy of these
|
||||||
|
materials or that you have already sent this user a copy.
|
||||||
|
|
||||||
|
For an executable, the required form of the "work that uses the
|
||||||
|
Library" must include any data and utility programs needed for
|
||||||
|
reproducing the executable from it. However, as a special exception,
|
||||||
|
the materials to be distributed need not include anything that is
|
||||||
|
normally distributed (in either source or binary form) with the major
|
||||||
|
components (compiler, kernel, and so on) of the operating system on
|
||||||
|
which the executable runs, unless that component itself accompanies
|
||||||
|
the executable.
|
||||||
|
|
||||||
|
It may happen that this requirement contradicts the license
|
||||||
|
restrictions of other proprietary libraries that do not normally
|
||||||
|
accompany the operating system. Such a contradiction means you cannot
|
||||||
|
use both them and the Library together in an executable that you
|
||||||
|
distribute.
|
||||||
|
^L
|
||||||
|
7. You may place library facilities that are a work based on the
|
||||||
|
Library side-by-side in a single library together with other library
|
||||||
|
facilities not covered by this License, and distribute such a combined
|
||||||
|
library, provided that the separate distribution of the work based on
|
||||||
|
the Library and of the other library facilities is otherwise
|
||||||
|
permitted, and provided that you do these two things:
|
||||||
|
|
||||||
|
a) Accompany the combined library with a copy of the same work
|
||||||
|
based on the Library, uncombined with any other library
|
||||||
|
facilities. This must be distributed under the terms of the
|
||||||
|
Sections above.
|
||||||
|
|
||||||
|
b) Give prominent notice with the combined library of the fact
|
||||||
|
that part of it is a work based on the Library, and explaining
|
||||||
|
where to find the accompanying uncombined form of the same work.
|
||||||
|
|
||||||
|
8. You may not copy, modify, sublicense, link with, or distribute
|
||||||
|
the Library except as expressly provided under this License. Any
|
||||||
|
attempt otherwise to copy, modify, sublicense, link with, or
|
||||||
|
distribute the Library is void, and will automatically terminate your
|
||||||
|
rights under this License. However, parties who have received copies,
|
||||||
|
or rights, from you under this License will not have their licenses
|
||||||
|
terminated so long as such parties remain in full compliance.
|
||||||
|
|
||||||
|
9. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Library or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Library (or any work based on the
|
||||||
|
Library), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Library or works based on it.
|
||||||
|
|
||||||
|
10. Each time you redistribute the Library (or any work based on the
|
||||||
|
Library), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute, link with or modify the Library
|
||||||
|
subject to these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties with
|
||||||
|
this License.
|
||||||
|
^L
|
||||||
|
11. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Library at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Library by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Library.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under
|
||||||
|
any particular circumstance, the balance of the section is intended to
|
||||||
|
apply, and the section as a whole is intended to apply in other
|
||||||
|
circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any
|
||||||
|
patents or other property right claims or to contest validity of any
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
12. If the distribution and/or use of the Library is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Library under this License
|
||||||
|
may add an explicit geographical distribution limitation excluding those
|
||||||
|
countries, so that distribution is permitted only in or among
|
||||||
|
countries not thus excluded. In such case, this License incorporates
|
||||||
|
the limitation as if written in the body of this License.
|
||||||
|
|
||||||
|
13. The Free Software Foundation may publish revised and/or new
|
||||||
|
versions of the Lesser General Public 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.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Library
|
||||||
|
specifies a version number of this License which applies to it and
|
||||||
|
"any later version", you have the option of following the terms and
|
||||||
|
conditions either of that version or of any later version published by
|
||||||
|
the Free Software Foundation. If the Library does not specify a
|
||||||
|
license version number, you may choose any version ever published by
|
||||||
|
the Free Software Foundation.
|
||||||
|
^L
|
||||||
|
14. If you wish to incorporate parts of the Library into other free
|
||||||
|
programs whose distribution conditions are incompatible with these,
|
||||||
|
write to the author to ask for permission. For software which is
|
||||||
|
copyrighted by the Free Software Foundation, write to the Free
|
||||||
|
Software Foundation; we sometimes make exceptions for this. Our
|
||||||
|
decision will be guided by the two goals of preserving the free status
|
||||||
|
of all derivatives of our free software and of promoting the sharing
|
||||||
|
and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||||
|
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||||
|
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||||
|
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||||
|
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||||
|
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||||
|
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||||
|
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||||
|
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||||
|
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||||
|
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||||
|
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||||
|
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||||
|
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||||
|
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||||
|
DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
^L
|
||||||
|
How to Apply These Terms to Your New Libraries
|
||||||
|
|
||||||
|
If you develop a new library, and you want it to be of the greatest
|
||||||
|
possible use to the public, we recommend making it free software that
|
||||||
|
everyone can redistribute and change. You can do so by permitting
|
||||||
|
redistribution under these terms (or, alternatively, under the terms
|
||||||
|
of the ordinary General Public License).
|
||||||
|
|
||||||
|
To apply these terms, attach the following notices to the library.
|
||||||
|
It is safest to attach them to the start of each source file to most
|
||||||
|
effectively convey the exclusion of warranty; and each file should
|
||||||
|
have at least the "copyright" line and a pointer to where the full
|
||||||
|
notice is found.
|
||||||
|
|
||||||
|
|
||||||
|
<one line to give the library's name and a brief idea of what it
|
||||||
|
does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper
|
||||||
|
mail.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or
|
||||||
|
your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||||
|
library `Frob' (a library for tweaking knobs) written by James
|
||||||
|
Random Hacker.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 1 April 1990
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
That's all there is to it!
|
||||||
|
|
||||||
|
|
164
libltdl/Makefile.am
Normal file
164
libltdl/Makefile.am
Normal file
|
@ -0,0 +1,164 @@
|
||||||
|
## Makefile.am -- Process this file with automake to produce Makefile.in
|
||||||
|
##
|
||||||
|
## Copyright (C) 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
|
||||||
|
## Written by Gary V. Vaughan, 2003
|
||||||
|
##
|
||||||
|
## NOTE: The canonical source of this file is maintained with the
|
||||||
|
## GNU Libtool package. Report bugs to bug-libtool@gnu.org.
|
||||||
|
##
|
||||||
|
## GNU Libltdl is free software; you can redistribute it and/or
|
||||||
|
## modify it under the terms of the GNU Lesser General Public
|
||||||
|
## License as published by the Free Software Foundation; either
|
||||||
|
## version 2 of the License, or (at your option) any later version.
|
||||||
|
##
|
||||||
|
## 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 this file under the
|
||||||
|
## same distribution terms that you use for the rest of that program.
|
||||||
|
##
|
||||||
|
## GNU Libltdl is distributed in the hope that it will be useful,
|
||||||
|
## but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
## GNU Lesser General Public License for more details.
|
||||||
|
##
|
||||||
|
## You should have received a copy of the GNU LesserGeneral Public
|
||||||
|
## License along with GNU Libltdl; see the file COPYING.LIB. If not, a
|
||||||
|
## copy can be downloaded from http://www.gnu.org/licenses/lgpl.html,
|
||||||
|
## or obtained by writing to the Free Software Foundation, Inc.,
|
||||||
|
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
#####
|
||||||
|
|
||||||
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
AUTOMAKE_OPTIONS = foreign
|
||||||
|
AM_CPPFLAGS =
|
||||||
|
AM_LDFLAGS =
|
||||||
|
BUILT_SOURCES =
|
||||||
|
include_HEADERS =
|
||||||
|
noinst_LTLIBRARIES =
|
||||||
|
lib_LTLIBRARIES =
|
||||||
|
EXTRA_LTLIBRARIES =
|
||||||
|
EXTRA_DIST =
|
||||||
|
CLEANFILES =
|
||||||
|
MOSTLYCLEANFILES =
|
||||||
|
|
||||||
|
# -I$(srcdir) is needed for user that built libltdl with a sub-Automake
|
||||||
|
# (not as a sub-package!) using 'nostdinc':
|
||||||
|
AM_CPPFLAGS += -DLT_CONFIG_H='<$(LT_CONFIG_H)>' \
|
||||||
|
-DLTDL -I. -I$(srcdir) -Ilibltdl \
|
||||||
|
-I$(srcdir)/libltdl -I$(srcdir)/libltdl
|
||||||
|
AM_LDFLAGS += -no-undefined
|
||||||
|
LTDL_VERSION_INFO = -version-info 10:0:3
|
||||||
|
|
||||||
|
noinst_LTLIBRARIES += $(LT_DLLOADERS)
|
||||||
|
|
||||||
|
if INSTALL_LTDL
|
||||||
|
ltdlincludedir = $(includedir)/libltdl
|
||||||
|
ltdlinclude_HEADERS = libltdl/lt_system.h \
|
||||||
|
libltdl/lt_error.h \
|
||||||
|
libltdl/lt_dlloader.h
|
||||||
|
include_HEADERS += ltdl.h
|
||||||
|
lib_LTLIBRARIES += libltdl.la
|
||||||
|
endif
|
||||||
|
|
||||||
|
if CONVENIENCE_LTDL
|
||||||
|
noinst_LTLIBRARIES += libltdlc.la
|
||||||
|
endif
|
||||||
|
|
||||||
|
libltdl_la_SOURCES = libltdl/lt__alloc.h \
|
||||||
|
libltdl/lt__dirent.h \
|
||||||
|
libltdl/lt__glibc.h \
|
||||||
|
libltdl/lt__private.h \
|
||||||
|
libltdl/lt__strl.h \
|
||||||
|
libltdl/lt_dlloader.h \
|
||||||
|
libltdl/lt_error.h \
|
||||||
|
libltdl/lt_system.h \
|
||||||
|
libltdl/slist.h \
|
||||||
|
loaders/preopen.c \
|
||||||
|
lt__alloc.c \
|
||||||
|
lt_dlloader.c \
|
||||||
|
lt_error.c \
|
||||||
|
ltdl.c \
|
||||||
|
ltdl.h \
|
||||||
|
slist.c
|
||||||
|
|
||||||
|
EXTRA_DIST += lt__dirent.c \
|
||||||
|
lt__strl.c
|
||||||
|
|
||||||
|
libltdl_la_CPPFLAGS = -DLTDLOPEN=$(LTDLOPEN) $(AM_CPPFLAGS)
|
||||||
|
libltdl_la_LDFLAGS = $(AM_LDFLAGS) $(LTDL_VERSION_INFO) $(LT_DLPREOPEN)
|
||||||
|
libltdl_la_LIBADD = $(LTLIBOBJS)
|
||||||
|
libltdl_la_DEPENDENCIES = $(LT_DLLOADERS) $(LTLIBOBJS)
|
||||||
|
|
||||||
|
libltdlc_la_SOURCES = $(libltdl_la_SOURCES)
|
||||||
|
libltdlc_la_CPPFLAGS = -DLTDLOPEN=$(LTDLOPEN)c $(AM_CPPFLAGS)
|
||||||
|
libltdlc_la_LDFLAGS = $(AM_LDFLAGS) $(LT_DLPREOPEN)
|
||||||
|
libltdlc_la_LIBADD = $(libltdl_la_LIBADD)
|
||||||
|
libltdlc_la_DEPENDENCIES= $(libltdl_la_DEPENDENCIES)
|
||||||
|
|
||||||
|
## The loaders are preopened by libltdl, itself always built from
|
||||||
|
## pic-objects (either as a shared library, or a convenience library),
|
||||||
|
## so the loaders themselves must be made from pic-objects too. We
|
||||||
|
## use convenience libraries for that purpose:
|
||||||
|
EXTRA_LTLIBRARIES += dlopen.la \
|
||||||
|
dld_link.la \
|
||||||
|
dyld.la \
|
||||||
|
load_add_on.la \
|
||||||
|
loadlibrary.la \
|
||||||
|
shl_load.la
|
||||||
|
|
||||||
|
dlopen_la_SOURCES = loaders/dlopen.c
|
||||||
|
dlopen_la_LDFLAGS = -module -avoid-version
|
||||||
|
dlopen_la_LIBADD = $(LIBADD_DLOPEN)
|
||||||
|
|
||||||
|
dld_link_la_SOURCES = loaders/dld_link.c
|
||||||
|
dld_link_la_LDFLAGS = -module -avoid-version
|
||||||
|
dld_link_la_LIBADD = -ldld
|
||||||
|
|
||||||
|
dyld_la_SOURCES = loaders/dyld.c
|
||||||
|
dyld_la_LDFLAGS = -module -avoid-version
|
||||||
|
|
||||||
|
load_add_on_la_SOURCES = loaders/load_add_on.c
|
||||||
|
load_add_on_la_LDFLAGS = -module -avoid-version
|
||||||
|
|
||||||
|
loadlibrary_la_SOURCES = loaders/loadlibrary.c
|
||||||
|
loadlibrary_la_LDFLAGS = -module -avoid-version
|
||||||
|
|
||||||
|
shl_load_la_SOURCES = loaders/shl_load.c
|
||||||
|
shl_load_la_LDFLAGS = -module -avoid-version
|
||||||
|
shl_load_la_LIBADD = $(LIBADD_SHL_LOAD)
|
||||||
|
|
||||||
|
## Make sure these will be cleaned even when they're not built by default:
|
||||||
|
CLEANFILES += libltdl.la \
|
||||||
|
libltdlc.la \
|
||||||
|
libdlloader.la
|
||||||
|
|
||||||
|
## Automake-1.9.6 doesn't clean subdir AC_LIBOBJ compiled objects
|
||||||
|
## automatically:
|
||||||
|
CLEANFILES += $(LIBOBJS) $(LTLIBOBJS)
|
||||||
|
|
||||||
|
EXTRA_DIST += COPYING.LIB \
|
||||||
|
configure.ac \
|
||||||
|
Makefile.am \
|
||||||
|
aclocal.m4 \
|
||||||
|
Makefile.in \
|
||||||
|
configure \
|
||||||
|
config-h.in \
|
||||||
|
README
|
||||||
|
|
||||||
|
## --------------------------- ##
|
||||||
|
## Gnulib Makefile.am snippets ##
|
||||||
|
## --------------------------- ##
|
||||||
|
|
||||||
|
BUILT_SOURCES += $(ARGZ_H)
|
||||||
|
EXTRA_DIST += argz_.h \
|
||||||
|
argz.c
|
||||||
|
|
||||||
|
# We need the following in order to create an <argz.h> when the system
|
||||||
|
# doesn't have one that works with the given compiler.
|
||||||
|
all-local $(lib_OBJECTS): $(ARGZ_H)
|
||||||
|
argz.h: argz_.h
|
||||||
|
$(mkinstalldirs) .
|
||||||
|
cp $(srcdir)/argz_.h $@-t
|
||||||
|
mv $@-t $@
|
||||||
|
MOSTLYCLEANFILES += argz.h \
|
||||||
|
argz.h-t
|
1209
libltdl/Makefile.in
Normal file
1209
libltdl/Makefile.in
Normal file
File diff suppressed because it is too large
Load diff
20
libltdl/README
Normal file
20
libltdl/README
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
This is GNU libltdl, a system independent dlopen wrapper for GNU libtool.
|
||||||
|
|
||||||
|
It supports the following dlopen interfaces:
|
||||||
|
* dlopen (POSIX)
|
||||||
|
* shl_load (HP-UX)
|
||||||
|
* LoadLibrary (Win16 and Win32)
|
||||||
|
* load_add_on (BeOS)
|
||||||
|
* GNU DLD (emulates dynamic linking for static libraries)
|
||||||
|
* dyld (darwin/Mac OS X)
|
||||||
|
* libtool's dlpreopen
|
||||||
|
--
|
||||||
|
Copyright (C) 1999, 2003, 2011 Free Software Foundation, Inc.
|
||||||
|
Written by Thomas Tanner, 1999
|
||||||
|
|
||||||
|
This file is part of GNU Libtool.
|
||||||
|
|
||||||
|
Copying and distribution of this file, with or without modification,
|
||||||
|
are permitted in any medium without royalty provided the copyright
|
||||||
|
notice and this notice are preserved. This file is offered as-is,
|
||||||
|
without warranty of any kind.
|
1157
libltdl/aclocal.m4
vendored
Normal file
1157
libltdl/aclocal.m4
vendored
Normal file
File diff suppressed because it is too large
Load diff
226
libltdl/argz.c
Normal file
226
libltdl/argz.c
Normal file
|
@ -0,0 +1,226 @@
|
||||||
|
/* argz.c -- argz implementation for non-glibc systems
|
||||||
|
|
||||||
|
Copyright (C) 2004, 2006, 2007, 2008 Free Software Foundation, Inc.
|
||||||
|
Written by Gary V. Vaughan, 2004
|
||||||
|
|
||||||
|
NOTE: The canonical source of this file is maintained with the
|
||||||
|
GNU Libtool package. Report bugs to bug-libtool@gnu.org.
|
||||||
|
|
||||||
|
GNU Libltdl is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
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 this file under the
|
||||||
|
same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
GNU Libltdl is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with GNU Libltdl; see the file COPYING.LIB. If not, a
|
||||||
|
copy can be downloaded from http://www.gnu.org/licenses/lgpl.html,
|
||||||
|
or obtained by writing to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(LTDL) && defined LT_CONFIG_H
|
||||||
|
# include LT_CONFIG_H
|
||||||
|
#else
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <argz.h>
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define EOS_CHAR '\0'
|
||||||
|
|
||||||
|
error_t
|
||||||
|
argz_append (char **pargz, size_t *pargz_len, const char *buf, size_t buf_len)
|
||||||
|
{
|
||||||
|
size_t argz_len;
|
||||||
|
char *argz;
|
||||||
|
|
||||||
|
assert (pargz);
|
||||||
|
assert (pargz_len);
|
||||||
|
assert ((*pargz && *pargz_len) || (!*pargz && !*pargz_len));
|
||||||
|
|
||||||
|
/* If nothing needs to be appended, no more work is required. */
|
||||||
|
if (buf_len == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* Ensure there is enough room to append BUF_LEN. */
|
||||||
|
argz_len = *pargz_len + buf_len;
|
||||||
|
argz = (char *) realloc (*pargz, argz_len);
|
||||||
|
if (!argz)
|
||||||
|
return ENOMEM;
|
||||||
|
|
||||||
|
/* Copy characters from BUF after terminating '\0' in ARGZ. */
|
||||||
|
memcpy (argz + *pargz_len, buf, buf_len);
|
||||||
|
|
||||||
|
/* Assign new values. */
|
||||||
|
*pargz = argz;
|
||||||
|
*pargz_len = argz_len;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
error_t
|
||||||
|
argz_create_sep (const char *str, int delim, char **pargz, size_t *pargz_len)
|
||||||
|
{
|
||||||
|
size_t argz_len;
|
||||||
|
char *argz = 0;
|
||||||
|
|
||||||
|
assert (str);
|
||||||
|
assert (pargz);
|
||||||
|
assert (pargz_len);
|
||||||
|
|
||||||
|
/* Make a copy of STR, but replacing each occurrence of
|
||||||
|
DELIM with '\0'. */
|
||||||
|
argz_len = 1+ strlen (str);
|
||||||
|
if (argz_len)
|
||||||
|
{
|
||||||
|
const char *p;
|
||||||
|
char *q;
|
||||||
|
|
||||||
|
argz = (char *) malloc (argz_len);
|
||||||
|
if (!argz)
|
||||||
|
return ENOMEM;
|
||||||
|
|
||||||
|
for (p = str, q = argz; *p != EOS_CHAR; ++p)
|
||||||
|
{
|
||||||
|
if (*p == delim)
|
||||||
|
{
|
||||||
|
/* Ignore leading delimiters, and fold consecutive
|
||||||
|
delimiters in STR into a single '\0' in ARGZ. */
|
||||||
|
if ((q > argz) && (q[-1] != EOS_CHAR))
|
||||||
|
*q++ = EOS_CHAR;
|
||||||
|
else
|
||||||
|
--argz_len;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*q++ = *p;
|
||||||
|
}
|
||||||
|
/* Copy terminating EOS_CHAR. */
|
||||||
|
*q = *p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If ARGZ_LEN has shrunk to nothing, release ARGZ's memory. */
|
||||||
|
if (!argz_len)
|
||||||
|
argz = (free (argz), (char *) 0);
|
||||||
|
|
||||||
|
/* Assign new values. */
|
||||||
|
*pargz = argz;
|
||||||
|
*pargz_len = argz_len;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
error_t
|
||||||
|
argz_insert (char **pargz, size_t *pargz_len, char *before, const char *entry)
|
||||||
|
{
|
||||||
|
assert (pargz);
|
||||||
|
assert (pargz_len);
|
||||||
|
assert (entry && *entry);
|
||||||
|
|
||||||
|
/* No BEFORE address indicates ENTRY should be inserted after the
|
||||||
|
current last element. */
|
||||||
|
if (!before)
|
||||||
|
return argz_append (pargz, pargz_len, entry, 1+ strlen (entry));
|
||||||
|
|
||||||
|
/* This probably indicates a programmer error, but to preserve
|
||||||
|
semantics, scan back to the start of an entry if BEFORE points
|
||||||
|
into the middle of it. */
|
||||||
|
while ((before > *pargz) && (before[-1] != EOS_CHAR))
|
||||||
|
--before;
|
||||||
|
|
||||||
|
{
|
||||||
|
size_t entry_len = 1+ strlen (entry);
|
||||||
|
size_t argz_len = *pargz_len + entry_len;
|
||||||
|
size_t offset = before - *pargz;
|
||||||
|
char *argz = (char *) realloc (*pargz, argz_len);
|
||||||
|
|
||||||
|
if (!argz)
|
||||||
|
return ENOMEM;
|
||||||
|
|
||||||
|
/* Make BEFORE point to the equivalent offset in ARGZ that it
|
||||||
|
used to have in *PARGZ incase realloc() moved the block. */
|
||||||
|
before = argz + offset;
|
||||||
|
|
||||||
|
/* Move the ARGZ entries starting at BEFORE up into the new
|
||||||
|
space at the end -- making room to copy ENTRY into the
|
||||||
|
resulting gap. */
|
||||||
|
memmove (before + entry_len, before, *pargz_len - offset);
|
||||||
|
memcpy (before, entry, entry_len);
|
||||||
|
|
||||||
|
/* Assign new values. */
|
||||||
|
*pargz = argz;
|
||||||
|
*pargz_len = argz_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char *
|
||||||
|
argz_next (char *argz, size_t argz_len, const char *entry)
|
||||||
|
{
|
||||||
|
assert ((argz && argz_len) || (!argz && !argz_len));
|
||||||
|
|
||||||
|
if (entry)
|
||||||
|
{
|
||||||
|
/* Either ARGZ/ARGZ_LEN is empty, or ENTRY points into an address
|
||||||
|
within the ARGZ vector. */
|
||||||
|
assert ((!argz && !argz_len)
|
||||||
|
|| ((argz <= entry) && (entry < (argz + argz_len))));
|
||||||
|
|
||||||
|
/* Move to the char immediately after the terminating
|
||||||
|
'\0' of ENTRY. */
|
||||||
|
entry = 1+ strchr (entry, EOS_CHAR);
|
||||||
|
|
||||||
|
/* Return either the new ENTRY, or else NULL if ARGZ is
|
||||||
|
exhausted. */
|
||||||
|
return (entry >= argz + argz_len) ? 0 : (char *) entry;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* This should probably be flagged as a programmer error,
|
||||||
|
since starting an argz_next loop with the iterator set
|
||||||
|
to ARGZ is safer. To preserve semantics, handle the NULL
|
||||||
|
case by returning the start of ARGZ (if any). */
|
||||||
|
if (argz_len > 0)
|
||||||
|
return argz;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
argz_stringify (char *argz, size_t argz_len, int sep)
|
||||||
|
{
|
||||||
|
assert ((argz && argz_len) || (!argz && !argz_len));
|
||||||
|
|
||||||
|
if (sep)
|
||||||
|
{
|
||||||
|
--argz_len; /* don't stringify the terminating EOS */
|
||||||
|
while (--argz_len > 0)
|
||||||
|
{
|
||||||
|
if (argz[argz_len] == EOS_CHAR)
|
||||||
|
argz[argz_len] = sep;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
68
libltdl/argz_.h
Normal file
68
libltdl/argz_.h
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
/* lt__argz.h -- internal argz interface for non-glibc systems
|
||||||
|
|
||||||
|
Copyright (C) 2004, 2007, 2008 Free Software Foundation, Inc.
|
||||||
|
Written by Gary V. Vaughan, 2004
|
||||||
|
|
||||||
|
NOTE: The canonical source of this file is maintained with the
|
||||||
|
GNU Libtool package. Report bugs to bug-libtool@gnu.org.
|
||||||
|
|
||||||
|
GNU Libltdl is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
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 this file under the
|
||||||
|
same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
GNU Libltdl is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with GNU Libltdl; see the file COPYING.LIB. If not, a
|
||||||
|
copy can be downloaded from http://www.gnu.org/licenses/lgpl.html,
|
||||||
|
or obtained by writing to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(LT__ARGZ_H)
|
||||||
|
#define LT__ARGZ_H 1
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#define __need_error_t
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#if defined(LTDL)
|
||||||
|
# include "lt__glibc.h"
|
||||||
|
# include "lt_system.h"
|
||||||
|
#else
|
||||||
|
# define LT_SCOPE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
LT_SCOPE error_t argz_append (char **pargz, size_t *pargz_len,
|
||||||
|
const char *buf, size_t buf_len);
|
||||||
|
LT_SCOPE error_t argz_create_sep(const char *str, int delim,
|
||||||
|
char **pargz, size_t *pargz_len);
|
||||||
|
LT_SCOPE error_t argz_insert (char **pargz, size_t *pargz_len,
|
||||||
|
char *before, const char *entry);
|
||||||
|
LT_SCOPE char * argz_next (char *argz, size_t argz_len,
|
||||||
|
const char *entry);
|
||||||
|
LT_SCOPE void argz_stringify (char *argz, size_t argz_len, int sep);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(LTDL)
|
||||||
|
# undef LT_SCOPE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /*!defined(LT__ARGZ_H)*/
|
178
libltdl/config-h.in
Normal file
178
libltdl/config-h.in
Normal file
|
@ -0,0 +1,178 @@
|
||||||
|
/* config-h.in. Generated from configure.ac by autoheader. */
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `argz_add' function. */
|
||||||
|
#undef HAVE_ARGZ_ADD
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `argz_append' function. */
|
||||||
|
#undef HAVE_ARGZ_APPEND
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `argz_count' function. */
|
||||||
|
#undef HAVE_ARGZ_COUNT
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `argz_create_sep' function. */
|
||||||
|
#undef HAVE_ARGZ_CREATE_SEP
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <argz.h> header file. */
|
||||||
|
#undef HAVE_ARGZ_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `argz_insert' function. */
|
||||||
|
#undef HAVE_ARGZ_INSERT
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `argz_next' function. */
|
||||||
|
#undef HAVE_ARGZ_NEXT
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `argz_stringify' function. */
|
||||||
|
#undef HAVE_ARGZ_STRINGIFY
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `closedir' function. */
|
||||||
|
#undef HAVE_CLOSEDIR
|
||||||
|
|
||||||
|
/* Define to 1 if you have the declaration of `cygwin_conv_path', and to 0 if
|
||||||
|
you don't. */
|
||||||
|
#undef HAVE_DECL_CYGWIN_CONV_PATH
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <dirent.h> header file. */
|
||||||
|
#undef HAVE_DIRENT_H
|
||||||
|
|
||||||
|
/* Define if you have the GNU dld library. */
|
||||||
|
#undef HAVE_DLD
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <dld.h> header file. */
|
||||||
|
#undef HAVE_DLD_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `dlerror' function. */
|
||||||
|
#undef HAVE_DLERROR
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <dlfcn.h> header file. */
|
||||||
|
#undef HAVE_DLFCN_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <dl.h> header file. */
|
||||||
|
#undef HAVE_DL_H
|
||||||
|
|
||||||
|
/* Define if you have the _dyld_func_lookup function. */
|
||||||
|
#undef HAVE_DYLD
|
||||||
|
|
||||||
|
/* Define to 1 if the system has the type `error_t'. */
|
||||||
|
#undef HAVE_ERROR_T
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||||
|
#undef HAVE_INTTYPES_H
|
||||||
|
|
||||||
|
/* Define if you have the libdl library or equivalent. */
|
||||||
|
#undef HAVE_LIBDL
|
||||||
|
|
||||||
|
/* Define if libdlloader will be built on this platform */
|
||||||
|
#undef HAVE_LIBDLLOADER
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <mach-o/dyld.h> header file. */
|
||||||
|
#undef HAVE_MACH_O_DYLD_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <memory.h> header file. */
|
||||||
|
#undef HAVE_MEMORY_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `opendir' function. */
|
||||||
|
#undef HAVE_OPENDIR
|
||||||
|
|
||||||
|
/* Define if libtool can extract symbol lists from object files. */
|
||||||
|
#undef HAVE_PRELOADED_SYMBOLS
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `readdir' function. */
|
||||||
|
#undef HAVE_READDIR
|
||||||
|
|
||||||
|
/* Define if you have the shl_load function. */
|
||||||
|
#undef HAVE_SHL_LOAD
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <stdint.h> header file. */
|
||||||
|
#undef HAVE_STDINT_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||||
|
#undef HAVE_STDLIB_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <strings.h> header file. */
|
||||||
|
#undef HAVE_STRINGS_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <string.h> header file. */
|
||||||
|
#undef HAVE_STRING_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `strlcat' function. */
|
||||||
|
#undef HAVE_STRLCAT
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `strlcpy' function. */
|
||||||
|
#undef HAVE_STRLCPY
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/dl.h> header file. */
|
||||||
|
#undef HAVE_SYS_DL_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||||
|
#undef HAVE_SYS_STAT_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||||
|
#undef HAVE_SYS_TYPES_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <unistd.h> header file. */
|
||||||
|
#undef HAVE_UNISTD_H
|
||||||
|
|
||||||
|
/* This value is set to 1 to indicate that the system argz facility works */
|
||||||
|
#undef HAVE_WORKING_ARGZ
|
||||||
|
|
||||||
|
/* Define if the OS needs help to load dependent libraries for dlopen(). */
|
||||||
|
#undef LTDL_DLOPEN_DEPLIBS
|
||||||
|
|
||||||
|
/* Define to the system default library search path. */
|
||||||
|
#undef LT_DLSEARCH_PATH
|
||||||
|
|
||||||
|
/* The archive extension */
|
||||||
|
#undef LT_LIBEXT
|
||||||
|
|
||||||
|
/* The archive prefix */
|
||||||
|
#undef LT_LIBPREFIX
|
||||||
|
|
||||||
|
/* Define to the extension used for runtime loadable modules, say, ".so". */
|
||||||
|
#undef LT_MODULE_EXT
|
||||||
|
|
||||||
|
/* Define to the name of the environment variable that determines the run-time
|
||||||
|
module search path. */
|
||||||
|
#undef LT_MODULE_PATH_VAR
|
||||||
|
|
||||||
|
/* Define to the sub-directory in which libtool stores uninstalled libraries.
|
||||||
|
*/
|
||||||
|
#undef LT_OBJDIR
|
||||||
|
|
||||||
|
/* Define to the shared library suffix, say, ".dylib". */
|
||||||
|
#undef LT_SHARED_EXT
|
||||||
|
|
||||||
|
/* Define if dlsym() requires a leading underscore in symbol names. */
|
||||||
|
#undef NEED_USCORE
|
||||||
|
|
||||||
|
/* Name of package */
|
||||||
|
#undef PACKAGE
|
||||||
|
|
||||||
|
/* Define to the address where bug reports for this package should be sent. */
|
||||||
|
#undef PACKAGE_BUGREPORT
|
||||||
|
|
||||||
|
/* Define to the full name of this package. */
|
||||||
|
#undef PACKAGE_NAME
|
||||||
|
|
||||||
|
/* Define to the full name and version of this package. */
|
||||||
|
#undef PACKAGE_STRING
|
||||||
|
|
||||||
|
/* Define to the one symbol short name of this package. */
|
||||||
|
#undef PACKAGE_TARNAME
|
||||||
|
|
||||||
|
/* Define to the home page for this package. */
|
||||||
|
#undef PACKAGE_URL
|
||||||
|
|
||||||
|
/* Define to the version of this package. */
|
||||||
|
#undef PACKAGE_VERSION
|
||||||
|
|
||||||
|
/* Define to 1 if you have the ANSI C header files. */
|
||||||
|
#undef STDC_HEADERS
|
||||||
|
|
||||||
|
/* Version number of package */
|
||||||
|
#undef VERSION
|
||||||
|
|
||||||
|
/* Define so that glibc/gnulib argp.h does not typedef error_t. */
|
||||||
|
#undef __error_t_defined
|
||||||
|
|
||||||
|
/* Define to a type to use for `error_t' if it is not otherwise available. */
|
||||||
|
#undef error_t
|
347
libltdl/config/compile
Executable file
347
libltdl/config/compile
Executable file
|
@ -0,0 +1,347 @@
|
||||||
|
#! /bin/sh
|
||||||
|
# Wrapper for compilers which do not understand '-c -o'.
|
||||||
|
|
||||||
|
scriptversion=2012-10-14.11; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 1999-2014 Free Software Foundation, Inc.
|
||||||
|
# Written by Tom Tromey <tromey@cygnus.com>.
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you
|
||||||
|
# distribute this file as part of a program that contains a
|
||||||
|
# configuration script generated by Autoconf, you may include it under
|
||||||
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
# This file is maintained in Automake, please report
|
||||||
|
# bugs to <bug-automake@gnu.org> or send patches to
|
||||||
|
# <automake-patches@gnu.org>.
|
||||||
|
|
||||||
|
nl='
|
||||||
|
'
|
||||||
|
|
||||||
|
# We need space, tab and new line, in precisely that order. Quoting is
|
||||||
|
# there to prevent tools from complaining about whitespace usage.
|
||||||
|
IFS=" "" $nl"
|
||||||
|
|
||||||
|
file_conv=
|
||||||
|
|
||||||
|
# func_file_conv build_file lazy
|
||||||
|
# Convert a $build file to $host form and store it in $file
|
||||||
|
# Currently only supports Windows hosts. If the determined conversion
|
||||||
|
# type is listed in (the comma separated) LAZY, no conversion will
|
||||||
|
# take place.
|
||||||
|
func_file_conv ()
|
||||||
|
{
|
||||||
|
file=$1
|
||||||
|
case $file in
|
||||||
|
/ | /[!/]*) # absolute file, and not a UNC file
|
||||||
|
if test -z "$file_conv"; then
|
||||||
|
# lazily determine how to convert abs files
|
||||||
|
case `uname -s` in
|
||||||
|
MINGW*)
|
||||||
|
file_conv=mingw
|
||||||
|
;;
|
||||||
|
CYGWIN*)
|
||||||
|
file_conv=cygwin
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
file_conv=wine
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
case $file_conv/,$2, in
|
||||||
|
*,$file_conv,*)
|
||||||
|
;;
|
||||||
|
mingw/*)
|
||||||
|
file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
|
||||||
|
;;
|
||||||
|
cygwin/*)
|
||||||
|
file=`cygpath -m "$file" || echo "$file"`
|
||||||
|
;;
|
||||||
|
wine/*)
|
||||||
|
file=`winepath -w "$file" || echo "$file"`
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# func_cl_dashL linkdir
|
||||||
|
# Make cl look for libraries in LINKDIR
|
||||||
|
func_cl_dashL ()
|
||||||
|
{
|
||||||
|
func_file_conv "$1"
|
||||||
|
if test -z "$lib_path"; then
|
||||||
|
lib_path=$file
|
||||||
|
else
|
||||||
|
lib_path="$lib_path;$file"
|
||||||
|
fi
|
||||||
|
linker_opts="$linker_opts -LIBPATH:$file"
|
||||||
|
}
|
||||||
|
|
||||||
|
# func_cl_dashl library
|
||||||
|
# Do a library search-path lookup for cl
|
||||||
|
func_cl_dashl ()
|
||||||
|
{
|
||||||
|
lib=$1
|
||||||
|
found=no
|
||||||
|
save_IFS=$IFS
|
||||||
|
IFS=';'
|
||||||
|
for dir in $lib_path $LIB
|
||||||
|
do
|
||||||
|
IFS=$save_IFS
|
||||||
|
if $shared && test -f "$dir/$lib.dll.lib"; then
|
||||||
|
found=yes
|
||||||
|
lib=$dir/$lib.dll.lib
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
if test -f "$dir/$lib.lib"; then
|
||||||
|
found=yes
|
||||||
|
lib=$dir/$lib.lib
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
if test -f "$dir/lib$lib.a"; then
|
||||||
|
found=yes
|
||||||
|
lib=$dir/lib$lib.a
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
IFS=$save_IFS
|
||||||
|
|
||||||
|
if test "$found" != yes; then
|
||||||
|
lib=$lib.lib
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# func_cl_wrapper cl arg...
|
||||||
|
# Adjust compile command to suit cl
|
||||||
|
func_cl_wrapper ()
|
||||||
|
{
|
||||||
|
# Assume a capable shell
|
||||||
|
lib_path=
|
||||||
|
shared=:
|
||||||
|
linker_opts=
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
if test -n "$eat"; then
|
||||||
|
eat=
|
||||||
|
else
|
||||||
|
case $1 in
|
||||||
|
-o)
|
||||||
|
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
||||||
|
eat=1
|
||||||
|
case $2 in
|
||||||
|
*.o | *.[oO][bB][jJ])
|
||||||
|
func_file_conv "$2"
|
||||||
|
set x "$@" -Fo"$file"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
func_file_conv "$2"
|
||||||
|
set x "$@" -Fe"$file"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
-I)
|
||||||
|
eat=1
|
||||||
|
func_file_conv "$2" mingw
|
||||||
|
set x "$@" -I"$file"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-I*)
|
||||||
|
func_file_conv "${1#-I}" mingw
|
||||||
|
set x "$@" -I"$file"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-l)
|
||||||
|
eat=1
|
||||||
|
func_cl_dashl "$2"
|
||||||
|
set x "$@" "$lib"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-l*)
|
||||||
|
func_cl_dashl "${1#-l}"
|
||||||
|
set x "$@" "$lib"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-L)
|
||||||
|
eat=1
|
||||||
|
func_cl_dashL "$2"
|
||||||
|
;;
|
||||||
|
-L*)
|
||||||
|
func_cl_dashL "${1#-L}"
|
||||||
|
;;
|
||||||
|
-static)
|
||||||
|
shared=false
|
||||||
|
;;
|
||||||
|
-Wl,*)
|
||||||
|
arg=${1#-Wl,}
|
||||||
|
save_ifs="$IFS"; IFS=','
|
||||||
|
for flag in $arg; do
|
||||||
|
IFS="$save_ifs"
|
||||||
|
linker_opts="$linker_opts $flag"
|
||||||
|
done
|
||||||
|
IFS="$save_ifs"
|
||||||
|
;;
|
||||||
|
-Xlinker)
|
||||||
|
eat=1
|
||||||
|
linker_opts="$linker_opts $2"
|
||||||
|
;;
|
||||||
|
-*)
|
||||||
|
set x "$@" "$1"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
|
||||||
|
func_file_conv "$1"
|
||||||
|
set x "$@" -Tp"$file"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
|
||||||
|
func_file_conv "$1" mingw
|
||||||
|
set x "$@" "$file"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set x "$@" "$1"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
if test -n "$linker_opts"; then
|
||||||
|
linker_opts="-link$linker_opts"
|
||||||
|
fi
|
||||||
|
exec "$@" $linker_opts
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
eat=
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
'')
|
||||||
|
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
||||||
|
exit 1;
|
||||||
|
;;
|
||||||
|
-h | --h*)
|
||||||
|
cat <<\EOF
|
||||||
|
Usage: compile [--help] [--version] PROGRAM [ARGS]
|
||||||
|
|
||||||
|
Wrapper for compilers which do not understand '-c -o'.
|
||||||
|
Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
|
||||||
|
arguments, and rename the output as expected.
|
||||||
|
|
||||||
|
If you are trying to build a whole package this is not the
|
||||||
|
right script to run: please start by reading the file 'INSTALL'.
|
||||||
|
|
||||||
|
Report bugs to <bug-automake@gnu.org>.
|
||||||
|
EOF
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
-v | --v*)
|
||||||
|
echo "compile $scriptversion"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
|
||||||
|
func_cl_wrapper "$@" # Doesn't return...
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
ofile=
|
||||||
|
cfile=
|
||||||
|
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
if test -n "$eat"; then
|
||||||
|
eat=
|
||||||
|
else
|
||||||
|
case $1 in
|
||||||
|
-o)
|
||||||
|
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
||||||
|
# So we strip '-o arg' only if arg is an object.
|
||||||
|
eat=1
|
||||||
|
case $2 in
|
||||||
|
*.o | *.obj)
|
||||||
|
ofile=$2
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set x "$@" -o "$2"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
*.c)
|
||||||
|
cfile=$1
|
||||||
|
set x "$@" "$1"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set x "$@" "$1"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
if test -z "$ofile" || test -z "$cfile"; then
|
||||||
|
# If no '-o' option was seen then we might have been invoked from a
|
||||||
|
# pattern rule where we don't need one. That is ok -- this is a
|
||||||
|
# normal compilation that the losing compiler can handle. If no
|
||||||
|
# '.c' file was seen then we are probably linking. That is also
|
||||||
|
# ok.
|
||||||
|
exec "$@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Name of file we expect compiler to create.
|
||||||
|
cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
|
||||||
|
|
||||||
|
# Create the lock directory.
|
||||||
|
# Note: use '[/\\:.-]' here to ensure that we don't use the same name
|
||||||
|
# that we are using for the .o file. Also, base the name on the expected
|
||||||
|
# object file name, since that is what matters with a parallel build.
|
||||||
|
lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
|
||||||
|
while true; do
|
||||||
|
if mkdir "$lockdir" >/dev/null 2>&1; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
# FIXME: race condition here if user kills between mkdir and trap.
|
||||||
|
trap "rmdir '$lockdir'; exit 1" 1 2 15
|
||||||
|
|
||||||
|
# Run the compile.
|
||||||
|
"$@"
|
||||||
|
ret=$?
|
||||||
|
|
||||||
|
if test -f "$cofile"; then
|
||||||
|
test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
|
||||||
|
elif test -f "${cofile}bj"; then
|
||||||
|
test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
|
||||||
|
fi
|
||||||
|
|
||||||
|
rmdir "$lockdir"
|
||||||
|
exit $ret
|
||||||
|
|
||||||
|
# Local Variables:
|
||||||
|
# mode: shell-script
|
||||||
|
# sh-indentation: 2
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
1420
libltdl/config/config.guess
vendored
Executable file
1420
libltdl/config/config.guess
vendored
Executable file
File diff suppressed because it is too large
Load diff
1799
libltdl/config/config.sub
vendored
Executable file
1799
libltdl/config/config.sub
vendored
Executable file
File diff suppressed because it is too large
Load diff
791
libltdl/config/depcomp
Executable file
791
libltdl/config/depcomp
Executable file
|
@ -0,0 +1,791 @@
|
||||||
|
#! /bin/sh
|
||||||
|
# depcomp - compile a program generating dependencies as side-effects
|
||||||
|
|
||||||
|
scriptversion=2013-05-30.07; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 1999-2014 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you
|
||||||
|
# distribute this file as part of a program that contains a
|
||||||
|
# configuration script generated by Autoconf, you may include it under
|
||||||
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
'')
|
||||||
|
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
||||||
|
exit 1;
|
||||||
|
;;
|
||||||
|
-h | --h*)
|
||||||
|
cat <<\EOF
|
||||||
|
Usage: depcomp [--help] [--version] PROGRAM [ARGS]
|
||||||
|
|
||||||
|
Run PROGRAMS ARGS to compile a file, generating dependencies
|
||||||
|
as side-effects.
|
||||||
|
|
||||||
|
Environment variables:
|
||||||
|
depmode Dependency tracking mode.
|
||||||
|
source Source file read by 'PROGRAMS ARGS'.
|
||||||
|
object Object file output by 'PROGRAMS ARGS'.
|
||||||
|
DEPDIR directory where to store dependencies.
|
||||||
|
depfile Dependency file to output.
|
||||||
|
tmpdepfile Temporary file to use when outputting dependencies.
|
||||||
|
libtool Whether libtool is used (yes/no).
|
||||||
|
|
||||||
|
Report bugs to <bug-automake@gnu.org>.
|
||||||
|
EOF
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
-v | --v*)
|
||||||
|
echo "depcomp $scriptversion"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Get the directory component of the given path, and save it in the
|
||||||
|
# global variables '$dir'. Note that this directory component will
|
||||||
|
# be either empty or ending with a '/' character. This is deliberate.
|
||||||
|
set_dir_from ()
|
||||||
|
{
|
||||||
|
case $1 in
|
||||||
|
*/*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
|
||||||
|
*) dir=;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get the suffix-stripped basename of the given path, and save it the
|
||||||
|
# global variable '$base'.
|
||||||
|
set_base_from ()
|
||||||
|
{
|
||||||
|
base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
|
||||||
|
}
|
||||||
|
|
||||||
|
# If no dependency file was actually created by the compiler invocation,
|
||||||
|
# we still have to create a dummy depfile, to avoid errors with the
|
||||||
|
# Makefile "include basename.Plo" scheme.
|
||||||
|
make_dummy_depfile ()
|
||||||
|
{
|
||||||
|
echo "#dummy" > "$depfile"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Factor out some common post-processing of the generated depfile.
|
||||||
|
# Requires the auxiliary global variable '$tmpdepfile' to be set.
|
||||||
|
aix_post_process_depfile ()
|
||||||
|
{
|
||||||
|
# If the compiler actually managed to produce a dependency file,
|
||||||
|
# post-process it.
|
||||||
|
if test -f "$tmpdepfile"; then
|
||||||
|
# Each line is of the form 'foo.o: dependency.h'.
|
||||||
|
# Do two passes, one to just change these to
|
||||||
|
# $object: dependency.h
|
||||||
|
# and one to simply output
|
||||||
|
# dependency.h:
|
||||||
|
# which is needed to avoid the deleted-header problem.
|
||||||
|
{ sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
|
||||||
|
sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
|
||||||
|
} > "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
else
|
||||||
|
make_dummy_depfile
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# A tabulation character.
|
||||||
|
tab=' '
|
||||||
|
# A newline character.
|
||||||
|
nl='
|
||||||
|
'
|
||||||
|
# Character ranges might be problematic outside the C locale.
|
||||||
|
# These definitions help.
|
||||||
|
upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||||
|
lower=abcdefghijklmnopqrstuvwxyz
|
||||||
|
digits=0123456789
|
||||||
|
alpha=${upper}${lower}
|
||||||
|
|
||||||
|
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
|
||||||
|
echo "depcomp: Variables source, object and depmode must be set" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
|
||||||
|
depfile=${depfile-`echo "$object" |
|
||||||
|
sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
|
||||||
|
tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
|
||||||
|
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
|
||||||
|
# Avoid interferences from the environment.
|
||||||
|
gccflag= dashmflag=
|
||||||
|
|
||||||
|
# Some modes work just like other modes, but use different flags. We
|
||||||
|
# parameterize here, but still list the modes in the big case below,
|
||||||
|
# to make depend.m4 easier to write. Note that we *cannot* use a case
|
||||||
|
# here, because this file can only contain one case statement.
|
||||||
|
if test "$depmode" = hp; then
|
||||||
|
# HP compiler uses -M and no extra arg.
|
||||||
|
gccflag=-M
|
||||||
|
depmode=gcc
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$depmode" = dashXmstdout; then
|
||||||
|
# This is just like dashmstdout with a different argument.
|
||||||
|
dashmflag=-xM
|
||||||
|
depmode=dashmstdout
|
||||||
|
fi
|
||||||
|
|
||||||
|
cygpath_u="cygpath -u -f -"
|
||||||
|
if test "$depmode" = msvcmsys; then
|
||||||
|
# This is just like msvisualcpp but w/o cygpath translation.
|
||||||
|
# Just convert the backslash-escaped backslashes to single forward
|
||||||
|
# slashes to satisfy depend.m4
|
||||||
|
cygpath_u='sed s,\\\\,/,g'
|
||||||
|
depmode=msvisualcpp
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$depmode" = msvc7msys; then
|
||||||
|
# This is just like msvc7 but w/o cygpath translation.
|
||||||
|
# Just convert the backslash-escaped backslashes to single forward
|
||||||
|
# slashes to satisfy depend.m4
|
||||||
|
cygpath_u='sed s,\\\\,/,g'
|
||||||
|
depmode=msvc7
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$depmode" = xlc; then
|
||||||
|
# IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
|
||||||
|
gccflag=-qmakedep=gcc,-MF
|
||||||
|
depmode=gcc
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$depmode" in
|
||||||
|
gcc3)
|
||||||
|
## gcc 3 implements dependency tracking that does exactly what
|
||||||
|
## we want. Yay! Note: for some reason libtool 1.4 doesn't like
|
||||||
|
## it if -MD -MP comes after the -MF stuff. Hmm.
|
||||||
|
## Unfortunately, FreeBSD c89 acceptance of flags depends upon
|
||||||
|
## the command line argument order; so add the flags where they
|
||||||
|
## appear in depend2.am. Note that the slowdown incurred here
|
||||||
|
## affects only configure: in makefiles, %FASTDEP% shortcuts this.
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case $arg in
|
||||||
|
-c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
|
||||||
|
*) set fnord "$@" "$arg" ;;
|
||||||
|
esac
|
||||||
|
shift # fnord
|
||||||
|
shift # $arg
|
||||||
|
done
|
||||||
|
"$@"
|
||||||
|
stat=$?
|
||||||
|
if test $stat -ne 0; then
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
mv "$tmpdepfile" "$depfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
gcc)
|
||||||
|
## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
|
||||||
|
## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
|
||||||
|
## (see the conditional assignment to $gccflag above).
|
||||||
|
## There are various ways to get dependency output from gcc. Here's
|
||||||
|
## why we pick this rather obscure method:
|
||||||
|
## - Don't want to use -MD because we'd like the dependencies to end
|
||||||
|
## up in a subdir. Having to rename by hand is ugly.
|
||||||
|
## (We might end up doing this anyway to support other compilers.)
|
||||||
|
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
|
||||||
|
## -MM, not -M (despite what the docs say). Also, it might not be
|
||||||
|
## supported by the other compilers which use the 'gcc' depmode.
|
||||||
|
## - Using -M directly means running the compiler twice (even worse
|
||||||
|
## than renaming).
|
||||||
|
if test -z "$gccflag"; then
|
||||||
|
gccflag=-MD,
|
||||||
|
fi
|
||||||
|
"$@" -Wp,"$gccflag$tmpdepfile"
|
||||||
|
stat=$?
|
||||||
|
if test $stat -ne 0; then
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
# The second -e expression handles DOS-style file names with drive
|
||||||
|
# letters.
|
||||||
|
sed -e 's/^[^:]*: / /' \
|
||||||
|
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
|
||||||
|
## This next piece of magic avoids the "deleted header file" problem.
|
||||||
|
## The problem is that when a header file which appears in a .P file
|
||||||
|
## is deleted, the dependency causes make to die (because there is
|
||||||
|
## typically no way to rebuild the header). We avoid this by adding
|
||||||
|
## dummy dependencies for each header file. Too bad gcc doesn't do
|
||||||
|
## this for us directly.
|
||||||
|
## Some versions of gcc put a space before the ':'. On the theory
|
||||||
|
## that the space means something, we add a space to the output as
|
||||||
|
## well. hp depmode also adds that space, but also prefixes the VPATH
|
||||||
|
## to the object. Take care to not repeat it in the output.
|
||||||
|
## Some versions of the HPUX 10.20 sed can't process this invocation
|
||||||
|
## correctly. Breaking it into two sed invocations is a workaround.
|
||||||
|
tr ' ' "$nl" < "$tmpdepfile" \
|
||||||
|
| sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
|
||||||
|
| sed -e 's/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
hp)
|
||||||
|
# This case exists only to let depend.m4 do its work. It works by
|
||||||
|
# looking at the text of this script. This case will never be run,
|
||||||
|
# since it is checked for above.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
sgi)
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
"$@" "-Wp,-MDupdate,$tmpdepfile"
|
||||||
|
else
|
||||||
|
"$@" -MDupdate "$tmpdepfile"
|
||||||
|
fi
|
||||||
|
stat=$?
|
||||||
|
if test $stat -ne 0; then
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
|
||||||
|
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
# Clip off the initial element (the dependent). Don't try to be
|
||||||
|
# clever and replace this with sed code, as IRIX sed won't handle
|
||||||
|
# lines with more than a fixed number of characters (4096 in
|
||||||
|
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
|
||||||
|
# the IRIX cc adds comments like '#:fec' to the end of the
|
||||||
|
# dependency line.
|
||||||
|
tr ' ' "$nl" < "$tmpdepfile" \
|
||||||
|
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
|
||||||
|
| tr "$nl" ' ' >> "$depfile"
|
||||||
|
echo >> "$depfile"
|
||||||
|
# The second pass generates a dummy entry for each header file.
|
||||||
|
tr ' ' "$nl" < "$tmpdepfile" \
|
||||||
|
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
|
||||||
|
>> "$depfile"
|
||||||
|
else
|
||||||
|
make_dummy_depfile
|
||||||
|
fi
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
xlc)
|
||||||
|
# This case exists only to let depend.m4 do its work. It works by
|
||||||
|
# looking at the text of this script. This case will never be run,
|
||||||
|
# since it is checked for above.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
aix)
|
||||||
|
# The C for AIX Compiler uses -M and outputs the dependencies
|
||||||
|
# in a .u file. In older versions, this file always lives in the
|
||||||
|
# current directory. Also, the AIX compiler puts '$object:' at the
|
||||||
|
# start of each line; $object doesn't have directory information.
|
||||||
|
# Version 6 uses the directory in both cases.
|
||||||
|
set_dir_from "$object"
|
||||||
|
set_base_from "$object"
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
tmpdepfile1=$dir$base.u
|
||||||
|
tmpdepfile2=$base.u
|
||||||
|
tmpdepfile3=$dir.libs/$base.u
|
||||||
|
"$@" -Wc,-M
|
||||||
|
else
|
||||||
|
tmpdepfile1=$dir$base.u
|
||||||
|
tmpdepfile2=$dir$base.u
|
||||||
|
tmpdepfile3=$dir$base.u
|
||||||
|
"$@" -M
|
||||||
|
fi
|
||||||
|
stat=$?
|
||||||
|
if test $stat -ne 0; then
|
||||||
|
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
|
||||||
|
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||||
|
do
|
||||||
|
test -f "$tmpdepfile" && break
|
||||||
|
done
|
||||||
|
aix_post_process_depfile
|
||||||
|
;;
|
||||||
|
|
||||||
|
tcc)
|
||||||
|
# tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
|
||||||
|
# FIXME: That version still under development at the moment of writing.
|
||||||
|
# Make that this statement remains true also for stable, released
|
||||||
|
# versions.
|
||||||
|
# It will wrap lines (doesn't matter whether long or short) with a
|
||||||
|
# trailing '\', as in:
|
||||||
|
#
|
||||||
|
# foo.o : \
|
||||||
|
# foo.c \
|
||||||
|
# foo.h \
|
||||||
|
#
|
||||||
|
# It will put a trailing '\' even on the last line, and will use leading
|
||||||
|
# spaces rather than leading tabs (at least since its commit 0394caf7
|
||||||
|
# "Emit spaces for -MD").
|
||||||
|
"$@" -MD -MF "$tmpdepfile"
|
||||||
|
stat=$?
|
||||||
|
if test $stat -ne 0; then
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
# Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
|
||||||
|
# We have to change lines of the first kind to '$object: \'.
|
||||||
|
sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
|
||||||
|
# And for each line of the second kind, we have to emit a 'dep.h:'
|
||||||
|
# dummy dependency, to avoid the deleted-header problem.
|
||||||
|
sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
## The order of this option in the case statement is important, since the
|
||||||
|
## shell code in configure will try each of these formats in the order
|
||||||
|
## listed in this file. A plain '-MD' option would be understood by many
|
||||||
|
## compilers, so we must ensure this comes after the gcc and icc options.
|
||||||
|
pgcc)
|
||||||
|
# Portland's C compiler understands '-MD'.
|
||||||
|
# Will always output deps to 'file.d' where file is the root name of the
|
||||||
|
# source file under compilation, even if file resides in a subdirectory.
|
||||||
|
# The object file name does not affect the name of the '.d' file.
|
||||||
|
# pgcc 10.2 will output
|
||||||
|
# foo.o: sub/foo.c sub/foo.h
|
||||||
|
# and will wrap long lines using '\' :
|
||||||
|
# foo.o: sub/foo.c ... \
|
||||||
|
# sub/foo.h ... \
|
||||||
|
# ...
|
||||||
|
set_dir_from "$object"
|
||||||
|
# Use the source, not the object, to determine the base name, since
|
||||||
|
# that's sadly what pgcc will do too.
|
||||||
|
set_base_from "$source"
|
||||||
|
tmpdepfile=$base.d
|
||||||
|
|
||||||
|
# For projects that build the same source file twice into different object
|
||||||
|
# files, the pgcc approach of using the *source* file root name can cause
|
||||||
|
# problems in parallel builds. Use a locking strategy to avoid stomping on
|
||||||
|
# the same $tmpdepfile.
|
||||||
|
lockdir=$base.d-lock
|
||||||
|
trap "
|
||||||
|
echo '$0: caught signal, cleaning up...' >&2
|
||||||
|
rmdir '$lockdir'
|
||||||
|
exit 1
|
||||||
|
" 1 2 13 15
|
||||||
|
numtries=100
|
||||||
|
i=$numtries
|
||||||
|
while test $i -gt 0; do
|
||||||
|
# mkdir is a portable test-and-set.
|
||||||
|
if mkdir "$lockdir" 2>/dev/null; then
|
||||||
|
# This process acquired the lock.
|
||||||
|
"$@" -MD
|
||||||
|
stat=$?
|
||||||
|
# Release the lock.
|
||||||
|
rmdir "$lockdir"
|
||||||
|
break
|
||||||
|
else
|
||||||
|
# If the lock is being held by a different process, wait
|
||||||
|
# until the winning process is done or we timeout.
|
||||||
|
while test -d "$lockdir" && test $i -gt 0; do
|
||||||
|
sleep 1
|
||||||
|
i=`expr $i - 1`
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
i=`expr $i - 1`
|
||||||
|
done
|
||||||
|
trap - 1 2 13 15
|
||||||
|
if test $i -le 0; then
|
||||||
|
echo "$0: failed to acquire lock after $numtries attempts" >&2
|
||||||
|
echo "$0: check lockdir '$lockdir'" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $stat -ne 0; then
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
# Each line is of the form `foo.o: dependent.h',
|
||||||
|
# or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
|
||||||
|
# Do two passes, one to just change these to
|
||||||
|
# `$object: dependent.h' and one to simply `dependent.h:'.
|
||||||
|
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
|
||||||
|
# Some versions of the HPUX 10.20 sed can't process this invocation
|
||||||
|
# correctly. Breaking it into two sed invocations is a workaround.
|
||||||
|
sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
|
||||||
|
| sed -e 's/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
hp2)
|
||||||
|
# The "hp" stanza above does not work with aCC (C++) and HP's ia64
|
||||||
|
# compilers, which have integrated preprocessors. The correct option
|
||||||
|
# to use with these is +Maked; it writes dependencies to a file named
|
||||||
|
# 'foo.d', which lands next to the object file, wherever that
|
||||||
|
# happens to be.
|
||||||
|
# Much of this is similar to the tru64 case; see comments there.
|
||||||
|
set_dir_from "$object"
|
||||||
|
set_base_from "$object"
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
tmpdepfile1=$dir$base.d
|
||||||
|
tmpdepfile2=$dir.libs/$base.d
|
||||||
|
"$@" -Wc,+Maked
|
||||||
|
else
|
||||||
|
tmpdepfile1=$dir$base.d
|
||||||
|
tmpdepfile2=$dir$base.d
|
||||||
|
"$@" +Maked
|
||||||
|
fi
|
||||||
|
stat=$?
|
||||||
|
if test $stat -ne 0; then
|
||||||
|
rm -f "$tmpdepfile1" "$tmpdepfile2"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
|
||||||
|
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
|
||||||
|
do
|
||||||
|
test -f "$tmpdepfile" && break
|
||||||
|
done
|
||||||
|
if test -f "$tmpdepfile"; then
|
||||||
|
sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
|
||||||
|
# Add 'dependent.h:' lines.
|
||||||
|
sed -ne '2,${
|
||||||
|
s/^ *//
|
||||||
|
s/ \\*$//
|
||||||
|
s/$/:/
|
||||||
|
p
|
||||||
|
}' "$tmpdepfile" >> "$depfile"
|
||||||
|
else
|
||||||
|
make_dummy_depfile
|
||||||
|
fi
|
||||||
|
rm -f "$tmpdepfile" "$tmpdepfile2"
|
||||||
|
;;
|
||||||
|
|
||||||
|
tru64)
|
||||||
|
# The Tru64 compiler uses -MD to generate dependencies as a side
|
||||||
|
# effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
|
||||||
|
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
|
||||||
|
# dependencies in 'foo.d' instead, so we check for that too.
|
||||||
|
# Subdirectories are respected.
|
||||||
|
set_dir_from "$object"
|
||||||
|
set_base_from "$object"
|
||||||
|
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
# Libtool generates 2 separate objects for the 2 libraries. These
|
||||||
|
# two compilations output dependencies in $dir.libs/$base.o.d and
|
||||||
|
# in $dir$base.o.d. We have to check for both files, because
|
||||||
|
# one of the two compilations can be disabled. We should prefer
|
||||||
|
# $dir$base.o.d over $dir.libs/$base.o.d because the latter is
|
||||||
|
# automatically cleaned when .libs/ is deleted, while ignoring
|
||||||
|
# the former would cause a distcleancheck panic.
|
||||||
|
tmpdepfile1=$dir$base.o.d # libtool 1.5
|
||||||
|
tmpdepfile2=$dir.libs/$base.o.d # Likewise.
|
||||||
|
tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504
|
||||||
|
"$@" -Wc,-MD
|
||||||
|
else
|
||||||
|
tmpdepfile1=$dir$base.d
|
||||||
|
tmpdepfile2=$dir$base.d
|
||||||
|
tmpdepfile3=$dir$base.d
|
||||||
|
"$@" -MD
|
||||||
|
fi
|
||||||
|
|
||||||
|
stat=$?
|
||||||
|
if test $stat -ne 0; then
|
||||||
|
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
|
||||||
|
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||||
|
do
|
||||||
|
test -f "$tmpdepfile" && break
|
||||||
|
done
|
||||||
|
# Same post-processing that is required for AIX mode.
|
||||||
|
aix_post_process_depfile
|
||||||
|
;;
|
||||||
|
|
||||||
|
msvc7)
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
showIncludes=-Wc,-showIncludes
|
||||||
|
else
|
||||||
|
showIncludes=-showIncludes
|
||||||
|
fi
|
||||||
|
"$@" $showIncludes > "$tmpdepfile"
|
||||||
|
stat=$?
|
||||||
|
grep -v '^Note: including file: ' "$tmpdepfile"
|
||||||
|
if test $stat -ne 0; then
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
# The first sed program below extracts the file names and escapes
|
||||||
|
# backslashes for cygpath. The second sed program outputs the file
|
||||||
|
# name when reading, but also accumulates all include files in the
|
||||||
|
# hold buffer in order to output them again at the end. This only
|
||||||
|
# works with sed implementations that can handle large buffers.
|
||||||
|
sed < "$tmpdepfile" -n '
|
||||||
|
/^Note: including file: *\(.*\)/ {
|
||||||
|
s//\1/
|
||||||
|
s/\\/\\\\/g
|
||||||
|
p
|
||||||
|
}' | $cygpath_u | sort -u | sed -n '
|
||||||
|
s/ /\\ /g
|
||||||
|
s/\(.*\)/'"$tab"'\1 \\/p
|
||||||
|
s/.\(.*\) \\/\1:/
|
||||||
|
H
|
||||||
|
$ {
|
||||||
|
s/.*/'"$tab"'/
|
||||||
|
G
|
||||||
|
p
|
||||||
|
}' >> "$depfile"
|
||||||
|
echo >> "$depfile" # make sure the fragment doesn't end with a backslash
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
msvc7msys)
|
||||||
|
# This case exists only to let depend.m4 do its work. It works by
|
||||||
|
# looking at the text of this script. This case will never be run,
|
||||||
|
# since it is checked for above.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
#nosideeffect)
|
||||||
|
# This comment above is used by automake to tell side-effect
|
||||||
|
# dependency tracking mechanisms from slower ones.
|
||||||
|
|
||||||
|
dashmstdout)
|
||||||
|
# Important note: in order to support this mode, a compiler *must*
|
||||||
|
# always write the preprocessed file to stdout, regardless of -o.
|
||||||
|
"$@" || exit $?
|
||||||
|
|
||||||
|
# Remove the call to Libtool.
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
while test "X$1" != 'X--mode=compile'; do
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Remove '-o $object'.
|
||||||
|
IFS=" "
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case $arg in
|
||||||
|
-o)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
$object)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set fnord "$@" "$arg"
|
||||||
|
shift # fnord
|
||||||
|
shift # $arg
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
test -z "$dashmflag" && dashmflag=-M
|
||||||
|
# Require at least two characters before searching for ':'
|
||||||
|
# in the target name. This is to cope with DOS-style filenames:
|
||||||
|
# a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
|
||||||
|
"$@" $dashmflag |
|
||||||
|
sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
|
||||||
|
rm -f "$depfile"
|
||||||
|
cat < "$tmpdepfile" > "$depfile"
|
||||||
|
# Some versions of the HPUX 10.20 sed can't process this sed invocation
|
||||||
|
# correctly. Breaking it into two sed invocations is a workaround.
|
||||||
|
tr ' ' "$nl" < "$tmpdepfile" \
|
||||||
|
| sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
|
||||||
|
| sed -e 's/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
dashXmstdout)
|
||||||
|
# This case only exists to satisfy depend.m4. It is never actually
|
||||||
|
# run, as this mode is specially recognized in the preamble.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
makedepend)
|
||||||
|
"$@" || exit $?
|
||||||
|
# Remove any Libtool call
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
while test "X$1" != 'X--mode=compile'; do
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
# X makedepend
|
||||||
|
shift
|
||||||
|
cleared=no eat=no
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case $cleared in
|
||||||
|
no)
|
||||||
|
set ""; shift
|
||||||
|
cleared=yes ;;
|
||||||
|
esac
|
||||||
|
if test $eat = yes; then
|
||||||
|
eat=no
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
case "$arg" in
|
||||||
|
-D*|-I*)
|
||||||
|
set fnord "$@" "$arg"; shift ;;
|
||||||
|
# Strip any option that makedepend may not understand. Remove
|
||||||
|
# the object too, otherwise makedepend will parse it as a source file.
|
||||||
|
-arch)
|
||||||
|
eat=yes ;;
|
||||||
|
-*|$object)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set fnord "$@" "$arg"; shift ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
obj_suffix=`echo "$object" | sed 's/^.*\././'`
|
||||||
|
touch "$tmpdepfile"
|
||||||
|
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
|
||||||
|
rm -f "$depfile"
|
||||||
|
# makedepend may prepend the VPATH from the source file name to the object.
|
||||||
|
# No need to regex-escape $object, excess matching of '.' is harmless.
|
||||||
|
sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
|
||||||
|
# Some versions of the HPUX 10.20 sed can't process the last invocation
|
||||||
|
# correctly. Breaking it into two sed invocations is a workaround.
|
||||||
|
sed '1,2d' "$tmpdepfile" \
|
||||||
|
| tr ' ' "$nl" \
|
||||||
|
| sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
|
||||||
|
| sed -e 's/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile" "$tmpdepfile".bak
|
||||||
|
;;
|
||||||
|
|
||||||
|
cpp)
|
||||||
|
# Important note: in order to support this mode, a compiler *must*
|
||||||
|
# always write the preprocessed file to stdout.
|
||||||
|
"$@" || exit $?
|
||||||
|
|
||||||
|
# Remove the call to Libtool.
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
while test "X$1" != 'X--mode=compile'; do
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Remove '-o $object'.
|
||||||
|
IFS=" "
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case $arg in
|
||||||
|
-o)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
$object)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set fnord "$@" "$arg"
|
||||||
|
shift # fnord
|
||||||
|
shift # $arg
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
"$@" -E \
|
||||||
|
| sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
||||||
|
-e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
||||||
|
| sed '$ s: \\$::' > "$tmpdepfile"
|
||||||
|
rm -f "$depfile"
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
cat < "$tmpdepfile" >> "$depfile"
|
||||||
|
sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
msvisualcpp)
|
||||||
|
# Important note: in order to support this mode, a compiler *must*
|
||||||
|
# always write the preprocessed file to stdout.
|
||||||
|
"$@" || exit $?
|
||||||
|
|
||||||
|
# Remove the call to Libtool.
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
while test "X$1" != 'X--mode=compile'; do
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
|
IFS=" "
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
case "$arg" in
|
||||||
|
-o)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
$object)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
|
||||||
|
set fnord "$@"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
set fnord "$@" "$arg"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
"$@" -E 2>/dev/null |
|
||||||
|
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
|
||||||
|
rm -f "$depfile"
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
|
||||||
|
echo "$tab" >> "$depfile"
|
||||||
|
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
msvcmsys)
|
||||||
|
# This case exists only to let depend.m4 do its work. It works by
|
||||||
|
# looking at the text of this script. This case will never be run,
|
||||||
|
# since it is checked for above.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
none)
|
||||||
|
exec "$@"
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "Unknown depmode $depmode" 1>&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
|
||||||
|
# Local Variables:
|
||||||
|
# mode: shell-script
|
||||||
|
# sh-indentation: 2
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
501
libltdl/config/install-sh
Executable file
501
libltdl/config/install-sh
Executable file
|
@ -0,0 +1,501 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# install - install a program, script, or datafile
|
||||||
|
|
||||||
|
scriptversion=2013-12-25.23; # UTC
|
||||||
|
|
||||||
|
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
||||||
|
# later released in X11R6 (xc/config/util/install.sh) with the
|
||||||
|
# following copyright and license.
|
||||||
|
#
|
||||||
|
# Copyright (C) 1994 X Consortium
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
# of this software and associated documentation files (the "Software"), to
|
||||||
|
# deal in the Software without restriction, including without limitation the
|
||||||
|
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
# sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
# furnished to do so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice shall be included in
|
||||||
|
# all copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||||
|
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
|
||||||
|
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
#
|
||||||
|
# Except as contained in this notice, the name of the X Consortium shall not
|
||||||
|
# be used in advertising or otherwise to promote the sale, use or other deal-
|
||||||
|
# ings in this Software without prior written authorization from the X Consor-
|
||||||
|
# tium.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# FSF changes to this file are in the public domain.
|
||||||
|
#
|
||||||
|
# Calling this script install-sh is preferred over install.sh, to prevent
|
||||||
|
# 'make' implicit rules from creating a file called install from it
|
||||||
|
# when there is no Makefile.
|
||||||
|
#
|
||||||
|
# This script is compatible with the BSD install script, but was written
|
||||||
|
# from scratch.
|
||||||
|
|
||||||
|
tab=' '
|
||||||
|
nl='
|
||||||
|
'
|
||||||
|
IFS=" $tab$nl"
|
||||||
|
|
||||||
|
# Set DOITPROG to "echo" to test this script.
|
||||||
|
|
||||||
|
doit=${DOITPROG-}
|
||||||
|
doit_exec=${doit:-exec}
|
||||||
|
|
||||||
|
# Put in absolute file names if you don't have them in your path;
|
||||||
|
# or use environment vars.
|
||||||
|
|
||||||
|
chgrpprog=${CHGRPPROG-chgrp}
|
||||||
|
chmodprog=${CHMODPROG-chmod}
|
||||||
|
chownprog=${CHOWNPROG-chown}
|
||||||
|
cmpprog=${CMPPROG-cmp}
|
||||||
|
cpprog=${CPPROG-cp}
|
||||||
|
mkdirprog=${MKDIRPROG-mkdir}
|
||||||
|
mvprog=${MVPROG-mv}
|
||||||
|
rmprog=${RMPROG-rm}
|
||||||
|
stripprog=${STRIPPROG-strip}
|
||||||
|
|
||||||
|
posix_mkdir=
|
||||||
|
|
||||||
|
# Desired mode of installed file.
|
||||||
|
mode=0755
|
||||||
|
|
||||||
|
chgrpcmd=
|
||||||
|
chmodcmd=$chmodprog
|
||||||
|
chowncmd=
|
||||||
|
mvcmd=$mvprog
|
||||||
|
rmcmd="$rmprog -f"
|
||||||
|
stripcmd=
|
||||||
|
|
||||||
|
src=
|
||||||
|
dst=
|
||||||
|
dir_arg=
|
||||||
|
dst_arg=
|
||||||
|
|
||||||
|
copy_on_change=false
|
||||||
|
is_target_a_directory=possibly
|
||||||
|
|
||||||
|
usage="\
|
||||||
|
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
||||||
|
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
||||||
|
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
||||||
|
or: $0 [OPTION]... -d DIRECTORIES...
|
||||||
|
|
||||||
|
In the 1st form, copy SRCFILE to DSTFILE.
|
||||||
|
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
||||||
|
In the 4th, create DIRECTORIES.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--help display this help and exit.
|
||||||
|
--version display version info and exit.
|
||||||
|
|
||||||
|
-c (ignored)
|
||||||
|
-C install only if different (preserve the last data modification time)
|
||||||
|
-d create directories instead of installing files.
|
||||||
|
-g GROUP $chgrpprog installed files to GROUP.
|
||||||
|
-m MODE $chmodprog installed files to MODE.
|
||||||
|
-o USER $chownprog installed files to USER.
|
||||||
|
-s $stripprog installed files.
|
||||||
|
-t DIRECTORY install into DIRECTORY.
|
||||||
|
-T report an error if DSTFILE is a directory.
|
||||||
|
|
||||||
|
Environment variables override the default commands:
|
||||||
|
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
|
||||||
|
RMPROG STRIPPROG
|
||||||
|
"
|
||||||
|
|
||||||
|
while test $# -ne 0; do
|
||||||
|
case $1 in
|
||||||
|
-c) ;;
|
||||||
|
|
||||||
|
-C) copy_on_change=true;;
|
||||||
|
|
||||||
|
-d) dir_arg=true;;
|
||||||
|
|
||||||
|
-g) chgrpcmd="$chgrpprog $2"
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
--help) echo "$usage"; exit $?;;
|
||||||
|
|
||||||
|
-m) mode=$2
|
||||||
|
case $mode in
|
||||||
|
*' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
|
||||||
|
echo "$0: invalid mode: $mode" >&2
|
||||||
|
exit 1;;
|
||||||
|
esac
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-o) chowncmd="$chownprog $2"
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-s) stripcmd=$stripprog;;
|
||||||
|
|
||||||
|
-t)
|
||||||
|
is_target_a_directory=always
|
||||||
|
dst_arg=$2
|
||||||
|
# Protect names problematic for 'test' and other utilities.
|
||||||
|
case $dst_arg in
|
||||||
|
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
||||||
|
esac
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-T) is_target_a_directory=never;;
|
||||||
|
|
||||||
|
--version) echo "$0 $scriptversion"; exit $?;;
|
||||||
|
|
||||||
|
--) shift
|
||||||
|
break;;
|
||||||
|
|
||||||
|
-*) echo "$0: invalid option: $1" >&2
|
||||||
|
exit 1;;
|
||||||
|
|
||||||
|
*) break;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
# We allow the use of options -d and -T together, by making -d
|
||||||
|
# take the precedence; this is for compatibility with GNU install.
|
||||||
|
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
if test -n "$dst_arg"; then
|
||||||
|
echo "$0: target directory not allowed when installing a directory." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
|
||||||
|
# When -d is used, all remaining arguments are directories to create.
|
||||||
|
# When -t is used, the destination is already specified.
|
||||||
|
# Otherwise, the last argument is the destination. Remove it from $@.
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
if test -n "$dst_arg"; then
|
||||||
|
# $@ is not empty: it contains at least $arg.
|
||||||
|
set fnord "$@" "$dst_arg"
|
||||||
|
shift # fnord
|
||||||
|
fi
|
||||||
|
shift # arg
|
||||||
|
dst_arg=$arg
|
||||||
|
# Protect names problematic for 'test' and other utilities.
|
||||||
|
case $dst_arg in
|
||||||
|
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $# -eq 0; then
|
||||||
|
if test -z "$dir_arg"; then
|
||||||
|
echo "$0: no input file specified." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
# It's OK to call 'install-sh -d' without argument.
|
||||||
|
# This can happen when creating conditional directories.
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$dir_arg"; then
|
||||||
|
if test $# -gt 1 || test "$is_target_a_directory" = always; then
|
||||||
|
if test ! -d "$dst_arg"; then
|
||||||
|
echo "$0: $dst_arg: Is not a directory." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$dir_arg"; then
|
||||||
|
do_exit='(exit $ret); exit $ret'
|
||||||
|
trap "ret=129; $do_exit" 1
|
||||||
|
trap "ret=130; $do_exit" 2
|
||||||
|
trap "ret=141; $do_exit" 13
|
||||||
|
trap "ret=143; $do_exit" 15
|
||||||
|
|
||||||
|
# Set umask so as not to create temps with too-generous modes.
|
||||||
|
# However, 'strip' requires both read and write access to temps.
|
||||||
|
case $mode in
|
||||||
|
# Optimize common cases.
|
||||||
|
*644) cp_umask=133;;
|
||||||
|
*755) cp_umask=22;;
|
||||||
|
|
||||||
|
*[0-7])
|
||||||
|
if test -z "$stripcmd"; then
|
||||||
|
u_plus_rw=
|
||||||
|
else
|
||||||
|
u_plus_rw='% 200'
|
||||||
|
fi
|
||||||
|
cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
|
||||||
|
*)
|
||||||
|
if test -z "$stripcmd"; then
|
||||||
|
u_plus_rw=
|
||||||
|
else
|
||||||
|
u_plus_rw=,u+rw
|
||||||
|
fi
|
||||||
|
cp_umask=$mode$u_plus_rw;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
for src
|
||||||
|
do
|
||||||
|
# Protect names problematic for 'test' and other utilities.
|
||||||
|
case $src in
|
||||||
|
-* | [=\(\)!]) src=./$src;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
dst=$src
|
||||||
|
dstdir=$dst
|
||||||
|
test -d "$dstdir"
|
||||||
|
dstdir_status=$?
|
||||||
|
else
|
||||||
|
|
||||||
|
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
||||||
|
# might cause directories to be created, which would be especially bad
|
||||||
|
# if $src (and thus $dsttmp) contains '*'.
|
||||||
|
if test ! -f "$src" && test ! -d "$src"; then
|
||||||
|
echo "$0: $src does not exist." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$dst_arg"; then
|
||||||
|
echo "$0: no destination specified." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
dst=$dst_arg
|
||||||
|
|
||||||
|
# If destination is a directory, append the input filename; won't work
|
||||||
|
# if double slashes aren't ignored.
|
||||||
|
if test -d "$dst"; then
|
||||||
|
if test "$is_target_a_directory" = never; then
|
||||||
|
echo "$0: $dst_arg: Is a directory" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
dstdir=$dst
|
||||||
|
dst=$dstdir/`basename "$src"`
|
||||||
|
dstdir_status=0
|
||||||
|
else
|
||||||
|
dstdir=`dirname "$dst"`
|
||||||
|
test -d "$dstdir"
|
||||||
|
dstdir_status=$?
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
obsolete_mkdir_used=false
|
||||||
|
|
||||||
|
if test $dstdir_status != 0; then
|
||||||
|
case $posix_mkdir in
|
||||||
|
'')
|
||||||
|
# Create intermediate dirs using mode 755 as modified by the umask.
|
||||||
|
# This is like FreeBSD 'install' as of 1997-10-28.
|
||||||
|
umask=`umask`
|
||||||
|
case $stripcmd.$umask in
|
||||||
|
# Optimize common cases.
|
||||||
|
*[2367][2367]) mkdir_umask=$umask;;
|
||||||
|
.*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
|
||||||
|
|
||||||
|
*[0-7])
|
||||||
|
mkdir_umask=`expr $umask + 22 \
|
||||||
|
- $umask % 100 % 40 + $umask % 20 \
|
||||||
|
- $umask % 10 % 4 + $umask % 2
|
||||||
|
`;;
|
||||||
|
*) mkdir_umask=$umask,go-w;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# With -d, create the new directory with the user-specified mode.
|
||||||
|
# Otherwise, rely on $mkdir_umask.
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
mkdir_mode=-m$mode
|
||||||
|
else
|
||||||
|
mkdir_mode=
|
||||||
|
fi
|
||||||
|
|
||||||
|
posix_mkdir=false
|
||||||
|
case $umask in
|
||||||
|
*[123567][0-7][0-7])
|
||||||
|
# POSIX mkdir -p sets u+wx bits regardless of umask, which
|
||||||
|
# is incompatible with FreeBSD 'install' when (umask & 300) != 0.
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
|
||||||
|
trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
|
||||||
|
|
||||||
|
if (umask $mkdir_umask &&
|
||||||
|
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
if test -z "$dir_arg" || {
|
||||||
|
# Check for POSIX incompatibilities with -m.
|
||||||
|
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
|
||||||
|
# other-writable bit of parent directory when it shouldn't.
|
||||||
|
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
|
||||||
|
ls_ld_tmpdir=`ls -ld "$tmpdir"`
|
||||||
|
case $ls_ld_tmpdir in
|
||||||
|
d????-?r-*) different_mode=700;;
|
||||||
|
d????-?--*) different_mode=755;;
|
||||||
|
*) false;;
|
||||||
|
esac &&
|
||||||
|
$mkdirprog -m$different_mode -p -- "$tmpdir" && {
|
||||||
|
ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
|
||||||
|
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
then posix_mkdir=:
|
||||||
|
fi
|
||||||
|
rmdir "$tmpdir/d" "$tmpdir"
|
||||||
|
else
|
||||||
|
# Remove any dirs left behind by ancient mkdir implementations.
|
||||||
|
rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
|
||||||
|
fi
|
||||||
|
trap '' 0;;
|
||||||
|
esac;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if
|
||||||
|
$posix_mkdir && (
|
||||||
|
umask $mkdir_umask &&
|
||||||
|
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
|
||||||
|
)
|
||||||
|
then :
|
||||||
|
else
|
||||||
|
|
||||||
|
# The umask is ridiculous, or mkdir does not conform to POSIX,
|
||||||
|
# or it failed possibly due to a race condition. Create the
|
||||||
|
# directory the slow way, step by step, checking for races as we go.
|
||||||
|
|
||||||
|
case $dstdir in
|
||||||
|
/*) prefix='/';;
|
||||||
|
[-=\(\)!]*) prefix='./';;
|
||||||
|
*) prefix='';;
|
||||||
|
esac
|
||||||
|
|
||||||
|
oIFS=$IFS
|
||||||
|
IFS=/
|
||||||
|
set -f
|
||||||
|
set fnord $dstdir
|
||||||
|
shift
|
||||||
|
set +f
|
||||||
|
IFS=$oIFS
|
||||||
|
|
||||||
|
prefixes=
|
||||||
|
|
||||||
|
for d
|
||||||
|
do
|
||||||
|
test X"$d" = X && continue
|
||||||
|
|
||||||
|
prefix=$prefix$d
|
||||||
|
if test -d "$prefix"; then
|
||||||
|
prefixes=
|
||||||
|
else
|
||||||
|
if $posix_mkdir; then
|
||||||
|
(umask=$mkdir_umask &&
|
||||||
|
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
|
||||||
|
# Don't fail if two instances are running concurrently.
|
||||||
|
test -d "$prefix" || exit 1
|
||||||
|
else
|
||||||
|
case $prefix in
|
||||||
|
*\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
|
||||||
|
*) qprefix=$prefix;;
|
||||||
|
esac
|
||||||
|
prefixes="$prefixes '$qprefix'"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
prefix=$prefix/
|
||||||
|
done
|
||||||
|
|
||||||
|
if test -n "$prefixes"; then
|
||||||
|
# Don't fail if two instances are running concurrently.
|
||||||
|
(umask $mkdir_umask &&
|
||||||
|
eval "\$doit_exec \$mkdirprog $prefixes") ||
|
||||||
|
test -d "$dstdir" || exit 1
|
||||||
|
obsolete_mkdir_used=true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
{ test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
|
||||||
|
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
|
||||||
|
{ test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
|
||||||
|
test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
|
||||||
|
else
|
||||||
|
|
||||||
|
# Make a couple of temp file names in the proper directory.
|
||||||
|
dsttmp=$dstdir/_inst.$$_
|
||||||
|
rmtmp=$dstdir/_rm.$$_
|
||||||
|
|
||||||
|
# Trap to clean up those temp files at exit.
|
||||||
|
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
||||||
|
|
||||||
|
# Copy the file name to the temp name.
|
||||||
|
(umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
|
||||||
|
|
||||||
|
# and set any options; do chmod last to preserve setuid bits.
|
||||||
|
#
|
||||||
|
# If any of these fail, we abort the whole thing. If we want to
|
||||||
|
# ignore errors from any of these, just make sure not to ignore
|
||||||
|
# errors from the above "$doit $cpprog $src $dsttmp" command.
|
||||||
|
#
|
||||||
|
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
|
||||||
|
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
|
||||||
|
{ test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
|
||||||
|
{ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
|
||||||
|
|
||||||
|
# If -C, don't bother to copy if it wouldn't change the file.
|
||||||
|
if $copy_on_change &&
|
||||||
|
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
|
||||||
|
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
|
||||||
|
set -f &&
|
||||||
|
set X $old && old=:$2:$4:$5:$6 &&
|
||||||
|
set X $new && new=:$2:$4:$5:$6 &&
|
||||||
|
set +f &&
|
||||||
|
test "$old" = "$new" &&
|
||||||
|
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
rm -f "$dsttmp"
|
||||||
|
else
|
||||||
|
# Rename the file to the real destination.
|
||||||
|
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
|
||||||
|
|
||||||
|
# The rename failed, perhaps because mv can't rename something else
|
||||||
|
# to itself, or perhaps because mv is so ancient that it does not
|
||||||
|
# support -f.
|
||||||
|
{
|
||||||
|
# Now remove or move aside any old file at destination location.
|
||||||
|
# We try this two ways since rm can't unlink itself on some
|
||||||
|
# systems and the destination file might be busy for other
|
||||||
|
# reasons. In this case, the final cleanup might fail but the new
|
||||||
|
# file should still install successfully.
|
||||||
|
{
|
||||||
|
test ! -f "$dst" ||
|
||||||
|
$doit $rmcmd -f "$dst" 2>/dev/null ||
|
||||||
|
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
|
||||||
|
{ $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
|
||||||
|
} ||
|
||||||
|
{ echo "$0: cannot unlink or rename $dst" >&2
|
||||||
|
(exit 1); exit 1
|
||||||
|
}
|
||||||
|
} &&
|
||||||
|
|
||||||
|
# Now rename the file to the real destination.
|
||||||
|
$doit $mvcmd "$dsttmp" "$dst"
|
||||||
|
}
|
||||||
|
fi || exit 1
|
||||||
|
|
||||||
|
trap '' 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Local variables:
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
9661
libltdl/config/ltmain.sh
Normal file
9661
libltdl/config/ltmain.sh
Normal file
File diff suppressed because it is too large
Load diff
215
libltdl/config/missing
Executable file
215
libltdl/config/missing
Executable file
|
@ -0,0 +1,215 @@
|
||||||
|
#! /bin/sh
|
||||||
|
# Common wrapper for a few potentially missing GNU programs.
|
||||||
|
|
||||||
|
scriptversion=2013-10-28.13; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 1996-2014 Free Software Foundation, Inc.
|
||||||
|
# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
|
||||||
|
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you
|
||||||
|
# distribute this file as part of a program that contains a
|
||||||
|
# configuration script generated by Autoconf, you may include it under
|
||||||
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
if test $# -eq 0; then
|
||||||
|
echo 1>&2 "Try '$0 --help' for more information"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
|
||||||
|
--is-lightweight)
|
||||||
|
# Used by our autoconf macros to check whether the available missing
|
||||||
|
# script is modern enough.
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
|
||||||
|
--run)
|
||||||
|
# Back-compat with the calling convention used by older automake.
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
|
||||||
|
-h|--h|--he|--hel|--help)
|
||||||
|
echo "\
|
||||||
|
$0 [OPTION]... PROGRAM [ARGUMENT]...
|
||||||
|
|
||||||
|
Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
|
||||||
|
to PROGRAM being missing or too old.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-h, --help display this help and exit
|
||||||
|
-v, --version output version information and exit
|
||||||
|
|
||||||
|
Supported PROGRAM values:
|
||||||
|
aclocal autoconf autoheader autom4te automake makeinfo
|
||||||
|
bison yacc flex lex help2man
|
||||||
|
|
||||||
|
Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
|
||||||
|
'g' are ignored when checking the name.
|
||||||
|
|
||||||
|
Send bug reports to <bug-automake@gnu.org>."
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
|
||||||
|
-v|--v|--ve|--ver|--vers|--versi|--versio|--version)
|
||||||
|
echo "missing $scriptversion (GNU Automake)"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
|
||||||
|
-*)
|
||||||
|
echo 1>&2 "$0: unknown '$1' option"
|
||||||
|
echo 1>&2 "Try '$0 --help' for more information"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Run the given program, remember its exit status.
|
||||||
|
"$@"; st=$?
|
||||||
|
|
||||||
|
# If it succeeded, we are done.
|
||||||
|
test $st -eq 0 && exit 0
|
||||||
|
|
||||||
|
# Also exit now if we it failed (or wasn't found), and '--version' was
|
||||||
|
# passed; such an option is passed most likely to detect whether the
|
||||||
|
# program is present and works.
|
||||||
|
case $2 in --version|--help) exit $st;; esac
|
||||||
|
|
||||||
|
# Exit code 63 means version mismatch. This often happens when the user
|
||||||
|
# tries to use an ancient version of a tool on a file that requires a
|
||||||
|
# minimum version.
|
||||||
|
if test $st -eq 63; then
|
||||||
|
msg="probably too old"
|
||||||
|
elif test $st -eq 127; then
|
||||||
|
# Program was missing.
|
||||||
|
msg="missing on your system"
|
||||||
|
else
|
||||||
|
# Program was found and executed, but failed. Give up.
|
||||||
|
exit $st
|
||||||
|
fi
|
||||||
|
|
||||||
|
perl_URL=http://www.perl.org/
|
||||||
|
flex_URL=http://flex.sourceforge.net/
|
||||||
|
gnu_software_URL=http://www.gnu.org/software
|
||||||
|
|
||||||
|
program_details ()
|
||||||
|
{
|
||||||
|
case $1 in
|
||||||
|
aclocal|automake)
|
||||||
|
echo "The '$1' program is part of the GNU Automake package:"
|
||||||
|
echo "<$gnu_software_URL/automake>"
|
||||||
|
echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
|
||||||
|
echo "<$gnu_software_URL/autoconf>"
|
||||||
|
echo "<$gnu_software_URL/m4/>"
|
||||||
|
echo "<$perl_URL>"
|
||||||
|
;;
|
||||||
|
autoconf|autom4te|autoheader)
|
||||||
|
echo "The '$1' program is part of the GNU Autoconf package:"
|
||||||
|
echo "<$gnu_software_URL/autoconf/>"
|
||||||
|
echo "It also requires GNU m4 and Perl in order to run:"
|
||||||
|
echo "<$gnu_software_URL/m4/>"
|
||||||
|
echo "<$perl_URL>"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
give_advice ()
|
||||||
|
{
|
||||||
|
# Normalize program name to check for.
|
||||||
|
normalized_program=`echo "$1" | sed '
|
||||||
|
s/^gnu-//; t
|
||||||
|
s/^gnu//; t
|
||||||
|
s/^g//; t'`
|
||||||
|
|
||||||
|
printf '%s\n' "'$1' is $msg."
|
||||||
|
|
||||||
|
configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
|
||||||
|
case $normalized_program in
|
||||||
|
autoconf*)
|
||||||
|
echo "You should only need it if you modified 'configure.ac',"
|
||||||
|
echo "or m4 files included by it."
|
||||||
|
program_details 'autoconf'
|
||||||
|
;;
|
||||||
|
autoheader*)
|
||||||
|
echo "You should only need it if you modified 'acconfig.h' or"
|
||||||
|
echo "$configure_deps."
|
||||||
|
program_details 'autoheader'
|
||||||
|
;;
|
||||||
|
automake*)
|
||||||
|
echo "You should only need it if you modified 'Makefile.am' or"
|
||||||
|
echo "$configure_deps."
|
||||||
|
program_details 'automake'
|
||||||
|
;;
|
||||||
|
aclocal*)
|
||||||
|
echo "You should only need it if you modified 'acinclude.m4' or"
|
||||||
|
echo "$configure_deps."
|
||||||
|
program_details 'aclocal'
|
||||||
|
;;
|
||||||
|
autom4te*)
|
||||||
|
echo "You might have modified some maintainer files that require"
|
||||||
|
echo "the 'autom4te' program to be rebuilt."
|
||||||
|
program_details 'autom4te'
|
||||||
|
;;
|
||||||
|
bison*|yacc*)
|
||||||
|
echo "You should only need it if you modified a '.y' file."
|
||||||
|
echo "You may want to install the GNU Bison package:"
|
||||||
|
echo "<$gnu_software_URL/bison/>"
|
||||||
|
;;
|
||||||
|
lex*|flex*)
|
||||||
|
echo "You should only need it if you modified a '.l' file."
|
||||||
|
echo "You may want to install the Fast Lexical Analyzer package:"
|
||||||
|
echo "<$flex_URL>"
|
||||||
|
;;
|
||||||
|
help2man*)
|
||||||
|
echo "You should only need it if you modified a dependency" \
|
||||||
|
"of a man page."
|
||||||
|
echo "You may want to install the GNU Help2man package:"
|
||||||
|
echo "<$gnu_software_URL/help2man/>"
|
||||||
|
;;
|
||||||
|
makeinfo*)
|
||||||
|
echo "You should only need it if you modified a '.texi' file, or"
|
||||||
|
echo "any other file indirectly affecting the aspect of the manual."
|
||||||
|
echo "You might want to install the Texinfo package:"
|
||||||
|
echo "<$gnu_software_URL/texinfo/>"
|
||||||
|
echo "The spurious makeinfo call might also be the consequence of"
|
||||||
|
echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
|
||||||
|
echo "want to install GNU make:"
|
||||||
|
echo "<$gnu_software_URL/make/>"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "You might have modified some files without having the proper"
|
||||||
|
echo "tools for further handling them. Check the 'README' file, it"
|
||||||
|
echo "often tells you about the needed prerequisites for installing"
|
||||||
|
echo "this package. You may also peek at any GNU archive site, in"
|
||||||
|
echo "case some other package contains this missing '$1' program."
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
give_advice "$1" | sed -e '1s/^/WARNING: /' \
|
||||||
|
-e '2,$s/^/ /' >&2
|
||||||
|
|
||||||
|
# Propagate the correct exit status (expected to be 127 for a program
|
||||||
|
# not found, 63 for a program that failed due to version mismatch).
|
||||||
|
exit $st
|
||||||
|
|
||||||
|
# Local variables:
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
247
libltdl/config/ylwrap
Executable file
247
libltdl/config/ylwrap
Executable file
|
@ -0,0 +1,247 @@
|
||||||
|
#! /bin/sh
|
||||||
|
# ylwrap - wrapper for lex/yacc invocations.
|
||||||
|
|
||||||
|
scriptversion=2013-01-12.17; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 1996-2014 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# Written by Tom Tromey <tromey@cygnus.com>.
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you
|
||||||
|
# distribute this file as part of a program that contains a
|
||||||
|
# configuration script generated by Autoconf, you may include it under
|
||||||
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
# This file is maintained in Automake, please report
|
||||||
|
# bugs to <bug-automake@gnu.org> or send patches to
|
||||||
|
# <automake-patches@gnu.org>.
|
||||||
|
|
||||||
|
get_dirname ()
|
||||||
|
{
|
||||||
|
case $1 in
|
||||||
|
*/*|*\\*) printf '%s\n' "$1" | sed -e 's|\([\\/]\)[^\\/]*$|\1|';;
|
||||||
|
# Otherwise, we want the empty string (not ".").
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# guard FILE
|
||||||
|
# ----------
|
||||||
|
# The CPP macro used to guard inclusion of FILE.
|
||||||
|
guard ()
|
||||||
|
{
|
||||||
|
printf '%s\n' "$1" \
|
||||||
|
| sed \
|
||||||
|
-e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \
|
||||||
|
-e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g' \
|
||||||
|
-e 's/__*/_/g'
|
||||||
|
}
|
||||||
|
|
||||||
|
# quote_for_sed [STRING]
|
||||||
|
# ----------------------
|
||||||
|
# Return STRING (or stdin) quoted to be used as a sed pattern.
|
||||||
|
quote_for_sed ()
|
||||||
|
{
|
||||||
|
case $# in
|
||||||
|
0) cat;;
|
||||||
|
1) printf '%s\n' "$1";;
|
||||||
|
esac \
|
||||||
|
| sed -e 's|[][\\.*]|\\&|g'
|
||||||
|
}
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
'')
|
||||||
|
echo "$0: No files given. Try '$0 --help' for more information." 1>&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
--basedir)
|
||||||
|
basedir=$2
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-h|--h*)
|
||||||
|
cat <<\EOF
|
||||||
|
Usage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]...
|
||||||
|
|
||||||
|
Wrapper for lex/yacc invocations, renaming files as desired.
|
||||||
|
|
||||||
|
INPUT is the input file
|
||||||
|
OUTPUT is one file PROG generates
|
||||||
|
DESIRED is the file we actually want instead of OUTPUT
|
||||||
|
PROGRAM is program to run
|
||||||
|
ARGS are passed to PROG
|
||||||
|
|
||||||
|
Any number of OUTPUT,DESIRED pairs may be used.
|
||||||
|
|
||||||
|
Report bugs to <bug-automake@gnu.org>.
|
||||||
|
EOF
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
-v|--v*)
|
||||||
|
echo "ylwrap $scriptversion"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
# The input.
|
||||||
|
input=$1
|
||||||
|
shift
|
||||||
|
# We'll later need for a correct munging of "#line" directives.
|
||||||
|
input_sub_rx=`get_dirname "$input" | quote_for_sed`
|
||||||
|
case $input in
|
||||||
|
[\\/]* | ?:[\\/]*)
|
||||||
|
# Absolute path; do nothing.
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# Relative path. Make it absolute.
|
||||||
|
input=`pwd`/$input
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
input_rx=`get_dirname "$input" | quote_for_sed`
|
||||||
|
|
||||||
|
# Since DOS filename conventions don't allow two dots,
|
||||||
|
# the DOS version of Bison writes out y_tab.c instead of y.tab.c
|
||||||
|
# and y_tab.h instead of y.tab.h. Test to see if this is the case.
|
||||||
|
y_tab_nodot=false
|
||||||
|
if test -f y_tab.c || test -f y_tab.h; then
|
||||||
|
y_tab_nodot=true
|
||||||
|
fi
|
||||||
|
|
||||||
|
# The parser itself, the first file, is the destination of the .y.c
|
||||||
|
# rule in the Makefile.
|
||||||
|
parser=$1
|
||||||
|
|
||||||
|
# A sed program to s/FROM/TO/g for all the FROM/TO so that, for
|
||||||
|
# instance, we rename #include "y.tab.h" into #include "parse.h"
|
||||||
|
# during the conversion from y.tab.c to parse.c.
|
||||||
|
sed_fix_filenames=
|
||||||
|
|
||||||
|
# Also rename header guards, as Bison 2.7 for instance uses its header
|
||||||
|
# guard in its implementation file.
|
||||||
|
sed_fix_header_guards=
|
||||||
|
|
||||||
|
while test $# -ne 0; do
|
||||||
|
if test x"$1" = x"--"; then
|
||||||
|
shift
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
from=$1
|
||||||
|
# Handle y_tab.c and y_tab.h output by DOS
|
||||||
|
if $y_tab_nodot; then
|
||||||
|
case $from in
|
||||||
|
"y.tab.c") from=y_tab.c;;
|
||||||
|
"y.tab.h") from=y_tab.h;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
shift
|
||||||
|
to=$1
|
||||||
|
shift
|
||||||
|
sed_fix_filenames="${sed_fix_filenames}s|"`quote_for_sed "$from"`"|$to|g;"
|
||||||
|
sed_fix_header_guards="${sed_fix_header_guards}s|"`guard "$from"`"|"`guard "$to"`"|g;"
|
||||||
|
done
|
||||||
|
|
||||||
|
# The program to run.
|
||||||
|
prog=$1
|
||||||
|
shift
|
||||||
|
# Make any relative path in $prog absolute.
|
||||||
|
case $prog in
|
||||||
|
[\\/]* | ?:[\\/]*) ;;
|
||||||
|
*[\\/]*) prog=`pwd`/$prog ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
dirname=ylwrap$$
|
||||||
|
do_exit="cd '`pwd`' && rm -rf $dirname > /dev/null 2>&1;"' (exit $ret); exit $ret'
|
||||||
|
trap "ret=129; $do_exit" 1
|
||||||
|
trap "ret=130; $do_exit" 2
|
||||||
|
trap "ret=141; $do_exit" 13
|
||||||
|
trap "ret=143; $do_exit" 15
|
||||||
|
mkdir $dirname || exit 1
|
||||||
|
|
||||||
|
cd $dirname
|
||||||
|
|
||||||
|
case $# in
|
||||||
|
0) "$prog" "$input" ;;
|
||||||
|
*) "$prog" "$@" "$input" ;;
|
||||||
|
esac
|
||||||
|
ret=$?
|
||||||
|
|
||||||
|
if test $ret -eq 0; then
|
||||||
|
for from in *
|
||||||
|
do
|
||||||
|
to=`printf '%s\n' "$from" | sed "$sed_fix_filenames"`
|
||||||
|
if test -f "$from"; then
|
||||||
|
# If $2 is an absolute path name, then just use that,
|
||||||
|
# otherwise prepend '../'.
|
||||||
|
case $to in
|
||||||
|
[\\/]* | ?:[\\/]*) target=$to;;
|
||||||
|
*) target=../$to;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Do not overwrite unchanged header files to avoid useless
|
||||||
|
# recompilations. Always update the parser itself: it is the
|
||||||
|
# destination of the .y.c rule in the Makefile. Divert the
|
||||||
|
# output of all other files to a temporary file so we can
|
||||||
|
# compare them to existing versions.
|
||||||
|
if test $from != $parser; then
|
||||||
|
realtarget=$target
|
||||||
|
target=tmp-`printf '%s\n' "$target" | sed 's|.*[\\/]||g'`
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Munge "#line" or "#" directives. Don't let the resulting
|
||||||
|
# debug information point at an absolute srcdir. Use the real
|
||||||
|
# output file name, not yy.lex.c for instance. Adjust the
|
||||||
|
# include guards too.
|
||||||
|
sed -e "/^#/!b" \
|
||||||
|
-e "s|$input_rx|$input_sub_rx|" \
|
||||||
|
-e "$sed_fix_filenames" \
|
||||||
|
-e "$sed_fix_header_guards" \
|
||||||
|
"$from" >"$target" || ret=$?
|
||||||
|
|
||||||
|
# Check whether files must be updated.
|
||||||
|
if test "$from" != "$parser"; then
|
||||||
|
if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then
|
||||||
|
echo "$to is unchanged"
|
||||||
|
rm -f "$target"
|
||||||
|
else
|
||||||
|
echo "updating $to"
|
||||||
|
mv -f "$target" "$realtarget"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# A missing file is only an error for the parser. This is a
|
||||||
|
# blatant hack to let us support using "yacc -d". If -d is not
|
||||||
|
# specified, don't fail when the header file is "missing".
|
||||||
|
if test "$from" = "$parser"; then
|
||||||
|
ret=1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Remove the directory.
|
||||||
|
cd ..
|
||||||
|
rm -rf $dirname
|
||||||
|
|
||||||
|
exit $ret
|
||||||
|
|
||||||
|
# Local Variables:
|
||||||
|
# mode: shell-script
|
||||||
|
# sh-indentation: 2
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
15077
libltdl/configure
vendored
Executable file
15077
libltdl/configure
vendored
Executable file
File diff suppressed because it is too large
Load diff
75
libltdl/configure.ac
Normal file
75
libltdl/configure.ac
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
# Process this file with autoconf to create configure. -*- autoconf -*-
|
||||||
|
#
|
||||||
|
# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
|
||||||
|
# Written by Gary V. Vaughan, 2004
|
||||||
|
#
|
||||||
|
# NOTE: The canonical source of this file is maintained with the
|
||||||
|
# GNU Libtool package. Report bugs to bug-libtool@gnu.org.
|
||||||
|
#
|
||||||
|
# GNU Libltdl is free software; you can redistribute it and/or
|
||||||
|
# modify it under the terms of the GNU Lesser General Public
|
||||||
|
# License as published by the Free Software Foundation; either
|
||||||
|
# version 2 of the License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# 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 this file under the
|
||||||
|
# same distribution terms that you use for the rest of that program.
|
||||||
|
#
|
||||||
|
# GNU Libltdl is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Lesser General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU LesserGeneral Public
|
||||||
|
# License along with GNU Libltdl; see the file COPYING.LIB. If not, a
|
||||||
|
# copy can be downloaded from http://www.gnu.org/licenses/lgpl.html,
|
||||||
|
# or obtained by writing to the Free Software Foundation, Inc.,
|
||||||
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
####
|
||||||
|
|
||||||
|
# This configure.ac is not used at all by the libtool bootstrap, but
|
||||||
|
# is copied to the ltdl subdirectory if you libtoolize --ltdl your own
|
||||||
|
# project. Adding LT_WITH_LTDL to your project configure.ac will then
|
||||||
|
# configure this directory if your user doesn't want to use the installed
|
||||||
|
# libltdl.
|
||||||
|
|
||||||
|
AC_PREREQ(2.59)dnl We use AS_HELP_STRING
|
||||||
|
|
||||||
|
|
||||||
|
## ------------------------ ##
|
||||||
|
## Autoconf initialisation. ##
|
||||||
|
## ------------------------ ##
|
||||||
|
AC_INIT([libltdl], [2.4.2], [bug-libtool@gnu.org])
|
||||||
|
AC_CONFIG_HEADERS([config.h:config-h.in])
|
||||||
|
AC_CONFIG_SRCDIR([ltdl.c])
|
||||||
|
AC_CONFIG_AUX_DIR([config])
|
||||||
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
|
LT_CONFIG_LTDL_DIR([.]) # I am me!
|
||||||
|
|
||||||
|
|
||||||
|
## ------------------------ ##
|
||||||
|
## Automake Initialisation. ##
|
||||||
|
## ------------------------ ##
|
||||||
|
|
||||||
|
AM_INIT_AUTOMAKE([gnu])
|
||||||
|
|
||||||
|
|
||||||
|
## ------------------------------- ##
|
||||||
|
## Libtool specific configuration. ##
|
||||||
|
## ------------------------------- ##
|
||||||
|
pkgdatadir='${datadir}'"/${PACKAGE}"
|
||||||
|
|
||||||
|
|
||||||
|
## ----------------------- ##
|
||||||
|
## Libtool initialisation. ##
|
||||||
|
## ----------------------- ##
|
||||||
|
LT_INIT([dlopen win32-dll])
|
||||||
|
_LTDL_SETUP
|
||||||
|
|
||||||
|
|
||||||
|
## -------- ##
|
||||||
|
## Outputs. ##
|
||||||
|
## -------- ##
|
||||||
|
AC_CONFIG_FILES([Makefile])
|
||||||
|
AC_OUTPUT
|
58
libltdl/libltdl/lt__alloc.h
Normal file
58
libltdl/libltdl/lt__alloc.h
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
/* lt__alloc.h -- internal memory management interface
|
||||||
|
|
||||||
|
Copyright (C) 2004 Free Software Foundation, Inc.
|
||||||
|
Written by Gary V. Vaughan, 2004
|
||||||
|
|
||||||
|
NOTE: The canonical source of this file is maintained with the
|
||||||
|
GNU Libtool package. Report bugs to bug-libtool@gnu.org.
|
||||||
|
|
||||||
|
GNU Libltdl is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
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 this file under the
|
||||||
|
same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
GNU Libltdl is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with GNU Libltdl; see the file COPYING.LIB. If not, a
|
||||||
|
copy can be downloaded from http://www.gnu.org/licenses/lgpl.html,
|
||||||
|
or obtained by writing to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(LT__ALLOC_H)
|
||||||
|
#define LT__ALLOC_H 1
|
||||||
|
|
||||||
|
#include "lt_system.h"
|
||||||
|
|
||||||
|
LT_BEGIN_C_DECLS
|
||||||
|
|
||||||
|
#define MALLOC(tp, n) (tp*) lt__malloc((n) * sizeof(tp))
|
||||||
|
#define REALLOC(tp, mem, n) (tp*) lt__realloc((mem), (n) * sizeof(tp))
|
||||||
|
#define FREE(mem) LT_STMT_START { \
|
||||||
|
if (mem) { free ((void *)mem); mem = NULL; } } LT_STMT_END
|
||||||
|
#define MEMREASSIGN(p, q) LT_STMT_START { \
|
||||||
|
if ((p) != (q)) { if (p) free (p); (p) = (q); (q) = 0; } \
|
||||||
|
} LT_STMT_END
|
||||||
|
|
||||||
|
/* If set, this function is called when memory allocation has failed. */
|
||||||
|
LT_SCOPE void (*lt__alloc_die) (void);
|
||||||
|
|
||||||
|
LT_SCOPE void *lt__malloc (size_t n);
|
||||||
|
LT_SCOPE void *lt__zalloc (size_t n);
|
||||||
|
LT_SCOPE void *lt__realloc (void *mem, size_t n);
|
||||||
|
LT_SCOPE void *lt__memdup (void const *mem, size_t n);
|
||||||
|
|
||||||
|
LT_SCOPE char *lt__strdup (const char *string);
|
||||||
|
|
||||||
|
LT_END_C_DECLS
|
||||||
|
|
||||||
|
#endif /*!defined(LT__ALLOC_H)*/
|
87
libltdl/libltdl/lt__dirent.h
Normal file
87
libltdl/libltdl/lt__dirent.h
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
/* lt__dirent.h -- internal directory entry scanning interface
|
||||||
|
|
||||||
|
Copyright (C) 2001, 2004, 2006 Free Software Foundation, Inc.
|
||||||
|
Written by Bob Friesenhahn, 2001
|
||||||
|
|
||||||
|
NOTE: The canonical source of this file is maintained with the
|
||||||
|
GNU Libtool package. Report bugs to bug-libtool@gnu.org.
|
||||||
|
|
||||||
|
GNU Libltdl is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
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 this file under the
|
||||||
|
same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
GNU Libltdl is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with GNU Libltdl; see the file COPYING.LIB. If not, a
|
||||||
|
copy can be downloaded from http://www.gnu.org/licenses/lgpl.html,
|
||||||
|
or obtained by writing to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(LT__DIRENT_H)
|
||||||
|
#define LT__DIRENT_H 1
|
||||||
|
|
||||||
|
#if defined(LT_CONFIG_H)
|
||||||
|
# include LT_CONFIG_H
|
||||||
|
#else
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "lt_system.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_DIRENT_H
|
||||||
|
/* We have a fully operational dirent subsystem. */
|
||||||
|
# include <dirent.h>
|
||||||
|
# define D_NAMLEN(dirent) (strlen((dirent)->d_name))
|
||||||
|
|
||||||
|
#elif defined __WINDOWS__
|
||||||
|
/* Use some wrapper code to emulate dirent on windows.. */
|
||||||
|
# define WINDOWS_DIRENT_EMULATION 1
|
||||||
|
|
||||||
|
# include <windows.h>
|
||||||
|
|
||||||
|
# define D_NAMLEN(dirent) (strlen((dirent)->d_name))
|
||||||
|
# define dirent lt__dirent
|
||||||
|
# define DIR lt__DIR
|
||||||
|
# define opendir lt__opendir
|
||||||
|
# define readdir lt__readdir
|
||||||
|
# define closedir lt__closedir
|
||||||
|
|
||||||
|
LT_BEGIN_C_DECLS
|
||||||
|
|
||||||
|
struct dirent
|
||||||
|
{
|
||||||
|
char d_name[LT_FILENAME_MAX];
|
||||||
|
int d_namlen;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
HANDLE hSearch;
|
||||||
|
WIN32_FIND_DATA Win32FindData;
|
||||||
|
BOOL firsttime;
|
||||||
|
struct dirent file_info;
|
||||||
|
} DIR;
|
||||||
|
|
||||||
|
|
||||||
|
LT_SCOPE DIR * opendir (const char *path);
|
||||||
|
LT_SCOPE struct dirent *readdir (DIR *entry);
|
||||||
|
LT_SCOPE void closedir (DIR *entry);
|
||||||
|
|
||||||
|
LT_END_C_DECLS
|
||||||
|
|
||||||
|
#else /* !defined(__WINDOWS__)*/
|
||||||
|
ERROR - cannot find dirent
|
||||||
|
#endif /*!defined(__WINDOWS__)*/
|
||||||
|
|
||||||
|
#endif /*!defined(LT__DIRENT_H)*/
|
83
libltdl/libltdl/lt__glibc.h
Normal file
83
libltdl/libltdl/lt__glibc.h
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
/* lt__glibc.h -- support for non glibc environments
|
||||||
|
|
||||||
|
Copyright (C) 2004, 2006, 2007 Free Software Foundation, Inc.
|
||||||
|
Written by Gary V. Vaughan, 2004
|
||||||
|
|
||||||
|
NOTE: The canonical source of this file is maintained with the
|
||||||
|
GNU Libtool package. Report bugs to bug-libtool@gnu.org.
|
||||||
|
|
||||||
|
GNU Libltdl is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
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 this file under the
|
||||||
|
same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
GNU Libltdl is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with GNU Libltdl; see the file COPYING.LIB. If not, a
|
||||||
|
copy can be downloaded from http://www.gnu.org/licenses/lgpl.html,
|
||||||
|
or obtained by writing to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(LT__GLIBC_H)
|
||||||
|
#define LT__GLIBC_H 1
|
||||||
|
|
||||||
|
#if defined(LT_CONFIG_H)
|
||||||
|
# include LT_CONFIG_H
|
||||||
|
#else
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(HAVE_ARGZ_H) || !defined(HAVE_WORKING_ARGZ)
|
||||||
|
/* Redefine any glibc symbols we reimplement to import the
|
||||||
|
implementations into our lt__ namespace so we don't ever
|
||||||
|
clash with the system library if our clients use argz_*
|
||||||
|
from there in addition to libltdl. */
|
||||||
|
# undef argz_append
|
||||||
|
# define argz_append lt__argz_append
|
||||||
|
# undef argz_create_sep
|
||||||
|
# define argz_create_sep lt__argz_create_sep
|
||||||
|
# undef argz_insert
|
||||||
|
# define argz_insert lt__argz_insert
|
||||||
|
# undef argz_next
|
||||||
|
# define argz_next lt__argz_next
|
||||||
|
# undef argz_stringify
|
||||||
|
# define argz_stringify lt__argz_stringify
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <argz.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
# define slist_concat lt__slist_concat
|
||||||
|
# define slist_cons lt__slist_cons
|
||||||
|
# define slist_delete lt__slist_delete
|
||||||
|
# define slist_remove lt__slist_remove
|
||||||
|
# define slist_reverse lt__slist_reverse
|
||||||
|
# define slist_sort lt__slist_sort
|
||||||
|
# define slist_tail lt__slist_tail
|
||||||
|
# define slist_nth lt__slist_nth
|
||||||
|
# define slist_find lt__slist_find
|
||||||
|
# define slist_length lt__slist_length
|
||||||
|
# define slist_foreach lt__slist_foreach
|
||||||
|
# define slist_box lt__slist_box
|
||||||
|
# define slist_unbox lt__slist_unbox
|
||||||
|
|
||||||
|
#include <slist.h>
|
||||||
|
|
||||||
|
#endif /*!defined(LT__GLIBC_H)*/
|
149
libltdl/libltdl/lt__private.h
Normal file
149
libltdl/libltdl/lt__private.h
Normal file
|
@ -0,0 +1,149 @@
|
||||||
|
/* lt__private.h -- internal apis for libltdl
|
||||||
|
|
||||||
|
Copyright (C) 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
|
||||||
|
Written by Gary V. Vaughan, 2004
|
||||||
|
|
||||||
|
NOTE: The canonical source of this file is maintained with the
|
||||||
|
GNU Libtool package. Report bugs to bug-libtool@gnu.org.
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
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 this file under the
|
||||||
|
same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
GNU Libltdl is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with GNU Libltdl; see the file COPYING.LIB. If not, a
|
||||||
|
copy con be downloaded from http://www.gnu.org/licenses/lgpl.html,
|
||||||
|
or obtained by writing to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(LT__PRIVATE_H)
|
||||||
|
#define LT__PRIVATE_H 1
|
||||||
|
|
||||||
|
#if defined(LT_CONFIG_H)
|
||||||
|
# include LT_CONFIG_H
|
||||||
|
#else
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#if defined(HAVE_UNISTD_H)
|
||||||
|
# include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Import internal interfaces... */
|
||||||
|
#include "lt__alloc.h"
|
||||||
|
#include "lt__dirent.h"
|
||||||
|
#include "lt__strl.h"
|
||||||
|
#include "lt__glibc.h"
|
||||||
|
|
||||||
|
/* ...and all exported interfaces. */
|
||||||
|
#include "ltdl.h"
|
||||||
|
|
||||||
|
#if defined(WITH_DMALLOC)
|
||||||
|
# include <dmalloc.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* DLL building support on win32 hosts; mostly to workaround their
|
||||||
|
ridiculous implementation of data symbol exporting. */
|
||||||
|
#ifndef LT_GLOBAL_DATA
|
||||||
|
# if defined(__WINDOWS__) || defined(__CYGWIN__)
|
||||||
|
# if defined(DLL_EXPORT) /* defined by libtool (if required) */
|
||||||
|
# define LT_GLOBAL_DATA __declspec(dllexport)
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# ifndef LT_GLOBAL_DATA
|
||||||
|
# define LT_GLOBAL_DATA /* static linking or !__WINDOWS__ */
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __attribute__
|
||||||
|
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__
|
||||||
|
# define __attribute__(x)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef LT__UNUSED
|
||||||
|
# define LT__UNUSED __attribute__ ((__unused__))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
LT_BEGIN_C_DECLS
|
||||||
|
|
||||||
|
#if !defined(errno)
|
||||||
|
extern int errno;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
LT_SCOPE void lt__alloc_die_callback (void);
|
||||||
|
|
||||||
|
|
||||||
|
/* For readability: */
|
||||||
|
#define strneq(s1, s2) (strcmp((s1), (s2)) != 0)
|
||||||
|
#define streq(s1, s2) (!strcmp((s1), (s2)))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* --- OPAQUE STRUCTURES DECLARED IN LTDL.H --- */
|
||||||
|
|
||||||
|
/* This type is used for the array of interface data sets in each handler. */
|
||||||
|
typedef struct {
|
||||||
|
lt_dlinterface_id key;
|
||||||
|
void * data;
|
||||||
|
} lt_interface_data;
|
||||||
|
|
||||||
|
struct lt__handle {
|
||||||
|
lt_dlhandle next;
|
||||||
|
const lt_dlvtable * vtable; /* dlopening interface */
|
||||||
|
lt_dlinfo info; /* user visible fields */
|
||||||
|
int depcount; /* number of dependencies */
|
||||||
|
lt_dlhandle * deplibs; /* dependencies */
|
||||||
|
lt_module module; /* system module handle */
|
||||||
|
void * system; /* system specific data */
|
||||||
|
lt_interface_data * interface_data; /* per caller associated data */
|
||||||
|
int flags; /* various boolean stats */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct lt__advise {
|
||||||
|
unsigned int try_ext:1; /* try system library extensions. */
|
||||||
|
unsigned int is_resident:1; /* module can't be unloaded. */
|
||||||
|
unsigned int is_symglobal:1; /* module symbols can satisfy
|
||||||
|
subsequently loaded modules. */
|
||||||
|
unsigned int is_symlocal:1; /* module symbols are only available
|
||||||
|
locally. */
|
||||||
|
unsigned int try_preload_only:1;/* only preloaded modules will be tried. */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* --- ERROR HANDLING --- */
|
||||||
|
|
||||||
|
/* Extract the diagnostic strings from the error table macro in the same
|
||||||
|
order as the enumerated indices in lt_error.h. */
|
||||||
|
|
||||||
|
#define LT__STRERROR(name) lt__error_string(LT_CONC(LT_ERROR_,name))
|
||||||
|
|
||||||
|
#define LT__GETERROR(lvalue) (lvalue) = lt__get_last_error()
|
||||||
|
#define LT__SETERRORSTR(errormsg) lt__set_last_error(errormsg)
|
||||||
|
#define LT__SETERROR(errorcode) LT__SETERRORSTR(LT__STRERROR(errorcode))
|
||||||
|
|
||||||
|
LT_SCOPE const char *lt__error_string (int errorcode);
|
||||||
|
LT_SCOPE const char *lt__get_last_error (void);
|
||||||
|
LT_SCOPE const char *lt__set_last_error (const char *errormsg);
|
||||||
|
|
||||||
|
LT_END_C_DECLS
|
||||||
|
|
||||||
|
#endif /*!defined(LT__PRIVATE_H)*/
|
53
libltdl/libltdl/lt__strl.h
Normal file
53
libltdl/libltdl/lt__strl.h
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
/* lt__strl.h -- size-bounded string copying and concatenation
|
||||||
|
|
||||||
|
Copyright (C) 2004, 2006 Free Software Foundation, Inc.
|
||||||
|
Written by Bob Friesenhahn, 2004
|
||||||
|
|
||||||
|
NOTE: The canonical source of this file is maintained with the
|
||||||
|
GNU Libtool package. Report bugs to bug-libtool@gnu.org.
|
||||||
|
|
||||||
|
GNU Libltdl is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
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 this file under the
|
||||||
|
same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
GNU Libltdl is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with GNU Libltdl; see the file COPYING.LIB. If not, a
|
||||||
|
copy can be downloaded from http://www.gnu.org/licenses/lgpl.html,
|
||||||
|
or obtained by writing to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(LT__STRL_H)
|
||||||
|
#define LT__STRL_H 1
|
||||||
|
|
||||||
|
#if defined(LT_CONFIG_H)
|
||||||
|
# include LT_CONFIG_H
|
||||||
|
#else
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include "lt_system.h"
|
||||||
|
|
||||||
|
#if !defined(HAVE_STRLCAT)
|
||||||
|
# define strlcat(dst,src,dstsize) lt_strlcat(dst,src,dstsize)
|
||||||
|
LT_SCOPE size_t lt_strlcat(char *dst, const char *src, const size_t dstsize);
|
||||||
|
#endif /* !defined(HAVE_STRLCAT) */
|
||||||
|
|
||||||
|
#if !defined(HAVE_STRLCPY)
|
||||||
|
# define strlcpy(dst,src,dstsize) lt_strlcpy(dst,src,dstsize)
|
||||||
|
LT_SCOPE size_t lt_strlcpy(char *dst, const char *src, const size_t dstsize);
|
||||||
|
#endif /* !defined(HAVE_STRLCPY) */
|
||||||
|
|
||||||
|
#endif /*!defined(LT__STRL_H)*/
|
90
libltdl/libltdl/lt_dlloader.h
Normal file
90
libltdl/libltdl/lt_dlloader.h
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
/* lt_dlloader.h -- dynamic library loader interface
|
||||||
|
|
||||||
|
Copyright (C) 2004, 2007, 2008 Free Software Foundation, Inc.
|
||||||
|
Written by Gary V. Vaughan, 2004
|
||||||
|
|
||||||
|
NOTE: The canonical source of this file is maintained with the
|
||||||
|
GNU Libtool package. Report bugs to bug-libtool@gnu.org.
|
||||||
|
|
||||||
|
GNU Libltdl is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
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 this file under the
|
||||||
|
same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
GNU Libltdl is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with GNU Libltdl; see the file COPYING.LIB. If not, a
|
||||||
|
copy can be downloaded from http://www.gnu.org/licenses/lgpl.html,
|
||||||
|
or obtained by writing to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(LT_DLLOADER_H)
|
||||||
|
#define LT_DLLOADER_H 1
|
||||||
|
|
||||||
|
#include <libltdl/lt_system.h>
|
||||||
|
|
||||||
|
LT_BEGIN_C_DECLS
|
||||||
|
|
||||||
|
typedef void * lt_dlloader;
|
||||||
|
typedef void * lt_module;
|
||||||
|
typedef void * lt_user_data;
|
||||||
|
typedef struct lt__advise * lt_dladvise;
|
||||||
|
|
||||||
|
/* Function pointer types for module loader vtable entries: */
|
||||||
|
typedef lt_module lt_module_open (lt_user_data data,
|
||||||
|
const char *filename,
|
||||||
|
lt_dladvise advise);
|
||||||
|
typedef int lt_module_close (lt_user_data data,
|
||||||
|
lt_module module);
|
||||||
|
typedef void * lt_find_sym (lt_user_data data, lt_module module,
|
||||||
|
const char *symbolname);
|
||||||
|
typedef int lt_dlloader_init (lt_user_data data);
|
||||||
|
typedef int lt_dlloader_exit (lt_user_data data);
|
||||||
|
|
||||||
|
/* Default priority is LT_DLLOADER_PREPEND if none is explicitly given. */
|
||||||
|
typedef enum {
|
||||||
|
LT_DLLOADER_PREPEND = 0, LT_DLLOADER_APPEND
|
||||||
|
} lt_dlloader_priority;
|
||||||
|
|
||||||
|
/* This structure defines a module loader, as populated by the get_vtable
|
||||||
|
entry point of each loader. */
|
||||||
|
typedef struct {
|
||||||
|
const char * name;
|
||||||
|
const char * sym_prefix;
|
||||||
|
lt_module_open * module_open;
|
||||||
|
lt_module_close * module_close;
|
||||||
|
lt_find_sym * find_sym;
|
||||||
|
lt_dlloader_init * dlloader_init;
|
||||||
|
lt_dlloader_exit * dlloader_exit;
|
||||||
|
lt_user_data dlloader_data;
|
||||||
|
lt_dlloader_priority priority;
|
||||||
|
} lt_dlvtable;
|
||||||
|
|
||||||
|
LT_SCOPE int lt_dlloader_add (const lt_dlvtable *vtable);
|
||||||
|
LT_SCOPE lt_dlloader lt_dlloader_next (const lt_dlloader loader);
|
||||||
|
|
||||||
|
LT_SCOPE lt_dlvtable * lt_dlloader_remove (const char *name);
|
||||||
|
LT_SCOPE const lt_dlvtable *lt_dlloader_find (const char *name);
|
||||||
|
LT_SCOPE const lt_dlvtable *lt_dlloader_get (lt_dlloader loader);
|
||||||
|
|
||||||
|
|
||||||
|
/* Type of a function to get a loader's vtable: */
|
||||||
|
typedef const lt_dlvtable *lt_get_vtable (lt_user_data data);
|
||||||
|
|
||||||
|
#ifdef LT_DEBUG_LOADERS
|
||||||
|
LT_SCOPE void lt_dlloader_dump (void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
LT_END_C_DECLS
|
||||||
|
|
||||||
|
#endif /*!defined(LT_DLLOADER_H)*/
|
85
libltdl/libltdl/lt_error.h
Normal file
85
libltdl/libltdl/lt_error.h
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
/* lt_error.h -- error propogation interface
|
||||||
|
|
||||||
|
Copyright (C) 1999, 2000, 2001, 2004, 2007 Free Software Foundation, Inc.
|
||||||
|
Written by Thomas Tanner, 1999
|
||||||
|
|
||||||
|
NOTE: The canonical source of this file is maintained with the
|
||||||
|
GNU Libtool package. Report bugs to bug-libtool@gnu.org.
|
||||||
|
|
||||||
|
GNU Libltdl is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
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 this file under the
|
||||||
|
same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
GNU Libltdl is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with GNU Libltdl; see the file COPYING.LIB. If not, a
|
||||||
|
copy can be downloaded from http://www.gnu.org/licenses/lgpl.html,
|
||||||
|
or obtained by writing to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Only include this header file once. */
|
||||||
|
#if !defined(LT_ERROR_H)
|
||||||
|
#define LT_ERROR_H 1
|
||||||
|
|
||||||
|
#include <libltdl/lt_system.h>
|
||||||
|
|
||||||
|
LT_BEGIN_C_DECLS
|
||||||
|
|
||||||
|
/* Defining error strings alongside their symbolic names in a macro in
|
||||||
|
this way allows us to expand the macro in different contexts with
|
||||||
|
confidence that the enumeration of symbolic names will map correctly
|
||||||
|
onto the table of error strings. \0 is appended to the strings to
|
||||||
|
expilicitely initialize the string terminator. */
|
||||||
|
#define lt_dlerror_table \
|
||||||
|
LT_ERROR(UNKNOWN, "unknown error\0") \
|
||||||
|
LT_ERROR(DLOPEN_NOT_SUPPORTED, "dlopen support not available\0") \
|
||||||
|
LT_ERROR(INVALID_LOADER, "invalid loader\0") \
|
||||||
|
LT_ERROR(INIT_LOADER, "loader initialization failed\0") \
|
||||||
|
LT_ERROR(REMOVE_LOADER, "loader removal failed\0") \
|
||||||
|
LT_ERROR(FILE_NOT_FOUND, "file not found\0") \
|
||||||
|
LT_ERROR(DEPLIB_NOT_FOUND, "dependency library not found\0") \
|
||||||
|
LT_ERROR(NO_SYMBOLS, "no symbols defined\0") \
|
||||||
|
LT_ERROR(CANNOT_OPEN, "can't open the module\0") \
|
||||||
|
LT_ERROR(CANNOT_CLOSE, "can't close the module\0") \
|
||||||
|
LT_ERROR(SYMBOL_NOT_FOUND, "symbol not found\0") \
|
||||||
|
LT_ERROR(NO_MEMORY, "not enough memory\0") \
|
||||||
|
LT_ERROR(INVALID_HANDLE, "invalid module handle\0") \
|
||||||
|
LT_ERROR(BUFFER_OVERFLOW, "internal buffer overflow\0") \
|
||||||
|
LT_ERROR(INVALID_ERRORCODE, "invalid errorcode\0") \
|
||||||
|
LT_ERROR(SHUTDOWN, "library already shutdown\0") \
|
||||||
|
LT_ERROR(CLOSE_RESIDENT_MODULE, "can't close resident module\0") \
|
||||||
|
LT_ERROR(INVALID_MUTEX_ARGS, "internal error (code withdrawn)\0")\
|
||||||
|
LT_ERROR(INVALID_POSITION, "invalid search path insert position\0")\
|
||||||
|
LT_ERROR(CONFLICTING_FLAGS, "symbol visibility can be global or local\0")
|
||||||
|
|
||||||
|
/* Enumerate the symbolic error names. */
|
||||||
|
enum {
|
||||||
|
#define LT_ERROR(name, diagnostic) LT_CONC(LT_ERROR_, name),
|
||||||
|
lt_dlerror_table
|
||||||
|
#undef LT_ERROR
|
||||||
|
|
||||||
|
LT_ERROR_MAX
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Should be max of the error string lengths above (plus one for C++) */
|
||||||
|
#define LT_ERROR_LEN_MAX (41)
|
||||||
|
|
||||||
|
/* These functions are only useful from inside custom module loaders. */
|
||||||
|
LT_SCOPE int lt_dladderror (const char *diagnostic);
|
||||||
|
LT_SCOPE int lt_dlseterror (int errorcode);
|
||||||
|
|
||||||
|
|
||||||
|
LT_END_C_DECLS
|
||||||
|
|
||||||
|
#endif /*!defined(LT_ERROR_H)*/
|
166
libltdl/libltdl/lt_system.h
Normal file
166
libltdl/libltdl/lt_system.h
Normal file
|
@ -0,0 +1,166 @@
|
||||||
|
/* lt_system.h -- system portability abstraction layer
|
||||||
|
|
||||||
|
Copyright (C) 2004, 2007, 2010 Free Software Foundation, Inc.
|
||||||
|
Written by Gary V. Vaughan, 2004
|
||||||
|
|
||||||
|
NOTE: The canonical source of this file is maintained with the
|
||||||
|
GNU Libtool package. Report bugs to bug-libtool@gnu.org.
|
||||||
|
|
||||||
|
GNU Libltdl is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
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 this file under the
|
||||||
|
same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
GNU Libltdl is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with GNU Libltdl; see the file COPYING.LIB. If not, a
|
||||||
|
copy can be downloaded from http://www.gnu.org/licenses/lgpl.html,
|
||||||
|
or obtained by writing to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(LT_SYSTEM_H)
|
||||||
|
#define LT_SYSTEM_H 1
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
/* Some systems do not define EXIT_*, even with STDC_HEADERS. */
|
||||||
|
#if !defined(EXIT_SUCCESS)
|
||||||
|
# define EXIT_SUCCESS 0
|
||||||
|
#endif
|
||||||
|
#if !defined(EXIT_FAILURE)
|
||||||
|
# define EXIT_FAILURE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Just pick a big number... */
|
||||||
|
#define LT_FILENAME_MAX 2048
|
||||||
|
|
||||||
|
|
||||||
|
/* Saves on those hard to debug '\0' typos.... */
|
||||||
|
#define LT_EOS_CHAR '\0'
|
||||||
|
|
||||||
|
/* LTDL_BEGIN_C_DECLS should be used at the beginning of your declarations,
|
||||||
|
so that C++ compilers don't mangle their names. Use LTDL_END_C_DECLS at
|
||||||
|
the end of C declarations. */
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
# define LT_BEGIN_C_DECLS extern "C" {
|
||||||
|
# define LT_END_C_DECLS }
|
||||||
|
#else
|
||||||
|
# define LT_BEGIN_C_DECLS /* empty */
|
||||||
|
# define LT_END_C_DECLS /* empty */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* LT_STMT_START/END are used to create macros which expand to a
|
||||||
|
a single compound statement in a portable way. */
|
||||||
|
#if defined (__GNUC__) && !defined (__STRICT_ANSI__) && !defined (__cplusplus)
|
||||||
|
# define LT_STMT_START (void)(
|
||||||
|
# define LT_STMT_END )
|
||||||
|
#else
|
||||||
|
# if (defined (sun) || defined (__sun__))
|
||||||
|
# define LT_STMT_START if (1)
|
||||||
|
# define LT_STMT_END else (void)0
|
||||||
|
# else
|
||||||
|
# define LT_STMT_START do
|
||||||
|
# define LT_STMT_END while (0)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */
|
||||||
|
#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
|
||||||
|
/* DATA imports from DLLs on WIN32 con't be const, because runtime
|
||||||
|
relocations are performed -- see ld's documentation on pseudo-relocs. */
|
||||||
|
# define LT_DLSYM_CONST
|
||||||
|
#elif defined(__osf__)
|
||||||
|
/* This system does not cope well with relocations in const data. */
|
||||||
|
# define LT_DLSYM_CONST
|
||||||
|
#else
|
||||||
|
# define LT_DLSYM_CONST const
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Canonicalise Windows and Cygwin recognition macros.
|
||||||
|
To match the values set by recent Cygwin compilers, make sure that if
|
||||||
|
__CYGWIN__ is defined (after canonicalisation), __WINDOWS__ is NOT! */
|
||||||
|
#if defined(__CYGWIN32__) && !defined(__CYGWIN__)
|
||||||
|
# define __CYGWIN__ __CYGWIN32__
|
||||||
|
#endif
|
||||||
|
#if defined(__CYGWIN__)
|
||||||
|
# if defined(__WINDOWS__)
|
||||||
|
# undef __WINDOWS__
|
||||||
|
# endif
|
||||||
|
#elif defined(_WIN32)
|
||||||
|
# define __WINDOWS__ _WIN32
|
||||||
|
#elif defined(WIN32)
|
||||||
|
# define __WINDOWS__ WIN32
|
||||||
|
#endif
|
||||||
|
#if defined(__CYGWIN__) && defined(__WINDOWS__)
|
||||||
|
# undef __WINDOWS__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* DLL building support on win32 hosts; mostly to workaround their
|
||||||
|
ridiculous implementation of data symbol exporting. */
|
||||||
|
#if !defined(LT_SCOPE)
|
||||||
|
# if defined(__WINDOWS__) || defined(__CYGWIN__)
|
||||||
|
# if defined(DLL_EXPORT) /* defined by libtool (if required) */
|
||||||
|
# define LT_SCOPE extern __declspec(dllexport)
|
||||||
|
# endif
|
||||||
|
# if defined(LIBLTDL_DLL_IMPORT) /* define if linking with this dll */
|
||||||
|
/* note: cygwin/mingw compilers can rely instead on auto-import */
|
||||||
|
# define LT_SCOPE extern __declspec(dllimport)
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# if !defined(LT_SCOPE) /* static linking or !__WINDOWS__ */
|
||||||
|
# define LT_SCOPE extern
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__WINDOWS__)
|
||||||
|
/* LT_DIRSEP_CHAR is accepted *in addition* to '/' as a directory
|
||||||
|
separator when it is set. */
|
||||||
|
# define LT_DIRSEP_CHAR '\\'
|
||||||
|
# define LT_PATHSEP_CHAR ';'
|
||||||
|
#else
|
||||||
|
# define LT_PATHSEP_CHAR ':'
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_MSC_VER) /* Visual Studio */
|
||||||
|
# define R_OK 4
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* fopen() mode flags for reading a text file */
|
||||||
|
#undef LT_READTEXT_MODE
|
||||||
|
#if defined(__WINDOWS__) || defined(__CYGWIN__)
|
||||||
|
# define LT_READTEXT_MODE "rt"
|
||||||
|
#else
|
||||||
|
# define LT_READTEXT_MODE "r"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The extra indirection to the LT__STR and LT__CONC macros is required so
|
||||||
|
that if the arguments to LT_STR() (or LT_CONC()) are themselves macros,
|
||||||
|
they will be expanded before being quoted. */
|
||||||
|
#ifndef LT_STR
|
||||||
|
# define LT__STR(arg) #arg
|
||||||
|
# define LT_STR(arg) LT__STR(arg)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef LT_CONC
|
||||||
|
# define LT__CONC(a, b) a##b
|
||||||
|
# define LT_CONC(a, b) LT__CONC(a, b)
|
||||||
|
#endif
|
||||||
|
#ifndef LT_CONC3
|
||||||
|
# define LT__CONC3(a, b, c) a##b##c
|
||||||
|
# define LT_CONC3(a, b, c) LT__CONC3(a, b, c)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /*!defined(LT_SYSTEM_H)*/
|
96
libltdl/libltdl/slist.h
Normal file
96
libltdl/libltdl/slist.h
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
/* slist.h -- generalised singly linked lists
|
||||||
|
|
||||||
|
Copyright (C) 2000, 2004, 2009 Free Software Foundation, Inc.
|
||||||
|
Written by Gary V. Vaughan, 2000
|
||||||
|
|
||||||
|
NOTE: The canonical source of this file is maintained with the
|
||||||
|
GNU Libtool package. Report bugs to bug-libtool@gnu.org.
|
||||||
|
|
||||||
|
GNU Libltdl is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
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 this file under the
|
||||||
|
same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
GNU Libltdl is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with GNU Libltdl; see the file COPYING.LIB. If not, a
|
||||||
|
copy can be downloaded from http://www.gnu.org/licenses/lgpl.html,
|
||||||
|
or obtained by writing to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* A generalised list. This is deliberately transparent so that you
|
||||||
|
can make the NEXT field of all your chained data structures first,
|
||||||
|
and then cast them to `(SList *)' so that they can be manipulated
|
||||||
|
by this API.
|
||||||
|
|
||||||
|
Alternatively, you can generate raw SList elements using slist_new(),
|
||||||
|
and put the element data in the USERDATA field. Either way you
|
||||||
|
get to manage the memory involved by yourself.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(SLIST_H)
|
||||||
|
#define SLIST_H 1
|
||||||
|
|
||||||
|
#if defined(LTDL)
|
||||||
|
# include <libltdl/lt__glibc.h>
|
||||||
|
# include <libltdl/lt_system.h>
|
||||||
|
#else
|
||||||
|
# define LT_SCOPE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct slist {
|
||||||
|
struct slist *next; /* chain forward pointer*/
|
||||||
|
const void *userdata; /* for boxed `SList' item */
|
||||||
|
} SList;
|
||||||
|
|
||||||
|
typedef void * SListCallback (SList *item, void *userdata);
|
||||||
|
typedef int SListCompare (const SList *item1, const SList *item2,
|
||||||
|
void *userdata);
|
||||||
|
|
||||||
|
LT_SCOPE SList *slist_concat (SList *head, SList *tail);
|
||||||
|
LT_SCOPE SList *slist_cons (SList *item, SList *slist);
|
||||||
|
|
||||||
|
LT_SCOPE SList *slist_delete (SList *slist, void (*delete_fct) (void *item));
|
||||||
|
LT_SCOPE SList *slist_remove (SList **phead, SListCallback *find,
|
||||||
|
void *matchdata);
|
||||||
|
LT_SCOPE SList *slist_reverse (SList *slist);
|
||||||
|
LT_SCOPE SList *slist_sort (SList *slist, SListCompare *compare,
|
||||||
|
void *userdata);
|
||||||
|
|
||||||
|
LT_SCOPE SList *slist_tail (SList *slist);
|
||||||
|
LT_SCOPE SList *slist_nth (SList *slist, size_t n);
|
||||||
|
LT_SCOPE void * slist_find (SList *slist, SListCallback *find,
|
||||||
|
void *matchdata);
|
||||||
|
LT_SCOPE size_t slist_length (SList *slist);
|
||||||
|
|
||||||
|
LT_SCOPE void * slist_foreach (SList *slist, SListCallback *foreach,
|
||||||
|
void *userdata);
|
||||||
|
|
||||||
|
LT_SCOPE SList *slist_box (const void *userdata);
|
||||||
|
LT_SCOPE void * slist_unbox (SList *item);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(LTDL)
|
||||||
|
# undef LT_SCOPE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /*!defined(SLIST_H)*/
|
158
libltdl/loaders/dld_link.c
Normal file
158
libltdl/loaders/dld_link.c
Normal file
|
@ -0,0 +1,158 @@
|
||||||
|
/* loader-dld_link.c -- dynamic linking with dld
|
||||||
|
|
||||||
|
Copyright (C) 1998, 1999, 2000, 2004, 2006,
|
||||||
|
2007, 2008 Free Software Foundation, Inc.
|
||||||
|
Written by Thomas Tanner, 1998
|
||||||
|
|
||||||
|
NOTE: The canonical source of this file is maintained with the
|
||||||
|
GNU Libtool package. Report bugs to bug-libtool@gnu.org.
|
||||||
|
|
||||||
|
GNU Libltdl is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
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 this file under the
|
||||||
|
same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
GNU Libltdl is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with GNU Libltdl; see the file COPYING.LIB. If not, a
|
||||||
|
copy can be downloaded from http://www.gnu.org/licenses/lgpl.html,
|
||||||
|
or obtained by writing to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "lt__private.h"
|
||||||
|
#include "lt_dlloader.h"
|
||||||
|
|
||||||
|
/* Use the preprocessor to rename non-static symbols to avoid namespace
|
||||||
|
collisions when the loader code is statically linked into libltdl.
|
||||||
|
Use the "<module_name>_LTX_" prefix so that the symbol addresses can
|
||||||
|
be fetched from the preloaded symbol list by lt_dlsym(): */
|
||||||
|
#define get_vtable dld_link_LTX_get_vtable
|
||||||
|
|
||||||
|
LT_BEGIN_C_DECLS
|
||||||
|
LT_SCOPE lt_dlvtable *get_vtable (lt_user_data loader_data);
|
||||||
|
LT_END_C_DECLS
|
||||||
|
|
||||||
|
|
||||||
|
/* Boilerplate code to set up the vtable for hooking this loader into
|
||||||
|
libltdl's loader list: */
|
||||||
|
static int vl_exit (lt_user_data loader_data);
|
||||||
|
static lt_module vm_open (lt_user_data loader_data, const char *filename,
|
||||||
|
lt_dladvise advise);
|
||||||
|
static int vm_close (lt_user_data loader_data, lt_module module);
|
||||||
|
static void * vm_sym (lt_user_data loader_data, lt_module module,
|
||||||
|
const char *symbolname);
|
||||||
|
|
||||||
|
static lt_dlvtable *vtable = 0;
|
||||||
|
|
||||||
|
/* Return the vtable for this loader, only the name and sym_prefix
|
||||||
|
attributes (plus the virtual function implementations, obviously)
|
||||||
|
change between loaders. */
|
||||||
|
lt_dlvtable *
|
||||||
|
get_vtable (lt_user_data loader_data)
|
||||||
|
{
|
||||||
|
if (!vtable)
|
||||||
|
{
|
||||||
|
vtable = lt__zalloc (sizeof *vtable);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vtable && !vtable->name)
|
||||||
|
{
|
||||||
|
vtable->name = "lt_dld_link";
|
||||||
|
vtable->module_open = vm_open;
|
||||||
|
vtable->module_close = vm_close;
|
||||||
|
vtable->find_sym = vm_sym;
|
||||||
|
vtable->dlloader_exit = vl_exit;
|
||||||
|
vtable->dlloader_data = loader_data;
|
||||||
|
vtable->priority = LT_DLLOADER_APPEND;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vtable && (vtable->dlloader_data != loader_data))
|
||||||
|
{
|
||||||
|
LT__SETERROR (INIT_LOADER);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return vtable;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* --- IMPLEMENTATION --- */
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(HAVE_DLD_H)
|
||||||
|
# include <dld.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* A function called through the vtable when this loader is no
|
||||||
|
longer needed by the application. */
|
||||||
|
static int
|
||||||
|
vl_exit (lt_user_data LT__UNUSED loader_data)
|
||||||
|
{
|
||||||
|
vtable = NULL;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* A function called through the vtable to open a module with this
|
||||||
|
loader. Returns an opaque representation of the newly opened
|
||||||
|
module for processing with this loader's other vtable functions. */
|
||||||
|
static lt_module
|
||||||
|
vm_open (lt_user_data LT__UNUSED loader_data, const char *filename,
|
||||||
|
lt_dladvise LT__UNUSED advise)
|
||||||
|
{
|
||||||
|
lt_module module = lt__strdup (filename);
|
||||||
|
|
||||||
|
if (dld_link (filename) != 0)
|
||||||
|
{
|
||||||
|
LT__SETERROR (CANNOT_OPEN);
|
||||||
|
FREE (module);
|
||||||
|
}
|
||||||
|
|
||||||
|
return module;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* A function called through the vtable when a particular module
|
||||||
|
should be unloaded. */
|
||||||
|
static int
|
||||||
|
vm_close (lt_user_data LT__UNUSED loader_data, lt_module module)
|
||||||
|
{
|
||||||
|
int errors = 0;
|
||||||
|
|
||||||
|
if (dld_unlink_by_file ((char*)(module), 1) != 0)
|
||||||
|
{
|
||||||
|
LT__SETERROR (CANNOT_CLOSE);
|
||||||
|
++errors;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FREE (module);
|
||||||
|
}
|
||||||
|
|
||||||
|
return errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* A function called through the vtable to get the address of
|
||||||
|
a symbol loaded from a particular module. */
|
||||||
|
static void *
|
||||||
|
vm_sym (lt_user_data LT__UNUSED loader_data, lt_module LT__UNUSED module,
|
||||||
|
const char *name)
|
||||||
|
{
|
||||||
|
void *address = dld_get_func (name);
|
||||||
|
|
||||||
|
if (!address)
|
||||||
|
{
|
||||||
|
LT__SETERROR (SYMBOL_NOT_FOUND);
|
||||||
|
}
|
||||||
|
|
||||||
|
return address;
|
||||||
|
}
|
235
libltdl/loaders/dlopen.c
Normal file
235
libltdl/loaders/dlopen.c
Normal file
|
@ -0,0 +1,235 @@
|
||||||
|
/* loader-dlopen.c -- dynamic linking with dlopen/dlsym
|
||||||
|
|
||||||
|
Copyright (C) 1998, 1999, 2000, 2004, 2006,
|
||||||
|
2007, 2008 Free Software Foundation, Inc.
|
||||||
|
Written by Thomas Tanner, 1998
|
||||||
|
|
||||||
|
NOTE: The canonical source of this file is maintained with the
|
||||||
|
GNU Libtool package. Report bugs to bug-libtool@gnu.org.
|
||||||
|
|
||||||
|
GNU Libltdl is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
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 this file under the
|
||||||
|
same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
GNU Libltdl is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with GNU Libltdl; see the file COPYING.LIB. If not, a
|
||||||
|
copy can be downloaded from http://www.gnu.org/licenses/lgpl.html,
|
||||||
|
or obtained by writing to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "lt__private.h"
|
||||||
|
#include "lt_dlloader.h"
|
||||||
|
|
||||||
|
/* Use the preprocessor to rename non-static symbols to avoid namespace
|
||||||
|
collisions when the loader code is statically linked into libltdl.
|
||||||
|
Use the "<module_name>_LTX_" prefix so that the symbol addresses can
|
||||||
|
be fetched from the preloaded symbol list by lt_dlsym(): */
|
||||||
|
#define get_vtable dlopen_LTX_get_vtable
|
||||||
|
|
||||||
|
LT_BEGIN_C_DECLS
|
||||||
|
LT_SCOPE lt_dlvtable *get_vtable (lt_user_data loader_data);
|
||||||
|
LT_END_C_DECLS
|
||||||
|
|
||||||
|
|
||||||
|
/* Boilerplate code to set up the vtable for hooking this loader into
|
||||||
|
libltdl's loader list: */
|
||||||
|
static int vl_exit (lt_user_data loader_data);
|
||||||
|
static lt_module vm_open (lt_user_data loader_data, const char *filename,
|
||||||
|
lt_dladvise advise);
|
||||||
|
static int vm_close (lt_user_data loader_data, lt_module module);
|
||||||
|
static void * vm_sym (lt_user_data loader_data, lt_module module,
|
||||||
|
const char *symbolname);
|
||||||
|
|
||||||
|
static lt_dlvtable *vtable = 0;
|
||||||
|
|
||||||
|
/* Return the vtable for this loader, only the name and sym_prefix
|
||||||
|
attributes (plus the virtual function implementations, obviously)
|
||||||
|
change between loaders. */
|
||||||
|
lt_dlvtable *
|
||||||
|
get_vtable (lt_user_data loader_data)
|
||||||
|
{
|
||||||
|
if (!vtable)
|
||||||
|
{
|
||||||
|
vtable = (lt_dlvtable *) lt__zalloc (sizeof *vtable);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vtable && !vtable->name)
|
||||||
|
{
|
||||||
|
vtable->name = "lt_dlopen";
|
||||||
|
#if defined(DLSYM_USCORE)
|
||||||
|
vtable->sym_prefix = "_";
|
||||||
|
#endif
|
||||||
|
vtable->module_open = vm_open;
|
||||||
|
vtable->module_close = vm_close;
|
||||||
|
vtable->find_sym = vm_sym;
|
||||||
|
vtable->dlloader_exit = vl_exit;
|
||||||
|
vtable->dlloader_data = loader_data;
|
||||||
|
vtable->priority = LT_DLLOADER_PREPEND;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vtable && (vtable->dlloader_data != loader_data))
|
||||||
|
{
|
||||||
|
LT__SETERROR (INIT_LOADER);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return vtable;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* --- IMPLEMENTATION --- */
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(HAVE_DLFCN_H)
|
||||||
|
# include <dlfcn.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(HAVE_SYS_DL_H)
|
||||||
|
# include <sys/dl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* We may have to define LT_LAZY_OR_NOW in the command line if we
|
||||||
|
find out it does not work in some platform. */
|
||||||
|
#if !defined(LT_LAZY_OR_NOW)
|
||||||
|
# if defined(RTLD_LAZY)
|
||||||
|
# define LT_LAZY_OR_NOW RTLD_LAZY
|
||||||
|
# else
|
||||||
|
# if defined(DL_LAZY)
|
||||||
|
# define LT_LAZY_OR_NOW DL_LAZY
|
||||||
|
# endif
|
||||||
|
# endif /* !RTLD_LAZY */
|
||||||
|
#endif
|
||||||
|
#if !defined(LT_LAZY_OR_NOW)
|
||||||
|
# if defined(RTLD_NOW)
|
||||||
|
# define LT_LAZY_OR_NOW RTLD_NOW
|
||||||
|
# else
|
||||||
|
# if defined(DL_NOW)
|
||||||
|
# define LT_LAZY_OR_NOW DL_NOW
|
||||||
|
# endif
|
||||||
|
# endif /* !RTLD_NOW */
|
||||||
|
#endif
|
||||||
|
#if !defined(LT_LAZY_OR_NOW)
|
||||||
|
# define LT_LAZY_OR_NOW 0
|
||||||
|
#endif /* !LT_LAZY_OR_NOW */
|
||||||
|
|
||||||
|
/* We only support local and global symbols from modules for loaders
|
||||||
|
that provide such a thing, otherwise the system default is used. */
|
||||||
|
#if !defined(RTLD_GLOBAL)
|
||||||
|
# if defined(DL_GLOBAL)
|
||||||
|
# define RTLD_GLOBAL DL_GLOBAL
|
||||||
|
# endif
|
||||||
|
#endif /* !RTLD_GLOBAL */
|
||||||
|
#if !defined(RTLD_LOCAL)
|
||||||
|
# if defined(DL_LOCAL)
|
||||||
|
# define RTLD_LOCAL DL_LOCAL
|
||||||
|
# endif
|
||||||
|
#endif /* !RTLD_LOCAL */
|
||||||
|
|
||||||
|
#if defined(HAVE_DLERROR)
|
||||||
|
# define DLERROR(arg) dlerror ()
|
||||||
|
#else
|
||||||
|
# define DLERROR(arg) LT__STRERROR (arg)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define DL__SETERROR(errorcode) \
|
||||||
|
LT__SETERRORSTR (DLERROR (errorcode))
|
||||||
|
|
||||||
|
|
||||||
|
/* A function called through the vtable when this loader is no
|
||||||
|
longer needed by the application. */
|
||||||
|
static int
|
||||||
|
vl_exit (lt_user_data LT__UNUSED loader_data)
|
||||||
|
{
|
||||||
|
vtable = NULL;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* A function called through the vtable to open a module with this
|
||||||
|
loader. Returns an opaque representation of the newly opened
|
||||||
|
module for processing with this loader's other vtable functions. */
|
||||||
|
static lt_module
|
||||||
|
vm_open (lt_user_data LT__UNUSED loader_data, const char *filename,
|
||||||
|
lt_dladvise advise)
|
||||||
|
{
|
||||||
|
int module_flags = LT_LAZY_OR_NOW;
|
||||||
|
lt_module module;
|
||||||
|
|
||||||
|
if (advise)
|
||||||
|
{
|
||||||
|
#ifdef RTLD_GLOBAL
|
||||||
|
/* If there is some means of asking for global symbol resolution,
|
||||||
|
do so. */
|
||||||
|
if (advise->is_symglobal)
|
||||||
|
module_flags |= RTLD_GLOBAL;
|
||||||
|
#else
|
||||||
|
/* Otherwise, reset that bit so the caller can tell it wasn't
|
||||||
|
acted on. */
|
||||||
|
advise->is_symglobal = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* And similarly for local only symbol resolution. */
|
||||||
|
#ifdef RTLD_LOCAL
|
||||||
|
if (advise->is_symlocal)
|
||||||
|
module_flags |= RTLD_LOCAL;
|
||||||
|
#else
|
||||||
|
advise->is_symlocal = 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
module = dlopen (filename, module_flags);
|
||||||
|
|
||||||
|
if (!module)
|
||||||
|
{
|
||||||
|
DL__SETERROR (CANNOT_OPEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
return module;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* A function called through the vtable when a particular module
|
||||||
|
should be unloaded. */
|
||||||
|
static int
|
||||||
|
vm_close (lt_user_data LT__UNUSED loader_data, lt_module module)
|
||||||
|
{
|
||||||
|
int errors = 0;
|
||||||
|
|
||||||
|
if (dlclose (module) != 0)
|
||||||
|
{
|
||||||
|
DL__SETERROR (CANNOT_CLOSE);
|
||||||
|
++errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
return errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* A function called through the vtable to get the address of
|
||||||
|
a symbol loaded from a particular module. */
|
||||||
|
static void *
|
||||||
|
vm_sym (lt_user_data LT__UNUSED loader_data, lt_module module, const char *name)
|
||||||
|
{
|
||||||
|
void *address = dlsym (module, name);
|
||||||
|
|
||||||
|
if (!address)
|
||||||
|
{
|
||||||
|
DL__SETERROR (SYMBOL_NOT_FOUND);
|
||||||
|
}
|
||||||
|
|
||||||
|
return address;
|
||||||
|
}
|
511
libltdl/loaders/dyld.c
Normal file
511
libltdl/loaders/dyld.c
Normal file
|
@ -0,0 +1,511 @@
|
||||||
|
/* loader-dyld.c -- dynamic linking on darwin and OS X
|
||||||
|
|
||||||
|
Copyright (C) 1998, 1999, 2000, 2004, 2006,
|
||||||
|
2007, 2008 Free Software Foundation, Inc.
|
||||||
|
Written by Peter O'Gorman, 1998
|
||||||
|
|
||||||
|
NOTE: The canonical source of this file is maintained with the
|
||||||
|
GNU Libtool package. Report bugs to bug-libtool@gnu.org.
|
||||||
|
|
||||||
|
GNU Libltdl is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
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 this file under the
|
||||||
|
same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
GNU Libltdl is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with GNU Libltdl; see the file COPYING.LIB. If not, a
|
||||||
|
copy can be downloaded from http://www.gnu.org/licenses/lgpl.html,
|
||||||
|
or obtained by writing to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "lt__private.h"
|
||||||
|
#include "lt_dlloader.h"
|
||||||
|
|
||||||
|
/* Use the preprocessor to rename non-static symbols to avoid namespace
|
||||||
|
collisions when the loader code is statically linked into libltdl.
|
||||||
|
Use the "<module_name>_LTX_" prefix so that the symbol addresses can
|
||||||
|
be fetched from the preloaded symbol list by lt_dlsym(): */
|
||||||
|
#define get_vtable dyld_LTX_get_vtable
|
||||||
|
|
||||||
|
LT_BEGIN_C_DECLS
|
||||||
|
LT_SCOPE lt_dlvtable *get_vtable (lt_user_data loader_data);
|
||||||
|
LT_END_C_DECLS
|
||||||
|
|
||||||
|
|
||||||
|
/* Boilerplate code to set up the vtable for hooking this loader into
|
||||||
|
libltdl's loader list: */
|
||||||
|
static int vl_init (lt_user_data loader_data);
|
||||||
|
static int vl_exit (lt_user_data loader_data);
|
||||||
|
static lt_module vm_open (lt_user_data loader_data, const char *filename,
|
||||||
|
lt_dladvise advise);
|
||||||
|
static int vm_close (lt_user_data loader_data, lt_module module);
|
||||||
|
static void * vm_sym (lt_user_data loader_data, lt_module module,
|
||||||
|
const char *symbolname);
|
||||||
|
|
||||||
|
static lt_dlvtable *vtable = 0;
|
||||||
|
|
||||||
|
/* Return the vtable for this loader, only the name and sym_prefix
|
||||||
|
attributes (plus the virtual function implementations, obviously)
|
||||||
|
change between loaders. */
|
||||||
|
lt_dlvtable *
|
||||||
|
get_vtable (lt_user_data loader_data)
|
||||||
|
{
|
||||||
|
if (!vtable)
|
||||||
|
{
|
||||||
|
vtable = lt__zalloc (sizeof *vtable);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vtable && !vtable->name)
|
||||||
|
{
|
||||||
|
vtable->name = "lt_dyld";
|
||||||
|
vtable->sym_prefix = "_";
|
||||||
|
vtable->dlloader_init = vl_init;
|
||||||
|
vtable->module_open = vm_open;
|
||||||
|
vtable->module_close = vm_close;
|
||||||
|
vtable->find_sym = vm_sym;
|
||||||
|
vtable->dlloader_exit = vl_exit;
|
||||||
|
vtable->dlloader_data = loader_data;
|
||||||
|
vtable->priority = LT_DLLOADER_APPEND;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vtable && (vtable->dlloader_data != loader_data))
|
||||||
|
{
|
||||||
|
LT__SETERROR (INIT_LOADER);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return vtable;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* --- IMPLEMENTATION --- */
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(HAVE_MACH_O_DYLD_H)
|
||||||
|
# if !defined(__APPLE_CC__) && !defined(__MWERKS__) && !defined(__private_extern__)
|
||||||
|
/* Is this correct? Does it still function properly? */
|
||||||
|
# define __private_extern__ extern
|
||||||
|
# endif
|
||||||
|
# include <mach-o/dyld.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <mach-o/getsect.h>
|
||||||
|
|
||||||
|
/* We have to put some stuff here that isn't in older dyld.h files */
|
||||||
|
#if !defined(ENUM_DYLD_BOOL)
|
||||||
|
# define ENUM_DYLD_BOOL
|
||||||
|
# undef FALSE
|
||||||
|
# undef TRUE
|
||||||
|
enum DYLD_BOOL {
|
||||||
|
FALSE,
|
||||||
|
TRUE
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
#if !defined(LC_REQ_DYLD)
|
||||||
|
# define LC_REQ_DYLD 0x80000000
|
||||||
|
#endif
|
||||||
|
#if !defined(LC_LOAD_WEAK_DYLIB)
|
||||||
|
# define LC_LOAD_WEAK_DYLIB (0x18 | LC_REQ_DYLD)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(NSADDIMAGE_OPTION_NONE)
|
||||||
|
# define NSADDIMAGE_OPTION_NONE 0x0
|
||||||
|
#endif
|
||||||
|
#if !defined(NSADDIMAGE_OPTION_RETURN_ON_ERROR)
|
||||||
|
# define NSADDIMAGE_OPTION_RETURN_ON_ERROR 0x1
|
||||||
|
#endif
|
||||||
|
#if !defined(NSADDIMAGE_OPTION_WITH_SEARCHING)
|
||||||
|
# define NSADDIMAGE_OPTION_WITH_SEARCHING 0x2
|
||||||
|
#endif
|
||||||
|
#if !defined(NSADDIMAGE_OPTION_RETURN_ONLY_IF_LOADED)
|
||||||
|
# define NSADDIMAGE_OPTION_RETURN_ONLY_IF_LOADED 0x4
|
||||||
|
#endif
|
||||||
|
#if !defined(NSADDIMAGE_OPTION_MATCH_FILENAME_BY_INSTALLNAME)
|
||||||
|
# define NSADDIMAGE_OPTION_MATCH_FILENAME_BY_INSTALLNAME 0x8
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(NSLOOKUPSYMBOLINIMAGE_OPTION_BIND)
|
||||||
|
# define NSLOOKUPSYMBOLINIMAGE_OPTION_BIND 0x0
|
||||||
|
#endif
|
||||||
|
#if !defined(NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_NOW)
|
||||||
|
# define NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_NOW 0x1
|
||||||
|
#endif
|
||||||
|
#if !defined(NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_FULLY)
|
||||||
|
# define NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_FULLY 0x2
|
||||||
|
#endif
|
||||||
|
#if !defined(NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR)
|
||||||
|
# define NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR 0x4
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define LT__SYMLOOKUP_OPTS (NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_NOW \
|
||||||
|
| NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR)
|
||||||
|
|
||||||
|
#if defined(__BIG_ENDIAN__)
|
||||||
|
# define LT__MAGIC MH_MAGIC
|
||||||
|
#else
|
||||||
|
# define LT__MAGIC MH_CIGAM
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define DYLD__SETMYERROR(errmsg) LT__SETERRORSTR (dylderror (errmsg))
|
||||||
|
#define DYLD__SETERROR(errcode) DYLD__SETMYERROR (LT__STRERROR (errcode))
|
||||||
|
|
||||||
|
typedef struct mach_header mach_header;
|
||||||
|
typedef struct dylib_command dylib_command;
|
||||||
|
|
||||||
|
static const char *dylderror (const char *errmsg);
|
||||||
|
static const mach_header *lt__nsmodule_get_header (NSModule module);
|
||||||
|
static const char *lt__header_get_instnam (const mach_header *mh);
|
||||||
|
static const mach_header *lt__match_loadedlib (const char *name);
|
||||||
|
static NSSymbol lt__linkedlib_symbol (const char *symname, const mach_header *mh);
|
||||||
|
|
||||||
|
static const mach_header *(*lt__addimage) (const char *image_name,
|
||||||
|
unsigned long options) = 0;
|
||||||
|
static NSSymbol (*lt__image_symbol) (const mach_header *image,
|
||||||
|
const char *symbolName,
|
||||||
|
unsigned long options) = 0;
|
||||||
|
static enum DYLD_BOOL (*lt__image_symbol_p) (const mach_header *image,
|
||||||
|
const char *symbolName) = 0;
|
||||||
|
static enum DYLD_BOOL (*lt__module_export) (NSModule module) = 0;
|
||||||
|
|
||||||
|
static int dyld_cannot_close = 0;
|
||||||
|
|
||||||
|
|
||||||
|
/* A function called through the vtable when this loader is no
|
||||||
|
longer needed by the application. */
|
||||||
|
static int
|
||||||
|
vl_exit (lt_user_data LT__UNUSED loader_data)
|
||||||
|
{
|
||||||
|
vtable = NULL;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* A function called through the vtable to initialise this loader. */
|
||||||
|
static int
|
||||||
|
vl_init (lt_user_data loader_data)
|
||||||
|
{
|
||||||
|
int errors = 0;
|
||||||
|
|
||||||
|
if (! dyld_cannot_close)
|
||||||
|
{
|
||||||
|
if (!_dyld_present ())
|
||||||
|
{
|
||||||
|
++errors;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
(void) _dyld_func_lookup ("__dyld_NSAddImage",
|
||||||
|
(unsigned long*) <__addimage);
|
||||||
|
(void) _dyld_func_lookup ("__dyld_NSLookupSymbolInImage",
|
||||||
|
(unsigned long*)<__image_symbol);
|
||||||
|
(void) _dyld_func_lookup ("__dyld_NSIsSymbolNameDefinedInImage",
|
||||||
|
(unsigned long*) <__image_symbol_p);
|
||||||
|
(void) _dyld_func_lookup ("__dyld_NSMakePrivateModulePublic",
|
||||||
|
(unsigned long*) <__module_export);
|
||||||
|
dyld_cannot_close = lt_dladderror ("can't close a dylib");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* A function called through the vtable to open a module with this
|
||||||
|
loader. Returns an opaque representation of the newly opened
|
||||||
|
module for processing with this loader's other vtable functions. */
|
||||||
|
static lt_module
|
||||||
|
vm_open (lt_user_data loader_data, const char *filename,
|
||||||
|
lt_dladvise LT__UNUSED advise)
|
||||||
|
{
|
||||||
|
lt_module module = 0;
|
||||||
|
NSObjectFileImage ofi = 0;
|
||||||
|
|
||||||
|
if (!filename)
|
||||||
|
{
|
||||||
|
return (lt_module) -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (NSCreateObjectFileImageFromFile (filename, &ofi))
|
||||||
|
{
|
||||||
|
case NSObjectFileImageSuccess:
|
||||||
|
module = NSLinkModule (ofi, filename, NSLINKMODULE_OPTION_RETURN_ON_ERROR
|
||||||
|
| NSLINKMODULE_OPTION_PRIVATE
|
||||||
|
| NSLINKMODULE_OPTION_BINDNOW);
|
||||||
|
NSDestroyObjectFileImage (ofi);
|
||||||
|
|
||||||
|
if (module)
|
||||||
|
{
|
||||||
|
lt__module_export (module);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NSObjectFileImageInappropriateFile:
|
||||||
|
if (lt__image_symbol_p && lt__image_symbol)
|
||||||
|
{
|
||||||
|
module = (lt_module) lt__addimage(filename,
|
||||||
|
NSADDIMAGE_OPTION_RETURN_ON_ERROR);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NSObjectFileImageFailure:
|
||||||
|
case NSObjectFileImageArch:
|
||||||
|
case NSObjectFileImageFormat:
|
||||||
|
case NSObjectFileImageAccess:
|
||||||
|
/*NOWORK*/
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!module)
|
||||||
|
{
|
||||||
|
DYLD__SETERROR (CANNOT_OPEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
return module;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* A function called through the vtable when a particular module
|
||||||
|
should be unloaded. */
|
||||||
|
static int
|
||||||
|
vm_close (lt_user_data loader_data, lt_module module)
|
||||||
|
{
|
||||||
|
int errors = 0;
|
||||||
|
|
||||||
|
if (module != (lt_module) -1)
|
||||||
|
{
|
||||||
|
const mach_header *mh = (const mach_header *) module;
|
||||||
|
int flags = 0;
|
||||||
|
if (mh->magic == LT__MAGIC)
|
||||||
|
{
|
||||||
|
lt_dlseterror (dyld_cannot_close);
|
||||||
|
++errors;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Currently, if a module contains c++ static destructors and it
|
||||||
|
is unloaded, we get a segfault in atexit(), due to compiler and
|
||||||
|
dynamic loader differences of opinion, this works around that. */
|
||||||
|
if ((const struct section *) NULL !=
|
||||||
|
getsectbynamefromheader (lt__nsmodule_get_header (module),
|
||||||
|
"__DATA", "__mod_term_func"))
|
||||||
|
{
|
||||||
|
flags |= NSUNLINKMODULE_OPTION_KEEP_MEMORY_MAPPED;
|
||||||
|
}
|
||||||
|
#if defined(__ppc__)
|
||||||
|
flags |= NSUNLINKMODULE_OPTION_RESET_LAZY_REFERENCES;
|
||||||
|
#endif
|
||||||
|
if (!NSUnLinkModule (module, flags))
|
||||||
|
{
|
||||||
|
DYLD__SETERROR (CANNOT_CLOSE);
|
||||||
|
++errors;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* A function called through the vtable to get the address of
|
||||||
|
a symbol loaded from a particular module. */
|
||||||
|
static void *
|
||||||
|
vm_sym (lt_user_data loader_data, lt_module module, const char *name)
|
||||||
|
{
|
||||||
|
NSSymbol *nssym = 0;
|
||||||
|
const mach_header *mh = (const mach_header *) module;
|
||||||
|
char saveError[256] = "Symbol not found";
|
||||||
|
|
||||||
|
if (module == (lt_module) -1)
|
||||||
|
{
|
||||||
|
void *address, *unused;
|
||||||
|
_dyld_lookup_and_bind (name, (unsigned long*) &address, &unused);
|
||||||
|
return address;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mh->magic == LT__MAGIC)
|
||||||
|
{
|
||||||
|
if (lt__image_symbol_p && lt__image_symbol)
|
||||||
|
{
|
||||||
|
if (lt__image_symbol_p (mh, name))
|
||||||
|
{
|
||||||
|
nssym = lt__image_symbol (mh, name, LT__SYMLOOKUP_OPTS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nssym = NSLookupSymbolInModule (module, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!nssym)
|
||||||
|
{
|
||||||
|
strncpy (saveError, dylderror (LT__STRERROR (SYMBOL_NOT_FOUND)), 255);
|
||||||
|
saveError[255] = 0;
|
||||||
|
if (!mh)
|
||||||
|
{
|
||||||
|
mh = (mach_header *)lt__nsmodule_get_header (module);
|
||||||
|
}
|
||||||
|
nssym = lt__linkedlib_symbol (name, mh);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!nssym)
|
||||||
|
{
|
||||||
|
LT__SETERRORSTR (saveError);
|
||||||
|
}
|
||||||
|
|
||||||
|
return nssym ? NSAddressOfSymbol (nssym) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* --- HELPER FUNCTIONS --- */
|
||||||
|
|
||||||
|
|
||||||
|
/* Return the dyld error string, or the passed in error string if none. */
|
||||||
|
static const char *
|
||||||
|
dylderror (const char *errmsg)
|
||||||
|
{
|
||||||
|
NSLinkEditErrors ler;
|
||||||
|
int lerno;
|
||||||
|
const char *file;
|
||||||
|
const char *errstr;
|
||||||
|
|
||||||
|
NSLinkEditError (&ler, &lerno, &file, &errstr);
|
||||||
|
|
||||||
|
if (! (errstr && *errstr))
|
||||||
|
{
|
||||||
|
errstr = errmsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
return errstr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* There should probably be an apple dyld api for this. */
|
||||||
|
static const mach_header *
|
||||||
|
lt__nsmodule_get_header (NSModule module)
|
||||||
|
{
|
||||||
|
int i = _dyld_image_count();
|
||||||
|
const char *modname = NSNameOfModule (module);
|
||||||
|
const mach_header *mh = 0;
|
||||||
|
|
||||||
|
if (!modname)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
while (i > 0)
|
||||||
|
{
|
||||||
|
--i;
|
||||||
|
if (strneq (_dyld_get_image_name (i), modname))
|
||||||
|
{
|
||||||
|
mh = _dyld_get_image_header (i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return mh;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* NSAddImage is also used to get the loaded image, but it only works if
|
||||||
|
the lib is installed, for uninstalled libs we need to check the
|
||||||
|
install_names against each other. Note that this is still broken if
|
||||||
|
DYLD_IMAGE_SUFFIX is set and a different lib was loaded as a result. */
|
||||||
|
static const char *
|
||||||
|
lt__header_get_instnam (const mach_header *mh)
|
||||||
|
{
|
||||||
|
unsigned long offset = sizeof(mach_header);
|
||||||
|
const char* result = 0;
|
||||||
|
int j;
|
||||||
|
|
||||||
|
for (j = 0; j < mh->ncmds; j++)
|
||||||
|
{
|
||||||
|
struct load_command *lc;
|
||||||
|
|
||||||
|
lc = (struct load_command*) (((unsigned long) mh) + offset);
|
||||||
|
if (LC_ID_DYLIB == lc->cmd)
|
||||||
|
{
|
||||||
|
result=(char*)(((dylib_command*) lc)->dylib.name.offset +
|
||||||
|
(unsigned long) lc);
|
||||||
|
}
|
||||||
|
offset += lc->cmdsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const mach_header *
|
||||||
|
lt__match_loadedlib (const char *name)
|
||||||
|
{
|
||||||
|
const mach_header *mh = 0;
|
||||||
|
int i = _dyld_image_count();
|
||||||
|
|
||||||
|
while (i > 0)
|
||||||
|
{
|
||||||
|
const char *id;
|
||||||
|
|
||||||
|
--i;
|
||||||
|
id = lt__header_get_instnam (_dyld_get_image_header (i));
|
||||||
|
if (id && strneq (id, name))
|
||||||
|
{
|
||||||
|
mh = _dyld_get_image_header (i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return mh;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Safe to assume our mh is good. */
|
||||||
|
static NSSymbol
|
||||||
|
lt__linkedlib_symbol (const char *symname, const mach_header *mh)
|
||||||
|
{
|
||||||
|
NSSymbol symbol = 0;
|
||||||
|
|
||||||
|
if (lt__image_symbol && NSIsSymbolNameDefined (symname))
|
||||||
|
{
|
||||||
|
unsigned long offset = sizeof(mach_header);
|
||||||
|
struct load_command *lc;
|
||||||
|
int j;
|
||||||
|
|
||||||
|
for (j = 0; j < mh->ncmds; j++)
|
||||||
|
{
|
||||||
|
lc = (struct load_command*) (((unsigned long) mh) + offset);
|
||||||
|
if ((LC_LOAD_DYLIB == lc->cmd) || (LC_LOAD_WEAK_DYLIB == lc->cmd))
|
||||||
|
{
|
||||||
|
unsigned long base = ((dylib_command *) lc)->dylib.name.offset;
|
||||||
|
char *name = (char *) (base + (unsigned long) lc);
|
||||||
|
const mach_header *mh1 = lt__match_loadedlib (name);
|
||||||
|
|
||||||
|
if (!mh1)
|
||||||
|
{
|
||||||
|
/* Maybe NSAddImage can find it */
|
||||||
|
mh1 = lt__addimage (name,
|
||||||
|
NSADDIMAGE_OPTION_RETURN_ONLY_IF_LOADED
|
||||||
|
| NSADDIMAGE_OPTION_WITH_SEARCHING
|
||||||
|
| NSADDIMAGE_OPTION_RETURN_ON_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mh1)
|
||||||
|
{
|
||||||
|
symbol = lt__image_symbol (mh1, symname, LT__SYMLOOKUP_OPTS);
|
||||||
|
if (symbol)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
offset += lc->cmdsize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return symbol;
|
||||||
|
}
|
167
libltdl/loaders/load_add_on.c
Normal file
167
libltdl/loaders/load_add_on.c
Normal file
|
@ -0,0 +1,167 @@
|
||||||
|
/* loader-load_add_on.c -- dynamic linking for BeOS
|
||||||
|
|
||||||
|
Copyright (C) 1998, 1999, 2000, 2004, 2006,
|
||||||
|
2007, 2008 Free Software Foundation, Inc.
|
||||||
|
Written by Thomas Tanner, 1998
|
||||||
|
|
||||||
|
NOTE: The canonical source of this file is maintained with the
|
||||||
|
GNU Libtool package. Report bugs to bug-libtool@gnu.org.
|
||||||
|
|
||||||
|
GNU Libltdl is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
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 this file under the
|
||||||
|
same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
GNU Libltdl is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with GNU Libltdl; see the file COPYING.LIB. If not, a
|
||||||
|
copy can be downloaded from http://www.gnu.org/licenses/lgpl.html,
|
||||||
|
or obtained by writing to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "lt__private.h"
|
||||||
|
#include "lt_dlloader.h"
|
||||||
|
|
||||||
|
/* Use the preprocessor to rename non-static symbols to avoid namespace
|
||||||
|
collisions when the loader code is statically linked into libltdl.
|
||||||
|
Use the "<module_name>_LTX_" prefix so that the symbol addresses can
|
||||||
|
be fetched from the preloaded symbol list by lt_dlsym(): */
|
||||||
|
#define get_vtable load_add_on_LTX_get_vtable
|
||||||
|
|
||||||
|
LT_BEGIN_C_DECLS
|
||||||
|
LT_SCOPE lt_dlvtable *get_vtable (lt_user_data loader_data);
|
||||||
|
LT_END_C_DECLS
|
||||||
|
|
||||||
|
|
||||||
|
/* Boilerplate code to set up the vtable for hooking this loader into
|
||||||
|
libltdl's loader list: */
|
||||||
|
static int vl_exit (lt_user_data loader_data);
|
||||||
|
static lt_module vm_open (lt_user_data loader_data, const char *filename,
|
||||||
|
lt_dladvise advise);
|
||||||
|
static int vm_close (lt_user_data loader_data, lt_module module);
|
||||||
|
static void * vm_sym (lt_user_data loader_data, lt_module module,
|
||||||
|
const char *symbolname);
|
||||||
|
|
||||||
|
static lt_dlvtable *vtable = 0;
|
||||||
|
|
||||||
|
/* Return the vtable for this loader, only the name and sym_prefix
|
||||||
|
attributes (plus the virtual function implementations, obviously)
|
||||||
|
change between loaders. */
|
||||||
|
lt_dlvtable *
|
||||||
|
get_vtable (lt_user_data loader_data)
|
||||||
|
{
|
||||||
|
if (!vtable)
|
||||||
|
{
|
||||||
|
vtable = lt__zalloc (sizeof *vtable);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vtable && !vtable->name)
|
||||||
|
{
|
||||||
|
vtable->name = "lt_load_add_on";
|
||||||
|
vtable->module_open = vm_open;
|
||||||
|
vtable->module_close = vm_close;
|
||||||
|
vtable->find_sym = vm_sym;
|
||||||
|
vtable->dlloader_exit = vl_exit;
|
||||||
|
vtable->dlloader_data = loader_data;
|
||||||
|
vtable->priority = LT_DLLOADER_APPEND;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vtable && (vtable->dlloader_data != loader_data))
|
||||||
|
{
|
||||||
|
LT__SETERROR (INIT_LOADER);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return vtable;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* --- IMPLEMENTATION --- */
|
||||||
|
|
||||||
|
|
||||||
|
#include <kernel/image.h>
|
||||||
|
|
||||||
|
/* A function called through the vtable when this loader is no
|
||||||
|
longer needed by the application. */
|
||||||
|
static int
|
||||||
|
vl_exit (lt_user_data LT__UNUSED loader_data)
|
||||||
|
{
|
||||||
|
vtable = NULL;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* A function called through the vtable to open a module with this
|
||||||
|
loader. Returns an opaque representation of the newly opened
|
||||||
|
module for processing with this loader's other vtable functions. */
|
||||||
|
static lt_module
|
||||||
|
vm_open (lt_user_data LT__UNUSED loader_data, const char *filename,
|
||||||
|
lt_dladvise LT__UNUSED advise)
|
||||||
|
{
|
||||||
|
image_id image = 0;
|
||||||
|
|
||||||
|
if (filename)
|
||||||
|
{
|
||||||
|
image = load_add_on (filename);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
image_info info;
|
||||||
|
int32 cookie = 0;
|
||||||
|
if (get_next_image_info (0, &cookie, &info) == B_OK)
|
||||||
|
image = load_add_on (info.name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (image <= 0)
|
||||||
|
{
|
||||||
|
LT__SETERROR (CANNOT_OPEN);
|
||||||
|
image = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (lt_module) image;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* A function called through the vtable when a particular module
|
||||||
|
should be unloaded. */
|
||||||
|
static int
|
||||||
|
vm_close (lt_user_data LT__UNUSED loader_data, lt_module module)
|
||||||
|
{
|
||||||
|
int errors = 0;
|
||||||
|
|
||||||
|
if (unload_add_on ((image_id) module) != B_OK)
|
||||||
|
{
|
||||||
|
LT__SETERROR (CANNOT_CLOSE);
|
||||||
|
++errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
return errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* A function called through the vtable to get the address of
|
||||||
|
a symbol loaded from a particular module. */
|
||||||
|
static void *
|
||||||
|
vm_sym (lt_user_data LT__UNUSED loader_data, lt_module module, const char *name)
|
||||||
|
{
|
||||||
|
void *address = 0;
|
||||||
|
image_id image = (image_id) module;
|
||||||
|
|
||||||
|
if (get_image_symbol (image, name, B_SYMBOL_TYPE_ANY, address) != B_OK)
|
||||||
|
{
|
||||||
|
LT__SETERROR (SYMBOL_NOT_FOUND);
|
||||||
|
address = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return address;
|
||||||
|
}
|
369
libltdl/loaders/loadlibrary.c
Normal file
369
libltdl/loaders/loadlibrary.c
Normal file
|
@ -0,0 +1,369 @@
|
||||||
|
/* loader-loadlibrary.c -- dynamic linking for Win32
|
||||||
|
|
||||||
|
Copyright (C) 1998, 1999, 2000, 2004, 2005, 2006,
|
||||||
|
2007, 2008, 2010 Free Software Foundation, Inc.
|
||||||
|
Written by Thomas Tanner, 1998
|
||||||
|
|
||||||
|
NOTE: The canonical source of this file is maintained with the
|
||||||
|
GNU Libtool package. Report bugs to bug-libtool@gnu.org.
|
||||||
|
|
||||||
|
GNU Libltdl is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
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 this file under the
|
||||||
|
same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
GNU Libltdl is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with GNU Libltdl; see the file COPYING.LIB. If not, a
|
||||||
|
copy can be downloaded from http://www.gnu.org/licenses/lgpl.html,
|
||||||
|
or obtained by writing to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "lt__private.h"
|
||||||
|
#include "lt_dlloader.h"
|
||||||
|
|
||||||
|
#if defined(__CYGWIN__)
|
||||||
|
# include <sys/cygwin.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Use the preprocessor to rename non-static symbols to avoid namespace
|
||||||
|
collisions when the loader code is statically linked into libltdl.
|
||||||
|
Use the "<module_name>_LTX_" prefix so that the symbol addresses can
|
||||||
|
be fetched from the preloaded symbol list by lt_dlsym(): */
|
||||||
|
#define get_vtable loadlibrary_LTX_get_vtable
|
||||||
|
|
||||||
|
LT_BEGIN_C_DECLS
|
||||||
|
LT_SCOPE lt_dlvtable *get_vtable (lt_user_data loader_data);
|
||||||
|
LT_END_C_DECLS
|
||||||
|
|
||||||
|
|
||||||
|
/* Boilerplate code to set up the vtable for hooking this loader into
|
||||||
|
libltdl's loader list: */
|
||||||
|
static int vl_exit (lt_user_data loader_data);
|
||||||
|
static lt_module vm_open (lt_user_data loader_data, const char *filename,
|
||||||
|
lt_dladvise advise);
|
||||||
|
static int vm_close (lt_user_data loader_data, lt_module module);
|
||||||
|
static void * vm_sym (lt_user_data loader_data, lt_module module,
|
||||||
|
const char *symbolname);
|
||||||
|
|
||||||
|
static lt_dlinterface_id iface_id = 0;
|
||||||
|
static lt_dlvtable *vtable = 0;
|
||||||
|
|
||||||
|
/* Return the vtable for this loader, only the name and sym_prefix
|
||||||
|
attributes (plus the virtual function implementations, obviously)
|
||||||
|
change between loaders. */
|
||||||
|
lt_dlvtable *
|
||||||
|
get_vtable (lt_user_data loader_data)
|
||||||
|
{
|
||||||
|
if (!vtable)
|
||||||
|
{
|
||||||
|
vtable = (lt_dlvtable *) lt__zalloc (sizeof *vtable);
|
||||||
|
iface_id = lt_dlinterface_register ("ltdl loadlibrary", NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vtable && !vtable->name)
|
||||||
|
{
|
||||||
|
vtable->name = "lt_loadlibrary";
|
||||||
|
vtable->module_open = vm_open;
|
||||||
|
vtable->module_close = vm_close;
|
||||||
|
vtable->find_sym = vm_sym;
|
||||||
|
vtable->dlloader_exit = vl_exit;
|
||||||
|
vtable->dlloader_data = loader_data;
|
||||||
|
vtable->priority = LT_DLLOADER_APPEND;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vtable && (vtable->dlloader_data != loader_data))
|
||||||
|
{
|
||||||
|
LT__SETERROR (INIT_LOADER);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return vtable;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* --- IMPLEMENTATION --- */
|
||||||
|
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#define LOCALFREE(mem) LT_STMT_START { \
|
||||||
|
if (mem) { LocalFree ((void *)mem); mem = NULL; } } LT_STMT_END
|
||||||
|
#define LOADLIB__SETERROR(errmsg) LT__SETERRORSTR (loadlibraryerror (errmsg))
|
||||||
|
#define LOADLIB_SETERROR(errcode) LOADLIB__SETERROR (LT__STRERROR (errcode))
|
||||||
|
|
||||||
|
static const char *loadlibraryerror (const char *default_errmsg);
|
||||||
|
static DWORD WINAPI wrap_getthreaderrormode (void);
|
||||||
|
static DWORD WINAPI fallback_getthreaderrormode (void);
|
||||||
|
static BOOL WINAPI wrap_setthreaderrormode (DWORD mode, DWORD *oldmode);
|
||||||
|
static BOOL WINAPI fallback_setthreaderrormode (DWORD mode, DWORD *oldmode);
|
||||||
|
|
||||||
|
typedef DWORD (WINAPI getthreaderrormode_type) (void);
|
||||||
|
typedef BOOL (WINAPI setthreaderrormode_type) (DWORD, DWORD *);
|
||||||
|
|
||||||
|
static getthreaderrormode_type *getthreaderrormode = wrap_getthreaderrormode;
|
||||||
|
static setthreaderrormode_type *setthreaderrormode = wrap_setthreaderrormode;
|
||||||
|
static char *error_message = 0;
|
||||||
|
|
||||||
|
|
||||||
|
/* A function called through the vtable when this loader is no
|
||||||
|
longer needed by the application. */
|
||||||
|
static int
|
||||||
|
vl_exit (lt_user_data LT__UNUSED loader_data)
|
||||||
|
{
|
||||||
|
vtable = NULL;
|
||||||
|
LOCALFREE (error_message);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* A function called through the vtable to open a module with this
|
||||||
|
loader. Returns an opaque representation of the newly opened
|
||||||
|
module for processing with this loader's other vtable functions. */
|
||||||
|
static lt_module
|
||||||
|
vm_open (lt_user_data LT__UNUSED loader_data, const char *filename,
|
||||||
|
lt_dladvise LT__UNUSED advise)
|
||||||
|
{
|
||||||
|
lt_module module = 0;
|
||||||
|
char *ext;
|
||||||
|
char wpath[MAX_PATH];
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
if (!filename)
|
||||||
|
{
|
||||||
|
/* Get the name of main module */
|
||||||
|
*wpath = 0;
|
||||||
|
GetModuleFileName (NULL, wpath, sizeof (wpath));
|
||||||
|
filename = wpath;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
len = LT_STRLEN (filename);
|
||||||
|
|
||||||
|
if (len >= MAX_PATH)
|
||||||
|
{
|
||||||
|
LT__SETERROR (CANNOT_OPEN);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if HAVE_DECL_CYGWIN_CONV_PATH
|
||||||
|
if (cygwin_conv_path (CCP_POSIX_TO_WIN_A, filename, wpath, MAX_PATH))
|
||||||
|
{
|
||||||
|
LT__SETERROR (CANNOT_OPEN);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
len = 0;
|
||||||
|
#elif defined(__CYGWIN__)
|
||||||
|
cygwin_conv_to_full_win32_path (filename, wpath);
|
||||||
|
len = 0;
|
||||||
|
#else
|
||||||
|
strcpy(wpath, filename);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ext = strrchr (wpath, '.');
|
||||||
|
if (!ext)
|
||||||
|
{
|
||||||
|
/* Append a `.' to stop Windows from adding an
|
||||||
|
implicit `.dll' extension. */
|
||||||
|
if (!len)
|
||||||
|
len = strlen (wpath);
|
||||||
|
|
||||||
|
if (len + 1 >= MAX_PATH)
|
||||||
|
{
|
||||||
|
LT__SETERROR (CANNOT_OPEN);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
wpath[len] = '.';
|
||||||
|
wpath[len+1] = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
/* Silence dialog from LoadLibrary on some failures. */
|
||||||
|
DWORD errormode = getthreaderrormode ();
|
||||||
|
DWORD last_error;
|
||||||
|
|
||||||
|
setthreaderrormode (errormode | SEM_FAILCRITICALERRORS, NULL);
|
||||||
|
|
||||||
|
module = LoadLibrary (wpath);
|
||||||
|
|
||||||
|
/* Restore the error mode. */
|
||||||
|
last_error = GetLastError ();
|
||||||
|
setthreaderrormode (errormode, NULL);
|
||||||
|
SetLastError (last_error);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* libltdl expects this function to fail if it is unable
|
||||||
|
to physically load the library. Sadly, LoadLibrary
|
||||||
|
will search the loaded libraries for a match and return
|
||||||
|
one of them if the path search load fails.
|
||||||
|
|
||||||
|
We check whether LoadLibrary is returning a handle to
|
||||||
|
an already loaded module, and simulate failure if we
|
||||||
|
find one. */
|
||||||
|
{
|
||||||
|
lt_dlhandle cur = 0;
|
||||||
|
|
||||||
|
while ((cur = lt_dlhandle_iterate (iface_id, cur)))
|
||||||
|
{
|
||||||
|
if (!cur->module)
|
||||||
|
{
|
||||||
|
cur = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cur->module == module)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!module)
|
||||||
|
LOADLIB_SETERROR (CANNOT_OPEN);
|
||||||
|
else if (cur)
|
||||||
|
{
|
||||||
|
LT__SETERROR (CANNOT_OPEN);
|
||||||
|
module = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return module;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* A function called through the vtable when a particular module
|
||||||
|
should be unloaded. */
|
||||||
|
static int
|
||||||
|
vm_close (lt_user_data LT__UNUSED loader_data, lt_module module)
|
||||||
|
{
|
||||||
|
int errors = 0;
|
||||||
|
|
||||||
|
if (FreeLibrary ((HMODULE) module) == 0)
|
||||||
|
{
|
||||||
|
LOADLIB_SETERROR (CANNOT_CLOSE);
|
||||||
|
++errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
return errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* A function called through the vtable to get the address of
|
||||||
|
a symbol loaded from a particular module. */
|
||||||
|
static void *
|
||||||
|
vm_sym (lt_user_data LT__UNUSED loader_data, lt_module module, const char *name)
|
||||||
|
{
|
||||||
|
void *address = (void *) GetProcAddress ((HMODULE) module, name);
|
||||||
|
|
||||||
|
if (!address)
|
||||||
|
{
|
||||||
|
LOADLIB_SETERROR (SYMBOL_NOT_FOUND);
|
||||||
|
}
|
||||||
|
|
||||||
|
return address;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* --- HELPER FUNCTIONS --- */
|
||||||
|
|
||||||
|
|
||||||
|
/* Return the windows error message, or the passed in error message on
|
||||||
|
failure. */
|
||||||
|
static const char *
|
||||||
|
loadlibraryerror (const char *default_errmsg)
|
||||||
|
{
|
||||||
|
size_t len;
|
||||||
|
LOCALFREE (error_message);
|
||||||
|
|
||||||
|
FormatMessageA (FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
||||||
|
FORMAT_MESSAGE_FROM_SYSTEM |
|
||||||
|
FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||||
|
NULL,
|
||||||
|
GetLastError (),
|
||||||
|
0,
|
||||||
|
(char *) &error_message,
|
||||||
|
0, NULL);
|
||||||
|
|
||||||
|
/* Remove trailing CRNL */
|
||||||
|
len = LT_STRLEN (error_message);
|
||||||
|
if (len && error_message[len - 1] == '\n')
|
||||||
|
error_message[--len] = LT_EOS_CHAR;
|
||||||
|
if (len && error_message[len - 1] == '\r')
|
||||||
|
error_message[--len] = LT_EOS_CHAR;
|
||||||
|
|
||||||
|
return len ? error_message : default_errmsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* A function called through the getthreaderrormode variable which checks
|
||||||
|
if the system supports GetThreadErrorMode (or GetErrorMode) and arranges
|
||||||
|
for it or a fallback implementation to be called directly in the future.
|
||||||
|
The selected version is then called. */
|
||||||
|
static DWORD WINAPI
|
||||||
|
wrap_getthreaderrormode (void)
|
||||||
|
{
|
||||||
|
HMODULE kernel32 = GetModuleHandleA ("kernel32.dll");
|
||||||
|
getthreaderrormode
|
||||||
|
= (getthreaderrormode_type *) GetProcAddress (kernel32,
|
||||||
|
"GetThreadErrorMode");
|
||||||
|
if (!getthreaderrormode)
|
||||||
|
getthreaderrormode
|
||||||
|
= (getthreaderrormode_type *) GetProcAddress (kernel32,
|
||||||
|
"GetErrorMode");
|
||||||
|
if (!getthreaderrormode)
|
||||||
|
getthreaderrormode = fallback_getthreaderrormode;
|
||||||
|
return getthreaderrormode ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* A function called through the getthreaderrormode variable for cases
|
||||||
|
where the system does not support GetThreadErrorMode or GetErrorMode */
|
||||||
|
static DWORD WINAPI
|
||||||
|
fallback_getthreaderrormode (void)
|
||||||
|
{
|
||||||
|
/* Prior to Windows Vista, the only way to get the current error
|
||||||
|
mode was to set a new one. In our case, we are setting a new
|
||||||
|
error mode right after "getting" it while ignoring the error
|
||||||
|
mode in effect when setting the new error mode, so that's
|
||||||
|
fairly ok. */
|
||||||
|
return (DWORD) SetErrorMode (SEM_FAILCRITICALERRORS);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* A function called through the setthreaderrormode variable which checks
|
||||||
|
if the system supports SetThreadErrorMode and arranges for it or a
|
||||||
|
fallback implementation to be called directly in the future.
|
||||||
|
The selected version is then called. */
|
||||||
|
static BOOL WINAPI
|
||||||
|
wrap_setthreaderrormode (DWORD mode, DWORD *oldmode)
|
||||||
|
{
|
||||||
|
HMODULE kernel32 = GetModuleHandleA ("kernel32.dll");
|
||||||
|
setthreaderrormode
|
||||||
|
= (setthreaderrormode_type *) GetProcAddress (kernel32,
|
||||||
|
"SetThreadErrorMode");
|
||||||
|
if (!setthreaderrormode)
|
||||||
|
setthreaderrormode = fallback_setthreaderrormode;
|
||||||
|
return setthreaderrormode (mode, oldmode);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* A function called through the setthreaderrormode variable for cases
|
||||||
|
where the system does not support SetThreadErrorMode. */
|
||||||
|
static BOOL WINAPI
|
||||||
|
fallback_setthreaderrormode (DWORD mode, DWORD *oldmode)
|
||||||
|
{
|
||||||
|
/* Prior to Windows 7, there was no way to set the thread local error
|
||||||
|
mode, so set the process global error mode instead. */
|
||||||
|
DWORD old = (DWORD) SetErrorMode (mode);
|
||||||
|
if (oldmode)
|
||||||
|
*oldmode = old;
|
||||||
|
return TRUE;
|
||||||
|
}
|
375
libltdl/loaders/preopen.c
Normal file
375
libltdl/loaders/preopen.c
Normal file
|
@ -0,0 +1,375 @@
|
||||||
|
/* loader-preopen.c -- emulate dynamic linking using preloaded_symbols
|
||||||
|
|
||||||
|
Copyright (C) 1998, 1999, 2000, 2004, 2006,
|
||||||
|
2007, 2008 Free Software Foundation, Inc.
|
||||||
|
Written by Thomas Tanner, 1998
|
||||||
|
|
||||||
|
NOTE: The canonical source of this file is maintained with the
|
||||||
|
GNU Libtool package. Report bugs to bug-libtool@gnu.org.
|
||||||
|
|
||||||
|
GNU Libltdl is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
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 this file under the
|
||||||
|
same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
GNU Libltdl is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with GNU Libltdl; see the file COPYING.LIB. If not, a
|
||||||
|
copy can be downloaded from http://www.gnu.org/licenses/lgpl.html,
|
||||||
|
or obtained by writing to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "lt__private.h"
|
||||||
|
#include "lt_dlloader.h"
|
||||||
|
|
||||||
|
/* Use the preprocessor to rename non-static symbols to avoid namespace
|
||||||
|
collisions when the loader code is statically linked into libltdl.
|
||||||
|
Use the "<module_name>_LTX_" prefix so that the symbol addresses can
|
||||||
|
be fetched from the preloaded symbol list by lt_dlsym(): */
|
||||||
|
#define get_vtable preopen_LTX_get_vtable
|
||||||
|
|
||||||
|
LT_BEGIN_C_DECLS
|
||||||
|
LT_SCOPE lt_dlvtable *get_vtable (lt_user_data loader_data);
|
||||||
|
LT_END_C_DECLS
|
||||||
|
|
||||||
|
|
||||||
|
/* Boilerplate code to set up the vtable for hooking this loader into
|
||||||
|
libltdl's loader list: */
|
||||||
|
static int vl_init (lt_user_data loader_data);
|
||||||
|
static int vl_exit (lt_user_data loader_data);
|
||||||
|
static lt_module vm_open (lt_user_data loader_data, const char *filename,
|
||||||
|
lt_dladvise advise);
|
||||||
|
static int vm_close (lt_user_data loader_data, lt_module module);
|
||||||
|
static void * vm_sym (lt_user_data loader_data, lt_module module,
|
||||||
|
const char *symbolname);
|
||||||
|
|
||||||
|
static lt_dlvtable *vtable = 0;
|
||||||
|
|
||||||
|
/* Return the vtable for this loader, only the name and sym_prefix
|
||||||
|
attributes (plus the virtual function implementations, obviously)
|
||||||
|
change between loaders. */
|
||||||
|
lt_dlvtable *
|
||||||
|
get_vtable (lt_user_data loader_data)
|
||||||
|
{
|
||||||
|
if (!vtable)
|
||||||
|
{
|
||||||
|
vtable = (lt_dlvtable *) lt__zalloc (sizeof *vtable);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vtable && !vtable->name)
|
||||||
|
{
|
||||||
|
vtable->name = "lt_preopen";
|
||||||
|
vtable->sym_prefix = 0;
|
||||||
|
vtable->module_open = vm_open;
|
||||||
|
vtable->module_close = vm_close;
|
||||||
|
vtable->find_sym = vm_sym;
|
||||||
|
vtable->dlloader_init = vl_init;
|
||||||
|
vtable->dlloader_exit = vl_exit;
|
||||||
|
vtable->dlloader_data = loader_data;
|
||||||
|
vtable->priority = LT_DLLOADER_PREPEND;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vtable && (vtable->dlloader_data != loader_data))
|
||||||
|
{
|
||||||
|
LT__SETERROR (INIT_LOADER);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return vtable;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* --- IMPLEMENTATION --- */
|
||||||
|
|
||||||
|
|
||||||
|
/* Wrapper type to chain together symbol lists of various origins. */
|
||||||
|
typedef struct symlist_chain
|
||||||
|
{
|
||||||
|
struct symlist_chain *next;
|
||||||
|
const lt_dlsymlist *symlist;
|
||||||
|
} symlist_chain;
|
||||||
|
|
||||||
|
|
||||||
|
static int add_symlist (const lt_dlsymlist *symlist);
|
||||||
|
static int free_symlists (void);
|
||||||
|
|
||||||
|
/* The start of the symbol lists chain. */
|
||||||
|
static symlist_chain *preloaded_symlists = 0;
|
||||||
|
|
||||||
|
/* A symbol list preloaded before lt_init() was called. */
|
||||||
|
static const lt_dlsymlist *default_preloaded_symbols = 0;
|
||||||
|
|
||||||
|
|
||||||
|
/* A function called through the vtable to initialise this loader. */
|
||||||
|
static int
|
||||||
|
vl_init (lt_user_data LT__UNUSED loader_data)
|
||||||
|
{
|
||||||
|
int errors = 0;
|
||||||
|
|
||||||
|
preloaded_symlists = 0;
|
||||||
|
if (default_preloaded_symbols)
|
||||||
|
{
|
||||||
|
errors = lt_dlpreload (default_preloaded_symbols);
|
||||||
|
}
|
||||||
|
|
||||||
|
return errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* A function called through the vtable when this loader is no
|
||||||
|
longer needed by the application. */
|
||||||
|
static int
|
||||||
|
vl_exit (lt_user_data LT__UNUSED loader_data)
|
||||||
|
{
|
||||||
|
vtable = NULL;
|
||||||
|
free_symlists ();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* A function called through the vtable to open a module with this
|
||||||
|
loader. Returns an opaque representation of the newly opened
|
||||||
|
module for processing with this loader's other vtable functions. */
|
||||||
|
static lt_module
|
||||||
|
vm_open (lt_user_data LT__UNUSED loader_data, const char *filename,
|
||||||
|
lt_dladvise LT__UNUSED advise)
|
||||||
|
{
|
||||||
|
symlist_chain *lists;
|
||||||
|
lt_module module = 0;
|
||||||
|
|
||||||
|
if (!preloaded_symlists)
|
||||||
|
{
|
||||||
|
LT__SETERROR (NO_SYMBOLS);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Can't use NULL as the reflective symbol header, as NULL is
|
||||||
|
used to mark the end of the entire symbol list. Self-dlpreopened
|
||||||
|
symbols follow this magic number, chosen to be an unlikely
|
||||||
|
clash with a real module name. */
|
||||||
|
if (!filename)
|
||||||
|
{
|
||||||
|
filename = "@PROGRAM@";
|
||||||
|
}
|
||||||
|
|
||||||
|
for (lists = preloaded_symlists; lists; lists = lists->next)
|
||||||
|
{
|
||||||
|
const lt_dlsymlist *symbol;
|
||||||
|
for (symbol= lists->symlist; symbol->name; ++symbol)
|
||||||
|
{
|
||||||
|
if (!symbol->address && streq (symbol->name, filename))
|
||||||
|
{
|
||||||
|
/* If the next symbol's name and address is 0, it means
|
||||||
|
the module just contains the originator and no symbols.
|
||||||
|
In this case we pretend that we never saw the module and
|
||||||
|
hope that some other loader will be able to load the module
|
||||||
|
and have access to its symbols */
|
||||||
|
const lt_dlsymlist *next_symbol = symbol +1;
|
||||||
|
if (next_symbol->address && next_symbol->name)
|
||||||
|
{
|
||||||
|
module = (lt_module) lists->symlist;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LT__SETERROR (FILE_NOT_FOUND);
|
||||||
|
|
||||||
|
done:
|
||||||
|
return module;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* A function called through the vtable when a particular module
|
||||||
|
should be unloaded. */
|
||||||
|
static int
|
||||||
|
vm_close (lt_user_data LT__UNUSED loader_data, lt_module LT__UNUSED module)
|
||||||
|
{
|
||||||
|
/* Just to silence gcc -Wall */
|
||||||
|
module = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* A function called through the vtable to get the address of
|
||||||
|
a symbol loaded from a particular module. */
|
||||||
|
static void *
|
||||||
|
vm_sym (lt_user_data LT__UNUSED loader_data, lt_module module, const char *name)
|
||||||
|
{
|
||||||
|
lt_dlsymlist *symbol = (lt_dlsymlist*) module;
|
||||||
|
|
||||||
|
symbol +=2; /* Skip header (originator then libname). */
|
||||||
|
|
||||||
|
while (symbol->name)
|
||||||
|
{
|
||||||
|
if (streq (symbol->name, name))
|
||||||
|
{
|
||||||
|
return symbol->address;
|
||||||
|
}
|
||||||
|
|
||||||
|
++symbol;
|
||||||
|
}
|
||||||
|
|
||||||
|
LT__SETERROR (SYMBOL_NOT_FOUND);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* --- HELPER FUNCTIONS --- */
|
||||||
|
|
||||||
|
|
||||||
|
/* The symbol lists themselves are not allocated from the heap, but
|
||||||
|
we can unhook them and free up the chain of links between them. */
|
||||||
|
static int
|
||||||
|
free_symlists (void)
|
||||||
|
{
|
||||||
|
symlist_chain *lists;
|
||||||
|
|
||||||
|
lists = preloaded_symlists;
|
||||||
|
while (lists)
|
||||||
|
{
|
||||||
|
symlist_chain *next = lists->next;
|
||||||
|
FREE (lists);
|
||||||
|
lists = next;
|
||||||
|
}
|
||||||
|
preloaded_symlists = 0;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add a new symbol list to the global chain. */
|
||||||
|
static int
|
||||||
|
add_symlist (const lt_dlsymlist *symlist)
|
||||||
|
{
|
||||||
|
symlist_chain *lists;
|
||||||
|
int errors = 0;
|
||||||
|
|
||||||
|
/* Search for duplicate entries: */
|
||||||
|
for (lists = preloaded_symlists;
|
||||||
|
lists && lists->symlist != symlist; lists = lists->next)
|
||||||
|
/*NOWORK*/;
|
||||||
|
|
||||||
|
/* Don't add the same list twice: */
|
||||||
|
if (!lists)
|
||||||
|
{
|
||||||
|
symlist_chain *tmp = (symlist_chain *) lt__zalloc (sizeof *tmp);
|
||||||
|
|
||||||
|
if (tmp)
|
||||||
|
{
|
||||||
|
tmp->symlist = symlist;
|
||||||
|
tmp->next = preloaded_symlists;
|
||||||
|
preloaded_symlists = tmp;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
++errors;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* --- PRELOADING API CALL IMPLEMENTATIONS --- */
|
||||||
|
|
||||||
|
|
||||||
|
/* Save a default symbol list for later. */
|
||||||
|
int
|
||||||
|
lt_dlpreload_default (const lt_dlsymlist *preloaded)
|
||||||
|
{
|
||||||
|
default_preloaded_symbols = preloaded;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Add a symbol list to the global chain, or with a NULL argument,
|
||||||
|
revert to just the default list. */
|
||||||
|
int
|
||||||
|
lt_dlpreload (const lt_dlsymlist *preloaded)
|
||||||
|
{
|
||||||
|
int errors = 0;
|
||||||
|
|
||||||
|
if (preloaded)
|
||||||
|
{
|
||||||
|
errors = add_symlist (preloaded);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
free_symlists();
|
||||||
|
|
||||||
|
if (default_preloaded_symbols)
|
||||||
|
{
|
||||||
|
errors = lt_dlpreload (default_preloaded_symbols);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Open all the preloaded modules from the named originator, executing
|
||||||
|
a callback for each one. If ORIGINATOR is NULL, then call FUNC for
|
||||||
|
each preloaded module from the program itself. */
|
||||||
|
int
|
||||||
|
lt_dlpreload_open (const char *originator, lt_dlpreload_callback_func *func)
|
||||||
|
{
|
||||||
|
symlist_chain *list;
|
||||||
|
int errors = 0;
|
||||||
|
int found = 0;
|
||||||
|
|
||||||
|
/* For each symlist in the chain... */
|
||||||
|
for (list = preloaded_symlists; list; list = list->next)
|
||||||
|
{
|
||||||
|
/* ...that was preloaded by the requesting ORIGINATOR... */
|
||||||
|
if ((originator && streq (list->symlist->name, originator))
|
||||||
|
|| (!originator && streq (list->symlist->name, "@PROGRAM@")))
|
||||||
|
{
|
||||||
|
const lt_dlsymlist *symbol;
|
||||||
|
unsigned int idx = 0;
|
||||||
|
|
||||||
|
++found;
|
||||||
|
|
||||||
|
/* ...load the symbols per source compilation unit:
|
||||||
|
(we preincrement the index to skip over the originator entry) */
|
||||||
|
while ((symbol = &list->symlist[++idx])->name != 0)
|
||||||
|
{
|
||||||
|
if ((symbol->address == 0)
|
||||||
|
&& (strneq (symbol->name, "@PROGRAM@")))
|
||||||
|
{
|
||||||
|
lt_dlhandle handle = lt_dlopen (symbol->name);
|
||||||
|
if (handle == 0)
|
||||||
|
{
|
||||||
|
++errors;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
errors += (*func) (handle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found)
|
||||||
|
{
|
||||||
|
LT__SETERROR(CANNOT_OPEN);
|
||||||
|
++errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
return errors;
|
||||||
|
}
|
222
libltdl/loaders/shl_load.c
Normal file
222
libltdl/loaders/shl_load.c
Normal file
|
@ -0,0 +1,222 @@
|
||||||
|
/* loader-shl_load.c -- dynamic linking with shl_load (HP-UX)
|
||||||
|
|
||||||
|
Copyright (C) 1998, 1999, 2000, 2004, 2006,
|
||||||
|
2007, 2008 Free Software Foundation, Inc.
|
||||||
|
Written by Thomas Tanner, 1998
|
||||||
|
|
||||||
|
NOTE: The canonical source of this file is maintained with the
|
||||||
|
GNU Libtool package. Report bugs to bug-libtool@gnu.org.
|
||||||
|
|
||||||
|
GNU Libltdl is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
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 this file under the
|
||||||
|
same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
GNU Libltdl is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with GNU Libltdl; see the file COPYING.LIB. If not, a
|
||||||
|
copy can be downloaded from http://www.gnu.org/licenses/lgpl.html,
|
||||||
|
or obtained by writing to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "lt__private.h"
|
||||||
|
#include "lt_dlloader.h"
|
||||||
|
|
||||||
|
/* Use the preprocessor to rename non-static symbols to avoid namespace
|
||||||
|
collisions when the loader code is statically linked into libltdl.
|
||||||
|
Use the "<module_name>_LTX_" prefix so that the symbol addresses can
|
||||||
|
be fetched from the preloaded symbol list by lt_dlsym(): */
|
||||||
|
#define get_vtable shl_load_LTX_get_vtable
|
||||||
|
|
||||||
|
LT_BEGIN_C_DECLS
|
||||||
|
LT_SCOPE lt_dlvtable *get_vtable (lt_user_data loader_data);
|
||||||
|
LT_END_C_DECLS
|
||||||
|
|
||||||
|
|
||||||
|
/* Boilerplate code to set up the vtable for hooking this loader into
|
||||||
|
libltdl's loader list: */
|
||||||
|
static int vl_exit (lt_user_data loader_data);
|
||||||
|
static lt_module vm_open (lt_user_data loader_data, const char *filename,
|
||||||
|
lt_dladvise advise);
|
||||||
|
static int vm_close (lt_user_data loader_data, lt_module module);
|
||||||
|
static void * vm_sym (lt_user_data loader_data, lt_module module,
|
||||||
|
const char *symbolname);
|
||||||
|
|
||||||
|
static lt_dlvtable *vtable = 0;
|
||||||
|
|
||||||
|
/* Return the vtable for this loader, only the name and sym_prefix
|
||||||
|
attributes (plus the virtual function implementations, obviously)
|
||||||
|
change between loaders. */
|
||||||
|
lt_dlvtable *
|
||||||
|
get_vtable (lt_user_data loader_data)
|
||||||
|
{
|
||||||
|
if (!vtable)
|
||||||
|
{
|
||||||
|
vtable = lt__zalloc (sizeof *vtable);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vtable && !vtable->name)
|
||||||
|
{
|
||||||
|
vtable->name = "lt_shl_load";
|
||||||
|
vtable->module_open = vm_open;
|
||||||
|
vtable->module_close = vm_close;
|
||||||
|
vtable->find_sym = vm_sym;
|
||||||
|
vtable->dlloader_exit = vl_exit;
|
||||||
|
vtable->dlloader_data = loader_data;
|
||||||
|
vtable->priority = LT_DLLOADER_APPEND;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vtable && (vtable->dlloader_data != loader_data))
|
||||||
|
{
|
||||||
|
LT__SETERROR (INIT_LOADER);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return vtable;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* --- IMPLEMENTATION --- */
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(HAVE_DL_H)
|
||||||
|
# include <dl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* some flags are missing on some systems, so we provide
|
||||||
|
* harmless defaults.
|
||||||
|
*
|
||||||
|
* Mandatory:
|
||||||
|
* BIND_IMMEDIATE - Resolve symbol references when the library is loaded.
|
||||||
|
* BIND_DEFERRED - Delay code symbol resolution until actual reference.
|
||||||
|
*
|
||||||
|
* Optionally:
|
||||||
|
* BIND_FIRST - Place the library at the head of the symbol search
|
||||||
|
* order.
|
||||||
|
* BIND_NONFATAL - The default BIND_IMMEDIATE behavior is to treat all
|
||||||
|
* unsatisfied symbols as fatal. This flag allows
|
||||||
|
* binding of unsatisfied code symbols to be deferred
|
||||||
|
* until use.
|
||||||
|
* [Perl: For certain libraries, like DCE, deferred
|
||||||
|
* binding often causes run time problems. Adding
|
||||||
|
* BIND_NONFATAL to BIND_IMMEDIATE still allows
|
||||||
|
* unresolved references in situations like this.]
|
||||||
|
* BIND_NOSTART - Do not call the initializer for the shared library
|
||||||
|
* when the library is loaded, nor on a future call to
|
||||||
|
* shl_unload().
|
||||||
|
* BIND_VERBOSE - Print verbose messages concerning possible
|
||||||
|
* unsatisfied symbols.
|
||||||
|
*
|
||||||
|
* hp9000s700/hp9000s800:
|
||||||
|
* BIND_RESTRICTED - Restrict symbols visible by the library to those
|
||||||
|
* present at library load time.
|
||||||
|
* DYNAMIC_PATH - Allow the loader to dynamically search for the
|
||||||
|
* library specified by the path argument.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(DYNAMIC_PATH)
|
||||||
|
# define DYNAMIC_PATH 0
|
||||||
|
#endif
|
||||||
|
#if !defined(BIND_RESTRICTED)
|
||||||
|
# define BIND_RESTRICTED 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define LT_BIND_FLAGS (BIND_IMMEDIATE | BIND_NONFATAL | DYNAMIC_PATH)
|
||||||
|
|
||||||
|
|
||||||
|
/* A function called through the vtable when this loader is no
|
||||||
|
longer needed by the application. */
|
||||||
|
static int
|
||||||
|
vl_exit (lt_user_data LT__UNUSED loader_data)
|
||||||
|
{
|
||||||
|
vtable = NULL;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* A function called through the vtable to open a module with this
|
||||||
|
loader. Returns an opaque representation of the newly opened
|
||||||
|
module for processing with this loader's other vtable functions. */
|
||||||
|
static lt_module
|
||||||
|
vm_open (lt_user_data LT__UNUSED loader_data, const char *filename,
|
||||||
|
lt_dladvise LT__UNUSED advise)
|
||||||
|
{
|
||||||
|
static shl_t self = (shl_t) 0;
|
||||||
|
lt_module module = shl_load (filename, LT_BIND_FLAGS, 0L);
|
||||||
|
|
||||||
|
/* Since searching for a symbol against a NULL module handle will also
|
||||||
|
look in everything else that was already loaded and exported with
|
||||||
|
the -E compiler flag, we always cache a handle saved before any
|
||||||
|
modules are loaded. */
|
||||||
|
if (!self)
|
||||||
|
{
|
||||||
|
void *address;
|
||||||
|
shl_findsym (&self, "main", TYPE_UNDEFINED, &address);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!filename)
|
||||||
|
{
|
||||||
|
module = self;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
module = shl_load (filename, LT_BIND_FLAGS, 0L);
|
||||||
|
|
||||||
|
if (!module)
|
||||||
|
{
|
||||||
|
LT__SETERROR (CANNOT_OPEN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return module;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* A function called through the vtable when a particular module
|
||||||
|
should be unloaded. */
|
||||||
|
static int
|
||||||
|
vm_close (lt_user_data LT__UNUSED loader_data, lt_module module)
|
||||||
|
{
|
||||||
|
int errors = 0;
|
||||||
|
|
||||||
|
if (module && (shl_unload ((shl_t) (module)) != 0))
|
||||||
|
{
|
||||||
|
LT__SETERROR (CANNOT_CLOSE);
|
||||||
|
++errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
return errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* A function called through the vtable to get the address of
|
||||||
|
a symbol loaded from a particular module. */
|
||||||
|
static void *
|
||||||
|
vm_sym (lt_user_data LT__UNUSED loader_data, lt_module module, const char *name)
|
||||||
|
{
|
||||||
|
void *address = 0;
|
||||||
|
|
||||||
|
/* sys_shl_open should never return a NULL module handle */
|
||||||
|
if (module == (lt_module) 0)
|
||||||
|
{
|
||||||
|
LT__SETERROR (INVALID_HANDLE);
|
||||||
|
}
|
||||||
|
else if (!shl_findsym((shl_t*) &module, name, TYPE_UNDEFINED, &address))
|
||||||
|
{
|
||||||
|
if (!address)
|
||||||
|
{
|
||||||
|
LT__SETERROR (SYMBOL_NOT_FOUND);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return address;
|
||||||
|
}
|
95
libltdl/lt__alloc.c
Normal file
95
libltdl/lt__alloc.c
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
/* lt__alloc.c -- internal memory management interface
|
||||||
|
|
||||||
|
Copyright (C) 2004, 2006, 2007 Free Software Foundation, Inc.
|
||||||
|
Written by Gary V. Vaughan, 2004
|
||||||
|
|
||||||
|
NOTE: The canonical source of this file is maintained with the
|
||||||
|
GNU Libtool package. Report bugs to bug-libtool@gnu.org.
|
||||||
|
|
||||||
|
GNU Libltdl is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
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 this file under the
|
||||||
|
same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
GNU Libltdl is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with GNU Libltdl; see the file COPYING.LIB. If not, a
|
||||||
|
copy can be downloaded from http://www.gnu.org/licenses/lgpl.html,
|
||||||
|
or obtained by writing to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "lt__private.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "lt__alloc.h"
|
||||||
|
|
||||||
|
static void alloc_die_default (void);
|
||||||
|
|
||||||
|
void (*lt__alloc_die) (void) = alloc_die_default;
|
||||||
|
|
||||||
|
/* Unless overridden, exit on memory failure. */
|
||||||
|
static void
|
||||||
|
alloc_die_default (void)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "Out of memory.\n");
|
||||||
|
exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
lt__malloc (size_t n)
|
||||||
|
{
|
||||||
|
void *mem;
|
||||||
|
|
||||||
|
if (! (mem = malloc (n)))
|
||||||
|
(*lt__alloc_die) ();
|
||||||
|
|
||||||
|
return mem;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
lt__zalloc (size_t n)
|
||||||
|
{
|
||||||
|
void *mem;
|
||||||
|
|
||||||
|
if ((mem = lt__malloc (n)))
|
||||||
|
memset (mem, 0, n);
|
||||||
|
|
||||||
|
return mem;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
lt__realloc (void *mem, size_t n)
|
||||||
|
{
|
||||||
|
if (! (mem = realloc (mem, n)))
|
||||||
|
(*lt__alloc_die) ();
|
||||||
|
|
||||||
|
return mem;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
lt__memdup (void const *mem, size_t n)
|
||||||
|
{
|
||||||
|
void *newmem;
|
||||||
|
|
||||||
|
if ((newmem = lt__malloc (n)))
|
||||||
|
return memcpy (newmem, mem, n);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
lt__strdup (const char *string)
|
||||||
|
{
|
||||||
|
return (char *) lt__memdup (string, strlen (string) +1);
|
||||||
|
}
|
107
libltdl/lt__dirent.c
Normal file
107
libltdl/lt__dirent.c
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
/* lt__dirent.c -- internal directory entry scanning interface
|
||||||
|
|
||||||
|
Copyright (C) 2001, 2004 Free Software Foundation, Inc.
|
||||||
|
Written by Bob Friesenhahn, 2001
|
||||||
|
|
||||||
|
NOTE: The canonical source of this file is maintained with the
|
||||||
|
GNU Libtool package. Report bugs to bug-libtool@gnu.org.
|
||||||
|
|
||||||
|
GNU Libltdl is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
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 this file under the
|
||||||
|
same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
GNU Libltdl is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with GNU Libltdl; see the file COPYING.LIB. If not, a
|
||||||
|
copy can be downloaded from http://www.gnu.org/licenses/lgpl.html,
|
||||||
|
or obtained by writing to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "lt__private.h"
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#include "lt__dirent.h"
|
||||||
|
|
||||||
|
#if defined(__WINDOWS__)
|
||||||
|
|
||||||
|
void
|
||||||
|
closedir (DIR *entry)
|
||||||
|
{
|
||||||
|
assert (entry != (DIR *) NULL);
|
||||||
|
FindClose (entry->hSearch);
|
||||||
|
free ((void *) entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DIR *
|
||||||
|
opendir (const char *path)
|
||||||
|
{
|
||||||
|
char file_spec[LT_FILENAME_MAX];
|
||||||
|
DIR *entry;
|
||||||
|
|
||||||
|
assert (path != (char *) 0);
|
||||||
|
if (lt_strlcpy (file_spec, path, sizeof file_spec) >= sizeof file_spec
|
||||||
|
|| lt_strlcat (file_spec, "\\", sizeof file_spec) >= sizeof file_spec)
|
||||||
|
return (DIR *) 0;
|
||||||
|
entry = (DIR *) malloc (sizeof(DIR));
|
||||||
|
if (entry != (DIR *) 0)
|
||||||
|
{
|
||||||
|
entry->firsttime = TRUE;
|
||||||
|
entry->hSearch = FindFirstFile (file_spec, &entry->Win32FindData);
|
||||||
|
|
||||||
|
if (entry->hSearch == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
if (lt_strlcat (file_spec, "\\*.*", sizeof file_spec) < sizeof file_spec)
|
||||||
|
{
|
||||||
|
entry->hSearch = FindFirstFile (file_spec, &entry->Win32FindData);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entry->hSearch == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
entry = (free (entry), (DIR *) 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct dirent *
|
||||||
|
readdir (DIR *entry)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
|
||||||
|
if (entry == (DIR *) 0)
|
||||||
|
return (struct dirent *) 0;
|
||||||
|
|
||||||
|
if (!entry->firsttime)
|
||||||
|
{
|
||||||
|
status = FindNextFile (entry->hSearch, &entry->Win32FindData);
|
||||||
|
if (status == 0)
|
||||||
|
return (struct dirent *) 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
entry->firsttime = FALSE;
|
||||||
|
if (lt_strlcpy (entry->file_info.d_name, entry->Win32FindData.cFileName,
|
||||||
|
sizeof entry->file_info.d_name) >= sizeof entry->file_info.d_name)
|
||||||
|
return (struct dirent *) 0;
|
||||||
|
entry->file_info.d_namlen = strlen (entry->file_info.d_name);
|
||||||
|
|
||||||
|
return &entry->file_info;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /*defined(__WINDOWS__)*/
|
127
libltdl/lt__strl.c
Normal file
127
libltdl/lt__strl.c
Normal file
|
@ -0,0 +1,127 @@
|
||||||
|
/* lt__strl.c -- size-bounded string copying and concatenation
|
||||||
|
|
||||||
|
Copyright (C) 2004 Free Software Foundation, Inc.
|
||||||
|
Written by Bob Friesenhahn, 2004
|
||||||
|
|
||||||
|
NOTE: The canonical source of this file is maintained with the
|
||||||
|
GNU Libtool package. Report bugs to bug-libtool@gnu.org.
|
||||||
|
|
||||||
|
GNU Libltdl is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
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 this file under the
|
||||||
|
same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
GNU Libltdl is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with GNU Libltdl; see the file COPYING.LIB. If not, a
|
||||||
|
copy can be downloaded from http://www.gnu.org/licenses/lgpl.html,
|
||||||
|
or obtained by writing to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "lt__strl.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
lt_strlcat appends the NULL-terminated string src to the end of dst.
|
||||||
|
It will append at most dstsize - strlen(dst) - 1 bytes,
|
||||||
|
NULL-terminating the result. The total length of the string which
|
||||||
|
would have been created given sufficient buffer size (may be longer
|
||||||
|
than dstsize) is returned. This function substitutes for strlcat()
|
||||||
|
which is available under NetBSD, FreeBSD and Solaris 9.
|
||||||
|
|
||||||
|
Buffer overflow can be checked as follows:
|
||||||
|
|
||||||
|
if (lt_strlcat(dst, src, dstsize) >= dstsize)
|
||||||
|
return -1;
|
||||||
|
*/
|
||||||
|
#if !defined(HAVE_STRLCAT)
|
||||||
|
size_t
|
||||||
|
lt_strlcat(char *dst, const char *src, const size_t dstsize)
|
||||||
|
{
|
||||||
|
size_t length;
|
||||||
|
char *p;
|
||||||
|
const char *q;
|
||||||
|
|
||||||
|
assert(dst != NULL);
|
||||||
|
assert(src != (const char *) NULL);
|
||||||
|
assert(dstsize >= 1);
|
||||||
|
|
||||||
|
length=strlen(dst);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copy remaining characters from src while constraining length to
|
||||||
|
size - 1.
|
||||||
|
*/
|
||||||
|
for ( p = dst + length, q = src;
|
||||||
|
(*q != 0) && (length < dstsize - 1) ;
|
||||||
|
length++, p++, q++ )
|
||||||
|
*p = *q;
|
||||||
|
|
||||||
|
dst[length]='\0';
|
||||||
|
|
||||||
|
/*
|
||||||
|
Add remaining length of src to length.
|
||||||
|
*/
|
||||||
|
while (*q++)
|
||||||
|
length++;
|
||||||
|
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
#endif /* !defined(HAVE_STRLCAT) */
|
||||||
|
|
||||||
|
/*
|
||||||
|
lt_strlcpy copies up to dstsize - 1 characters from the NULL-terminated
|
||||||
|
string src to dst, NULL-terminating the result. The total length of
|
||||||
|
the string which would have been created given sufficient buffer
|
||||||
|
size (may be longer than dstsize) is returned. This function
|
||||||
|
substitutes for strlcpy() which is available under OpenBSD, FreeBSD
|
||||||
|
and Solaris 9.
|
||||||
|
|
||||||
|
Buffer overflow can be checked as follows:
|
||||||
|
|
||||||
|
if (lt_strlcpy(dst, src, dstsize) >= dstsize)
|
||||||
|
return -1;
|
||||||
|
*/
|
||||||
|
#if !defined(HAVE_STRLCPY)
|
||||||
|
size_t
|
||||||
|
lt_strlcpy(char *dst, const char *src, const size_t dstsize)
|
||||||
|
{
|
||||||
|
size_t length=0;
|
||||||
|
char *p;
|
||||||
|
const char *q;
|
||||||
|
|
||||||
|
assert(dst != NULL);
|
||||||
|
assert(src != (const char *) NULL);
|
||||||
|
assert(dstsize >= 1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Copy src to dst within bounds of size-1.
|
||||||
|
*/
|
||||||
|
for ( p=dst, q=src, length=0 ;
|
||||||
|
(*q != 0) && (length < dstsize-1) ;
|
||||||
|
length++, p++, q++ )
|
||||||
|
*p = *q;
|
||||||
|
|
||||||
|
dst[length]='\0';
|
||||||
|
|
||||||
|
/*
|
||||||
|
Add remaining length of src to length.
|
||||||
|
*/
|
||||||
|
while (*q++)
|
||||||
|
length++;
|
||||||
|
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
#endif /* !defined(HAVE_STRLCPY) */
|
210
libltdl/lt_dlloader.c
Normal file
210
libltdl/lt_dlloader.c
Normal file
|
@ -0,0 +1,210 @@
|
||||||
|
/* lt_dlloader.c -- dynamic library loader interface
|
||||||
|
|
||||||
|
Copyright (C) 2004, 2007, 2008 Free Software Foundation, Inc.
|
||||||
|
Written by Gary V. Vaughan, 2004
|
||||||
|
|
||||||
|
NOTE: The canonical source of this file is maintained with the
|
||||||
|
GNU Libtool package. Report bugs to bug-libtool@gnu.org.
|
||||||
|
|
||||||
|
GNU Libltdl is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
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 this file under the
|
||||||
|
same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
GNU Libltdl is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with GNU Libltdl; see the file COPYING.LIB. If not, a
|
||||||
|
copy can be downloaded from http://www.gnu.org/licenses/lgpl.html,
|
||||||
|
or obtained by writing to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "lt__private.h"
|
||||||
|
#include "lt_dlloader.h"
|
||||||
|
|
||||||
|
#define RETURN_SUCCESS 0
|
||||||
|
#define RETURN_FAILURE 1
|
||||||
|
|
||||||
|
static void * loader_callback (SList *item, void *userdata);
|
||||||
|
|
||||||
|
/* A list of all the dlloaders we know about, each stored as a boxed
|
||||||
|
SList item: */
|
||||||
|
static SList *loaders = 0;
|
||||||
|
|
||||||
|
|
||||||
|
/* Return NULL, unless the loader in this ITEM has a matching name,
|
||||||
|
in which case we return the matching item so that its address is
|
||||||
|
passed back out (for possible freeing) by slist_remove. */
|
||||||
|
static void *
|
||||||
|
loader_callback (SList *item, void *userdata)
|
||||||
|
{
|
||||||
|
const lt_dlvtable *vtable = (const lt_dlvtable *) item->userdata;
|
||||||
|
const char * name = (const char *) userdata;
|
||||||
|
|
||||||
|
assert (vtable);
|
||||||
|
|
||||||
|
return streq (vtable->name, name) ? (void *) item : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Hook VTABLE into our global LOADERS list according to its own
|
||||||
|
PRIORITY field value. */
|
||||||
|
int
|
||||||
|
lt_dlloader_add (const lt_dlvtable *vtable)
|
||||||
|
{
|
||||||
|
SList *item;
|
||||||
|
|
||||||
|
if ((vtable == 0) /* diagnose invalid vtable fields */
|
||||||
|
|| (vtable->module_open == 0)
|
||||||
|
|| (vtable->module_close == 0)
|
||||||
|
|| (vtable->find_sym == 0)
|
||||||
|
|| ((vtable->priority != LT_DLLOADER_PREPEND) &&
|
||||||
|
(vtable->priority != LT_DLLOADER_APPEND)))
|
||||||
|
{
|
||||||
|
LT__SETERROR (INVALID_LOADER);
|
||||||
|
return RETURN_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
item = slist_box (vtable);
|
||||||
|
if (!item)
|
||||||
|
{
|
||||||
|
(*lt__alloc_die) ();
|
||||||
|
|
||||||
|
/* Let the caller know something went wrong if lt__alloc_die
|
||||||
|
doesn't abort. */
|
||||||
|
return RETURN_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vtable->priority == LT_DLLOADER_PREPEND)
|
||||||
|
{
|
||||||
|
loaders = slist_cons (item, loaders);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
assert (vtable->priority == LT_DLLOADER_APPEND);
|
||||||
|
loaders = slist_concat (loaders, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
return RETURN_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef LT_DEBUG_LOADERS
|
||||||
|
static void *
|
||||||
|
loader_dump_callback (SList *item, void *userdata)
|
||||||
|
{
|
||||||
|
const lt_dlvtable *vtable = (const lt_dlvtable *) item->userdata;
|
||||||
|
fprintf (stderr, ", %s", (vtable && vtable->name) ? vtable->name : "(null)");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
lt_dlloader_dump (void)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "loaders: ");
|
||||||
|
if (!loaders)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "(empty)");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const lt_dlvtable *head = (const lt_dlvtable *) loaders->userdata;
|
||||||
|
fprintf (stderr, "%s", (head && head->name) ? head->name : "(null)");
|
||||||
|
if (slist_tail (loaders))
|
||||||
|
slist_foreach (slist_tail (loaders), loader_dump_callback, NULL);
|
||||||
|
}
|
||||||
|
fprintf (stderr, "\n");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* An iterator for the global loader list: if LOADER is NULL, then
|
||||||
|
return the first element, otherwise the following element. */
|
||||||
|
lt_dlloader
|
||||||
|
lt_dlloader_next (lt_dlloader loader)
|
||||||
|
{
|
||||||
|
SList *item = (SList *) loader;
|
||||||
|
return (lt_dlloader) (item ? item->next : loaders);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Non-destructive unboxing of a loader. */
|
||||||
|
const lt_dlvtable *
|
||||||
|
lt_dlloader_get (lt_dlloader loader)
|
||||||
|
{
|
||||||
|
return (const lt_dlvtable *) (loader ? ((SList *) loader)->userdata : NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Return the contents of the first item in the global loader list
|
||||||
|
with a matching NAME after removing it from that list. If there
|
||||||
|
was no match, return NULL; if there is an error, return NULL and
|
||||||
|
set an error for lt_dlerror; do not set an error if only resident
|
||||||
|
modules need this loader; in either case, the loader list is not
|
||||||
|
changed if NULL is returned. */
|
||||||
|
lt_dlvtable *
|
||||||
|
lt_dlloader_remove (const char *name)
|
||||||
|
{
|
||||||
|
const lt_dlvtable * vtable = lt_dlloader_find (name);
|
||||||
|
static const char id_string[] = "lt_dlloader_remove";
|
||||||
|
lt_dlinterface_id iface;
|
||||||
|
lt_dlhandle handle = 0;
|
||||||
|
int in_use = 0;
|
||||||
|
int in_use_by_resident = 0;
|
||||||
|
|
||||||
|
if (!vtable)
|
||||||
|
{
|
||||||
|
LT__SETERROR (INVALID_LOADER);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fail if there are any open modules which use this loader. */
|
||||||
|
iface = lt_dlinterface_register (id_string, NULL);
|
||||||
|
while ((handle = lt_dlhandle_iterate (iface, handle)))
|
||||||
|
{
|
||||||
|
lt_dlhandle cur = handle;
|
||||||
|
if (cur->vtable == vtable)
|
||||||
|
{
|
||||||
|
in_use = 1;
|
||||||
|
if (lt_dlisresident (handle))
|
||||||
|
in_use_by_resident = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lt_dlinterface_free (iface);
|
||||||
|
if (in_use)
|
||||||
|
{
|
||||||
|
if (!in_use_by_resident)
|
||||||
|
LT__SETERROR (REMOVE_LOADER);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Call the loader finalisation function. */
|
||||||
|
if (vtable && vtable->dlloader_exit)
|
||||||
|
{
|
||||||
|
if ((*vtable->dlloader_exit) (vtable->dlloader_data) != 0)
|
||||||
|
{
|
||||||
|
/* If there is an exit function, and it returns non-zero
|
||||||
|
then it must set an error, and we will not remove it
|
||||||
|
from the list. */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we got this far, remove the loader from our global list. */
|
||||||
|
return (lt_dlvtable *)
|
||||||
|
slist_unbox ((SList *) slist_remove (&loaders, loader_callback, (void *) name));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const lt_dlvtable *
|
||||||
|
lt_dlloader_find (const char *name)
|
||||||
|
{
|
||||||
|
return lt_dlloader_get (slist_find (loaders, loader_callback, (void *) name));
|
||||||
|
}
|
110
libltdl/lt_error.c
Normal file
110
libltdl/lt_error.c
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
/* lt_error.c -- error propogation interface
|
||||||
|
|
||||||
|
Copyright (C) 1999, 2000, 2001, 2004, 2005, 2007 Free Software Foundation, Inc.
|
||||||
|
Written by Thomas Tanner, 1999
|
||||||
|
|
||||||
|
NOTE: The canonical source of this file is maintained with the
|
||||||
|
GNU Libtool package. Report bugs to bug-libtool@gnu.org.
|
||||||
|
|
||||||
|
GNU Libltdl is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
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 this file under the
|
||||||
|
same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
GNU Libltdl is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with GNU Libltdl; see the file COPYING.LIB. If not, a
|
||||||
|
copy can be downloaded from http://www.gnu.org/licenses/lgpl.html,
|
||||||
|
or obtained by writing to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "lt__private.h"
|
||||||
|
#include "lt_error.h"
|
||||||
|
|
||||||
|
static const char *last_error = 0;
|
||||||
|
static const char error_strings[LT_ERROR_MAX][LT_ERROR_LEN_MAX + 1] =
|
||||||
|
{
|
||||||
|
#define LT_ERROR(name, diagnostic) diagnostic,
|
||||||
|
lt_dlerror_table
|
||||||
|
#undef LT_ERROR
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char **user_error_strings = 0;
|
||||||
|
static int errorcount = LT_ERROR_MAX;
|
||||||
|
|
||||||
|
int
|
||||||
|
lt_dladderror (const char *diagnostic)
|
||||||
|
{
|
||||||
|
int errindex = 0;
|
||||||
|
int result = -1;
|
||||||
|
const char **temp = (const char **) 0;
|
||||||
|
|
||||||
|
assert (diagnostic);
|
||||||
|
|
||||||
|
errindex = errorcount - LT_ERROR_MAX;
|
||||||
|
temp = REALLOC (const char *, user_error_strings, 1 + errindex);
|
||||||
|
if (temp)
|
||||||
|
{
|
||||||
|
user_error_strings = temp;
|
||||||
|
user_error_strings[errindex] = diagnostic;
|
||||||
|
result = errorcount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
lt_dlseterror (int errindex)
|
||||||
|
{
|
||||||
|
int errors = 0;
|
||||||
|
|
||||||
|
if (errindex >= errorcount || errindex < 0)
|
||||||
|
{
|
||||||
|
/* Ack! Error setting the error message! */
|
||||||
|
LT__SETERROR (INVALID_ERRORCODE);
|
||||||
|
++errors;
|
||||||
|
}
|
||||||
|
else if (errindex < LT_ERROR_MAX)
|
||||||
|
{
|
||||||
|
/* No error setting the error message! */
|
||||||
|
LT__SETERRORSTR (error_strings[errindex]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* No error setting the error message! */
|
||||||
|
LT__SETERRORSTR (user_error_strings[errindex - LT_ERROR_MAX]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
lt__error_string (int errorcode)
|
||||||
|
{
|
||||||
|
assert (errorcode >= 0);
|
||||||
|
assert (errorcode < LT_ERROR_MAX);
|
||||||
|
|
||||||
|
return error_strings[errorcode];
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
lt__get_last_error (void)
|
||||||
|
{
|
||||||
|
return last_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
lt__set_last_error (const char *errormsg)
|
||||||
|
{
|
||||||
|
return last_error = errormsg;
|
||||||
|
}
|
2464
libltdl/ltdl.c
Normal file
2464
libltdl/ltdl.c
Normal file
File diff suppressed because it is too large
Load diff
163
libltdl/ltdl.h
Normal file
163
libltdl/ltdl.h
Normal file
|
@ -0,0 +1,163 @@
|
||||||
|
/* ltdl.h -- generic dlopen functions
|
||||||
|
|
||||||
|
Copyright (C) 1998-2000, 2004, 2005,
|
||||||
|
2007, 2008 Free Software Foundation, Inc.
|
||||||
|
Written by Thomas Tanner, 1998
|
||||||
|
|
||||||
|
NOTE: The canonical source of this file is maintained with the
|
||||||
|
GNU Libtool package. Report bugs to bug-libtool@gnu.org.
|
||||||
|
|
||||||
|
GNU Libltdl is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
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 this file under the
|
||||||
|
same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
GNU Libltdl is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with GNU Libltdl; see the file COPYING.LIB. If not, a
|
||||||
|
copy can be downloaded from http://www.gnu.org/licenses/lgpl.html,
|
||||||
|
or obtained by writing to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Only include this header file once. */
|
||||||
|
#if !defined(LTDL_H)
|
||||||
|
#define LTDL_H 1
|
||||||
|
|
||||||
|
#include <libltdl/lt_system.h>
|
||||||
|
#include <libltdl/lt_error.h>
|
||||||
|
#include <libltdl/lt_dlloader.h>
|
||||||
|
|
||||||
|
LT_BEGIN_C_DECLS
|
||||||
|
|
||||||
|
|
||||||
|
/* LT_STRLEN can be used safely on NULL pointers. */
|
||||||
|
#define LT_STRLEN(s) (((s) && (s)[0]) ? strlen (s) : 0)
|
||||||
|
|
||||||
|
|
||||||
|
/* --- DYNAMIC MODULE LOADING API --- */
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct lt__handle *lt_dlhandle; /* A loaded module. */
|
||||||
|
|
||||||
|
/* Initialisation and finalisation functions for libltdl. */
|
||||||
|
LT_SCOPE int lt_dlinit (void);
|
||||||
|
LT_SCOPE int lt_dlexit (void);
|
||||||
|
|
||||||
|
/* Module search path manipulation. */
|
||||||
|
LT_SCOPE int lt_dladdsearchdir (const char *search_dir);
|
||||||
|
LT_SCOPE int lt_dlinsertsearchdir (const char *before,
|
||||||
|
const char *search_dir);
|
||||||
|
LT_SCOPE int lt_dlsetsearchpath (const char *search_path);
|
||||||
|
LT_SCOPE const char *lt_dlgetsearchpath (void);
|
||||||
|
LT_SCOPE int lt_dlforeachfile (
|
||||||
|
const char *search_path,
|
||||||
|
int (*func) (const char *filename, void *data),
|
||||||
|
void *data);
|
||||||
|
|
||||||
|
/* User module loading advisors. */
|
||||||
|
LT_SCOPE int lt_dladvise_init (lt_dladvise *advise);
|
||||||
|
LT_SCOPE int lt_dladvise_destroy (lt_dladvise *advise);
|
||||||
|
LT_SCOPE int lt_dladvise_ext (lt_dladvise *advise);
|
||||||
|
LT_SCOPE int lt_dladvise_resident (lt_dladvise *advise);
|
||||||
|
LT_SCOPE int lt_dladvise_local (lt_dladvise *advise);
|
||||||
|
LT_SCOPE int lt_dladvise_global (lt_dladvise *advise);
|
||||||
|
LT_SCOPE int lt_dladvise_preload (lt_dladvise *advise);
|
||||||
|
|
||||||
|
/* Portable libltdl versions of the system dlopen() API. */
|
||||||
|
LT_SCOPE lt_dlhandle lt_dlopen (const char *filename);
|
||||||
|
LT_SCOPE lt_dlhandle lt_dlopenext (const char *filename);
|
||||||
|
LT_SCOPE lt_dlhandle lt_dlopenadvise (const char *filename,
|
||||||
|
lt_dladvise advise);
|
||||||
|
LT_SCOPE void * lt_dlsym (lt_dlhandle handle, const char *name);
|
||||||
|
LT_SCOPE const char *lt_dlerror (void);
|
||||||
|
LT_SCOPE int lt_dlclose (lt_dlhandle handle);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* --- PRELOADED MODULE SUPPORT --- */
|
||||||
|
|
||||||
|
|
||||||
|
/* A preopened symbol. Arrays of this type comprise the exported
|
||||||
|
symbols for a dlpreopened module. */
|
||||||
|
typedef struct {
|
||||||
|
const char *name;
|
||||||
|
void *address;
|
||||||
|
} lt_dlsymlist;
|
||||||
|
|
||||||
|
typedef int lt_dlpreload_callback_func (lt_dlhandle handle);
|
||||||
|
|
||||||
|
LT_SCOPE int lt_dlpreload (const lt_dlsymlist *preloaded);
|
||||||
|
LT_SCOPE int lt_dlpreload_default (const lt_dlsymlist *preloaded);
|
||||||
|
LT_SCOPE int lt_dlpreload_open (const char *originator,
|
||||||
|
lt_dlpreload_callback_func *func);
|
||||||
|
|
||||||
|
#define lt_preloaded_symbols lt__PROGRAM__LTX_preloaded_symbols
|
||||||
|
/* Ensure C linkage. */
|
||||||
|
extern LT_DLSYM_CONST lt_dlsymlist lt__PROGRAM__LTX_preloaded_symbols[];
|
||||||
|
|
||||||
|
#define LTDL_SET_PRELOADED_SYMBOLS() \
|
||||||
|
lt_dlpreload_default(lt_preloaded_symbols)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* --- MODULE INFORMATION --- */
|
||||||
|
|
||||||
|
|
||||||
|
/* Associating user data with loaded modules. */
|
||||||
|
typedef void * lt_dlinterface_id;
|
||||||
|
typedef int lt_dlhandle_interface (lt_dlhandle handle, const char *id_string);
|
||||||
|
|
||||||
|
LT_SCOPE lt_dlinterface_id lt_dlinterface_register (const char *id_string,
|
||||||
|
lt_dlhandle_interface *iface);
|
||||||
|
LT_SCOPE void lt_dlinterface_free (lt_dlinterface_id key);
|
||||||
|
LT_SCOPE void * lt_dlcaller_set_data (lt_dlinterface_id key,
|
||||||
|
lt_dlhandle handle, void *data);
|
||||||
|
LT_SCOPE void * lt_dlcaller_get_data (lt_dlinterface_id key,
|
||||||
|
lt_dlhandle handle);
|
||||||
|
|
||||||
|
|
||||||
|
/* Read only information pertaining to a loaded module. */
|
||||||
|
typedef struct {
|
||||||
|
char * filename; /* file name */
|
||||||
|
char * name; /* module name */
|
||||||
|
int ref_count; /* number of times lt_dlopened minus
|
||||||
|
number of times lt_dlclosed. */
|
||||||
|
unsigned int is_resident:1; /* module can't be unloaded. */
|
||||||
|
unsigned int is_symglobal:1; /* module symbols can satisfy
|
||||||
|
subsequently loaded modules. */
|
||||||
|
unsigned int is_symlocal:1; /* module symbols are only available
|
||||||
|
locally. */
|
||||||
|
} lt_dlinfo;
|
||||||
|
|
||||||
|
LT_SCOPE const lt_dlinfo *lt_dlgetinfo (lt_dlhandle handle);
|
||||||
|
|
||||||
|
LT_SCOPE lt_dlhandle lt_dlhandle_iterate (lt_dlinterface_id iface,
|
||||||
|
lt_dlhandle place);
|
||||||
|
LT_SCOPE lt_dlhandle lt_dlhandle_fetch (lt_dlinterface_id iface,
|
||||||
|
const char *module_name);
|
||||||
|
LT_SCOPE int lt_dlhandle_map (lt_dlinterface_id iface,
|
||||||
|
int (*func) (lt_dlhandle handle, void *data),
|
||||||
|
void *data);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Deprecated module residency management API. */
|
||||||
|
LT_SCOPE int lt_dlmakeresident (lt_dlhandle handle);
|
||||||
|
LT_SCOPE int lt_dlisresident (lt_dlhandle handle);
|
||||||
|
|
||||||
|
#define lt_ptr void *
|
||||||
|
|
||||||
|
LT_END_C_DECLS
|
||||||
|
|
||||||
|
#endif /*!defined(LTDL_H)*/
|
79
libltdl/m4/argz.m4
Normal file
79
libltdl/m4/argz.m4
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
# Portability macros for glibc argz. -*- Autoconf -*-
|
||||||
|
#
|
||||||
|
# Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
|
||||||
|
# Written by Gary V. Vaughan <gary@gnu.org>
|
||||||
|
#
|
||||||
|
# This file is free software; the Free Software Foundation gives
|
||||||
|
# unlimited permission to copy and/or distribute it, with or without
|
||||||
|
# modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# serial 5 argz.m4
|
||||||
|
|
||||||
|
AC_DEFUN([gl_FUNC_ARGZ],
|
||||||
|
[gl_PREREQ_ARGZ
|
||||||
|
|
||||||
|
AC_CHECK_HEADERS([argz.h], [], [], [AC_INCLUDES_DEFAULT])
|
||||||
|
|
||||||
|
AC_CHECK_TYPES([error_t],
|
||||||
|
[],
|
||||||
|
[AC_DEFINE([error_t], [int],
|
||||||
|
[Define to a type to use for `error_t' if it is not otherwise available.])
|
||||||
|
AC_DEFINE([__error_t_defined], [1], [Define so that glibc/gnulib argp.h
|
||||||
|
does not typedef error_t.])],
|
||||||
|
[#if defined(HAVE_ARGZ_H)
|
||||||
|
# include <argz.h>
|
||||||
|
#endif])
|
||||||
|
|
||||||
|
ARGZ_H=
|
||||||
|
AC_CHECK_FUNCS([argz_add argz_append argz_count argz_create_sep argz_insert \
|
||||||
|
argz_next argz_stringify], [], [ARGZ_H=argz.h; AC_LIBOBJ([argz])])
|
||||||
|
|
||||||
|
dnl if have system argz functions, allow forced use of
|
||||||
|
dnl libltdl-supplied implementation (and default to do so
|
||||||
|
dnl on "known bad" systems). Could use a runtime check, but
|
||||||
|
dnl (a) detecting malloc issues is notoriously unreliable
|
||||||
|
dnl (b) only known system that declares argz functions,
|
||||||
|
dnl provides them, yet they are broken, is cygwin
|
||||||
|
dnl releases prior to 16-Mar-2007 (1.5.24 and earlier)
|
||||||
|
dnl So, it's more straightforward simply to special case
|
||||||
|
dnl this for known bad systems.
|
||||||
|
AS_IF([test -z "$ARGZ_H"],
|
||||||
|
[AC_CACHE_CHECK(
|
||||||
|
[if argz actually works],
|
||||||
|
[lt_cv_sys_argz_works],
|
||||||
|
[[case $host_os in #(
|
||||||
|
*cygwin*)
|
||||||
|
lt_cv_sys_argz_works=no
|
||||||
|
if test "$cross_compiling" != no; then
|
||||||
|
lt_cv_sys_argz_works="guessing no"
|
||||||
|
else
|
||||||
|
lt_sed_extract_leading_digits='s/^\([0-9\.]*\).*/\1/'
|
||||||
|
save_IFS=$IFS
|
||||||
|
IFS=-.
|
||||||
|
set x `uname -r | sed -e "$lt_sed_extract_leading_digits"`
|
||||||
|
IFS=$save_IFS
|
||||||
|
lt_os_major=${2-0}
|
||||||
|
lt_os_minor=${3-0}
|
||||||
|
lt_os_micro=${4-0}
|
||||||
|
if test "$lt_os_major" -gt 1 \
|
||||||
|
|| { test "$lt_os_major" -eq 1 \
|
||||||
|
&& { test "$lt_os_minor" -gt 5 \
|
||||||
|
|| { test "$lt_os_minor" -eq 5 \
|
||||||
|
&& test "$lt_os_micro" -gt 24; }; }; }; then
|
||||||
|
lt_cv_sys_argz_works=yes
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;; #(
|
||||||
|
*) lt_cv_sys_argz_works=yes ;;
|
||||||
|
esac]])
|
||||||
|
AS_IF([test "$lt_cv_sys_argz_works" = yes],
|
||||||
|
[AC_DEFINE([HAVE_WORKING_ARGZ], 1,
|
||||||
|
[This value is set to 1 to indicate that the system argz facility works])],
|
||||||
|
[ARGZ_H=argz.h
|
||||||
|
AC_LIBOBJ([argz])])])
|
||||||
|
|
||||||
|
AC_SUBST([ARGZ_H])
|
||||||
|
])
|
||||||
|
|
||||||
|
# Prerequisites of lib/argz.c.
|
||||||
|
AC_DEFUN([gl_PREREQ_ARGZ], [:])
|
7997
libltdl/m4/libtool.m4
vendored
Normal file
7997
libltdl/m4/libtool.m4
vendored
Normal file
File diff suppressed because it is too large
Load diff
817
libltdl/m4/ltdl.m4
Normal file
817
libltdl/m4/ltdl.m4
Normal file
|
@ -0,0 +1,817 @@
|
||||||
|
# ltdl.m4 - Configure ltdl for the target system. -*-Autoconf-*-
|
||||||
|
#
|
||||||
|
# Copyright (C) 1999-2006, 2007, 2008, 2011 Free Software Foundation, Inc.
|
||||||
|
# Written by Thomas Tanner, 1999
|
||||||
|
#
|
||||||
|
# This file is free software; the Free Software Foundation gives
|
||||||
|
# unlimited permission to copy and/or distribute it, with or without
|
||||||
|
# modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# serial 18 LTDL_INIT
|
||||||
|
|
||||||
|
# LT_CONFIG_LTDL_DIR(DIRECTORY, [LTDL-MODE])
|
||||||
|
# ------------------------------------------
|
||||||
|
# DIRECTORY contains the libltdl sources. It is okay to call this
|
||||||
|
# function multiple times, as long as the same DIRECTORY is always given.
|
||||||
|
AC_DEFUN([LT_CONFIG_LTDL_DIR],
|
||||||
|
[AC_BEFORE([$0], [LTDL_INIT])
|
||||||
|
_$0($*)
|
||||||
|
])# LT_CONFIG_LTDL_DIR
|
||||||
|
|
||||||
|
# We break this out into a separate macro, so that we can call it safely
|
||||||
|
# internally without being caught accidentally by the sed scan in libtoolize.
|
||||||
|
m4_defun([_LT_CONFIG_LTDL_DIR],
|
||||||
|
[dnl remove trailing slashes
|
||||||
|
m4_pushdef([_ARG_DIR], m4_bpatsubst([$1], [/*$]))
|
||||||
|
m4_case(_LTDL_DIR,
|
||||||
|
[], [dnl only set lt_ltdl_dir if _ARG_DIR is not simply `.'
|
||||||
|
m4_if(_ARG_DIR, [.],
|
||||||
|
[],
|
||||||
|
[m4_define([_LTDL_DIR], _ARG_DIR)
|
||||||
|
_LT_SHELL_INIT([lt_ltdl_dir=']_ARG_DIR['])])],
|
||||||
|
[m4_if(_ARG_DIR, _LTDL_DIR,
|
||||||
|
[],
|
||||||
|
[m4_fatal([multiple libltdl directories: `]_LTDL_DIR[', `]_ARG_DIR['])])])
|
||||||
|
m4_popdef([_ARG_DIR])
|
||||||
|
])# _LT_CONFIG_LTDL_DIR
|
||||||
|
|
||||||
|
# Initialise:
|
||||||
|
m4_define([_LTDL_DIR], [])
|
||||||
|
|
||||||
|
|
||||||
|
# _LT_BUILD_PREFIX
|
||||||
|
# ----------------
|
||||||
|
# If Autoconf is new enough, expand to `${top_build_prefix}', otherwise
|
||||||
|
# to `${top_builddir}/'.
|
||||||
|
m4_define([_LT_BUILD_PREFIX],
|
||||||
|
[m4_ifdef([AC_AUTOCONF_VERSION],
|
||||||
|
[m4_if(m4_version_compare(m4_defn([AC_AUTOCONF_VERSION]), [2.62]),
|
||||||
|
[-1], [m4_ifdef([_AC_HAVE_TOP_BUILD_PREFIX],
|
||||||
|
[${top_build_prefix}],
|
||||||
|
[${top_builddir}/])],
|
||||||
|
[${top_build_prefix}])],
|
||||||
|
[${top_builddir}/])[]dnl
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
# LTDL_CONVENIENCE
|
||||||
|
# ----------------
|
||||||
|
# sets LIBLTDL to the link flags for the libltdl convenience library and
|
||||||
|
# LTDLINCL to the include flags for the libltdl header and adds
|
||||||
|
# --enable-ltdl-convenience to the configure arguments. Note that
|
||||||
|
# AC_CONFIG_SUBDIRS is not called here. LIBLTDL will be prefixed with
|
||||||
|
# '${top_build_prefix}' if available, otherwise with '${top_builddir}/',
|
||||||
|
# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single
|
||||||
|
# quotes!). If your package is not flat and you're not using automake,
|
||||||
|
# define top_build_prefix, top_builddir, and top_srcdir appropriately
|
||||||
|
# in your Makefiles.
|
||||||
|
AC_DEFUN([LTDL_CONVENIENCE],
|
||||||
|
[AC_BEFORE([$0], [LTDL_INIT])dnl
|
||||||
|
dnl Although the argument is deprecated and no longer documented,
|
||||||
|
dnl LTDL_CONVENIENCE used to take a DIRECTORY orgument, if we have one
|
||||||
|
dnl here make sure it is the same as any other declaration of libltdl's
|
||||||
|
dnl location! This also ensures lt_ltdl_dir is set when configure.ac is
|
||||||
|
dnl not yet using an explicit LT_CONFIG_LTDL_DIR.
|
||||||
|
m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl
|
||||||
|
_$0()
|
||||||
|
])# LTDL_CONVENIENCE
|
||||||
|
|
||||||
|
# AC_LIBLTDL_CONVENIENCE accepted a directory argument in older libtools,
|
||||||
|
# now we have LT_CONFIG_LTDL_DIR:
|
||||||
|
AU_DEFUN([AC_LIBLTDL_CONVENIENCE],
|
||||||
|
[_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])])
|
||||||
|
_LTDL_CONVENIENCE])
|
||||||
|
|
||||||
|
dnl aclocal-1.4 backwards compatibility:
|
||||||
|
dnl AC_DEFUN([AC_LIBLTDL_CONVENIENCE], [])
|
||||||
|
|
||||||
|
|
||||||
|
# _LTDL_CONVENIENCE
|
||||||
|
# -----------------
|
||||||
|
# Code shared by LTDL_CONVENIENCE and LTDL_INIT([convenience]).
|
||||||
|
m4_defun([_LTDL_CONVENIENCE],
|
||||||
|
[case $enable_ltdl_convenience in
|
||||||
|
no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
|
||||||
|
"") enable_ltdl_convenience=yes
|
||||||
|
ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
|
||||||
|
esac
|
||||||
|
LIBLTDL='_LT_BUILD_PREFIX'"${lt_ltdl_dir+$lt_ltdl_dir/}libltdlc.la"
|
||||||
|
LTDLDEPS=$LIBLTDL
|
||||||
|
LTDLINCL='-I${top_srcdir}'"${lt_ltdl_dir+/$lt_ltdl_dir}"
|
||||||
|
|
||||||
|
AC_SUBST([LIBLTDL])
|
||||||
|
AC_SUBST([LTDLDEPS])
|
||||||
|
AC_SUBST([LTDLINCL])
|
||||||
|
|
||||||
|
# For backwards non-gettext consistent compatibility...
|
||||||
|
INCLTDL="$LTDLINCL"
|
||||||
|
AC_SUBST([INCLTDL])
|
||||||
|
])# _LTDL_CONVENIENCE
|
||||||
|
|
||||||
|
|
||||||
|
# LTDL_INSTALLABLE
|
||||||
|
# ----------------
|
||||||
|
# sets LIBLTDL to the link flags for the libltdl installable library
|
||||||
|
# and LTDLINCL to the include flags for the libltdl header and adds
|
||||||
|
# --enable-ltdl-install to the configure arguments. Note that
|
||||||
|
# AC_CONFIG_SUBDIRS is not called from here. If an installed libltdl
|
||||||
|
# is not found, LIBLTDL will be prefixed with '${top_build_prefix}' if
|
||||||
|
# available, otherwise with '${top_builddir}/', and LTDLINCL will be
|
||||||
|
# prefixed with '${top_srcdir}/' (note the single quotes!). If your
|
||||||
|
# package is not flat and you're not using automake, define top_build_prefix,
|
||||||
|
# top_builddir, and top_srcdir appropriately in your Makefiles.
|
||||||
|
# In the future, this macro may have to be called after LT_INIT.
|
||||||
|
AC_DEFUN([LTDL_INSTALLABLE],
|
||||||
|
[AC_BEFORE([$0], [LTDL_INIT])dnl
|
||||||
|
dnl Although the argument is deprecated and no longer documented,
|
||||||
|
dnl LTDL_INSTALLABLE used to take a DIRECTORY orgument, if we have one
|
||||||
|
dnl here make sure it is the same as any other declaration of libltdl's
|
||||||
|
dnl location! This also ensures lt_ltdl_dir is set when configure.ac is
|
||||||
|
dnl not yet using an explicit LT_CONFIG_LTDL_DIR.
|
||||||
|
m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl
|
||||||
|
_$0()
|
||||||
|
])# LTDL_INSTALLABLE
|
||||||
|
|
||||||
|
# AC_LIBLTDL_INSTALLABLE accepted a directory argument in older libtools,
|
||||||
|
# now we have LT_CONFIG_LTDL_DIR:
|
||||||
|
AU_DEFUN([AC_LIBLTDL_INSTALLABLE],
|
||||||
|
[_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])])
|
||||||
|
_LTDL_INSTALLABLE])
|
||||||
|
|
||||||
|
dnl aclocal-1.4 backwards compatibility:
|
||||||
|
dnl AC_DEFUN([AC_LIBLTDL_INSTALLABLE], [])
|
||||||
|
|
||||||
|
|
||||||
|
# _LTDL_INSTALLABLE
|
||||||
|
# -----------------
|
||||||
|
# Code shared by LTDL_INSTALLABLE and LTDL_INIT([installable]).
|
||||||
|
m4_defun([_LTDL_INSTALLABLE],
|
||||||
|
[if test -f $prefix/lib/libltdl.la; then
|
||||||
|
lt_save_LDFLAGS="$LDFLAGS"
|
||||||
|
LDFLAGS="-L$prefix/lib $LDFLAGS"
|
||||||
|
AC_CHECK_LIB([ltdl], [lt_dlinit], [lt_lib_ltdl=yes])
|
||||||
|
LDFLAGS="$lt_save_LDFLAGS"
|
||||||
|
if test x"${lt_lib_ltdl-no}" = xyes; then
|
||||||
|
if test x"$enable_ltdl_install" != xyes; then
|
||||||
|
# Don't overwrite $prefix/lib/libltdl.la without --enable-ltdl-install
|
||||||
|
AC_MSG_WARN([not overwriting libltdl at $prefix, force with `--enable-ltdl-install'])
|
||||||
|
enable_ltdl_install=no
|
||||||
|
fi
|
||||||
|
elif test x"$enable_ltdl_install" = xno; then
|
||||||
|
AC_MSG_WARN([libltdl not installed, but installation disabled])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If configure.ac declared an installable ltdl, and the user didn't override
|
||||||
|
# with --disable-ltdl-install, we will install the shipped libltdl.
|
||||||
|
case $enable_ltdl_install in
|
||||||
|
no) ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
|
||||||
|
LIBLTDL="-lltdl"
|
||||||
|
LTDLDEPS=
|
||||||
|
LTDLINCL=
|
||||||
|
;;
|
||||||
|
*) enable_ltdl_install=yes
|
||||||
|
ac_configure_args="$ac_configure_args --enable-ltdl-install"
|
||||||
|
LIBLTDL='_LT_BUILD_PREFIX'"${lt_ltdl_dir+$lt_ltdl_dir/}libltdl.la"
|
||||||
|
LTDLDEPS=$LIBLTDL
|
||||||
|
LTDLINCL='-I${top_srcdir}'"${lt_ltdl_dir+/$lt_ltdl_dir}"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
AC_SUBST([LIBLTDL])
|
||||||
|
AC_SUBST([LTDLDEPS])
|
||||||
|
AC_SUBST([LTDLINCL])
|
||||||
|
|
||||||
|
# For backwards non-gettext consistent compatibility...
|
||||||
|
INCLTDL="$LTDLINCL"
|
||||||
|
AC_SUBST([INCLTDL])
|
||||||
|
])# LTDL_INSTALLABLE
|
||||||
|
|
||||||
|
|
||||||
|
# _LTDL_MODE_DISPATCH
|
||||||
|
# -------------------
|
||||||
|
m4_define([_LTDL_MODE_DISPATCH],
|
||||||
|
[dnl If _LTDL_DIR is `.', then we are configuring libltdl itself:
|
||||||
|
m4_if(_LTDL_DIR, [],
|
||||||
|
[],
|
||||||
|
dnl if _LTDL_MODE was not set already, the default value is `subproject':
|
||||||
|
[m4_case(m4_default(_LTDL_MODE, [subproject]),
|
||||||
|
[subproject], [AC_CONFIG_SUBDIRS(_LTDL_DIR)
|
||||||
|
_LT_SHELL_INIT([lt_dlopen_dir="$lt_ltdl_dir"])],
|
||||||
|
[nonrecursive], [_LT_SHELL_INIT([lt_dlopen_dir="$lt_ltdl_dir"; lt_libobj_prefix="$lt_ltdl_dir/"])],
|
||||||
|
[recursive], [],
|
||||||
|
[m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])])dnl
|
||||||
|
dnl Be careful not to expand twice:
|
||||||
|
m4_define([$0], [])
|
||||||
|
])# _LTDL_MODE_DISPATCH
|
||||||
|
|
||||||
|
|
||||||
|
# _LT_LIBOBJ(MODULE_NAME)
|
||||||
|
# -----------------------
|
||||||
|
# Like AC_LIBOBJ, except that MODULE_NAME goes into _LT_LIBOBJS instead
|
||||||
|
# of into LIBOBJS.
|
||||||
|
AC_DEFUN([_LT_LIBOBJ], [
|
||||||
|
m4_pattern_allow([^_LT_LIBOBJS$])
|
||||||
|
_LT_LIBOBJS="$_LT_LIBOBJS $1.$ac_objext"
|
||||||
|
])# _LT_LIBOBJS
|
||||||
|
|
||||||
|
|
||||||
|
# LTDL_INIT([OPTIONS])
|
||||||
|
# --------------------
|
||||||
|
# Clients of libltdl can use this macro to allow the installer to
|
||||||
|
# choose between a shipped copy of the ltdl sources or a preinstalled
|
||||||
|
# version of the library. If the shipped ltdl sources are not in a
|
||||||
|
# subdirectory named libltdl, the directory name must be given by
|
||||||
|
# LT_CONFIG_LTDL_DIR.
|
||||||
|
AC_DEFUN([LTDL_INIT],
|
||||||
|
[dnl Parse OPTIONS
|
||||||
|
_LT_SET_OPTIONS([$0], [$1])
|
||||||
|
|
||||||
|
dnl We need to keep our own list of libobjs separate from our parent project,
|
||||||
|
dnl and the easiest way to do that is redefine the AC_LIBOBJs macro while
|
||||||
|
dnl we look for our own LIBOBJs.
|
||||||
|
m4_pushdef([AC_LIBOBJ], m4_defn([_LT_LIBOBJ]))
|
||||||
|
m4_pushdef([AC_LIBSOURCES])
|
||||||
|
|
||||||
|
dnl If not otherwise defined, default to the 1.5.x compatible subproject mode:
|
||||||
|
m4_if(_LTDL_MODE, [],
|
||||||
|
[m4_define([_LTDL_MODE], m4_default([$2], [subproject]))
|
||||||
|
m4_if([-1], [m4_bregexp(_LTDL_MODE, [\(subproject\|\(non\)?recursive\)])],
|
||||||
|
[m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])])
|
||||||
|
|
||||||
|
AC_ARG_WITH([included_ltdl],
|
||||||
|
[AS_HELP_STRING([--with-included-ltdl],
|
||||||
|
[use the GNU ltdl sources included here])])
|
||||||
|
|
||||||
|
if test "x$with_included_ltdl" != xyes; then
|
||||||
|
# We are not being forced to use the included libltdl sources, so
|
||||||
|
# decide whether there is a useful installed version we can use.
|
||||||
|
AC_CHECK_HEADER([ltdl.h],
|
||||||
|
[AC_CHECK_DECL([lt_dlinterface_register],
|
||||||
|
[AC_CHECK_LIB([ltdl], [lt_dladvise_preload],
|
||||||
|
[with_included_ltdl=no],
|
||||||
|
[with_included_ltdl=yes])],
|
||||||
|
[with_included_ltdl=yes],
|
||||||
|
[AC_INCLUDES_DEFAULT
|
||||||
|
#include <ltdl.h>])],
|
||||||
|
[with_included_ltdl=yes],
|
||||||
|
[AC_INCLUDES_DEFAULT]
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl If neither LT_CONFIG_LTDL_DIR, LTDL_CONVENIENCE nor LTDL_INSTALLABLE
|
||||||
|
dnl was called yet, then for old times' sake, we assume libltdl is in an
|
||||||
|
dnl eponymous directory:
|
||||||
|
AC_PROVIDE_IFELSE([LT_CONFIG_LTDL_DIR], [], [_LT_CONFIG_LTDL_DIR([libltdl])])
|
||||||
|
|
||||||
|
AC_ARG_WITH([ltdl_include],
|
||||||
|
[AS_HELP_STRING([--with-ltdl-include=DIR],
|
||||||
|
[use the ltdl headers installed in DIR])])
|
||||||
|
|
||||||
|
if test -n "$with_ltdl_include"; then
|
||||||
|
if test -f "$with_ltdl_include/ltdl.h"; then :
|
||||||
|
else
|
||||||
|
AC_MSG_ERROR([invalid ltdl include directory: `$with_ltdl_include'])
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
with_ltdl_include=no
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_ARG_WITH([ltdl_lib],
|
||||||
|
[AS_HELP_STRING([--with-ltdl-lib=DIR],
|
||||||
|
[use the libltdl.la installed in DIR])])
|
||||||
|
|
||||||
|
if test -n "$with_ltdl_lib"; then
|
||||||
|
if test -f "$with_ltdl_lib/libltdl.la"; then :
|
||||||
|
else
|
||||||
|
AC_MSG_ERROR([invalid ltdl library directory: `$with_ltdl_lib'])
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
with_ltdl_lib=no
|
||||||
|
fi
|
||||||
|
|
||||||
|
case ,$with_included_ltdl,$with_ltdl_include,$with_ltdl_lib, in
|
||||||
|
,yes,no,no,)
|
||||||
|
m4_case(m4_default(_LTDL_TYPE, [convenience]),
|
||||||
|
[convenience], [_LTDL_CONVENIENCE],
|
||||||
|
[installable], [_LTDL_INSTALLABLE],
|
||||||
|
[m4_fatal([unknown libltdl build type: ]_LTDL_TYPE)])
|
||||||
|
;;
|
||||||
|
,no,no,no,)
|
||||||
|
# If the included ltdl is not to be used, then use the
|
||||||
|
# preinstalled libltdl we found.
|
||||||
|
AC_DEFINE([HAVE_LTDL], [1],
|
||||||
|
[Define this if a modern libltdl is already installed])
|
||||||
|
LIBLTDL=-lltdl
|
||||||
|
LTDLDEPS=
|
||||||
|
LTDLINCL=
|
||||||
|
;;
|
||||||
|
,no*,no,*)
|
||||||
|
AC_MSG_ERROR([`--with-ltdl-include' and `--with-ltdl-lib' options must be used together])
|
||||||
|
;;
|
||||||
|
*) with_included_ltdl=no
|
||||||
|
LIBLTDL="-L$with_ltdl_lib -lltdl"
|
||||||
|
LTDLDEPS=
|
||||||
|
LTDLINCL="-I$with_ltdl_include"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
INCLTDL="$LTDLINCL"
|
||||||
|
|
||||||
|
# Report our decision...
|
||||||
|
AC_MSG_CHECKING([where to find libltdl headers])
|
||||||
|
AC_MSG_RESULT([$LTDLINCL])
|
||||||
|
AC_MSG_CHECKING([where to find libltdl library])
|
||||||
|
AC_MSG_RESULT([$LIBLTDL])
|
||||||
|
|
||||||
|
_LTDL_SETUP
|
||||||
|
|
||||||
|
dnl restore autoconf definition.
|
||||||
|
m4_popdef([AC_LIBOBJ])
|
||||||
|
m4_popdef([AC_LIBSOURCES])
|
||||||
|
|
||||||
|
AC_CONFIG_COMMANDS_PRE([
|
||||||
|
_ltdl_libobjs=
|
||||||
|
_ltdl_ltlibobjs=
|
||||||
|
if test -n "$_LT_LIBOBJS"; then
|
||||||
|
# Remove the extension.
|
||||||
|
_lt_sed_drop_objext='s/\.o$//;s/\.obj$//'
|
||||||
|
for i in `for i in $_LT_LIBOBJS; do echo "$i"; done | sed "$_lt_sed_drop_objext" | sort -u`; do
|
||||||
|
_ltdl_libobjs="$_ltdl_libobjs $lt_libobj_prefix$i.$ac_objext"
|
||||||
|
_ltdl_ltlibobjs="$_ltdl_ltlibobjs $lt_libobj_prefix$i.lo"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
AC_SUBST([ltdl_LIBOBJS], [$_ltdl_libobjs])
|
||||||
|
AC_SUBST([ltdl_LTLIBOBJS], [$_ltdl_ltlibobjs])
|
||||||
|
])
|
||||||
|
|
||||||
|
# Only expand once:
|
||||||
|
m4_define([LTDL_INIT])
|
||||||
|
])# LTDL_INIT
|
||||||
|
|
||||||
|
# Old names:
|
||||||
|
AU_DEFUN([AC_LIB_LTDL], [LTDL_INIT($@)])
|
||||||
|
AU_DEFUN([AC_WITH_LTDL], [LTDL_INIT($@)])
|
||||||
|
AU_DEFUN([LT_WITH_LTDL], [LTDL_INIT($@)])
|
||||||
|
dnl aclocal-1.4 backwards compatibility:
|
||||||
|
dnl AC_DEFUN([AC_LIB_LTDL], [])
|
||||||
|
dnl AC_DEFUN([AC_WITH_LTDL], [])
|
||||||
|
dnl AC_DEFUN([LT_WITH_LTDL], [])
|
||||||
|
|
||||||
|
|
||||||
|
# _LTDL_SETUP
|
||||||
|
# -----------
|
||||||
|
# Perform all the checks necessary for compilation of the ltdl objects
|
||||||
|
# -- including compiler checks and header checks. This is a public
|
||||||
|
# interface mainly for the benefit of libltdl's own configure.ac, most
|
||||||
|
# other users should call LTDL_INIT instead.
|
||||||
|
AC_DEFUN([_LTDL_SETUP],
|
||||||
|
[AC_REQUIRE([AC_PROG_CC])dnl
|
||||||
|
AC_REQUIRE([LT_SYS_MODULE_EXT])dnl
|
||||||
|
AC_REQUIRE([LT_SYS_MODULE_PATH])dnl
|
||||||
|
AC_REQUIRE([LT_SYS_DLSEARCH_PATH])dnl
|
||||||
|
AC_REQUIRE([LT_LIB_DLLOAD])dnl
|
||||||
|
AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl
|
||||||
|
AC_REQUIRE([LT_FUNC_DLSYM_USCORE])dnl
|
||||||
|
AC_REQUIRE([LT_SYS_DLOPEN_DEPLIBS])dnl
|
||||||
|
AC_REQUIRE([gl_FUNC_ARGZ])dnl
|
||||||
|
|
||||||
|
m4_require([_LT_CHECK_OBJDIR])dnl
|
||||||
|
m4_require([_LT_HEADER_DLFCN])dnl
|
||||||
|
m4_require([_LT_CHECK_DLPREOPEN])dnl
|
||||||
|
m4_require([_LT_DECL_SED])dnl
|
||||||
|
|
||||||
|
dnl Don't require this, or it will be expanded earlier than the code
|
||||||
|
dnl that sets the variables it relies on:
|
||||||
|
_LT_ENABLE_INSTALL
|
||||||
|
|
||||||
|
dnl _LTDL_MODE specific code must be called at least once:
|
||||||
|
_LTDL_MODE_DISPATCH
|
||||||
|
|
||||||
|
# In order that ltdl.c can compile, find out the first AC_CONFIG_HEADERS
|
||||||
|
# the user used. This is so that ltdl.h can pick up the parent projects
|
||||||
|
# config.h file, The first file in AC_CONFIG_HEADERS must contain the
|
||||||
|
# definitions required by ltdl.c.
|
||||||
|
# FIXME: Remove use of undocumented AC_LIST_HEADERS (2.59 compatibility).
|
||||||
|
AC_CONFIG_COMMANDS_PRE([dnl
|
||||||
|
m4_pattern_allow([^LT_CONFIG_H$])dnl
|
||||||
|
m4_ifset([AH_HEADER],
|
||||||
|
[LT_CONFIG_H=AH_HEADER],
|
||||||
|
[m4_ifset([AC_LIST_HEADERS],
|
||||||
|
[LT_CONFIG_H=`echo "AC_LIST_HEADERS" | $SED 's,^[[ ]]*,,;s,[[ :]].*$,,'`],
|
||||||
|
[])])])
|
||||||
|
AC_SUBST([LT_CONFIG_H])
|
||||||
|
|
||||||
|
AC_CHECK_HEADERS([unistd.h dl.h sys/dl.h dld.h mach-o/dyld.h dirent.h],
|
||||||
|
[], [], [AC_INCLUDES_DEFAULT])
|
||||||
|
|
||||||
|
AC_CHECK_FUNCS([closedir opendir readdir], [], [AC_LIBOBJ([lt__dirent])])
|
||||||
|
AC_CHECK_FUNCS([strlcat strlcpy], [], [AC_LIBOBJ([lt__strl])])
|
||||||
|
|
||||||
|
m4_pattern_allow([LT_LIBEXT])dnl
|
||||||
|
AC_DEFINE_UNQUOTED([LT_LIBEXT],["$libext"],[The archive extension])
|
||||||
|
|
||||||
|
name=
|
||||||
|
eval "lt_libprefix=\"$libname_spec\""
|
||||||
|
m4_pattern_allow([LT_LIBPREFIX])dnl
|
||||||
|
AC_DEFINE_UNQUOTED([LT_LIBPREFIX],["$lt_libprefix"],[The archive prefix])
|
||||||
|
|
||||||
|
name=ltdl
|
||||||
|
eval "LTDLOPEN=\"$libname_spec\""
|
||||||
|
AC_SUBST([LTDLOPEN])
|
||||||
|
])# _LTDL_SETUP
|
||||||
|
|
||||||
|
|
||||||
|
# _LT_ENABLE_INSTALL
|
||||||
|
# ------------------
|
||||||
|
m4_define([_LT_ENABLE_INSTALL],
|
||||||
|
[AC_ARG_ENABLE([ltdl-install],
|
||||||
|
[AS_HELP_STRING([--enable-ltdl-install], [install libltdl])])
|
||||||
|
|
||||||
|
case ,${enable_ltdl_install},${enable_ltdl_convenience} in
|
||||||
|
*yes*) ;;
|
||||||
|
*) enable_ltdl_convenience=yes ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
m4_ifdef([AM_CONDITIONAL],
|
||||||
|
[AM_CONDITIONAL(INSTALL_LTDL, test x"${enable_ltdl_install-no}" != xno)
|
||||||
|
AM_CONDITIONAL(CONVENIENCE_LTDL, test x"${enable_ltdl_convenience-no}" != xno)])
|
||||||
|
])# _LT_ENABLE_INSTALL
|
||||||
|
|
||||||
|
|
||||||
|
# LT_SYS_DLOPEN_DEPLIBS
|
||||||
|
# ---------------------
|
||||||
|
AC_DEFUN([LT_SYS_DLOPEN_DEPLIBS],
|
||||||
|
[AC_REQUIRE([AC_CANONICAL_HOST])dnl
|
||||||
|
AC_CACHE_CHECK([whether deplibs are loaded by dlopen],
|
||||||
|
[lt_cv_sys_dlopen_deplibs],
|
||||||
|
[# PORTME does your system automatically load deplibs for dlopen?
|
||||||
|
# or its logical equivalent (e.g. shl_load for HP-UX < 11)
|
||||||
|
# For now, we just catch OSes we know something about -- in the
|
||||||
|
# future, we'll try test this programmatically.
|
||||||
|
lt_cv_sys_dlopen_deplibs=unknown
|
||||||
|
case $host_os in
|
||||||
|
aix3*|aix4.1.*|aix4.2.*)
|
||||||
|
# Unknown whether this is true for these versions of AIX, but
|
||||||
|
# we want this `case' here to explicitly catch those versions.
|
||||||
|
lt_cv_sys_dlopen_deplibs=unknown
|
||||||
|
;;
|
||||||
|
aix[[4-9]]*)
|
||||||
|
lt_cv_sys_dlopen_deplibs=yes
|
||||||
|
;;
|
||||||
|
amigaos*)
|
||||||
|
case $host_cpu in
|
||||||
|
powerpc)
|
||||||
|
lt_cv_sys_dlopen_deplibs=no
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
darwin*)
|
||||||
|
# Assuming the user has installed a libdl from somewhere, this is true
|
||||||
|
# If you are looking for one http://www.opendarwin.org/projects/dlcompat
|
||||||
|
lt_cv_sys_dlopen_deplibs=yes
|
||||||
|
;;
|
||||||
|
freebsd* | dragonfly*)
|
||||||
|
lt_cv_sys_dlopen_deplibs=yes
|
||||||
|
;;
|
||||||
|
gnu* | linux* | k*bsd*-gnu | kopensolaris*-gnu)
|
||||||
|
# GNU and its variants, using gnu ld.so (Glibc)
|
||||||
|
lt_cv_sys_dlopen_deplibs=yes
|
||||||
|
;;
|
||||||
|
hpux10*|hpux11*)
|
||||||
|
lt_cv_sys_dlopen_deplibs=yes
|
||||||
|
;;
|
||||||
|
interix*)
|
||||||
|
lt_cv_sys_dlopen_deplibs=yes
|
||||||
|
;;
|
||||||
|
irix[[12345]]*|irix6.[[01]]*)
|
||||||
|
# Catch all versions of IRIX before 6.2, and indicate that we don't
|
||||||
|
# know how it worked for any of those versions.
|
||||||
|
lt_cv_sys_dlopen_deplibs=unknown
|
||||||
|
;;
|
||||||
|
irix*)
|
||||||
|
# The case above catches anything before 6.2, and it's known that
|
||||||
|
# at 6.2 and later dlopen does load deplibs.
|
||||||
|
lt_cv_sys_dlopen_deplibs=yes
|
||||||
|
;;
|
||||||
|
netbsd* | netbsdelf*-gnu)
|
||||||
|
lt_cv_sys_dlopen_deplibs=yes
|
||||||
|
;;
|
||||||
|
openbsd*)
|
||||||
|
lt_cv_sys_dlopen_deplibs=yes
|
||||||
|
;;
|
||||||
|
osf[[1234]]*)
|
||||||
|
# dlopen did load deplibs (at least at 4.x), but until the 5.x series,
|
||||||
|
# it did *not* use an RPATH in a shared library to find objects the
|
||||||
|
# library depends on, so we explicitly say `no'.
|
||||||
|
lt_cv_sys_dlopen_deplibs=no
|
||||||
|
;;
|
||||||
|
osf5.0|osf5.0a|osf5.1)
|
||||||
|
# dlopen *does* load deplibs and with the right loader patch applied
|
||||||
|
# it even uses RPATH in a shared library to search for shared objects
|
||||||
|
# that the library depends on, but there's no easy way to know if that
|
||||||
|
# patch is installed. Since this is the case, all we can really
|
||||||
|
# say is unknown -- it depends on the patch being installed. If
|
||||||
|
# it is, this changes to `yes'. Without it, it would be `no'.
|
||||||
|
lt_cv_sys_dlopen_deplibs=unknown
|
||||||
|
;;
|
||||||
|
osf*)
|
||||||
|
# the two cases above should catch all versions of osf <= 5.1. Read
|
||||||
|
# the comments above for what we know about them.
|
||||||
|
# At > 5.1, deplibs are loaded *and* any RPATH in a shared library
|
||||||
|
# is used to find them so we can finally say `yes'.
|
||||||
|
lt_cv_sys_dlopen_deplibs=yes
|
||||||
|
;;
|
||||||
|
qnx*)
|
||||||
|
lt_cv_sys_dlopen_deplibs=yes
|
||||||
|
;;
|
||||||
|
solaris*)
|
||||||
|
lt_cv_sys_dlopen_deplibs=yes
|
||||||
|
;;
|
||||||
|
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
|
||||||
|
libltdl_cv_sys_dlopen_deplibs=yes
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
])
|
||||||
|
if test "$lt_cv_sys_dlopen_deplibs" != yes; then
|
||||||
|
AC_DEFINE([LTDL_DLOPEN_DEPLIBS], [1],
|
||||||
|
[Define if the OS needs help to load dependent libraries for dlopen().])
|
||||||
|
fi
|
||||||
|
])# LT_SYS_DLOPEN_DEPLIBS
|
||||||
|
|
||||||
|
# Old name:
|
||||||
|
AU_ALIAS([AC_LTDL_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS])
|
||||||
|
dnl aclocal-1.4 backwards compatibility:
|
||||||
|
dnl AC_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], [])
|
||||||
|
|
||||||
|
|
||||||
|
# LT_SYS_MODULE_EXT
|
||||||
|
# -----------------
|
||||||
|
AC_DEFUN([LT_SYS_MODULE_EXT],
|
||||||
|
[m4_require([_LT_SYS_DYNAMIC_LINKER])dnl
|
||||||
|
AC_CACHE_CHECK([which extension is used for runtime loadable modules],
|
||||||
|
[libltdl_cv_shlibext],
|
||||||
|
[
|
||||||
|
module=yes
|
||||||
|
eval libltdl_cv_shlibext=$shrext_cmds
|
||||||
|
module=no
|
||||||
|
eval libltdl_cv_shrext=$shrext_cmds
|
||||||
|
])
|
||||||
|
if test -n "$libltdl_cv_shlibext"; then
|
||||||
|
m4_pattern_allow([LT_MODULE_EXT])dnl
|
||||||
|
AC_DEFINE_UNQUOTED([LT_MODULE_EXT], ["$libltdl_cv_shlibext"],
|
||||||
|
[Define to the extension used for runtime loadable modules, say, ".so".])
|
||||||
|
fi
|
||||||
|
if test "$libltdl_cv_shrext" != "$libltdl_cv_shlibext"; then
|
||||||
|
m4_pattern_allow([LT_SHARED_EXT])dnl
|
||||||
|
AC_DEFINE_UNQUOTED([LT_SHARED_EXT], ["$libltdl_cv_shrext"],
|
||||||
|
[Define to the shared library suffix, say, ".dylib".])
|
||||||
|
fi
|
||||||
|
])# LT_SYS_MODULE_EXT
|
||||||
|
|
||||||
|
# Old name:
|
||||||
|
AU_ALIAS([AC_LTDL_SHLIBEXT], [LT_SYS_MODULE_EXT])
|
||||||
|
dnl aclocal-1.4 backwards compatibility:
|
||||||
|
dnl AC_DEFUN([AC_LTDL_SHLIBEXT], [])
|
||||||
|
|
||||||
|
|
||||||
|
# LT_SYS_MODULE_PATH
|
||||||
|
# ------------------
|
||||||
|
AC_DEFUN([LT_SYS_MODULE_PATH],
|
||||||
|
[m4_require([_LT_SYS_DYNAMIC_LINKER])dnl
|
||||||
|
AC_CACHE_CHECK([which variable specifies run-time module search path],
|
||||||
|
[lt_cv_module_path_var], [lt_cv_module_path_var="$shlibpath_var"])
|
||||||
|
if test -n "$lt_cv_module_path_var"; then
|
||||||
|
m4_pattern_allow([LT_MODULE_PATH_VAR])dnl
|
||||||
|
AC_DEFINE_UNQUOTED([LT_MODULE_PATH_VAR], ["$lt_cv_module_path_var"],
|
||||||
|
[Define to the name of the environment variable that determines the run-time module search path.])
|
||||||
|
fi
|
||||||
|
])# LT_SYS_MODULE_PATH
|
||||||
|
|
||||||
|
# Old name:
|
||||||
|
AU_ALIAS([AC_LTDL_SHLIBPATH], [LT_SYS_MODULE_PATH])
|
||||||
|
dnl aclocal-1.4 backwards compatibility:
|
||||||
|
dnl AC_DEFUN([AC_LTDL_SHLIBPATH], [])
|
||||||
|
|
||||||
|
|
||||||
|
# LT_SYS_DLSEARCH_PATH
|
||||||
|
# --------------------
|
||||||
|
AC_DEFUN([LT_SYS_DLSEARCH_PATH],
|
||||||
|
[m4_require([_LT_SYS_DYNAMIC_LINKER])dnl
|
||||||
|
AC_CACHE_CHECK([for the default library search path],
|
||||||
|
[lt_cv_sys_dlsearch_path],
|
||||||
|
[lt_cv_sys_dlsearch_path="$sys_lib_dlsearch_path_spec"])
|
||||||
|
if test -n "$lt_cv_sys_dlsearch_path"; then
|
||||||
|
sys_dlsearch_path=
|
||||||
|
for dir in $lt_cv_sys_dlsearch_path; do
|
||||||
|
if test -z "$sys_dlsearch_path"; then
|
||||||
|
sys_dlsearch_path="$dir"
|
||||||
|
else
|
||||||
|
sys_dlsearch_path="$sys_dlsearch_path$PATH_SEPARATOR$dir"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
m4_pattern_allow([LT_DLSEARCH_PATH])dnl
|
||||||
|
AC_DEFINE_UNQUOTED([LT_DLSEARCH_PATH], ["$sys_dlsearch_path"],
|
||||||
|
[Define to the system default library search path.])
|
||||||
|
fi
|
||||||
|
])# LT_SYS_DLSEARCH_PATH
|
||||||
|
|
||||||
|
# Old name:
|
||||||
|
AU_ALIAS([AC_LTDL_SYSSEARCHPATH], [LT_SYS_DLSEARCH_PATH])
|
||||||
|
dnl aclocal-1.4 backwards compatibility:
|
||||||
|
dnl AC_DEFUN([AC_LTDL_SYSSEARCHPATH], [])
|
||||||
|
|
||||||
|
|
||||||
|
# _LT_CHECK_DLPREOPEN
|
||||||
|
# -------------------
|
||||||
|
m4_defun([_LT_CHECK_DLPREOPEN],
|
||||||
|
[m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
|
||||||
|
AC_CACHE_CHECK([whether libtool supports -dlopen/-dlpreopen],
|
||||||
|
[libltdl_cv_preloaded_symbols],
|
||||||
|
[if test -n "$lt_cv_sys_global_symbol_pipe"; then
|
||||||
|
libltdl_cv_preloaded_symbols=yes
|
||||||
|
else
|
||||||
|
libltdl_cv_preloaded_symbols=no
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
if test x"$libltdl_cv_preloaded_symbols" = xyes; then
|
||||||
|
AC_DEFINE([HAVE_PRELOADED_SYMBOLS], [1],
|
||||||
|
[Define if libtool can extract symbol lists from object files.])
|
||||||
|
fi
|
||||||
|
])# _LT_CHECK_DLPREOPEN
|
||||||
|
|
||||||
|
|
||||||
|
# LT_LIB_DLLOAD
|
||||||
|
# -------------
|
||||||
|
AC_DEFUN([LT_LIB_DLLOAD],
|
||||||
|
[m4_pattern_allow([^LT_DLLOADERS$])
|
||||||
|
LT_DLLOADERS=
|
||||||
|
AC_SUBST([LT_DLLOADERS])
|
||||||
|
|
||||||
|
AC_LANG_PUSH([C])
|
||||||
|
|
||||||
|
LIBADD_DLOPEN=
|
||||||
|
AC_SEARCH_LIBS([dlopen], [dl],
|
||||||
|
[AC_DEFINE([HAVE_LIBDL], [1],
|
||||||
|
[Define if you have the libdl library or equivalent.])
|
||||||
|
if test "$ac_cv_search_dlopen" != "none required" ; then
|
||||||
|
LIBADD_DLOPEN="-ldl"
|
||||||
|
fi
|
||||||
|
libltdl_cv_lib_dl_dlopen="yes"
|
||||||
|
LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"],
|
||||||
|
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[#if HAVE_DLFCN_H
|
||||||
|
# include <dlfcn.h>
|
||||||
|
#endif
|
||||||
|
]], [[dlopen(0, 0);]])],
|
||||||
|
[AC_DEFINE([HAVE_LIBDL], [1],
|
||||||
|
[Define if you have the libdl library or equivalent.])
|
||||||
|
libltdl_cv_func_dlopen="yes"
|
||||||
|
LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"],
|
||||||
|
[AC_CHECK_LIB([svld], [dlopen],
|
||||||
|
[AC_DEFINE([HAVE_LIBDL], [1],
|
||||||
|
[Define if you have the libdl library or equivalent.])
|
||||||
|
LIBADD_DLOPEN="-lsvld" libltdl_cv_func_dlopen="yes"
|
||||||
|
LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"])])])
|
||||||
|
if test x"$libltdl_cv_func_dlopen" = xyes || test x"$libltdl_cv_lib_dl_dlopen" = xyes
|
||||||
|
then
|
||||||
|
lt_save_LIBS="$LIBS"
|
||||||
|
LIBS="$LIBS $LIBADD_DLOPEN"
|
||||||
|
AC_CHECK_FUNCS([dlerror])
|
||||||
|
LIBS="$lt_save_LIBS"
|
||||||
|
fi
|
||||||
|
AC_SUBST([LIBADD_DLOPEN])
|
||||||
|
|
||||||
|
LIBADD_SHL_LOAD=
|
||||||
|
AC_CHECK_FUNC([shl_load],
|
||||||
|
[AC_DEFINE([HAVE_SHL_LOAD], [1],
|
||||||
|
[Define if you have the shl_load function.])
|
||||||
|
LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la"],
|
||||||
|
[AC_CHECK_LIB([dld], [shl_load],
|
||||||
|
[AC_DEFINE([HAVE_SHL_LOAD], [1],
|
||||||
|
[Define if you have the shl_load function.])
|
||||||
|
LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la"
|
||||||
|
LIBADD_SHL_LOAD="-ldld"])])
|
||||||
|
AC_SUBST([LIBADD_SHL_LOAD])
|
||||||
|
|
||||||
|
case $host_os in
|
||||||
|
darwin[[1567]].*)
|
||||||
|
# We only want this for pre-Mac OS X 10.4.
|
||||||
|
AC_CHECK_FUNC([_dyld_func_lookup],
|
||||||
|
[AC_DEFINE([HAVE_DYLD], [1],
|
||||||
|
[Define if you have the _dyld_func_lookup function.])
|
||||||
|
LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dyld.la"])
|
||||||
|
;;
|
||||||
|
beos*)
|
||||||
|
LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}load_add_on.la"
|
||||||
|
;;
|
||||||
|
cygwin* | mingw* | os2* | pw32*)
|
||||||
|
AC_CHECK_DECLS([cygwin_conv_path], [], [], [[#include <sys/cygwin.h>]])
|
||||||
|
LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}loadlibrary.la"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
AC_CHECK_LIB([dld], [dld_link],
|
||||||
|
[AC_DEFINE([HAVE_DLD], [1],
|
||||||
|
[Define if you have the GNU dld library.])
|
||||||
|
LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dld_link.la"])
|
||||||
|
AC_SUBST([LIBADD_DLD_LINK])
|
||||||
|
|
||||||
|
m4_pattern_allow([^LT_DLPREOPEN$])
|
||||||
|
LT_DLPREOPEN=
|
||||||
|
if test -n "$LT_DLLOADERS"
|
||||||
|
then
|
||||||
|
for lt_loader in $LT_DLLOADERS; do
|
||||||
|
LT_DLPREOPEN="$LT_DLPREOPEN-dlpreopen $lt_loader "
|
||||||
|
done
|
||||||
|
AC_DEFINE([HAVE_LIBDLLOADER], [1],
|
||||||
|
[Define if libdlloader will be built on this platform])
|
||||||
|
fi
|
||||||
|
AC_SUBST([LT_DLPREOPEN])
|
||||||
|
|
||||||
|
dnl This isn't used anymore, but set it for backwards compatibility
|
||||||
|
LIBADD_DL="$LIBADD_DLOPEN $LIBADD_SHL_LOAD"
|
||||||
|
AC_SUBST([LIBADD_DL])
|
||||||
|
|
||||||
|
AC_LANG_POP
|
||||||
|
])# LT_LIB_DLLOAD
|
||||||
|
|
||||||
|
# Old name:
|
||||||
|
AU_ALIAS([AC_LTDL_DLLIB], [LT_LIB_DLLOAD])
|
||||||
|
dnl aclocal-1.4 backwards compatibility:
|
||||||
|
dnl AC_DEFUN([AC_LTDL_DLLIB], [])
|
||||||
|
|
||||||
|
|
||||||
|
# LT_SYS_SYMBOL_USCORE
|
||||||
|
# --------------------
|
||||||
|
# does the compiler prefix global symbols with an underscore?
|
||||||
|
AC_DEFUN([LT_SYS_SYMBOL_USCORE],
|
||||||
|
[m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
|
||||||
|
AC_CACHE_CHECK([for _ prefix in compiled symbols],
|
||||||
|
[lt_cv_sys_symbol_underscore],
|
||||||
|
[lt_cv_sys_symbol_underscore=no
|
||||||
|
cat > conftest.$ac_ext <<_LT_EOF
|
||||||
|
void nm_test_func(){}
|
||||||
|
int main(){nm_test_func;return 0;}
|
||||||
|
_LT_EOF
|
||||||
|
if AC_TRY_EVAL(ac_compile); then
|
||||||
|
# Now try to grab the symbols.
|
||||||
|
ac_nlist=conftest.nm
|
||||||
|
if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then
|
||||||
|
# See whether the symbols have a leading underscore.
|
||||||
|
if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then
|
||||||
|
lt_cv_sys_symbol_underscore=yes
|
||||||
|
else
|
||||||
|
if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then
|
||||||
|
:
|
||||||
|
else
|
||||||
|
echo "configure: cannot find nm_test_func in $ac_nlist" >&AS_MESSAGE_LOG_FD
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD
|
||||||
|
cat conftest.c >&AS_MESSAGE_LOG_FD
|
||||||
|
fi
|
||||||
|
rm -rf conftest*
|
||||||
|
])
|
||||||
|
sys_symbol_underscore=$lt_cv_sys_symbol_underscore
|
||||||
|
AC_SUBST([sys_symbol_underscore])
|
||||||
|
])# LT_SYS_SYMBOL_USCORE
|
||||||
|
|
||||||
|
# Old name:
|
||||||
|
AU_ALIAS([AC_LTDL_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE])
|
||||||
|
dnl aclocal-1.4 backwards compatibility:
|
||||||
|
dnl AC_DEFUN([AC_LTDL_SYMBOL_USCORE], [])
|
||||||
|
|
||||||
|
|
||||||
|
# LT_FUNC_DLSYM_USCORE
|
||||||
|
# --------------------
|
||||||
|
AC_DEFUN([LT_FUNC_DLSYM_USCORE],
|
||||||
|
[AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl
|
||||||
|
if test x"$lt_cv_sys_symbol_underscore" = xyes; then
|
||||||
|
if test x"$libltdl_cv_func_dlopen" = xyes ||
|
||||||
|
test x"$libltdl_cv_lib_dl_dlopen" = xyes ; then
|
||||||
|
AC_CACHE_CHECK([whether we have to add an underscore for dlsym],
|
||||||
|
[libltdl_cv_need_uscore],
|
||||||
|
[libltdl_cv_need_uscore=unknown
|
||||||
|
save_LIBS="$LIBS"
|
||||||
|
LIBS="$LIBS $LIBADD_DLOPEN"
|
||||||
|
_LT_TRY_DLOPEN_SELF(
|
||||||
|
[libltdl_cv_need_uscore=no], [libltdl_cv_need_uscore=yes],
|
||||||
|
[], [libltdl_cv_need_uscore=cross])
|
||||||
|
LIBS="$save_LIBS"
|
||||||
|
])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test x"$libltdl_cv_need_uscore" = xyes; then
|
||||||
|
AC_DEFINE([NEED_USCORE], [1],
|
||||||
|
[Define if dlsym() requires a leading underscore in symbol names.])
|
||||||
|
fi
|
||||||
|
])# LT_FUNC_DLSYM_USCORE
|
||||||
|
|
||||||
|
# Old name:
|
||||||
|
AU_ALIAS([AC_LTDL_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE])
|
||||||
|
dnl aclocal-1.4 backwards compatibility:
|
||||||
|
dnl AC_DEFUN([AC_LTDL_DLSYM_USCORE], [])
|
384
libltdl/m4/ltoptions.m4
vendored
Normal file
384
libltdl/m4/ltoptions.m4
vendored
Normal file
|
@ -0,0 +1,384 @@
|
||||||
|
# Helper functions for option handling. -*- Autoconf -*-
|
||||||
|
#
|
||||||
|
# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
|
||||||
|
# Inc.
|
||||||
|
# Written by Gary V. Vaughan, 2004
|
||||||
|
#
|
||||||
|
# This file is free software; the Free Software Foundation gives
|
||||||
|
# unlimited permission to copy and/or distribute it, with or without
|
||||||
|
# modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# serial 7 ltoptions.m4
|
||||||
|
|
||||||
|
# This is to help aclocal find these macros, as it can't see m4_define.
|
||||||
|
AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
|
||||||
|
|
||||||
|
|
||||||
|
# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
|
||||||
|
# ------------------------------------------
|
||||||
|
m4_define([_LT_MANGLE_OPTION],
|
||||||
|
[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
|
||||||
|
|
||||||
|
|
||||||
|
# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
|
||||||
|
# ---------------------------------------
|
||||||
|
# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
|
||||||
|
# matching handler defined, dispatch to it. Other OPTION-NAMEs are
|
||||||
|
# saved as a flag.
|
||||||
|
m4_define([_LT_SET_OPTION],
|
||||||
|
[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
|
||||||
|
m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
|
||||||
|
_LT_MANGLE_DEFUN([$1], [$2]),
|
||||||
|
[m4_warning([Unknown $1 option `$2'])])[]dnl
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
|
||||||
|
m4_define([_LT_IF_OPTION],
|
||||||
|
[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
|
||||||
|
|
||||||
|
|
||||||
|
# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
|
||||||
|
# -------------------------------------------------------
|
||||||
|
# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
|
||||||
|
# are set.
|
||||||
|
m4_define([_LT_UNLESS_OPTIONS],
|
||||||
|
[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
|
||||||
|
[m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
|
||||||
|
[m4_define([$0_found])])])[]dnl
|
||||||
|
m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
|
||||||
|
])[]dnl
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
|
||||||
|
# ----------------------------------------
|
||||||
|
# OPTION-LIST is a space-separated list of Libtool options associated
|
||||||
|
# with MACRO-NAME. If any OPTION has a matching handler declared with
|
||||||
|
# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
|
||||||
|
# the unknown option and exit.
|
||||||
|
m4_defun([_LT_SET_OPTIONS],
|
||||||
|
[# Set options
|
||||||
|
m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
|
||||||
|
[_LT_SET_OPTION([$1], _LT_Option)])
|
||||||
|
|
||||||
|
m4_if([$1],[LT_INIT],[
|
||||||
|
dnl
|
||||||
|
dnl Simply set some default values (i.e off) if boolean options were not
|
||||||
|
dnl specified:
|
||||||
|
_LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
|
||||||
|
])
|
||||||
|
_LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
|
||||||
|
])
|
||||||
|
dnl
|
||||||
|
dnl If no reference was made to various pairs of opposing options, then
|
||||||
|
dnl we run the default mode handler for the pair. For example, if neither
|
||||||
|
dnl `shared' nor `disable-shared' was passed, we enable building of shared
|
||||||
|
dnl archives by default:
|
||||||
|
_LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
|
||||||
|
_LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
|
||||||
|
_LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
|
||||||
|
_LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
|
||||||
|
[_LT_ENABLE_FAST_INSTALL])
|
||||||
|
])
|
||||||
|
])# _LT_SET_OPTIONS
|
||||||
|
|
||||||
|
|
||||||
|
## --------------------------------- ##
|
||||||
|
## Macros to handle LT_INIT options. ##
|
||||||
|
## --------------------------------- ##
|
||||||
|
|
||||||
|
# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
|
||||||
|
# -----------------------------------------
|
||||||
|
m4_define([_LT_MANGLE_DEFUN],
|
||||||
|
[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
|
||||||
|
|
||||||
|
|
||||||
|
# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
|
||||||
|
# -----------------------------------------------
|
||||||
|
m4_define([LT_OPTION_DEFINE],
|
||||||
|
[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
|
||||||
|
])# LT_OPTION_DEFINE
|
||||||
|
|
||||||
|
|
||||||
|
# dlopen
|
||||||
|
# ------
|
||||||
|
LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
|
||||||
|
])
|
||||||
|
|
||||||
|
AU_DEFUN([AC_LIBTOOL_DLOPEN],
|
||||||
|
[_LT_SET_OPTION([LT_INIT], [dlopen])
|
||||||
|
AC_DIAGNOSE([obsolete],
|
||||||
|
[$0: Remove this warning and the call to _LT_SET_OPTION when you
|
||||||
|
put the `dlopen' option into LT_INIT's first parameter.])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl aclocal-1.4 backwards compatibility:
|
||||||
|
dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
|
||||||
|
|
||||||
|
|
||||||
|
# win32-dll
|
||||||
|
# ---------
|
||||||
|
# Declare package support for building win32 dll's.
|
||||||
|
LT_OPTION_DEFINE([LT_INIT], [win32-dll],
|
||||||
|
[enable_win32_dll=yes
|
||||||
|
|
||||||
|
case $host in
|
||||||
|
*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
|
||||||
|
AC_CHECK_TOOL(AS, as, false)
|
||||||
|
AC_CHECK_TOOL(DLLTOOL, dlltool, false)
|
||||||
|
AC_CHECK_TOOL(OBJDUMP, objdump, false)
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
test -z "$AS" && AS=as
|
||||||
|
_LT_DECL([], [AS], [1], [Assembler program])dnl
|
||||||
|
|
||||||
|
test -z "$DLLTOOL" && DLLTOOL=dlltool
|
||||||
|
_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
|
||||||
|
|
||||||
|
test -z "$OBJDUMP" && OBJDUMP=objdump
|
||||||
|
_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
|
||||||
|
])# win32-dll
|
||||||
|
|
||||||
|
AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
|
||||||
|
[AC_REQUIRE([AC_CANONICAL_HOST])dnl
|
||||||
|
_LT_SET_OPTION([LT_INIT], [win32-dll])
|
||||||
|
AC_DIAGNOSE([obsolete],
|
||||||
|
[$0: Remove this warning and the call to _LT_SET_OPTION when you
|
||||||
|
put the `win32-dll' option into LT_INIT's first parameter.])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl aclocal-1.4 backwards compatibility:
|
||||||
|
dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
|
||||||
|
|
||||||
|
|
||||||
|
# _LT_ENABLE_SHARED([DEFAULT])
|
||||||
|
# ----------------------------
|
||||||
|
# implement the --enable-shared flag, and supports the `shared' and
|
||||||
|
# `disable-shared' LT_INIT options.
|
||||||
|
# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
|
||||||
|
m4_define([_LT_ENABLE_SHARED],
|
||||||
|
[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
|
||||||
|
AC_ARG_ENABLE([shared],
|
||||||
|
[AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
|
||||||
|
[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
|
||||||
|
[p=${PACKAGE-default}
|
||||||
|
case $enableval in
|
||||||
|
yes) enable_shared=yes ;;
|
||||||
|
no) enable_shared=no ;;
|
||||||
|
*)
|
||||||
|
enable_shared=no
|
||||||
|
# Look at the argument we got. We use all the common list separators.
|
||||||
|
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
|
||||||
|
for pkg in $enableval; do
|
||||||
|
IFS="$lt_save_ifs"
|
||||||
|
if test "X$pkg" = "X$p"; then
|
||||||
|
enable_shared=yes
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
IFS="$lt_save_ifs"
|
||||||
|
;;
|
||||||
|
esac],
|
||||||
|
[enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
|
||||||
|
|
||||||
|
_LT_DECL([build_libtool_libs], [enable_shared], [0],
|
||||||
|
[Whether or not to build shared libraries])
|
||||||
|
])# _LT_ENABLE_SHARED
|
||||||
|
|
||||||
|
LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
|
||||||
|
LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
|
||||||
|
|
||||||
|
# Old names:
|
||||||
|
AC_DEFUN([AC_ENABLE_SHARED],
|
||||||
|
[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([AC_DISABLE_SHARED],
|
||||||
|
[_LT_SET_OPTION([LT_INIT], [disable-shared])
|
||||||
|
])
|
||||||
|
|
||||||
|
AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
|
||||||
|
AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
|
||||||
|
|
||||||
|
dnl aclocal-1.4 backwards compatibility:
|
||||||
|
dnl AC_DEFUN([AM_ENABLE_SHARED], [])
|
||||||
|
dnl AC_DEFUN([AM_DISABLE_SHARED], [])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# _LT_ENABLE_STATIC([DEFAULT])
|
||||||
|
# ----------------------------
|
||||||
|
# implement the --enable-static flag, and support the `static' and
|
||||||
|
# `disable-static' LT_INIT options.
|
||||||
|
# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
|
||||||
|
m4_define([_LT_ENABLE_STATIC],
|
||||||
|
[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
|
||||||
|
AC_ARG_ENABLE([static],
|
||||||
|
[AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
|
||||||
|
[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
|
||||||
|
[p=${PACKAGE-default}
|
||||||
|
case $enableval in
|
||||||
|
yes) enable_static=yes ;;
|
||||||
|
no) enable_static=no ;;
|
||||||
|
*)
|
||||||
|
enable_static=no
|
||||||
|
# Look at the argument we got. We use all the common list separators.
|
||||||
|
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
|
||||||
|
for pkg in $enableval; do
|
||||||
|
IFS="$lt_save_ifs"
|
||||||
|
if test "X$pkg" = "X$p"; then
|
||||||
|
enable_static=yes
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
IFS="$lt_save_ifs"
|
||||||
|
;;
|
||||||
|
esac],
|
||||||
|
[enable_static=]_LT_ENABLE_STATIC_DEFAULT)
|
||||||
|
|
||||||
|
_LT_DECL([build_old_libs], [enable_static], [0],
|
||||||
|
[Whether or not to build static libraries])
|
||||||
|
])# _LT_ENABLE_STATIC
|
||||||
|
|
||||||
|
LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
|
||||||
|
LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
|
||||||
|
|
||||||
|
# Old names:
|
||||||
|
AC_DEFUN([AC_ENABLE_STATIC],
|
||||||
|
[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([AC_DISABLE_STATIC],
|
||||||
|
[_LT_SET_OPTION([LT_INIT], [disable-static])
|
||||||
|
])
|
||||||
|
|
||||||
|
AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
|
||||||
|
AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
|
||||||
|
|
||||||
|
dnl aclocal-1.4 backwards compatibility:
|
||||||
|
dnl AC_DEFUN([AM_ENABLE_STATIC], [])
|
||||||
|
dnl AC_DEFUN([AM_DISABLE_STATIC], [])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# _LT_ENABLE_FAST_INSTALL([DEFAULT])
|
||||||
|
# ----------------------------------
|
||||||
|
# implement the --enable-fast-install flag, and support the `fast-install'
|
||||||
|
# and `disable-fast-install' LT_INIT options.
|
||||||
|
# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
|
||||||
|
m4_define([_LT_ENABLE_FAST_INSTALL],
|
||||||
|
[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
|
||||||
|
AC_ARG_ENABLE([fast-install],
|
||||||
|
[AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
|
||||||
|
[optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
|
||||||
|
[p=${PACKAGE-default}
|
||||||
|
case $enableval in
|
||||||
|
yes) enable_fast_install=yes ;;
|
||||||
|
no) enable_fast_install=no ;;
|
||||||
|
*)
|
||||||
|
enable_fast_install=no
|
||||||
|
# Look at the argument we got. We use all the common list separators.
|
||||||
|
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
|
||||||
|
for pkg in $enableval; do
|
||||||
|
IFS="$lt_save_ifs"
|
||||||
|
if test "X$pkg" = "X$p"; then
|
||||||
|
enable_fast_install=yes
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
IFS="$lt_save_ifs"
|
||||||
|
;;
|
||||||
|
esac],
|
||||||
|
[enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
|
||||||
|
|
||||||
|
_LT_DECL([fast_install], [enable_fast_install], [0],
|
||||||
|
[Whether or not to optimize for fast installation])dnl
|
||||||
|
])# _LT_ENABLE_FAST_INSTALL
|
||||||
|
|
||||||
|
LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
|
||||||
|
LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
|
||||||
|
|
||||||
|
# Old names:
|
||||||
|
AU_DEFUN([AC_ENABLE_FAST_INSTALL],
|
||||||
|
[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
|
||||||
|
AC_DIAGNOSE([obsolete],
|
||||||
|
[$0: Remove this warning and the call to _LT_SET_OPTION when you put
|
||||||
|
the `fast-install' option into LT_INIT's first parameter.])
|
||||||
|
])
|
||||||
|
|
||||||
|
AU_DEFUN([AC_DISABLE_FAST_INSTALL],
|
||||||
|
[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
|
||||||
|
AC_DIAGNOSE([obsolete],
|
||||||
|
[$0: Remove this warning and the call to _LT_SET_OPTION when you put
|
||||||
|
the `disable-fast-install' option into LT_INIT's first parameter.])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl aclocal-1.4 backwards compatibility:
|
||||||
|
dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
|
||||||
|
dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
|
||||||
|
|
||||||
|
|
||||||
|
# _LT_WITH_PIC([MODE])
|
||||||
|
# --------------------
|
||||||
|
# implement the --with-pic flag, and support the `pic-only' and `no-pic'
|
||||||
|
# LT_INIT options.
|
||||||
|
# MODE is either `yes' or `no'. If omitted, it defaults to `both'.
|
||||||
|
m4_define([_LT_WITH_PIC],
|
||||||
|
[AC_ARG_WITH([pic],
|
||||||
|
[AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
|
||||||
|
[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
|
||||||
|
[lt_p=${PACKAGE-default}
|
||||||
|
case $withval in
|
||||||
|
yes|no) pic_mode=$withval ;;
|
||||||
|
*)
|
||||||
|
pic_mode=default
|
||||||
|
# Look at the argument we got. We use all the common list separators.
|
||||||
|
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
|
||||||
|
for lt_pkg in $withval; do
|
||||||
|
IFS="$lt_save_ifs"
|
||||||
|
if test "X$lt_pkg" = "X$lt_p"; then
|
||||||
|
pic_mode=yes
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
IFS="$lt_save_ifs"
|
||||||
|
;;
|
||||||
|
esac],
|
||||||
|
[pic_mode=default])
|
||||||
|
|
||||||
|
test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
|
||||||
|
|
||||||
|
_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
|
||||||
|
])# _LT_WITH_PIC
|
||||||
|
|
||||||
|
LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
|
||||||
|
LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
|
||||||
|
|
||||||
|
# Old name:
|
||||||
|
AU_DEFUN([AC_LIBTOOL_PICMODE],
|
||||||
|
[_LT_SET_OPTION([LT_INIT], [pic-only])
|
||||||
|
AC_DIAGNOSE([obsolete],
|
||||||
|
[$0: Remove this warning and the call to _LT_SET_OPTION when you
|
||||||
|
put the `pic-only' option into LT_INIT's first parameter.])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl aclocal-1.4 backwards compatibility:
|
||||||
|
dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
|
||||||
|
|
||||||
|
## ----------------- ##
|
||||||
|
## LTDL_INIT Options ##
|
||||||
|
## ----------------- ##
|
||||||
|
|
||||||
|
m4_define([_LTDL_MODE], [])
|
||||||
|
LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
|
||||||
|
[m4_define([_LTDL_MODE], [nonrecursive])])
|
||||||
|
LT_OPTION_DEFINE([LTDL_INIT], [recursive],
|
||||||
|
[m4_define([_LTDL_MODE], [recursive])])
|
||||||
|
LT_OPTION_DEFINE([LTDL_INIT], [subproject],
|
||||||
|
[m4_define([_LTDL_MODE], [subproject])])
|
||||||
|
|
||||||
|
m4_define([_LTDL_TYPE], [])
|
||||||
|
LT_OPTION_DEFINE([LTDL_INIT], [installable],
|
||||||
|
[m4_define([_LTDL_TYPE], [installable])])
|
||||||
|
LT_OPTION_DEFINE([LTDL_INIT], [convenience],
|
||||||
|
[m4_define([_LTDL_TYPE], [convenience])])
|
123
libltdl/m4/ltsugar.m4
vendored
Normal file
123
libltdl/m4/ltsugar.m4
vendored
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*-
|
||||||
|
#
|
||||||
|
# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
|
||||||
|
# Written by Gary V. Vaughan, 2004
|
||||||
|
#
|
||||||
|
# This file is free software; the Free Software Foundation gives
|
||||||
|
# unlimited permission to copy and/or distribute it, with or without
|
||||||
|
# modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# serial 6 ltsugar.m4
|
||||||
|
|
||||||
|
# This is to help aclocal find these macros, as it can't see m4_define.
|
||||||
|
AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
|
||||||
|
|
||||||
|
|
||||||
|
# lt_join(SEP, ARG1, [ARG2...])
|
||||||
|
# -----------------------------
|
||||||
|
# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
|
||||||
|
# associated separator.
|
||||||
|
# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
|
||||||
|
# versions in m4sugar had bugs.
|
||||||
|
m4_define([lt_join],
|
||||||
|
[m4_if([$#], [1], [],
|
||||||
|
[$#], [2], [[$2]],
|
||||||
|
[m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
|
||||||
|
m4_define([_lt_join],
|
||||||
|
[m4_if([$#$2], [2], [],
|
||||||
|
[m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
|
||||||
|
|
||||||
|
|
||||||
|
# lt_car(LIST)
|
||||||
|
# lt_cdr(LIST)
|
||||||
|
# ------------
|
||||||
|
# Manipulate m4 lists.
|
||||||
|
# These macros are necessary as long as will still need to support
|
||||||
|
# Autoconf-2.59 which quotes differently.
|
||||||
|
m4_define([lt_car], [[$1]])
|
||||||
|
m4_define([lt_cdr],
|
||||||
|
[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
|
||||||
|
[$#], 1, [],
|
||||||
|
[m4_dquote(m4_shift($@))])])
|
||||||
|
m4_define([lt_unquote], $1)
|
||||||
|
|
||||||
|
|
||||||
|
# lt_append(MACRO-NAME, STRING, [SEPARATOR])
|
||||||
|
# ------------------------------------------
|
||||||
|
# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
|
||||||
|
# Note that neither SEPARATOR nor STRING are expanded; they are appended
|
||||||
|
# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
|
||||||
|
# No SEPARATOR is output if MACRO-NAME was previously undefined (different
|
||||||
|
# than defined and empty).
|
||||||
|
#
|
||||||
|
# This macro is needed until we can rely on Autoconf 2.62, since earlier
|
||||||
|
# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
|
||||||
|
m4_define([lt_append],
|
||||||
|
[m4_define([$1],
|
||||||
|
m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
|
||||||
|
# ----------------------------------------------------------
|
||||||
|
# Produce a SEP delimited list of all paired combinations of elements of
|
||||||
|
# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list
|
||||||
|
# has the form PREFIXmINFIXSUFFIXn.
|
||||||
|
# Needed until we can rely on m4_combine added in Autoconf 2.62.
|
||||||
|
m4_define([lt_combine],
|
||||||
|
[m4_if(m4_eval([$# > 3]), [1],
|
||||||
|
[m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
|
||||||
|
[[m4_foreach([_Lt_prefix], [$2],
|
||||||
|
[m4_foreach([_Lt_suffix],
|
||||||
|
]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
|
||||||
|
[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
|
||||||
|
|
||||||
|
|
||||||
|
# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
|
||||||
|
# -----------------------------------------------------------------------
|
||||||
|
# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
|
||||||
|
# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
|
||||||
|
m4_define([lt_if_append_uniq],
|
||||||
|
[m4_ifdef([$1],
|
||||||
|
[m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
|
||||||
|
[lt_append([$1], [$2], [$3])$4],
|
||||||
|
[$5])],
|
||||||
|
[lt_append([$1], [$2], [$3])$4])])
|
||||||
|
|
||||||
|
|
||||||
|
# lt_dict_add(DICT, KEY, VALUE)
|
||||||
|
# -----------------------------
|
||||||
|
m4_define([lt_dict_add],
|
||||||
|
[m4_define([$1($2)], [$3])])
|
||||||
|
|
||||||
|
|
||||||
|
# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
|
||||||
|
# --------------------------------------------
|
||||||
|
m4_define([lt_dict_add_subkey],
|
||||||
|
[m4_define([$1($2:$3)], [$4])])
|
||||||
|
|
||||||
|
|
||||||
|
# lt_dict_fetch(DICT, KEY, [SUBKEY])
|
||||||
|
# ----------------------------------
|
||||||
|
m4_define([lt_dict_fetch],
|
||||||
|
[m4_ifval([$3],
|
||||||
|
m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
|
||||||
|
m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
|
||||||
|
|
||||||
|
|
||||||
|
# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
|
||||||
|
# -----------------------------------------------------------------
|
||||||
|
m4_define([lt_if_dict_fetch],
|
||||||
|
[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
|
||||||
|
[$5],
|
||||||
|
[$6])])
|
||||||
|
|
||||||
|
|
||||||
|
# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
|
||||||
|
# --------------------------------------------------------------
|
||||||
|
m4_define([lt_dict_filter],
|
||||||
|
[m4_if([$5], [], [],
|
||||||
|
[lt_join(m4_quote(m4_default([$4], [[, ]])),
|
||||||
|
lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
|
||||||
|
[lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
|
||||||
|
])
|
23
libltdl/m4/ltversion.m4
vendored
Normal file
23
libltdl/m4/ltversion.m4
vendored
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# ltversion.m4 -- version numbers -*- Autoconf -*-
|
||||||
|
#
|
||||||
|
# Copyright (C) 2004 Free Software Foundation, Inc.
|
||||||
|
# Written by Scott James Remnant, 2004
|
||||||
|
#
|
||||||
|
# This file is free software; the Free Software Foundation gives
|
||||||
|
# unlimited permission to copy and/or distribute it, with or without
|
||||||
|
# modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
|
# serial 3337 ltversion.m4
|
||||||
|
# This file is part of GNU Libtool
|
||||||
|
|
||||||
|
m4_define([LT_PACKAGE_VERSION], [2.4.2])
|
||||||
|
m4_define([LT_PACKAGE_REVISION], [1.3337])
|
||||||
|
|
||||||
|
AC_DEFUN([LTVERSION_VERSION],
|
||||||
|
[macro_version='2.4.2'
|
||||||
|
macro_revision='1.3337'
|
||||||
|
_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
|
||||||
|
_LT_DECL(, macro_revision, 0)
|
||||||
|
])
|
98
libltdl/m4/lt~obsolete.m4
vendored
Normal file
98
libltdl/m4/lt~obsolete.m4
vendored
Normal file
|
@ -0,0 +1,98 @@
|
||||||
|
# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*-
|
||||||
|
#
|
||||||
|
# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
|
||||||
|
# Written by Scott James Remnant, 2004.
|
||||||
|
#
|
||||||
|
# This file is free software; the Free Software Foundation gives
|
||||||
|
# unlimited permission to copy and/or distribute it, with or without
|
||||||
|
# modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# serial 5 lt~obsolete.m4
|
||||||
|
|
||||||
|
# These exist entirely to fool aclocal when bootstrapping libtool.
|
||||||
|
#
|
||||||
|
# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
|
||||||
|
# which have later been changed to m4_define as they aren't part of the
|
||||||
|
# exported API, or moved to Autoconf or Automake where they belong.
|
||||||
|
#
|
||||||
|
# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN
|
||||||
|
# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
|
||||||
|
# using a macro with the same name in our local m4/libtool.m4 it'll
|
||||||
|
# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
|
||||||
|
# and doesn't know about Autoconf macros at all.)
|
||||||
|
#
|
||||||
|
# So we provide this file, which has a silly filename so it's always
|
||||||
|
# included after everything else. This provides aclocal with the
|
||||||
|
# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
|
||||||
|
# because those macros already exist, or will be overwritten later.
|
||||||
|
# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6.
|
||||||
|
#
|
||||||
|
# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
|
||||||
|
# Yes, that means every name once taken will need to remain here until
|
||||||
|
# we give up compatibility with versions before 1.7, at which point
|
||||||
|
# we need to keep only those names which we still refer to.
|
||||||
|
|
||||||
|
# This is to help aclocal find these macros, as it can't see m4_define.
|
||||||
|
AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
|
||||||
|
|
||||||
|
m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
|
||||||
|
m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])])
|
||||||
|
m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
|
||||||
|
m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])])
|
||||||
|
m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
|
||||||
|
m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])])
|
||||||
|
m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])])
|
||||||
|
m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
|
||||||
|
m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])])
|
||||||
|
m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])])
|
||||||
|
m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
|
||||||
|
m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])])
|
||||||
|
m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
|
||||||
|
m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])])
|
||||||
|
m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])])
|
||||||
|
m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
|
||||||
|
m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
|
||||||
|
m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])])
|
||||||
|
m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])])
|
||||||
|
m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])])
|
||||||
|
m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
|
||||||
|
m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])])
|
||||||
|
m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])])
|
||||||
|
m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
|
||||||
|
m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])])
|
||||||
|
m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
|
||||||
|
m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])])
|
||||||
|
m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])])
|
||||||
|
m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
|
||||||
|
m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
|
||||||
|
m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
|
||||||
|
m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
|
||||||
|
m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
|
||||||
|
m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
|
||||||
|
m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])])
|
||||||
|
m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
|
||||||
|
m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
|
||||||
|
m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])])
|
||||||
|
m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
|
||||||
|
m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
|
||||||
|
m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])])
|
||||||
|
m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])])
|
||||||
|
m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])])
|
379
libltdl/slist.c
Normal file
379
libltdl/slist.c
Normal file
|
@ -0,0 +1,379 @@
|
||||||
|
/* slist.c -- generalised singly linked lists
|
||||||
|
|
||||||
|
Copyright (C) 2000, 2004, 2007, 2008, 2009 Free Software Foundation, Inc.
|
||||||
|
Written by Gary V. Vaughan, 2000
|
||||||
|
|
||||||
|
NOTE: The canonical source of this file is maintained with the
|
||||||
|
GNU Libtool package. Report bugs to bug-libtool@gnu.org.
|
||||||
|
|
||||||
|
GNU Libltdl is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
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 this file under the
|
||||||
|
same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
GNU Libltdl is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with GNU Libltdl; see the file COPYING.LIB. If not, a
|
||||||
|
copy can be downloaded from http://www.gnu.org/licenses/lgpl.html,
|
||||||
|
or obtained by writing to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include "slist.h"
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
static SList * slist_sort_merge (SList *left, SList *right,
|
||||||
|
SListCompare *compare, void *userdata);
|
||||||
|
|
||||||
|
|
||||||
|
/* Call DELETE repeatedly on each element of HEAD.
|
||||||
|
|
||||||
|
CAVEAT: If you call this when HEAD is the start of a list of boxed
|
||||||
|
items, you must remember that each item passed back to your
|
||||||
|
DELETE function will be a boxed item that must be slist_unbox()ed
|
||||||
|
before operating on its contents.
|
||||||
|
|
||||||
|
e.g. void boxed_delete (void *item) { item_free (slist_unbox (item)); }
|
||||||
|
...
|
||||||
|
slist = slist_delete (slist, boxed_delete);
|
||||||
|
...
|
||||||
|
*/
|
||||||
|
SList *
|
||||||
|
slist_delete (SList *head, void (*delete_fct) (void *item))
|
||||||
|
{
|
||||||
|
assert (delete_fct);
|
||||||
|
|
||||||
|
while (head)
|
||||||
|
{
|
||||||
|
SList *next = head->next;
|
||||||
|
(*delete_fct) (head);
|
||||||
|
head = next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Call FIND repeatedly with MATCHDATA and each item of *PHEAD, until
|
||||||
|
FIND returns non-NULL, or the list is exhausted. If a match is found
|
||||||
|
the matching item is destructively removed from *PHEAD, and the value
|
||||||
|
returned by the matching call to FIND is returned.
|
||||||
|
|
||||||
|
CAVEAT: To avoid memory leaks, unless you already have the address of
|
||||||
|
the stale item, you should probably return that from FIND if
|
||||||
|
it makes a successful match. Don't forget to slist_unbox()
|
||||||
|
every item in a boxed list before operating on its contents. */
|
||||||
|
SList *
|
||||||
|
slist_remove (SList **phead, SListCallback *find, void *matchdata)
|
||||||
|
{
|
||||||
|
SList *stale = 0;
|
||||||
|
void *result = 0;
|
||||||
|
|
||||||
|
assert (find);
|
||||||
|
|
||||||
|
if (!phead || !*phead)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* Does the head of the passed list match? */
|
||||||
|
result = (*find) (*phead, matchdata);
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
stale = *phead;
|
||||||
|
*phead = stale->next;
|
||||||
|
}
|
||||||
|
/* what about the rest of the elements? */
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SList *head;
|
||||||
|
for (head = *phead; head->next; head = head->next)
|
||||||
|
{
|
||||||
|
result = (*find) (head->next, matchdata);
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
stale = head->next;
|
||||||
|
head->next = stale->next;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (SList *) result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Call FIND repeatedly with each element of SLIST and MATCHDATA, until
|
||||||
|
FIND returns non-NULL, or the list is exhausted. If a match is found
|
||||||
|
the value returned by the matching call to FIND is returned. */
|
||||||
|
void *
|
||||||
|
slist_find (SList *slist, SListCallback *find, void *matchdata)
|
||||||
|
{
|
||||||
|
void *result = 0;
|
||||||
|
|
||||||
|
assert (find);
|
||||||
|
|
||||||
|
for (; slist; slist = slist->next)
|
||||||
|
{
|
||||||
|
result = (*find) (slist, matchdata);
|
||||||
|
if (result)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return a single list, composed by destructively concatenating the
|
||||||
|
items in HEAD and TAIL. The values of HEAD and TAIL are undefined
|
||||||
|
after calling this function.
|
||||||
|
|
||||||
|
CAVEAT: Don't mix boxed and unboxed items in a single list.
|
||||||
|
|
||||||
|
e.g. slist1 = slist_concat (slist1, slist2); */
|
||||||
|
SList *
|
||||||
|
slist_concat (SList *head, SList *tail)
|
||||||
|
{
|
||||||
|
SList *last;
|
||||||
|
|
||||||
|
if (!head)
|
||||||
|
{
|
||||||
|
return tail;
|
||||||
|
}
|
||||||
|
|
||||||
|
last = head;
|
||||||
|
while (last->next)
|
||||||
|
last = last->next;
|
||||||
|
|
||||||
|
last->next = tail;
|
||||||
|
|
||||||
|
return head;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return a single list, composed by destructively appending all of
|
||||||
|
the items in SLIST to ITEM. The values of ITEM and SLIST are undefined
|
||||||
|
after calling this function.
|
||||||
|
|
||||||
|
CAVEAT: Don't mix boxed and unboxed items in a single list.
|
||||||
|
|
||||||
|
e.g. slist1 = slist_cons (slist_box (data), slist1); */
|
||||||
|
SList *
|
||||||
|
slist_cons (SList *item, SList *slist)
|
||||||
|
{
|
||||||
|
if (!item)
|
||||||
|
{
|
||||||
|
return slist;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert (!item->next);
|
||||||
|
|
||||||
|
item->next = slist;
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return a list starting at the second item of SLIST. */
|
||||||
|
SList *
|
||||||
|
slist_tail (SList *slist)
|
||||||
|
{
|
||||||
|
return slist ? slist->next : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return a list starting at the Nth item of SLIST. If SLIST is less
|
||||||
|
than N items long, NULL is returned. Just to be confusing, list items
|
||||||
|
are counted from 1, to get the 2nd element of slist:
|
||||||
|
|
||||||
|
e.g. shared_list = slist_nth (slist, 2); */
|
||||||
|
SList *
|
||||||
|
slist_nth (SList *slist, size_t n)
|
||||||
|
{
|
||||||
|
for (;n > 1 && slist; n--)
|
||||||
|
slist = slist->next;
|
||||||
|
|
||||||
|
return slist;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the number of items in SLIST. We start counting from 1, so
|
||||||
|
the length of a list with no items is 0, and so on. */
|
||||||
|
size_t
|
||||||
|
slist_length (SList *slist)
|
||||||
|
{
|
||||||
|
size_t n;
|
||||||
|
|
||||||
|
for (n = 0; slist; ++n)
|
||||||
|
slist = slist->next;
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Destructively reverse the order of items in SLIST. The value of SLIST
|
||||||
|
is undefined after calling this function.
|
||||||
|
|
||||||
|
CAVEAT: You must store the result of this function, or you might not
|
||||||
|
be able to get all the items except the first one back again.
|
||||||
|
|
||||||
|
e.g. slist = slist_reverse (slist); */
|
||||||
|
SList *
|
||||||
|
slist_reverse (SList *slist)
|
||||||
|
{
|
||||||
|
SList *result = 0;
|
||||||
|
SList *next;
|
||||||
|
|
||||||
|
while (slist)
|
||||||
|
{
|
||||||
|
next = slist->next;
|
||||||
|
slist->next = result;
|
||||||
|
result = slist;
|
||||||
|
slist = next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Call FOREACH once for each item in SLIST, passing both the item and
|
||||||
|
USERDATA on each call. */
|
||||||
|
void *
|
||||||
|
slist_foreach (SList *slist, SListCallback *foreach, void *userdata)
|
||||||
|
{
|
||||||
|
void *result = 0;
|
||||||
|
|
||||||
|
assert (foreach);
|
||||||
|
|
||||||
|
while (slist)
|
||||||
|
{
|
||||||
|
SList *next = slist->next;
|
||||||
|
result = (*foreach) (slist, userdata);
|
||||||
|
|
||||||
|
if (result)
|
||||||
|
break;
|
||||||
|
|
||||||
|
slist = next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Destructively merge the items of two ordered lists LEFT and RIGHT,
|
||||||
|
returning a single sorted list containing the items of both -- Part of
|
||||||
|
the quicksort algorithm. The values of LEFT and RIGHT are undefined
|
||||||
|
after calling this function.
|
||||||
|
|
||||||
|
At each iteration, add another item to the merged list by taking the
|
||||||
|
lowest valued item from the head of either LEFT or RIGHT, determined
|
||||||
|
by passing those items and USERDATA to COMPARE. COMPARE should return
|
||||||
|
less than 0 if the head of LEFT has the lower value, greater than 0 if
|
||||||
|
the head of RIGHT has the lower value, otherwise 0. */
|
||||||
|
static SList *
|
||||||
|
slist_sort_merge (SList *left, SList *right, SListCompare *compare,
|
||||||
|
void *userdata)
|
||||||
|
{
|
||||||
|
SList merged, *insert;
|
||||||
|
|
||||||
|
insert = &merged;
|
||||||
|
|
||||||
|
while (left && right)
|
||||||
|
{
|
||||||
|
if ((*compare) (left, right, userdata) <= 0)
|
||||||
|
{
|
||||||
|
insert = insert->next = left;
|
||||||
|
left = left->next;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
insert = insert->next = right;
|
||||||
|
right = right->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
insert->next = left ? left : right;
|
||||||
|
|
||||||
|
return merged.next;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Perform a destructive quicksort on the items in SLIST, by repeatedly
|
||||||
|
calling COMPARE with a pair of items from SLIST along with USERDATA
|
||||||
|
at every iteration. COMPARE is a function as defined above for
|
||||||
|
slist_sort_merge(). The value of SLIST is undefined after calling
|
||||||
|
this function.
|
||||||
|
|
||||||
|
e.g. slist = slist_sort (slist, compare, 0); */
|
||||||
|
SList *
|
||||||
|
slist_sort (SList *slist, SListCompare *compare, void *userdata)
|
||||||
|
{
|
||||||
|
SList *left, *right;
|
||||||
|
|
||||||
|
if (!slist)
|
||||||
|
return slist;
|
||||||
|
|
||||||
|
/* Be sure that LEFT and RIGHT never contain the same item. */
|
||||||
|
left = slist;
|
||||||
|
right = slist->next;
|
||||||
|
|
||||||
|
if (!right)
|
||||||
|
return left;
|
||||||
|
|
||||||
|
/* Skip two items with RIGHT and one with SLIST, until RIGHT falls off
|
||||||
|
the end. SLIST must be about half way along. */
|
||||||
|
while (right && (right = right->next))
|
||||||
|
{
|
||||||
|
if (!right || !(right = right->next))
|
||||||
|
break;
|
||||||
|
slist = slist->next;
|
||||||
|
}
|
||||||
|
right = slist->next;
|
||||||
|
slist->next = 0;
|
||||||
|
|
||||||
|
/* Sort LEFT and RIGHT, then merge the two. */
|
||||||
|
return slist_sort_merge (slist_sort (left, compare, userdata),
|
||||||
|
slist_sort (right, compare, userdata),
|
||||||
|
compare, userdata);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Aside from using the functions above to manage chained structures of
|
||||||
|
any type that has a NEXT pointer as its first field, SLISTs can
|
||||||
|
be comprised of boxed items. The boxes are chained together in
|
||||||
|
that case, so there is no need for a NEXT field in the item proper.
|
||||||
|
Some care must be taken to slist_box and slist_unbox each item in
|
||||||
|
a boxed list at the appropriate points to avoid leaking the memory
|
||||||
|
used for the boxes. It us usually a very bad idea to mix boxed and
|
||||||
|
non-boxed items in a single list. */
|
||||||
|
|
||||||
|
/* Return a `boxed' freshly mallocated 1 element list containing
|
||||||
|
USERDATA. */
|
||||||
|
SList *
|
||||||
|
slist_box (const void *userdata)
|
||||||
|
{
|
||||||
|
SList *item = (SList *) malloc (sizeof *item);
|
||||||
|
|
||||||
|
if (item)
|
||||||
|
{
|
||||||
|
item->next = 0;
|
||||||
|
item->userdata = userdata;
|
||||||
|
}
|
||||||
|
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the contents of a `boxed' ITEM, recycling the box itself. */
|
||||||
|
void *
|
||||||
|
slist_unbox (SList *item)
|
||||||
|
{
|
||||||
|
void *userdata = 0;
|
||||||
|
|
||||||
|
if (item)
|
||||||
|
{
|
||||||
|
/* Strip the const, because responsibility for this memory
|
||||||
|
passes to the caller on return. */
|
||||||
|
userdata = (void *) item->userdata;
|
||||||
|
free (item);
|
||||||
|
}
|
||||||
|
|
||||||
|
return userdata;
|
||||||
|
}
|
1
libltdl/stamp-h1
Normal file
1
libltdl/stamp-h1
Normal file
|
@ -0,0 +1 @@
|
||||||
|
timestamp for config.h
|
Loading…
Reference in a new issue