From df6a1b88ae8536a167476d91bbe31b94739701c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Picca=20Fr=C3=A9d=C3=A9ric-Emmanuel?= Date: Fri, 25 Jul 2014 14:39:28 +0200 Subject: Import mmdb_1.25.5.orig.tar.gz [dgit import orig mmdb_1.25.5.orig.tar.gz] --- AUTHORS | 2 + COPYING | 685 ++ COPYING.LESSER | 165 + INSTALL | 365 + Makefile.am | 38 + Makefile.in | 992 +++ README | 33 + aclocal.m4 | 1141 +++ build-aux/ar-lib | 270 + build-aux/config.guess | 1558 ++++ build-aux/config.sub | 1788 +++++ build-aux/depcomp | 630 ++ build-aux/install-sh | 520 ++ build-aux/ltmain.sh | 9655 +++++++++++++++++++++++++ build-aux/missing | 376 + config.h.in | 62 + configure | 18135 +++++++++++++++++++++++++++++++++++++++++++++++ configure.ac | 21 + m4/libtool.m4 | 7835 ++++++++++++++++++++ m4/ltoptions.m4 | 369 + m4/ltsugar.m4 | 123 + m4/ltversion.m4 | 23 + m4/lt~obsolete.m4 | 98 + mmdb.pc.in | 10 + mmdb/bfgs_min.cpp | 936 +++ mmdb/bfgs_min.h | 257 + mmdb/file_.cpp | 1857 +++++ mmdb/file_.h | 302 + mmdb/hybrid_36.cpp | 320 + mmdb/hybrid_36.h | 21 + mmdb/linalg_.cpp | 987 +++ mmdb/linalg_.h | 233 + mmdb/machine_.cpp | 148 + mmdb/machine_.h | 470 ++ mmdb/math_.cpp | 199 + mmdb/math_.h | 73 + mmdb/mattype_.cpp | 2116 ++++++ mmdb/mattype_.h | 659 ++ mmdb/mmdb_align.cpp | 1219 ++++ mmdb/mmdb_align.h | 189 + mmdb/mmdb_atom.cpp | 3495 +++++++++ mmdb/mmdb_atom.h | 739 ++ mmdb/mmdb_bondmngr.cpp | 125 + mmdb/mmdb_bondmngr.h | 73 + mmdb/mmdb_chain.cpp | 2568 +++++++ mmdb/mmdb_chain.h | 674 ++ mmdb/mmdb_cifdefs.cpp | 122 + mmdb/mmdb_cifdefs.h | 327 + mmdb/mmdb_coormngr.cpp | 4360 ++++++++++++ mmdb/mmdb_coormngr.h | 951 +++ mmdb/mmdb_cryst.cpp | 2288 ++++++ mmdb/mmdb_cryst.h | 462 ++ mmdb/mmdb_defs.h | 259 + mmdb/mmdb_ficif.cpp | 518 ++ mmdb/mmdb_ficif.h | 290 + mmdb/mmdb_file.cpp | 3060 ++++++++ mmdb/mmdb_file.h | 650 ++ mmdb/mmdb_graph.cpp | 2460 +++++++ mmdb/mmdb_graph.h | 484 ++ mmdb/mmdb_manager.cpp | 392 + mmdb/mmdb_manager.h | 122 + mmdb/mmdb_mask.cpp | 246 + mmdb/mmdb_mask.h | 97 + mmdb/mmdb_mmcif.cpp | 3671 ++++++++++ mmdb/mmdb_mmcif.h | 2129 ++++++ mmdb/mmdb_model.cpp | 5313 ++++++++++++++ mmdb/mmdb_model.h | 1085 +++ mmdb/mmdb_rwbrook.cpp | 3092 ++++++++ mmdb/mmdb_rwbrook.h | 1555 ++++ mmdb/mmdb_sbase.cpp | 320 + mmdb/mmdb_sbase.h | 142 + mmdb/mmdb_sbase0.cpp | 3124 ++++++++ mmdb/mmdb_sbase0.h | 746 ++ mmdb/mmdb_selmngr.cpp | 3393 +++++++++ mmdb/mmdb_selmngr.h | 624 ++ mmdb/mmdb_symop.cpp | 1009 +++ mmdb/mmdb_symop.h | 173 + mmdb/mmdb_tables.cpp | 750 ++ mmdb/mmdb_tables.h | 129 + mmdb/mmdb_title.cpp | 2653 +++++++ mmdb/mmdb_title.h | 734 ++ mmdb/mmdb_uddata.cpp | 537 ++ mmdb/mmdb_uddata.h | 152 + mmdb/mmdb_utils.cpp | 1974 ++++++ mmdb/mmdb_utils.h | 639 ++ mmdb/mmdb_xml.cpp | 954 +++ mmdb/mmdb_xml.h | 148 + mmdb/random_n.cpp | 235 + mmdb/random_n.h | 71 + mmdb/stream_.cpp | 106 + mmdb/stream_.h | 192 + 91 files changed, 115292 insertions(+) create mode 100755 AUTHORS create mode 100755 COPYING create mode 100755 COPYING.LESSER create mode 100755 INSTALL create mode 100644 Makefile.am create mode 100644 Makefile.in create mode 100755 README create mode 100644 aclocal.m4 create mode 100755 build-aux/ar-lib create mode 100755 build-aux/config.guess create mode 100755 build-aux/config.sub create mode 100755 build-aux/depcomp create mode 100755 build-aux/install-sh create mode 100755 build-aux/ltmain.sh create mode 100755 build-aux/missing create mode 100755 config.h.in create mode 100755 configure create mode 100644 configure.ac create mode 100755 m4/libtool.m4 create mode 100755 m4/ltoptions.m4 create mode 100755 m4/ltsugar.m4 create mode 100755 m4/ltversion.m4 create mode 100755 m4/lt~obsolete.m4 create mode 100644 mmdb.pc.in create mode 100755 mmdb/bfgs_min.cpp create mode 100755 mmdb/bfgs_min.h create mode 100755 mmdb/file_.cpp create mode 100755 mmdb/file_.h create mode 100755 mmdb/hybrid_36.cpp create mode 100755 mmdb/hybrid_36.h create mode 100755 mmdb/linalg_.cpp create mode 100755 mmdb/linalg_.h create mode 100755 mmdb/machine_.cpp create mode 100755 mmdb/machine_.h create mode 100755 mmdb/math_.cpp create mode 100755 mmdb/math_.h create mode 100755 mmdb/mattype_.cpp create mode 100755 mmdb/mattype_.h create mode 100755 mmdb/mmdb_align.cpp create mode 100755 mmdb/mmdb_align.h create mode 100755 mmdb/mmdb_atom.cpp create mode 100755 mmdb/mmdb_atom.h create mode 100755 mmdb/mmdb_bondmngr.cpp create mode 100755 mmdb/mmdb_bondmngr.h create mode 100755 mmdb/mmdb_chain.cpp create mode 100755 mmdb/mmdb_chain.h create mode 100755 mmdb/mmdb_cifdefs.cpp create mode 100755 mmdb/mmdb_cifdefs.h create mode 100755 mmdb/mmdb_coormngr.cpp create mode 100755 mmdb/mmdb_coormngr.h create mode 100755 mmdb/mmdb_cryst.cpp create mode 100755 mmdb/mmdb_cryst.h create mode 100755 mmdb/mmdb_defs.h create mode 100755 mmdb/mmdb_ficif.cpp create mode 100755 mmdb/mmdb_ficif.h create mode 100755 mmdb/mmdb_file.cpp create mode 100755 mmdb/mmdb_file.h create mode 100755 mmdb/mmdb_graph.cpp create mode 100755 mmdb/mmdb_graph.h create mode 100755 mmdb/mmdb_manager.cpp create mode 100755 mmdb/mmdb_manager.h create mode 100755 mmdb/mmdb_mask.cpp create mode 100755 mmdb/mmdb_mask.h create mode 100755 mmdb/mmdb_mmcif.cpp create mode 100755 mmdb/mmdb_mmcif.h create mode 100755 mmdb/mmdb_model.cpp create mode 100755 mmdb/mmdb_model.h create mode 100755 mmdb/mmdb_rwbrook.cpp create mode 100755 mmdb/mmdb_rwbrook.h create mode 100755 mmdb/mmdb_sbase.cpp create mode 100755 mmdb/mmdb_sbase.h create mode 100755 mmdb/mmdb_sbase0.cpp create mode 100755 mmdb/mmdb_sbase0.h create mode 100755 mmdb/mmdb_selmngr.cpp create mode 100755 mmdb/mmdb_selmngr.h create mode 100755 mmdb/mmdb_symop.cpp create mode 100755 mmdb/mmdb_symop.h create mode 100755 mmdb/mmdb_tables.cpp create mode 100755 mmdb/mmdb_tables.h create mode 100755 mmdb/mmdb_title.cpp create mode 100755 mmdb/mmdb_title.h create mode 100755 mmdb/mmdb_uddata.cpp create mode 100755 mmdb/mmdb_uddata.h create mode 100755 mmdb/mmdb_utils.cpp create mode 100755 mmdb/mmdb_utils.h create mode 100755 mmdb/mmdb_xml.cpp create mode 100755 mmdb/mmdb_xml.h create mode 100755 mmdb/random_n.cpp create mode 100755 mmdb/random_n.h create mode 100755 mmdb/stream_.cpp create mode 100755 mmdb/stream_.h diff --git a/AUTHORS b/AUTHORS new file mode 100755 index 0000000..a0f1276 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,2 @@ + + Eugene Krissinel (eugene.krissinel@stfc.ac.uk) diff --git a/COPYING b/COPYING new file mode 100755 index 0000000..14c5b73 --- /dev/null +++ b/COPYING @@ -0,0 +1,685 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, 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 +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If 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 convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + +Section 15 has been amended in accordance with Section 7a) above to +address the requirements of UK law. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + +Section 16 has been replaced in accordance with Section 7a) above to +address the requirements of UK law. + + THE LICENSOR OR ANY THIRD PARTIES FROM WHOM IT HAS LICENSED ANY CODE +WILL NOT BE LIABLE FOR: ANY LOSS OF PROFITS, LOSS OF REVENUE, LOSS OR +CORRUPTION OF DATA, LOSS OF CONTRACTS OR OPPORTUNITY, LOSS OF SAVINGS +OR THIRD PARTY CLAIMS (IN EACH CASE WHETHER DIRECT OR INDIRECT), ANY +DIRECT OR INDIRECT LOSS OR DAMAGE ARISING OUT OF OR IN CONNECTION WITH +THE PROGRAM, IN EACH CASE, WHETHER THAT LOSS ARISES AS A RESULT OF +LICENSOR"S NEGLIGENCE, OR IN ANY OTHER WAY, EVEN IF LICENSOR HAS BEEN +ADVISED OF THE POSSIBILITY OF THAT LOSS ARISING, OR IF IT WAS WITHIN +LICENSOR'S CONTEMPLATION. + +NONE OF THESE PROVISION LIMITS OR EXCLUDES THE LICENSOR"S LIABILITY +FOR DEATH OR PERSONAL INJURY CAUSED BY ITS NEGLIGENCE OR FOR ANY +FRAUD, OR FOR ANY SORT OF LIABILITY THAT, BY LAW, CANNOT BE LIMITED OR +EXCLUDED + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 3 of the License, 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 . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/COPYING.LESSER b/COPYING.LESSER new file mode 100755 index 0000000..fc8a5de --- /dev/null +++ b/COPYING.LESSER @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + 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 that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU 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 as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/INSTALL b/INSTALL new file mode 100755 index 0000000..7d1c323 --- /dev/null +++ b/INSTALL @@ -0,0 +1,365 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, +2006, 2007, 2008, 2009 Free Software Foundation, Inc. + + 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. + +Basic Installation +================== + + Briefly, the shell commands `./configure; make; make install' should +configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. Some packages provide this +`INSTALL' file but do not implement all of the features documented +below. The lack of an optional feature in a given package is not +necessarily a bug. More recommendations for GNU packages can be found +in *note Makefile Conventions: (standards)Makefile Conventions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + + The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package, generally using the just-built uninstalled binaries. + + 4. Type `make install' to install the programs and any data files and + documentation. When installing into a prefix owned by root, it is + recommended that the package be configured and built as a regular + user, and only the `make install' phase executed with root + privileges. + + 5. Optionally, type `make installcheck' to repeat any self-tests, but + this time using the binaries in their final installed location. + This target does not install anything. Running this target as a + regular user, particularly if the prior `make install' required + root privileges, verifies that the installation completed + correctly. + + 6. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + + 7. Often, you can also type `make uninstall' to remove the installed + files again. In practice, not all packages have tested that + uninstallation works correctly, even though it is required by the + GNU Coding Standards. + + 8. Some packages, particularly those that use Automake, provide `make + distcheck', which can by used by developers to test that all other + targets like `make install' and `make uninstall' work correctly. + This target is generally not run by end users. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. This +is known as a "VPATH" build. + + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + + On MacOS X 10.5 and later systems, you can create libraries and +executables that work on multiple system types--known as "fat" or +"universal" binaries--by specifying multiple `-arch' options to the +compiler but only a single `-arch' option to the preprocessor. Like +this: + + ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CPP="gcc -E" CXXCPP="g++ -E" + + This is not guaranteed to produce working output in all cases, you +may have to build one architecture at a time and combine the results +using the `lipo' tool if you have problems. + +Installation Names +================== + + By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX', where PREFIX must be an +absolute file name. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. In general, the +default for these options is expressed in terms of `${prefix}', so that +specifying just `--prefix' will affect all of the other directory +specifications that were not explicitly provided. + + The most portable way to affect installation locations is to pass the +correct locations to `configure'; however, many packages provide one or +both of the following shortcuts of passing variable assignments to the +`make install' command line to change installation locations without +having to reconfigure or recompile. + + The first method involves providing an override variable for each +affected directory. For example, `make install +prefix=/alternate/directory' will choose an alternate location for all +directory configuration variables that were expressed in terms of +`${prefix}'. Any directories that were specified during `configure', +but not in terms of `${prefix}', must each be overridden at install +time for the entire installation to be relocated. The approach of +makefile variable overrides for each directory variable is required by +the GNU Coding Standards, and ideally causes no recompilation. +However, some platforms have known limitations with the semantics of +shared libraries that end up requiring recompilation when using this +method, particularly noticeable in packages that use GNU Libtool. + + The second method involves providing the `DESTDIR' variable. For +example, `make install DESTDIR=/alternate/directory' will prepend +`/alternate/directory' before all installation names. The approach of +`DESTDIR' overrides is not required by the GNU Coding Standards, and +does not work on platforms that have drive letters. On the other hand, +it does better at avoiding recompilation issues, and works well even +when some directory options were not specified in terms of `${prefix}' +at `configure' time. + +Optional Features +================= + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + + Some packages offer the ability to configure how verbose the +execution of `make' will be. For these packages, running `./configure +--enable-silent-rules' sets the default to minimal output, which can be +overridden with `make V=1'; while running `./configure +--disable-silent-rules' sets the default to verbose, which can be +overridden with `make V=0'. + +Particular systems +================== + + On HP-UX, the default C compiler is not ANSI C compatible. If GNU +CC is not installed, it is recommended to use the following options in +order to use an ANSI C compiler: + + ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" + +and if that doesn't work, install pre-built binaries of GCC for HP-UX. + + On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot +parse its `' header file. The option `-nodtk' can be used as +a workaround. If GNU CC is not installed, it is therefore recommended +to try + + ./configure CC="cc" + +and if that doesn't work, try + + ./configure CC="cc -nodtk" + + On Solaris, don't put `/usr/ucb' early in your `PATH'. This +directory contains several dysfunctional programs; working variants of +these programs are available in `/usr/bin'. So, if you need `/usr/ucb' +in your `PATH', put it _after_ `/usr/bin'. + + On Haiku, software installed for all users goes in `/boot/common', +not `/usr/local'. It is recommended to use the following options: + + ./configure --prefix=/boot/common + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS + KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf bug. Until the bug is fixed you can use this workaround: + + CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of all of the options to `configure', and exit. + +`--help=short' +`--help=recursive' + Print a summary of the options unique to this package's + `configure', and exit. The `short' variant lists options used + only in the top level, while the `recursive' variant lists options + also present in any nested packages. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--prefix=DIR' + Use DIR as the installation prefix. *note Installation Names:: + for more details, including other options available for fine-tuning + the installation locations. + +`--no-create' +`-n' + Run the configure checks, but stop before creating any output + files. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..2f33492 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,38 @@ + +ACLOCAL_AMFLAGS = -I m4 + +lib_LTLIBRARIES = mmdb/libmmdb.la + +pkginclude_HEADERS = \ +mmdb/bfgs_min.h mmdb/mmdb_atom.h mmdb/mmdb_ficif.h \ +mmdb/mmdb_rwbrook.h mmdb/mmdb_uddata.h mmdb/file_.h \ +mmdb/mmdb_bondmngr.h mmdb/mmdb_file.h mmdb/mmdb_sbase0.h \ +mmdb/mmdb_utils.h mmdb/linalg_.h mmdb/mmdb_chain.h \ +mmdb/mmdb_graph.h mmdb/mmdb_sbase.h mmdb/mmdb_xml.h \ +mmdb/machine_.h mmdb/mmdb_cifdefs.h mmdb/mmdb_manager.h \ +mmdb/mmdb_selmngr.h mmdb/random_n.h mmdb/math_.h \ +mmdb/mmdb_coormngr.h mmdb/mmdb_mask.h mmdb/mmdb_symop.h \ +mmdb/stream_.h mmdb/mattype_.h mmdb/mmdb_cryst.h \ +mmdb/mmdb_mmcif.h mmdb/mmdb_tables.h mmdb/mmdb_align.h \ +mmdb/mmdb_defs.h mmdb/mmdb_model.h mmdb/mmdb_title.h \ +mmdb/hybrid_36.h + + +mmdb_libmmdb_la_SOURCES = \ +mmdb/bfgs_min.cpp mmdb/mmdb_bondmngr.cpp mmdb/mmdb_manager.cpp \ +mmdb/mmdb_symop.cpp mmdb/file_.cpp mmdb/mmdb_chain.cpp \ +mmdb/mmdb_mask.cpp mmdb/mmdb_tables.cpp mmdb/linalg_.cpp \ +mmdb/mmdb_cifdefs.cpp mmdb/mmdb_mmcif.cpp mmdb/mmdb_title.cpp \ +mmdb/machine_.cpp mmdb/mmdb_coormngr.cpp mmdb/mmdb_model.cpp \ +mmdb/mmdb_uddata.cpp mmdb/math_.cpp mmdb/mmdb_cryst.cpp \ +mmdb/mmdb_rwbrook.cpp mmdb/mmdb_utils.cpp mmdb/mattype_.cpp \ +mmdb/mmdb_ficif.cpp mmdb/mmdb_sbase0.cpp mmdb/mmdb_xml.cpp \ +mmdb/mmdb_align.cpp mmdb/mmdb_file.cpp mmdb/mmdb_sbase.cpp \ +mmdb/random_n.cpp mmdb/mmdb_atom.cpp mmdb/mmdb_graph.cpp \ +mmdb/mmdb_selmngr.cpp mmdb/stream_.cpp mmdb/hybrid_36.cpp + +mmdb_libmmdb_la_LDFLAGS = -no-undefined + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = mmdb.pc + diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..6e8eade --- /dev/null +++ b/Makefile.in @@ -0,0 +1,992 @@ +# Makefile.in generated by automake 1.12.2 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2012 Free Software Foundation, Inc. + +# This Makefile.in 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. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = . +DIST_COMMON = README $(am__configure_deps) $(pkginclude_HEADERS) \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/config.h.in $(srcdir)/mmdb.pc.in \ + $(top_srcdir)/build-aux/ar-lib \ + $(top_srcdir)/build-aux/config.guess \ + $(top_srcdir)/build-aux/config.sub \ + $(top_srcdir)/build-aux/depcomp \ + $(top_srcdir)/build-aux/install-sh \ + $(top_srcdir)/build-aux/ltmain.sh \ + $(top_srcdir)/build-aux/missing $(top_srcdir)/configure \ + AUTHORS COPYING COPYING.LESSER INSTALL build-aux/ar-lib \ + build-aux/config.guess build-aux/config.sub build-aux/depcomp \ + build-aux/install-sh build-aux/ltmain.sh build-aux/missing +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = mmdb.pc +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdir)" \ + "$(DESTDIR)$(pkgincludedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +mmdb_libmmdb_la_LIBADD = +am__dirstamp = $(am__leading_dot)dirstamp +am_mmdb_libmmdb_la_OBJECTS = mmdb/bfgs_min.lo mmdb/mmdb_bondmngr.lo \ + mmdb/mmdb_manager.lo mmdb/mmdb_symop.lo mmdb/file_.lo \ + mmdb/mmdb_chain.lo mmdb/mmdb_mask.lo mmdb/mmdb_tables.lo \ + mmdb/linalg_.lo mmdb/mmdb_cifdefs.lo mmdb/mmdb_mmcif.lo \ + mmdb/mmdb_title.lo mmdb/machine_.lo mmdb/mmdb_coormngr.lo \ + mmdb/mmdb_model.lo mmdb/mmdb_uddata.lo mmdb/math_.lo \ + mmdb/mmdb_cryst.lo mmdb/mmdb_rwbrook.lo mmdb/mmdb_utils.lo \ + mmdb/mattype_.lo mmdb/mmdb_ficif.lo mmdb/mmdb_sbase0.lo \ + mmdb/mmdb_xml.lo mmdb/mmdb_align.lo mmdb/mmdb_file.lo \ + mmdb/mmdb_sbase.lo mmdb/random_n.lo mmdb/mmdb_atom.lo \ + mmdb/mmdb_graph.lo mmdb/mmdb_selmngr.lo mmdb/stream_.lo \ + mmdb/hybrid_36.lo +mmdb_libmmdb_la_OBJECTS = $(am_mmdb_libmmdb_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +mmdb_libmmdb_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ + $(AM_CXXFLAGS) $(CXXFLAGS) $(mmdb_libmmdb_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(mmdb_libmmdb_la_SOURCES) +DIST_SOURCES = $(mmdb_libmmdb_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +DATA = $(pkgconfig_DATA) +HEADERS = $(pkginclude_HEADERS) +ETAGS = etags +CTAGS = ctags +CSCOPE = cscope +AM_RECURSIVE_TARGETS = cscope +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +DIST_TARGETS = dist-gzip +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +ACLOCAL_AMFLAGS = -I m4 +lib_LTLIBRARIES = mmdb/libmmdb.la +pkginclude_HEADERS = \ +mmdb/bfgs_min.h mmdb/mmdb_atom.h mmdb/mmdb_ficif.h \ +mmdb/mmdb_rwbrook.h mmdb/mmdb_uddata.h mmdb/file_.h \ +mmdb/mmdb_bondmngr.h mmdb/mmdb_file.h mmdb/mmdb_sbase0.h \ +mmdb/mmdb_utils.h mmdb/linalg_.h mmdb/mmdb_chain.h \ +mmdb/mmdb_graph.h mmdb/mmdb_sbase.h mmdb/mmdb_xml.h \ +mmdb/machine_.h mmdb/mmdb_cifdefs.h mmdb/mmdb_manager.h \ +mmdb/mmdb_selmngr.h mmdb/random_n.h mmdb/math_.h \ +mmdb/mmdb_coormngr.h mmdb/mmdb_mask.h mmdb/mmdb_symop.h \ +mmdb/stream_.h mmdb/mattype_.h mmdb/mmdb_cryst.h \ +mmdb/mmdb_mmcif.h mmdb/mmdb_tables.h mmdb/mmdb_align.h \ +mmdb/mmdb_defs.h mmdb/mmdb_model.h mmdb/mmdb_title.h \ +mmdb/hybrid_36.h + +mmdb_libmmdb_la_SOURCES = \ +mmdb/bfgs_min.cpp mmdb/mmdb_bondmngr.cpp mmdb/mmdb_manager.cpp \ +mmdb/mmdb_symop.cpp mmdb/file_.cpp mmdb/mmdb_chain.cpp \ +mmdb/mmdb_mask.cpp mmdb/mmdb_tables.cpp mmdb/linalg_.cpp \ +mmdb/mmdb_cifdefs.cpp mmdb/mmdb_mmcif.cpp mmdb/mmdb_title.cpp \ +mmdb/machine_.cpp mmdb/mmdb_coormngr.cpp mmdb/mmdb_model.cpp \ +mmdb/mmdb_uddata.cpp mmdb/math_.cpp mmdb/mmdb_cryst.cpp \ +mmdb/mmdb_rwbrook.cpp mmdb/mmdb_utils.cpp mmdb/mattype_.cpp \ +mmdb/mmdb_ficif.cpp mmdb/mmdb_sbase0.cpp mmdb/mmdb_xml.cpp \ +mmdb/mmdb_align.cpp mmdb/mmdb_file.cpp mmdb/mmdb_sbase.cpp \ +mmdb/random_n.cpp mmdb/mmdb_atom.cpp mmdb/mmdb_graph.cpp \ +mmdb/mmdb_selmngr.cpp mmdb/stream_.cpp mmdb/hybrid_36.cpp + +mmdb_libmmdb_la_LDFLAGS = -no-undefined +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = mmdb.pc +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +config.h: stamp-h1 + @if test ! -f $@; then rm -f stamp-h1; else :; fi + @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 +mmdb.pc: $(top_builddir)/config.status $(srcdir)/mmdb.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } +mmdb/$(am__dirstamp): + @$(MKDIR_P) mmdb + @: > mmdb/$(am__dirstamp) +mmdb/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) mmdb/$(DEPDIR) + @: > mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/bfgs_min.lo: mmdb/$(am__dirstamp) mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/mmdb_bondmngr.lo: mmdb/$(am__dirstamp) \ + mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/mmdb_manager.lo: mmdb/$(am__dirstamp) \ + mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/mmdb_symop.lo: mmdb/$(am__dirstamp) \ + mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/file_.lo: mmdb/$(am__dirstamp) mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/mmdb_chain.lo: mmdb/$(am__dirstamp) \ + mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/mmdb_mask.lo: mmdb/$(am__dirstamp) mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/mmdb_tables.lo: mmdb/$(am__dirstamp) \ + mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/linalg_.lo: mmdb/$(am__dirstamp) mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/mmdb_cifdefs.lo: mmdb/$(am__dirstamp) \ + mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/mmdb_mmcif.lo: mmdb/$(am__dirstamp) \ + mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/mmdb_title.lo: mmdb/$(am__dirstamp) \ + mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/machine_.lo: mmdb/$(am__dirstamp) mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/mmdb_coormngr.lo: mmdb/$(am__dirstamp) \ + mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/mmdb_model.lo: mmdb/$(am__dirstamp) \ + mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/mmdb_uddata.lo: mmdb/$(am__dirstamp) \ + mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/math_.lo: mmdb/$(am__dirstamp) mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/mmdb_cryst.lo: mmdb/$(am__dirstamp) \ + mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/mmdb_rwbrook.lo: mmdb/$(am__dirstamp) \ + mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/mmdb_utils.lo: mmdb/$(am__dirstamp) \ + mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/mattype_.lo: mmdb/$(am__dirstamp) mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/mmdb_ficif.lo: mmdb/$(am__dirstamp) \ + mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/mmdb_sbase0.lo: mmdb/$(am__dirstamp) \ + mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/mmdb_xml.lo: mmdb/$(am__dirstamp) mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/mmdb_align.lo: mmdb/$(am__dirstamp) \ + mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/mmdb_file.lo: mmdb/$(am__dirstamp) mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/mmdb_sbase.lo: mmdb/$(am__dirstamp) \ + mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/random_n.lo: mmdb/$(am__dirstamp) mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/mmdb_atom.lo: mmdb/$(am__dirstamp) mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/mmdb_graph.lo: mmdb/$(am__dirstamp) \ + mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/mmdb_selmngr.lo: mmdb/$(am__dirstamp) \ + mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/stream_.lo: mmdb/$(am__dirstamp) mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/hybrid_36.lo: mmdb/$(am__dirstamp) mmdb/$(DEPDIR)/$(am__dirstamp) +mmdb/libmmdb.la: $(mmdb_libmmdb_la_OBJECTS) $(mmdb_libmmdb_la_DEPENDENCIES) $(EXTRA_mmdb_libmmdb_la_DEPENDENCIES) mmdb/$(am__dirstamp) + $(AM_V_CXXLD)$(mmdb_libmmdb_la_LINK) -rpath $(libdir) $(mmdb_libmmdb_la_OBJECTS) $(mmdb_libmmdb_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f mmdb/*.$(OBJEXT) + -rm -f mmdb/*.lo + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/bfgs_min.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/file_.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/hybrid_36.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/linalg_.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/machine_.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/math_.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/mattype_.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/mmdb_align.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/mmdb_atom.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/mmdb_bondmngr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/mmdb_chain.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/mmdb_cifdefs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/mmdb_coormngr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/mmdb_cryst.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/mmdb_ficif.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/mmdb_file.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/mmdb_graph.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/mmdb_manager.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/mmdb_mask.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/mmdb_mmcif.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/mmdb_model.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/mmdb_rwbrook.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/mmdb_sbase.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/mmdb_sbase0.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/mmdb_selmngr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/mmdb_symop.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/mmdb_tables.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/mmdb_title.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/mmdb_uddata.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/mmdb_utils.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/mmdb_xml.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/random_n.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@mmdb/$(DEPDIR)/stream_.Plo@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + -rm -rf mmdb/.libs mmdb/_libs + +distclean-libtool: + -rm -f libtool config.lt +install-pkgconfigDATA: $(pkgconfig_DATA) + @$(NORMAL_INSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ + done + +uninstall-pkgconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) +install-pkgincludeHEADERS: $(pkginclude_HEADERS) + @$(NORMAL_INSTALL) + @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ + done + +uninstall-pkgincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) + +clean-cscope: + -rm -f cscope.files + +cscope.files: clean-cscope cscopelist + +cscopelist: $(HEADERS) $(SOURCES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__post_remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-tarZ: distdir + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__post_remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir); chmod u+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) config.h +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(pkgincludedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f mmdb/$(DEPDIR)/$(am__dirstamp) + -rm -f mmdb/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf mmdb/$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pkgconfigDATA install-pkgincludeHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -rf mmdb/$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-libLTLIBRARIES uninstall-pkgconfigDATA \ + uninstall-pkgincludeHEADERS + +.MAKE: all install-am install-strip + +.PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \ + clean-cscope clean-generic clean-libLTLIBRARIES clean-libtool \ + cscope cscopelist ctags dist dist-all dist-bzip2 dist-gzip \ + dist-lzip dist-shar dist-tarZ dist-xz dist-zip distcheck \ + distclean distclean-compile distclean-generic distclean-hdr \ + distclean-libtool distclean-tags distcleancheck distdir \ + distuninstallcheck dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am \ + install-libLTLIBRARIES install-man install-pdf install-pdf-am \ + install-pkgconfigDATA install-pkgincludeHEADERS install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ + uninstall-am uninstall-libLTLIBRARIES uninstall-pkgconfigDATA \ + uninstall-pkgincludeHEADERS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/README b/README new file mode 100755 index 0000000..22a8101 --- /dev/null +++ b/README @@ -0,0 +1,33 @@ +==================================================== + KNOWN INCOMPATIBILITIES WITH PREVIOUS VERSIONS +==================================================== + +-------------------------- +Version 1.05 (26.03.2004) +-------------------------- + +1. CAtom::GetBonds ( RPSAtomBond AtomBond, int & nAtomBonds ); + +now returns a pointer to internal list of bonded atoms. Therefore +application MUST NEITHER attempt to deallocate AtomBond obtained from +this function NOR modify it (doing so will cause crash). This is in +difference of previous versions where deallocation of AtomBond was +explicitely required. + +2. CAtom::GetBonds ( RPSAtomBondI AtomBondI, int & nAtomBonds ); + +on contrary, now returns an allocated instance of the atom's bond list. +If AtomBondI is not NULL on input, the function attempts to deallocate +it (which will cause crash if you feed uninitialized non-NULL AtomBondI +into the function). Application is responsible for deallocation of +AtomBondI when appropriate. + +3. CAtom::GetBonds ( PSAtomBondI AtomBondI, int & nAtomBonds, int maxlength ); + +is a new function for pre-allocated AtomBondI[0..maxlength]. Application +is responsible for allocation and deallocation of AtomBondI. + +4. CAtom::GetBonds ( RPSAtomBond AtomBond, int & nAtomBonds, int maxlength ); + +removed as there is no need in it in view of change #1 above. + diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..c15146a --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,1141 @@ +# generated automatically by aclocal 1.12.2 -*- Autoconf -*- + +# Copyright (C) 1996-2012 Free Software Foundation, Inc. + +# 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. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) + +# Copyright (C) 2002-2012 Free Software Foundation, Inc. +# +# 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 8 + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.12' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.12.2], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.12.2])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# Copyright (C) 2011-2012 Free Software Foundation, Inc. +# +# 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 1 + +# AM_PROG_AR([ACT-IF-FAIL]) +# ------------------------- +# Try to determine the archiver interface, and trigger the ar-lib wrapper +# if it is needed. If the detection of archiver interface fails, run +# ACT-IF-FAIL (default is to abort configure with a proper error message). +AC_DEFUN([AM_PROG_AR], +[AC_BEFORE([$0], [LT_INIT])dnl +AC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl +AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([ar-lib])dnl +AC_CHECK_TOOLS([AR], [ar lib "link -lib"], [false]) +: ${AR=ar} + +AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface], + [am_cv_ar_interface=ar + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])], + [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([am_ar_try]) + if test "$ac_status" -eq 0; then + am_cv_ar_interface=ar + else + am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([am_ar_try]) + if test "$ac_status" -eq 0; then + am_cv_ar_interface=lib + else + am_cv_ar_interface=unknown + fi + fi + rm -f conftest.lib libconftest.a + ]) + ]) + +case $am_cv_ar_interface in +ar) + ;; +lib) + # Microsoft lib, so override with the ar-lib wrapper script. + # FIXME: It is wrong to rewrite AR. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__AR in this case, + # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something + # similar. + AR="$am_aux_dir/ar-lib $AR" + ;; +unknown) + m4_default([$1], + [AC_MSG_ERROR([could not determine $AR interface])]) + ;; +esac +AC_SUBST([AR])dnl +]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2012 Free Software Foundation, Inc. +# +# 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 2 + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is '.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997-2012 Free Software Foundation, Inc. +# +# 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 10 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999-2012 Free Software Foundation, Inc. +# +# 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 17 + +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999-2012 Free Software Foundation, Inc. +# +# 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 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each '.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996-2012 Free Software Foundation, Inc. +# +# 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 19 + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.62])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[AC_DIAGNOSE([obsolete], +[$0: two- and three-arguments forms are deprecated. For more info, see: +http://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_INIT_AUTOMAKE-invocation]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +dnl Support for Objective C++ was only introduced in Autoconf 2.65, +dnl but we still cater to Autoconf 2.62. +m4_ifdef([AC_PROG_OBJCXX], +[AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])])dnl +]) +_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl +dnl The 'parallel-tests' driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl +]) + +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001-2012 Free Software Foundation, Inc. +# +# 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 8 + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) + +# Copyright (C) 2003-2012 Free Software Foundation, Inc. +# +# 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 2 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Add --enable-maintainer-mode option to configure. -*- Autoconf -*- +# From Jim Meyering + +# Copyright (C) 1996-2012 Free Software Foundation, Inc. +# +# 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 + +# AM_MAINTAINER_MODE([DEFAULT-MODE]) +# ---------------------------------- +# Control maintainer-specific portions of Makefiles. +# Default is to disable them, unless 'enable' is passed literally. +# For symmetry, 'disable' may be passed as well. Anyway, the user +# can override the default with the --enable/--disable switch. +AC_DEFUN([AM_MAINTAINER_MODE], +[m4_case(m4_default([$1], [disable]), + [enable], [m4_define([am_maintainer_other], [disable])], + [disable], [m4_define([am_maintainer_other], [enable])], + [m4_define([am_maintainer_other], [enable]) + m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) +AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) + dnl maintainer-mode's default is 'disable' unless 'enable' is passed + AC_ARG_ENABLE([maintainer-mode], + [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], + am_maintainer_other[ make rules and dependencies not useful + (and sometimes confusing) to the casual installer])], + [USE_MAINTAINER_MODE=$enableval], + [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) + AC_MSG_RESULT([$USE_MAINTAINER_MODE]) + AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) + MAINT=$MAINTAINER_MODE_TRUE + AC_SUBST([MAINT])dnl +] +) + +AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001-2012 Free Software Foundation, Inc. +# +# 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 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997-2012 Free Software Foundation, Inc. +# +# 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 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001-2012 Free Software Foundation, Inc. +# +# 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 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2012 Free Software Foundation, Inc. +# +# 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 9 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) + +# Copyright (C) 2009-2012 Free Software Foundation, Inc. +# +# 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 3 + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2012 Free Software Foundation, Inc. +# +# 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 2 + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor 'install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in "make install-strip", and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006-2012 Free Software Foundation, Inc. +# +# 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 3 + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004-2012 Free Software Foundation, Inc. +# +# 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 3 + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of '-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi +done +rm -rf conftest.dir + +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([m4/libtool.m4]) +m4_include([m4/ltoptions.m4]) +m4_include([m4/ltsugar.m4]) +m4_include([m4/ltversion.m4]) +m4_include([m4/lt~obsolete.m4]) diff --git a/build-aux/ar-lib b/build-aux/ar-lib new file mode 100755 index 0000000..67f5f36 --- /dev/null +++ b/build-aux/ar-lib @@ -0,0 +1,270 @@ +#! /bin/sh +# Wrapper for Microsoft lib.exe + +me=ar-lib +scriptversion=2012-03-01.08; # UTC + +# Copyright (C) 2010-2012 Free Software Foundation, Inc. +# Written by Peter Rosin . +# +# 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 . + +# 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 or send patches to +# . + + +# func_error message +func_error () +{ + echo "$me: $1" 1>&2 + exit 1 +} + +file_conv= + +# func_file_conv build_file +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. +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 in + 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_at_file at_file operation archive +# Iterate over all members in AT_FILE performing OPERATION on ARCHIVE +# for each of them. +# When interpreting the content of the @FILE, do NOT use func_file_conv, +# since the user would need to supply preconverted file names to +# binutils ar, at least for MinGW. +func_at_file () +{ + operation=$2 + archive=$3 + at_file_contents=`cat "$1"` + eval set x "$at_file_contents" + shift + + for member + do + $AR -NOLOGO $operation:"$member" "$archive" || exit $? + done +} + +case $1 in + '') + func_error "no command. Try '$0 --help' for more information." + ;; + -h | --h*) + cat <. +# +# 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 Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# +# Please send patches with a ChangeLog entry to config-patches@gnu.org. + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2013 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case "${UNAME_SYSTEM}" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + eval $set_cc_for_build + cat <<-EOF > $dummy.c + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case ${UNAME_PROCESSOR} in + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW64*:*) + echo ${UNAME_MACHINE}-pc-mingw64 + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:MSYS*:*) + echo ${UNAME_MACHINE}-pc-msys + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + aarch64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC="gnulibc1" ; fi + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi + else + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + cris:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + crisv32:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + frv:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + hexagon:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:Linux:*:*) + echo ${UNAME_MACHINE}-pc-linux-${LIBC} + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } + ;; + or1k:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + or32:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-${LIBC} + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-${LIBC} + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; + PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; + *) echo hppa-unknown-linux-${LIBC} ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-${LIBC} + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-${LIBC} + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-${LIBC} + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-${LIBC} + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux-${LIBC} + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + tile*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-${LIBC} + exit ;; + x86_64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + eval $set_cc_for_build + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + fi + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-?:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk${UNAME_RELEASE} + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo ${UNAME_MACHINE}-unknown-esx + exit ;; +esac + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/build-aux/config.sub b/build-aux/config.sub new file mode 100755 index 0000000..c765b34 --- /dev/null +++ b/build-aux/config.sub @@ -0,0 +1,1788 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2013 Free Software Foundation, Inc. + +timestamp='2013-04-24' + +# This file 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 3 of the License, 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 . +# +# 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 Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches with a ChangeLog entry to config-patches@gnu.org. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2013 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | \ + kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + android-linux) + os=-linux-android + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze*) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arceb \ + | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ + | avr | avr32 \ + | be32 | be64 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | epiphany \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nios | nios2 | nios2eb | nios2el \ + | ns16k | ns32k \ + | open8 \ + | or1k | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pyramid \ + | rl78 | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu \ + | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | we32k \ + | x86 | xc16x | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + strongarm | thumb | xscale) + basic_machine=arm-unknown + ;; + xgate) + basic_machine=$basic_machine-unknown + os=-none + ;; + xscaleeb) + basic_machine=armeb-unknown + ;; + + xscaleel) + basic_machine=armel-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | aarch64-* | aarch64_be-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | be32-* | be64-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | hexagon-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | le32-* | le64-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | microblaze-* | microblazeel-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipsr5900-* | mipsr5900el-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* | nios2eb-* | nios2el-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | open8-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pyramid-* \ + | rl78-* | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ + | tahoe-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile*-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ + | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16 | cr16-*) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze*) + basic_machine=microblaze-xilinx + ;; + mingw64) + basic_machine=x86_64-pc + os=-mingw64 + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + msys) + basic_machine=i386-pc + os=-msys + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + nacl) + basic_machine=le32-unknown + os=-nacl + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + neo-tandem) + basic_machine=neo-tandem + ;; + nse-tandem) + basic_machine=nse-tandem + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc | ppcbe) basic_machine=powerpc-unknown + ;; + ppc-* | ppcbe-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-* | ppc64p7-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + os=-rdos + ;; + rdos32) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + strongarm-* | thumb-*) + basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tile*) + basic_machine=$basic_machine-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + xscale-* | xscalee[bl]-*) + basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* | -plan9* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -bitrig* | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-musl* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -nacl*) + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + hexagon-*) + os=-elf + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or1k-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/build-aux/depcomp b/build-aux/depcomp new file mode 100755 index 0000000..df8eea7 --- /dev/null +++ b/build-aux/depcomp @@ -0,0 +1,630 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2009-04-28.21; # UTC + +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 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 . + +# 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 . + +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 outputing dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +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" + +# 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 + +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 -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## 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). +## - 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 -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## 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. + tr ' ' ' +' < "$tmpdepfile" | +## 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. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -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 -eq 0; then : + else + 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 ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr ' +' ' ' >> "$depfile" + echo >> "$depfile" + + # The second pass generates a dummy entry for each header file. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +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. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + 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 -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +icc) + # Intel's C compiler understands `-MD -MF file'. However on + # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # ICC 7.0 will fill foo.d with something like + # foo.o: sub/foo.c + # foo.o: sub/foo.h + # which is wrong. We want: + # sub/foo.o: sub/foo.c + # sub/foo.o: sub/foo.h + # sub/foo.c: + # sub/foo.h: + # ICC 7.1 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using \ : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + 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. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + 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 -eq 0; then : + else + 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,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" + # Add `dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + echo "#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. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + + if test "$libtool" = yes; then + # With Tru64 cc, shared objects can also be used to make a + # static library. This mechanism is used in libtool 1.4 series to + # handle both shared and static libraries in a single compilation. + # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. + # + # With libtool 1.5 this exception was removed, and libtool now + # 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.libs/$base.lo.d # libtool 1.4 + tmpdepfile2=$dir$base.o.d # libtool 1.5 + tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 + tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.o.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + tmpdepfile4=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +#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:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' ' +' < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + 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" + cat < "$tmpdepfile" > "$depfile" + sed '1,2d' "$tmpdepfile" | tr ' ' ' +' | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + 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:: \1 \\:p' >> "$depfile" + echo " " >> "$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: diff --git a/build-aux/install-sh b/build-aux/install-sh new file mode 100755 index 0000000..6781b98 --- /dev/null +++ b/build-aux/install-sh @@ -0,0 +1,520 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2009-04-28.21; # 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. + +nl=' +' +IFS=" "" $nl" + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit=${DOITPROG-} +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi + +# 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_glob='?' +initialize_posix_glob=' + test "$posix_glob" != "?" || { + if (set -f) 2>/dev/null; then + posix_glob= + else + posix_glob=: + fi + } +' + +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 +no_target_directory= + +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 + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) dst_arg=$2 + shift;; + + -T) no_target_directory=true;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +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 + 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 + trap '(exit $?); exit' 1 2 13 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 starting with `-'. + 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 + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst;; + esac + + # 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 -n "$no_target_directory"; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + 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-writeable 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 + + eval "$initialize_posix_glob" + + oIFS=$IFS + IFS=/ + $posix_glob set -f + set fnord $dstdir + shift + $posix_glob set +f + IFS=$oIFS + + prefixes= + + for d + do + test -z "$d" && 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` && + + eval "$initialize_posix_glob" && + $posix_glob set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + $posix_glob 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: diff --git a/build-aux/ltmain.sh b/build-aux/ltmain.sh new file mode 100755 index 0000000..63ae69d --- /dev/null +++ b/build-aux/ltmain.sh @@ -0,0 +1,9655 @@ + +# libtool (GNU libtool) 2.4.2 +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, +# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool 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 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU 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 Libtool 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 GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, +# or obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# Usage: $progname [OPTION]... [MODE-ARG]... +# +# Provide generalized library-building support services. +# +# --config show all configuration variables +# --debug enable verbose shell tracing +# -n, --dry-run display commands without modifying any files +# --features display basic configuration information and exit +# --mode=MODE use operation mode MODE +# --preserve-dup-deps don't remove duplicate dependency libraries +# --quiet, --silent don't print informational messages +# --no-quiet, --no-silent +# print informational messages (default) +# --no-warn don't display warning messages +# --tag=TAG use configuration variables from tag TAG +# -v, --verbose print more informational messages than default +# --no-verbose don't print the extra informational messages +# --version print version information +# -h, --help, --help-all print short, long, or detailed help message +# +# MODE must be one of the following: +# +# clean remove files from the build directory +# compile compile a source file into a libtool object +# execute automatically set library path, then run a program +# finish complete the installation of libtool libraries +# install install libraries or executables +# link create a library or an executable +# uninstall remove libraries from an installed directory +# +# MODE-ARGS vary depending on the MODE. When passed as first option, +# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. +# Try `$progname --help --mode=MODE' for a more detailed description of MODE. +# +# When reporting a bug, please describe a test case to reproduce it and +# include the following information: +# +# host-triplet: $host +# shell: $SHELL +# compiler: $LTCC +# compiler flags: $LTCFLAGS +# linker: $LD (gnu? $with_gnu_ld) +# $progname: (GNU libtool) 2.4.2 +# automake: $automake_version +# autoconf: $autoconf_version +# +# Report bugs to . +# GNU libtool home page: . +# General help using GNU software: . + +PROGRAM=libtool +PACKAGE=libtool +VERSION=2.4.2 +TIMESTAMP="" +package_revision=1.3337 + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# NLS nuisances: We save the old values to restore during execute mode. +lt_user_locale= +lt_safe_locale= +for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test \"\${$lt_var+set}\" = set; then + save_$lt_var=\$$lt_var + $lt_var=C + export $lt_var + lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" + lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" + fi" +done +LC_ALL=C +LANGUAGE=C +export LANGUAGE LC_ALL + +$lt_unset CDPATH + + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + + + +: ${CP="cp -f"} +test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} +: ${Xsed="$SED -e 1s/^X//"} + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +exit_status=$EXIT_SUCCESS + +# Make sure IFS has a sensible default +lt_nl=' +' +IFS=" $lt_nl" + +dirname="s,/[^/]*$,," +basename="s,^.*/,," + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi +} # func_dirname may be replaced by extended shell implementation + + +# func_basename file +func_basename () +{ + func_basename_result=`$ECHO "${1}" | $SED "$basename"` +} # func_basename may be replaced by extended shell implementation + + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi + func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` +} # func_dirname_and_basename may be replaced by extended shell implementation + + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# func_strip_suffix prefix name +func_stripname () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname may be replaced by extended shell implementation + + +# These SED scripts presuppose an absolute path with a trailing slash. +pathcar='s,^/\([^/]*\).*$,\1,' +pathcdr='s,^/[^/]*,,' +removedotparts=':dotsl + s@/\./@/@g + t dotsl + s,/\.$,/,' +collapseslashes='s@/\{1,\}@/@g' +finalslash='s,/*$,/,' + +# func_normal_abspath PATH +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +# value returned in "$func_normal_abspath_result" +func_normal_abspath () +{ + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` + while :; do + # Processed it all yet? + if test "$func_normal_abspath_tpath" = / ; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result" ; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + +# func_relative_path SRCDIR DSTDIR +# generates a relative path from SRCDIR to DSTDIR, with a trailing +# slash if non-empty, suitable for immediately appending a filename +# without needing to append a separator. +# value returned in "$func_relative_path_result" +func_relative_path () +{ + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=${func_dirname_result} + if test "x$func_relative_path_tlibdir" = x ; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test "x$func_stripname_result" != x ; then + func_relative_path_result=${func_relative_path_result}/${func_stripname_result} + fi + + # Normalisation. If bindir is libdir, return empty string, + # else relative path ending with a slash; either way, target + # file name can be directly appended. + if test ! -z "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result/" + func_relative_path_result=$func_stripname_result + fi +} + +# The name of this program: +func_dirname_and_basename "$progpath" +progname=$func_basename_result + +# Make sure we have an absolute path for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=$func_dirname_result + progdir=`cd "$progdir" && pwd` + progpath="$progdir/$progname" + ;; + *) + save_IFS="$IFS" + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS="$save_IFS" + test -x "$progdir/$progname" && break + done + IFS="$save_IFS" + test -n "$progdir" || progdir=`pwd` + progpath="$progdir/$progname" + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed="${SED}"' -e 1s/^X//' +sed_quote_subst='s/\([`"$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' + +# Sed substitution that converts a w32 file name or path +# which contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-`\' parameter expansions in output of double_quote_subst that were +# `\'-ed in input to the same. If an odd number of `\' preceded a '$' +# in input to double_quote_subst, that '$' was protected from expansion. +# Since each input `\' is now two `\'s, look for any number of runs of +# four `\'s followed by two `\'s and then a '$'. `\' that '$'. +bs='\\' +bs2='\\\\' +bs4='\\\\\\\\' +dollar='\$' +sed_double_backslash="\ + s/$bs4/&\\ +/g + s/^$bs2$dollar/$bs&/ + s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g + s/\n//g" + +# Standard options: +opt_dry_run=false +opt_help=false +opt_quiet=false +opt_verbose=false +opt_warning=: + +# func_echo arg... +# Echo program name prefixed message, along with the current mode +# name if it has been set yet. +func_echo () +{ + $ECHO "$progname: ${opt_mode+$opt_mode: }$*" +} + +# func_verbose arg... +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $opt_verbose && func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +# func_error arg... +# Echo program name prefixed message to standard error. +func_error () +{ + $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 +} + +# func_warning arg... +# Echo program name prefixed warning message to standard error. +func_warning () +{ + $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 + + # bash bug again: + : +} + +# func_fatal_error arg... +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + +# func_fatal_help arg... +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + func_error ${1+"$@"} + func_fatal_error "$help" +} +help="Try \`$progname --help' for more information." ## default + + +# func_grep expression filename +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_mkdir_p directory-path +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + my_directory_path="$1" + my_dir_list= + + if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then + + # Protect directory names starting with `-' + case $my_directory_path in + -*) my_directory_path="./$my_directory_path" ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$my_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + my_dir_list="$my_directory_path:$my_dir_list" + + # If the last portion added has no slash in it, the list is done + case $my_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` + done + my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` + + save_mkdir_p_IFS="$IFS"; IFS=':' + for my_dir in $my_dir_list; do + IFS="$save_mkdir_p_IFS" + # mkdir can fail with a `File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$my_dir" 2>/dev/null || : + done + IFS="$save_mkdir_p_IFS" + + # Bail out if we (or some other process) failed to create a directory. + test -d "$my_directory_path" || \ + func_fatal_error "Failed to create \`$1'" + fi +} + + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$opt_dry_run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || \ + func_fatal_error "cannot create temporary directory \`$my_tmpdir'" + fi + + $ECHO "$my_tmpdir" +} + + +# func_quote_for_eval arg +# Aesthetically quote ARG to be evaled later. +# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT +# is double-quoted, suitable for a subsequent eval, whereas +# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters +# which are still active within double quotes backslashified. +func_quote_for_eval () +{ + case $1 in + *[\\\`\"\$]*) + func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; + *) + func_quote_for_eval_unquoted_result="$1" ;; + esac + + case $func_quote_for_eval_unquoted_result in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and and variable + # expansion for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" + ;; + *) + func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" + esac +} + + +# func_quote_for_expand arg +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + case $1 in + *[\\\`\"]*) + my_arg=`$ECHO "$1" | $SED \ + -e "$double_quote_subst" -e "$sed_double_backslash"` ;; + *) + my_arg="$1" ;; + esac + + case $my_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + my_arg="\"$my_arg\"" + ;; + esac + + func_quote_for_expand_result="$my_arg" +} + + +# func_show_eval cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$my_cmd" + my_status=$? + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + + +# func_show_eval_locale cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$lt_user_locale + $my_cmd" + my_status=$? + eval "$lt_safe_locale" + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + +# func_tr_sh +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_version +# Echo version message to standard output and exit. +func_version () +{ + $opt_debug + + $SED -n '/(C)/!b go + :more + /\./!{ + N + s/\n# / / + b more + } + :go + /^# '$PROGRAM' (GNU /,/# warranty; / { + s/^# // + s/^# *$// + s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ + p + }' < "$progpath" + exit $? +} + +# func_usage +# Echo short help message to standard output and exit. +func_usage () +{ + $opt_debug + + $SED -n '/^# Usage:/,/^# *.*--help/ { + s/^# // + s/^# *$// + s/\$progname/'$progname'/ + p + }' < "$progpath" + echo + $ECHO "run \`$progname --help | more' for full usage" + exit $? +} + +# func_help [NOEXIT] +# Echo long help message to standard output and exit, +# unless 'noexit' is passed as argument. +func_help () +{ + $opt_debug + + $SED -n '/^# Usage:/,/# Report bugs to/ { + :print + s/^# // + s/^# *$// + s*\$progname*'$progname'* + s*\$host*'"$host"'* + s*\$SHELL*'"$SHELL"'* + s*\$LTCC*'"$LTCC"'* + s*\$LTCFLAGS*'"$LTCFLAGS"'* + s*\$LD*'"$LD"'* + s/\$with_gnu_ld/'"$with_gnu_ld"'/ + s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ + s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ + p + d + } + /^# .* home page:/b print + /^# General help using/b print + ' < "$progpath" + ret=$? + if test -z "$1"; then + exit $ret + fi +} + +# func_missing_arg argname +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $opt_debug + + func_error "missing argument for $1." + exit_cmd=exit +} + + +# func_split_short_opt shortopt +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +func_split_short_opt () +{ + my_sed_short_opt='1s/^\(..\).*$/\1/;q' + my_sed_short_rest='1s/^..\(.*\)$/\1/;q' + + func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` + func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` +} # func_split_short_opt may be replaced by extended shell implementation + + +# func_split_long_opt longopt +# Set func_split_long_opt_name and func_split_long_opt_arg shell +# variables after splitting LONGOPT at the `=' sign. +func_split_long_opt () +{ + my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' + my_sed_long_arg='1s/^--[^=]*=//' + + func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` + func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` +} # func_split_long_opt may be replaced by extended shell implementation + +exit_cmd=: + + + + + +magic="%%%MAGIC variable%%%" +magic_exe="%%%MAGIC EXE variable%%%" + +# Global variables. +nonopt= +preserve_args= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "${1}=\$${1}\${2}" +} # func_append may be replaced by extended shell implementation + +# func_append_quoted var value +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +func_append_quoted () +{ + func_quote_for_eval "${2}" + eval "${1}=\$${1}\\ \$func_quote_for_eval_result" +} # func_append_quoted may be replaced by extended shell implementation + + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "${@}"` +} # func_arith may be replaced by extended shell implementation + + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` +} # func_len may be replaced by extended shell implementation + + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` +} # func_lo2o may be replaced by extended shell implementation + + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` +} # func_xform may be replaced by extended shell implementation + + +# func_fatal_configuration arg... +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func_error ${1+"$@"} + func_error "See the $PACKAGE documentation for more information." + func_fatal_error "Fatal configuration error." +} + + +# func_config +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + +# func_features +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test "$build_libtool_libs" = yes; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + +# func_enable_tag tagname +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname="$1" + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf="/$re_begincf/,/$re_endcf/p" + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + +# func_check_version_match +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# Shorthand for --mode=foo, only valid as the first argument +case $1 in +clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; +compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; +execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; +finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; +install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; +link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; +uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; +esac + + + +# Option defaults: +opt_debug=: +opt_dry_run=false +opt_config=false +opt_preserve_dup_deps=false +opt_features=false +opt_finish=false +opt_help=false +opt_help_all=false +opt_silent=: +opt_warning=: +opt_verbose=: +opt_silent=false +opt_verbose=false + + +# Parse options once, thoroughly. This comes as soon as possible in the +# script to make things like `--version' happen as quickly as we can. +{ + # this just eases exit handling + while test $# -gt 0; do + opt="$1" + shift + case $opt in + --debug|-x) opt_debug='set -x' + func_echo "enabling shell trace mode" + $opt_debug + ;; + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + --config) + opt_config=: +func_config + ;; + --dlopen|-dlopen) + optarg="$1" + opt_dlopen="${opt_dlopen+$opt_dlopen +}$optarg" + shift + ;; + --preserve-dup-deps) + opt_preserve_dup_deps=: + ;; + --features) + opt_features=: +func_features + ;; + --finish) + opt_finish=: +set dummy --mode finish ${1+"$@"}; shift + ;; + --help) + opt_help=: + ;; + --help-all) + opt_help_all=: +opt_help=': help-all' + ;; + --mode) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_mode="$optarg" +case $optarg in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $opt" + exit_cmd=exit + break + ;; +esac + shift + ;; + --no-silent|--no-quiet) + opt_silent=false +func_append preserve_args " $opt" + ;; + --no-warning|--no-warn) + opt_warning=false +func_append preserve_args " $opt" + ;; + --no-verbose) + opt_verbose=false +func_append preserve_args " $opt" + ;; + --silent|--quiet) + opt_silent=: +func_append preserve_args " $opt" + opt_verbose=false + ;; + --verbose|-v) + opt_verbose=: +func_append preserve_args " $opt" +opt_silent=false + ;; + --tag) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_tag="$optarg" +func_append preserve_args " $opt $optarg" +func_enable_tag "$optarg" + shift + ;; + + -\?|-h) func_usage ;; + --help) func_help ;; + --version) func_version ;; + + # Separate optargs to long options: + --*=*) + func_split_long_opt "$opt" + set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-n*|-v*) + func_split_short_opt "$opt" + set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognized option \`$opt'" ;; + *) set dummy "$opt" ${1+"$@"}; shift; break ;; + esac + done + + # Validate options: + + # save first non-option argument + if test "$#" -gt 0; then + nonopt="$opt" + shift + fi + + # preserve --debug + test "$opt_debug" = : || func_append preserve_args " --debug" + + case $host in + *cygwin* | *mingw* | *pw32* | *cegcc*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + func_fatal_configuration "not configured to build any kind of library" + fi + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test "$opt_mode" != execute; then + func_error "unrecognized option \`-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$progname --help --mode=$opt_mode' for more information." + } + + + # Bail if the options were screwed + $exit_cmd $EXIT_FAILURE +} + + + + +## ----------- ## +## Main. ## +## ----------- ## + +# func_lalib_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null \ + | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if `file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case "$lalib_p_line" in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test "$lalib_p" = yes +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + func_lalib_p "$1" +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $opt_debug + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$save_ifs + eval cmd=\"$cmd\" + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# `FILE.' does not work on cygwin managed mounts. +func_source () +{ + $opt_debug + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case "$lt_sysroot:$1" in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result="=$func_stripname_result" + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $opt_debug + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with \`--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=${1} + if test "$build_libtool_libs" = yes; then + write_lobj=\'${2}\' + else + write_lobj=none + fi + + if test "$build_old_libs" = yes; then + write_oldobj=\'${3}\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$lt_sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $opt_debug + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result="" + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result" ; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $opt_debug + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $opt_debug + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $opt_debug + if test -z "$2" && test -n "$1" ; then + func_error "Could not determine host file name corresponding to" + func_error " \`$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result="$1" + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $opt_debug + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " \`$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result="$3" + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $opt_debug + case $4 in + $1 ) func_to_host_path_result="$3$func_to_host_path_result" + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via `$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $opt_debug + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $opt_debug + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result="$1" +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result="$func_convert_core_msys_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via `$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $opt_debug + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd="func_convert_path_${func_stripname_result}" + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $opt_debug + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result="$1" +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_msys_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_mode_compile arg... +func_mode_compile () +{ + $opt_debug + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg="$arg" + arg_mode=normal + ;; + + target ) + libobj="$arg" + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify \`-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + func_append_quoted lastarg "$arg" + done + IFS="$save_ifs" + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg="$srcfile" + srcfile="$arg" + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with \`-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj="$func_basename_result" + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from \`$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name \`$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname="$func_basename_result" + xdir="$func_dirname_result" + lobj=${xdir}$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test "$build_libtool_libs" = yes; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test "$pic_mode" != no; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test "$suppress_opt" = yes; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test "$build_old_libs" = yes; then + if test "$pic_mode" != yes; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test "$compiler_c_o" = yes; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test "$opt_mode" = compile && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a \`.o' file suitable for static linking + -static only build a \`.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode \`$opt_mode'" + ;; + esac + + echo + $ECHO "Try \`$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test "$opt_help" = :; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | sed -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + sed '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $opt_debug + # The first argument is the command name. + cmd="$nonopt" + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "\`$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "\`$file' was not linked with \`-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir="$func_dirname_result" + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir="$func_dirname_result" + ;; + + *) + func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file="$progdir/$program" + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if test "X$opt_dry_run" = Xfalse; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + fi +} + +test "$opt_mode" = execute && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $opt_debug + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "\`$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument \`$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and \`=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_silent && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the \`$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test "$opt_mode" = finish && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $opt_debug + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac; then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test "x$prev" = x-m && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the \`$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir="$func_dirname_result" + destname="$func_basename_result" + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "\`$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "\`$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir="$func_dirname_result" + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking \`$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname="$1" + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme="$stripme" + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme="" + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try `ln -sf' first, because the `ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name="$func_basename_result" + instname="$dir/$name"i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to \`$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script \`$wrapper'" + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "\`$lib' has not been installed in \`$libdir'" + finalize=no + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + $opt_dry_run || { + if test "$finalize" = yes; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file="$func_basename_result" + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_silent || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink \`$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file="$outputname" + else + func_warning "cannot relink \`$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name="$func_basename_result" + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run \`$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test "$opt_mode" = install && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $opt_debug + my_outputname="$1" + my_originator="$2" + my_pic_p="${3-no}" + my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms="${my_outputname}S.c" + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${my_outputname}.nm" + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#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 + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + func_verbose "generating symbol list for \`$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $opt_dry_run || { + $RM $export_symbols + eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from \`$dlprefile'" + func_basename "$dlprefile" + name="$func_basename_result" + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename="" + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname" ; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename="$func_basename_result" + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename" ; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[]; +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{\ + { \"$my_originator\", (void *) 0 }," + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + if test "X$my_pic_p" != Xno; then + pic_flag_for_symtable=" $pic_flag" + fi + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' + + # Transform the symbol file into the correct name. + symfileobj="$output_objdir/${my_outputname}S.$objext" + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for \`$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $opt_debug + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $opt_debug + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $opt_debug + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive which possess that section. Heuristic: eliminate + # all those which have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $opt_debug + if func_cygming_gnu_implib_p "$1" ; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1" ; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result="" + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $opt_debug + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + if test "$lock_old_archive_extraction" = yes; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test "$lock_old_archive_extraction" = yes; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $opt_debug + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib="$func_basename_result" + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir="$my_gentop/$my_xlib_u" + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`basename "$darwin_archive"` + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" + $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" + func_extract_an_archive "`pwd`" "${darwin_base_archive}" + cd "$darwin_curdir" + $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result="$my_oldobjs" +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory in which it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ which is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options which match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +/* declarations of non-ANSI functions */ +#if defined(__MINGW32__) +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined(__CYGWIN__) +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined (other platforms) ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined(_MSC_VER) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +# ifndef _INTPTR_T_DEFINED +# define _INTPTR_T_DEFINED +# define intptr_t int +# endif +#elif defined(__MINGW32__) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined(__CYGWIN__) +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined (other platforms) ... */ +#endif + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +#if defined(LT_DEBUGWRAPPER) +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp (str, pat) == 0) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + int len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + int orig_value_len = strlen (orig_value); + int add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + int len = strlen (new_value); + while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[len-1] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $opt_debug + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $opt_debug + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # which system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll which has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=no + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module="${wl}-single_module" + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg="$1" + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir="$arg" + prev= + continue + ;; + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + test -f "$arg" \ + || func_fatal_error "symbol file \`$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file \`$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg="$arg" + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "\`-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between \`-L' and \`$1'" + else + func_fatal_error "need path for \`-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of \`$dir'" + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "\`-no-install' is ignored for $host" + func_warning "assuming \`-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-flto*|-fwhopr*|-fuse-linker-plugin) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the \`$prevarg' option requires an argument" + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname="$func_basename_result" + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + func_dirname "$output" "/" "" + output_objdir="$func_dirname_result$objdir" + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps ; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test "$linkmode,$pass" = "lib,link"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs="$tmp_deplibs" + fi + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test "$linkmode,$pass" = "lib,dlpreopen"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs="$dlprefiles" + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + func_warning "\`-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test "$linkmode" = lib; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + *.ltframework) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "\`-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + else + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + ;; + esac + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + + if test "$found" = yes || test -f "$lib"; then : + else + func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" + fi + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "\`$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + elif test "$linkmode" != prog && test "$linkmode" != lib; then + func_fatal_error "\`$lib' is not a convenience library" + fi + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test "$prefer_static_libs" = yes || + test "$prefer_static_libs,$installed" = "built,no"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib="$l" + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + func_fatal_error "cannot -dlopen a convenience library: \`$lib'" + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of \`$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir="$ladir" + fi + ;; + esac + func_basename "$lib" + laname="$func_basename_result" + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library \`$lib' was moved." + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$lt_sysroot$libdir" + absdir="$lt_sysroot$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir" && test "$linkmode" = prog; then + func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" + fi + case "$host" in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath:" in + *"$absdir:"*) ;; + *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test "$installed" = no; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule="" + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule="$dlpremoduletest" + break + fi + done + if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then + echo + if test "$linkmode" = prog; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname="$1" + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc*) + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + func_basename "$soroot" + soname="$func_basename_result" + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from \`$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for \`$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$opt_mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; + *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we can not + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null ; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + elif test -n "$old_library"; then + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$absdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && + test "$hardcode_minus_L" != yes && + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$opt_mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system can not link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path="$deplib" ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of \`$dir'" + absdir="$dir" + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl" ; then + depdepl="$absdir/$objdir/$depdepl" + darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" + func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" + path= + fi + fi + ;; + *) + path="-L$absdir/$objdir" + ;; + esac + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "\`$deplib' seems to be moved" + + path="-L$absdir" + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test "$pass" = link; then + if test "$linkmode" = "prog"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + fi + if test "$linkmode" = prog || test "$linkmode" = lib; then + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "\`-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "\`-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test "$module" = no && \ + func_fatal_help "libtool library \`$output' must begin with \`lib'" + + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test "$dlself" != no && \ + func_warning "\`-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test "$#" -gt 1 && \ + func_warning "ignoring multiple \`-rpath's for a libtool library" + + install_libdir="$1" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "\`-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + shift + IFS="$save_ifs" + + test -n "$7" && \ + func_fatal_help "too many parameters to \`-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$1" + number_minor="$2" + number_revision="$3" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|qnx|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_minor" + lt_irix_increment=no + ;; + esac + ;; + no) + current="$1" + revision="$2" + age="$3" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT \`$current' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION \`$revision' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE \`$age' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE \`$age' is greater than the current interface number \`$current'" + func_fatal_error "\`$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current" + ;; + + irix | nonstopux) + if test "X$lt_irix_increment" = "Xno"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + func_append verstring ":${current}.0" + ;; + + qnx) + major=".$current" + versuffix=".$current" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + + *) + func_fatal_configuration "unknown library version type \`$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + func_warning "undefined symbols not allowed in $host shared libraries" + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + + fi + + func_generate_dlsyms "$libname" "$libname" "yes" + func_append libobjs " $symfileobj" + test "X$libobjs" = "X " && libobjs= + + if test "$opt_mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + func_append deplibs " -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test "X$deplibs_check_method" = "Xnone"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs="$new_libs" + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + # Remove ${wl} instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$opt_mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname="$1" + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols="$output_objdir/$libname.uexp" + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + if test "x`$SED 1q $export_symbols`" != xEXPORTS; then + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols="$export_symbols" + export_symbols= + always_export_symbols=yes + fi + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd1 in $cmds; do + IFS="$save_ifs" + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test "$try_normal_branch" = yes \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=${output_objdir}/${output_la}.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test "$compiler_needs_object" = yes && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then + output=${output_objdir}/${output_la}.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then + output=${output_objdir}/${output_la}.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test "$compiler_needs_object" = yes; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-${k}.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test "X$objlist" = X || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-${k}.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\${concat_cmds}$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + if ${skipped_export-false}; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + fi + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + if ${skipped_export-false}; then + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + fi + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "\`-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object \`$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "\`-release' is ignored for programs" + + test "$preload" = yes \ + && test "$dlopen_support" = unknown \ + && test "$dlopen_self" = unknown \ + && test "$dlopen_self_static" = unknown && \ + func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test "$tagname" = CXX ; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " ${wl}-bind_at_load" + func_append finalize_command " ${wl}-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append finalize_perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" "no" + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=yes + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=no + ;; + *cygwin* | *mingw* ) + if test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + *) + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + esac + if test "$wrappers_required" = no; then + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.${objext}"; then + func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' + fi + + exit $exit_status + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "\`$output' will be relinked during installation" + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource="$output_path/$objdir/lt-$output_name.c" + cwrapper="$output_path/$output_name.exe" + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host" ; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save $symfileobj" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + if test "$preload" = yes && test -f "$symfileobj"; then + func_append oldobjs " $symfileobj" + fi + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase="$func_basename_result" + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name="$func_basename_result" + func_resolve_sysroot "$deplib" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles="$newdlprefiles" + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test "x$bindir" != x ; + then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +{ test "$opt_mode" = link || test "$opt_mode" = relink; } && + func_mode_link ${1+"$@"} + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $opt_debug + RM="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) func_append RM " $arg"; rmforce=yes ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir="$func_dirname_result" + if test "X$dir" = X.; then + odir="$objdir" + else + odir="$dir/$objdir" + fi + func_basename "$file" + name="$func_basename_result" + test "$opt_mode" = uninstall && odir="$dir" + + # Remember odir for removal later, being careful to avoid duplicates + if test "$opt_mode" = clean; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case "$opt_mode" in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && + test "$pic_object" != none; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && + test "$non_pic_object" != none; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$opt_mode" = clean ; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + func_append rmfiles " $odir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && + func_mode_uninstall ${1+"$@"} + +test -z "$opt_mode" && { + help="$generic_help" + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode \`$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: +# vi:sw=2 + diff --git a/build-aux/missing b/build-aux/missing new file mode 100755 index 0000000..28055d2 --- /dev/null +++ b/build-aux/missing @@ -0,0 +1,376 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2009-04-28.21; # UTC + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, +# 2008, 2009 Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 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 . + +# 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 + +run=: +sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' +sed_minuso='s/.* -o \([^ ]*\).*/\1/p' + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case $1 in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + autom4te touch the output file, or create a stub one + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and +\`g' are ignored when checking the name. + +Send bug reports to ." + 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 + +# normalize program name to check for. +program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + +# Now exit if we have it, but it failed. Also exit now if we +# don't have it and --version was passed (most likely to detect +# the program). This is about non-GNU programs, so use $1 not +# $program. +case $1 in + lex*|yacc*) + # Not GNU programs, they don't have --version. + ;; + + tar*) + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + exit 1 + fi + ;; + + *) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + # Could not run --version or --help. This is probably someone + # running `$TOOL --version' or `$TOOL --help' to check whether + # $TOOL exists and not knowing $TOOL uses missing. + exit 1 + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case $program in + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case $f in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te*) + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison*|yacc*) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if test ! -f y.tab.h; then + echo >y.tab.h + fi + if test ! -f y.tab.c; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex*|flex*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if test ! -f lex.yy.c; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit $? + fi + ;; + + makeinfo*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + # The file to touch is that specified with -o ... + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -z "$file"; then + # ... or it is the one specified with @setfilename ... + infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n ' + /^@setfilename/{ + s/.* \([^ ]*\) *$/\1/ + p + q + }' $infile` + # ... or it is derived from the source name (dir/f.texi becomes f.info) + test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info + fi + # If the file does not exist, the user really needs makeinfo; + # let's fail without touching anything. + test -f $file || exit 1 + touch $file + ;; + + tar*) + shift + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar "$@" && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar "$@" && exit 0 + fi + firstarg="$1" + if shift; then + case $firstarg in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + case $firstarg in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# 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: diff --git a/config.h.in b/config.h.in new file mode 100755 index 0000000..423fcf8 --- /dev/null +++ b/config.h.in @@ -0,0 +1,62 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#undef LT_OBJDIR + +/* 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 diff --git a/configure b/configure new file mode 100755 index 0000000..46aa5d7 --- /dev/null +++ b/configure @@ -0,0 +1,18135 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for mmdb 1.25.5. +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='mmdb' +PACKAGE_TARNAME='mmdb' +PACKAGE_VERSION='1.25.5' +PACKAGE_STRING='mmdb 1.25.5' +PACKAGE_BUGREPORT='' +PACKAGE_URL='' + +ac_unique_file="mmdb/mmdb_align.cpp" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +MAINT +MAINTAINER_MODE_FALSE +MAINTAINER_MODE_TRUE +CXXCPP +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX +CPP +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +LN_S +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +EGREP +GREP +SED +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +LIBTOOL +OBJDUMP +DLLTOOL +AS +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +ac_ct_AR +AR +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_silent_rules +enable_dependency_tracking +enable_shared +enable_static +with_pic +enable_fast_install +with_gnu_ld +with_sysroot +enable_libtool_lock +enable_maintainer_mode +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP +CXX +CXXFLAGS +CCC +CXXCPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures mmdb 1.25.5 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/mmdb] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of mmdb 1.25.5:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --enable-shared[=PKGS] build shared libraries [default=no] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + --enable-maintainer-mode + enable make rules and dependencies not useful (and + sometimes confusing) to the casual installer + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-pic try to use only PIC/non-PIC objects [default=use + both] + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-sysroot=DIR Search for dependent libraries within DIR + (or the compiler's sysroot if not specified). + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CXXCPP C++ preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +mmdb configure 1.25.5 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + +# ac_fn_cxx_try_cpp LINENO +# ------------------------ +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_cpp + +# ac_fn_cxx_try_link LINENO +# ------------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_link +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by mmdb $as_me 1.25.5, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + # keep in sync with mmdb/mmdb_defs.h + +ac_aux_dir= +for ac_dir in build-aux "$srcdir"/build-aux; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + + + +ac_config_headers="$ac_config_headers config.h" + +am__api_version='1.12' + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='mmdb' + VERSION='1.25.5' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar lib "link -lib" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar lib "link -lib" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5 +$as_echo_n "checking the archiver ($AR) interface... " >&6; } +if ${am_cv_ar_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + am_cv_ar_interface=ar + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int some_variable = 0; +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 + (eval $am_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + am_cv_ar_interface=ar + else + am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 + (eval $am_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + am_cv_ar_interface=lib + else + am_cv_ar_interface=unknown + fi + fi + rm -f conftest.lib libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5 +$as_echo "$am_cv_ar_interface" >&6; } + +case $am_cv_ar_interface in +ar) + ;; +lib) + # Microsoft lib, so override with the ar-lib wrapper script. + # FIXME: It is wrong to rewrite AR. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__AR in this case, + # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something + # similar. + AR="$am_aux_dir/ar-lib $AR" + ;; +unknown) + as_fn_error $? "could not determine $AR interface" "$LINENO" 5 + ;; +esac + +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.2' +macro_revision='1.3337' + + + + + + + + + + + + + +ltmain="$ac_aux_dir/ltmain.sh" + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case "$ECHO" in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n $lt_cv_sys_max_cmd_len ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 +$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,b/c, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 +$as_echo "$xsi_shell" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 +$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } +lt_shell_append=no +( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 +$as_echo "$lt_shell_append" >&6; } + + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test "$GCC" != yes; then + reload_cmds=false + fi + ;; + darwin*) + if test "$GCC" = yes; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given extended regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. + if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh + # decide which to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd="$ECHO" + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -ne 0; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } + +if test "x$lt_cv_ar_at_file" = xno; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* 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 + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } + +# Check whether --with-sysroot was given. +if test "${with_sysroot+set}" = set; then : + withval=$with_sysroot; +else + with_sysroot=no +fi + + +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 +$as_echo "${with_sysroot}" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } + + + + + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test "x$lt_cv_path_mainfest_tool" != xyes; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[012]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + + + +# Set options +# Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; 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 +else + enable_shared=no +fi + + + + + + + +enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. +set dummy ${ac_tool_prefix}as; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AS+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AS"; then + ac_cv_prog_AS="$AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AS="${ac_tool_prefix}as" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AS=$ac_cv_prog_AS +if test -n "$AS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 +$as_echo "$AS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AS"; then + ac_ct_AS=$AS + # Extract the first word of "as", so it can be a program name with args. +set dummy as; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AS+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AS"; then + ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AS="as" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AS=$ac_cv_prog_ac_ct_AS +if test -n "$ac_ct_AS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 +$as_echo "$ac_ct_AS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_AS" = x; then + AS="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AS=$ac_ct_AS + fi +else + AS="$ac_cv_prog_AS" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + + ;; +esac + +test -z "$AS" && AS=as + + + + + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + + enable_dlopen=no + + + + + # Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; 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 +else + enable_static=yes +fi + + + + + + + + + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; pic_mode="$withval" +else + pic_mode=default +fi + + +test -z "$pic_mode" && pic_mode=default + + + + + + + + # Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; 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 +else + enable_fast_install=yes +fi + + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +#define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC="$CC" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test "$GCC" = yes; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + lt_prog_compiler_pic='-Xcompiler -fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ F* | *Sun*Fortran*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works" = xyes; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test x"$lt_cv_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_flag_spec_ld= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='${wl}--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec= + hardcode_libdir_flag_spec_ld='-rpath $libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = no; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld='+b $libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test x"$lt_cv_prog_compiler__b" = xyes; then + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test "$lt_cv_irix_exported_symbol" = yes; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='${wl}-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='${wl}-z,text' + allow_undefined_flag='${wl}-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='${wl}-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test "$ld_shlibs" = no && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; + *) lt_sed_strip_eq="s,=/,/,g" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's,/\([A-Za-z]:\),\1,g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +haiku*) + version_type=linux + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Add ABI-specific directories to the system library path. + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" + + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test "X$hardcode_automatic" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test "$hardcode_action" = relink || + test "$inherit_rpath" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report which library types will actually be built + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + + + +func_stripname_cnf () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname_cnf + + if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if ${ac_cv_prog_CXXCPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +$as_echo "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +else + _lt_caught_CXX_error=yes +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +compiler_needs_object_CXX=no +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_direct_absolute_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_flag_spec_ld_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +inherit_rpath_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +reload_flag_CXX=$reload_flag +reload_cmds_CXX=$reload_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + compiler_CXX=$CC + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` + + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' + else + lt_prog_compiler_no_builtin_flag_CXX= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + ld_shlibs_CXX=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + file_list_spec_CXX='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec_CXX='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + always_export_symbols_CXX=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_CXX='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' ${wl}-bernotok' + allow_undefined_flag_CXX=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + fi + archive_cmds_need_lc_CXX=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_CXX=' ' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=yes + file_list_spec_CXX='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' + enable_shared_with_static_runtimes_CXX=yes + # Don't use ranlib + old_postinstall_cmds_CXX='chmod 644 $oldlib' + postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + + + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + else + whole_archive_flag_spec_CXX='' + fi + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + if test "$lt_cv_apple_cc_single_mod" != "yes"; then + archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi + + else + ld_shlibs_CXX=no + fi + + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + freebsd[12]*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + ld_shlibs_CXX=no + ;; + + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + + gnu*) + ;; + + haiku*) + archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + link_all_deplibs_CXX=yes + ;; + + hpux9*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + export_dynamic_flag_spec_CXX='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + inherit_rpath_CXX=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [1-5].* | *pgcpp\ [1-5].*) + prelink_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + old_archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object_CXX=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + ld_shlibs_CXX=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + ld_shlibs_CXX=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + hardcode_direct_absolute_CXX=yes + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='${wl}-E' + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + ld_shlibs_CXX=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + case $host in + osf3*) + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + ;; + *) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + ;; + esac + + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + no_undefined_flag_CXX=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='${wl}-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_CXX='${wl}-z,text' + allow_undefined_flag_CXX='${wl}-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ + '"$old_archive_cmds_CXX" + reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ + '"$reload_cmds_CXX" + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } + test "$ld_shlibs_CXX" = no && can_build_shared=no + + GCC_CXX="$GXX" + LD_CXX="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + # Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF + + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +esac + +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case ${prev}${p} in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test "$pre_test_object_deps_done" = no; then + case ${prev} in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX="${prev}${p}" + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX="${prev}${p}" + else + postdeps_CXX="${postdeps_CXX} ${prev}${p}" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX="$p" + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX="$p" + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +case $host_os in +interix[3-9]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC* | sunCC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac + + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + compiler_lib_search_dirs_CXX= +if test -n "${compiler_lib_search_path_CXX}"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + + + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_CXX='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static_CXX= + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-qpic' + lt_prog_compiler_static_CXX='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } +lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then + : +else + lt_prog_compiler_static_CXX= +fi + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + case $host_os in + aix[4-9]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global defined + # symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + ;; + esac + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test "$ld_shlibs_CXX" = no && can_build_shared=no + +with_gnu_ld_CXX=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc_CXX=no + else + lt_cv_archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } + archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +haiku*) + version_type=linux + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Add ABI-specific directories to the system library path. + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" + + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || + test -n "$runpath_var_CXX" || + test "X$hardcode_automatic_CXX" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct_CXX" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && + test "$hardcode_minus_L_CXX" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +$as_echo "$hardcode_action_CXX" >&6; } + +if test "$hardcode_action_CXX" = relink || + test "$inherit_rpath_CXX" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# AC_PROG_CXX doesn't fail if compiler is not found, test it explicitely +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + +else + as_fn_error $? "C++ compiler not found." "$LINENO" 5 +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 +$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } + # Check whether --enable-maintainer-mode was given. +if test "${enable_maintainer_mode+set}" = set; then : + enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval +else + USE_MAINTAINER_MODE=no +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 +$as_echo "$USE_MAINTAINER_MODE" >&6; } + if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + + MAINT=$MAINTAINER_MODE_TRUE + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing cos" >&5 +$as_echo_n "checking for library containing cos... " >&6; } +if ${ac_cv_search_cos+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char cos (); +int +main () +{ +return cos (); + ; + return 0; +} +_ACEOF +for ac_lib in '' m; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_cos=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_cos+:} false; then : + break +fi +done +if ${ac_cv_search_cos+:} false; then : + +else + ac_cv_search_cos=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_cos" >&5 +$as_echo "$ac_cv_search_cos" >&6; } +ac_res=$ac_cv_search_cos +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +else + as_fn_error $? "need math library" "$LINENO" 5 +fi + +ac_config_files="$ac_config_files Makefile mmdb.pc" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then + as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by mmdb $as_me 1.25.5, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to the package provider." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +mmdb config.status 1.25.5 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_ld='`$ECHO "$hardcode_libdir_flag_spec_ld" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' +predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' +predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' +postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' +LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' +reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' +reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' +GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_ld_CXX='`$ECHO "$hardcode_libdir_flag_spec_ld_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' +inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' +link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' +always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' +exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' +predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' +postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' +predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' +postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in AS \ +DLLTOOL \ +OBJDUMP \ +SHELL \ +ECHO \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +nm_file_list_spec \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_flag_spec_ld \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_CXX \ +reload_flag_CXX \ +compiler_CXX \ +lt_prog_compiler_no_builtin_flag_CXX \ +lt_prog_compiler_pic_CXX \ +lt_prog_compiler_wl_CXX \ +lt_prog_compiler_static_CXX \ +lt_cv_prog_compiler_c_o_CXX \ +export_dynamic_flag_spec_CXX \ +whole_archive_flag_spec_CXX \ +compiler_needs_object_CXX \ +with_gnu_ld_CXX \ +allow_undefined_flag_CXX \ +no_undefined_flag_CXX \ +hardcode_libdir_flag_spec_CXX \ +hardcode_libdir_flag_spec_ld_CXX \ +hardcode_libdir_separator_CXX \ +exclude_expsyms_CXX \ +include_expsyms_CXX \ +file_list_spec_CXX \ +compiler_lib_search_dirs_CXX \ +predep_objects_CXX \ +postdep_objects_CXX \ +predeps_CXX \ +postdeps_CXX \ +compiler_lib_search_path_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +sys_lib_dlsearch_path_spec \ +reload_cmds_CXX \ +old_archive_cmds_CXX \ +old_archive_from_new_cmds_CXX \ +old_archive_from_expsyms_cmds_CXX \ +archive_cmds_CXX \ +archive_expsym_cmds_CXX \ +module_cmds_CXX \ +module_expsym_cmds_CXX \ +export_symbols_cmds_CXX \ +prelink_cmds_CXX \ +postlink_cmds_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' +xsi_shell='$xsi_shell' +lt_shell_append='$lt_shell_append' + +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile' + + + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "mmdb.pc") CONFIG_FILES="$CONFIG_FILES mmdb.pc" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010 Free Software Foundation, +# Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool 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 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU 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 Libtool 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 GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +# The names of the tagged configurations supported by this script. +available_tags="CXX " + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Assembler program. +AS=$lt_AS + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Object dumper program. +OBJDUMP=$lt_OBJDUMP + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and in which our libraries should be installed. +lt_sysroot=$lt_sysroot + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# If ld is used when linking, flag to hardcode \$libdir into a binary +# during linking. This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain="$ac_aux_dir/ltmain.sh" + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + if test x"$xsi_shell" = xyes; then + sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ +func_dirname ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_basename ()$/,/^} # func_basename /c\ +func_basename ()\ +{\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ +func_dirname_and_basename ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ +func_stripname ()\ +{\ +\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ +\ # positional parameters, so assign one to ordinary parameter first.\ +\ func_stripname_result=${3}\ +\ func_stripname_result=${func_stripname_result#"${1}"}\ +\ func_stripname_result=${func_stripname_result%"${2}"}\ +} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ +func_split_long_opt ()\ +{\ +\ func_split_long_opt_name=${1%%=*}\ +\ func_split_long_opt_arg=${1#*=}\ +} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ +func_split_short_opt ()\ +{\ +\ func_split_short_opt_arg=${1#??}\ +\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ +} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ +func_lo2o ()\ +{\ +\ case ${1} in\ +\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ +\ *) func_lo2o_result=${1} ;;\ +\ esac\ +} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_xform ()$/,/^} # func_xform /c\ +func_xform ()\ +{\ + func_xform_result=${1%.*}.lo\ +} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_arith ()$/,/^} # func_arith /c\ +func_arith ()\ +{\ + func_arith_result=$(( $* ))\ +} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_len ()$/,/^} # func_len /c\ +func_len ()\ +{\ + func_len_result=${#1}\ +} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + +fi + +if test x"$lt_shell_append" = xyes; then + sed -e '/^func_append ()$/,/^} # func_append /c\ +func_append ()\ +{\ + eval "${1}+=\\${2}"\ +} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ +func_append_quoted ()\ +{\ +\ func_quote_for_eval "${2}"\ +\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ +} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 +$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} +fi + + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_CXX +reload_cmds=$lt_reload_cmds_CXX + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_CXX + +# A language specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU compiler? +with_gcc=$GCC_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_CXX + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_CXX + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# If ld is used when linking, flag to hardcode \$libdir into a binary +# during linking. This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_CXX + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_CXX + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_CXX + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_CXX + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_CXX + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_CXX +postdep_objects=$lt_postdep_objects_CXX +predeps=$lt_predeps_CXX +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# ### END LIBTOOL TAG CONFIG: CXX +_LT_EOF + + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..92ff8d6 --- /dev/null +++ b/configure.ac @@ -0,0 +1,21 @@ + +AC_INIT(mmdb, 1.25.5) # keep in sync with mmdb/mmdb_defs.h + +AC_CONFIG_AUX_DIR(build-aux) +AC_CONFIG_MACRO_DIR(m4) +AC_CONFIG_SRCDIR(mmdb/mmdb_align.cpp) +AC_CONFIG_HEADERS(config.h) +AM_INIT_AUTOMAKE([1.11 foreign subdir-objects silent-rules -Wall]) +AM_PROG_AR +LT_INIT([disable-shared win32-dll]) +AC_PROG_CXX +# AC_PROG_CXX doesn't fail if compiler is not found, test it explicitely +AC_LANG_PUSH(C++) +AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])], [], + [AC_MSG_ERROR([C++ compiler not found.])]) +AC_LANG_POP(C++) + +AM_MAINTAINER_MODE dnl disable (by default) maintainer mode + +AC_SEARCH_LIBS([cos], [m], [], [AC_MSG_ERROR([need math library])]) +AC_OUTPUT(Makefile mmdb.pc) diff --git a/m4/libtool.m4 b/m4/libtool.m4 new file mode 100755 index 0000000..88de383 --- /dev/null +++ b/m4/libtool.m4 @@ -0,0 +1,7835 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010 Free Software Foundation, +# Inc. +# Written by Gordon Matzigkeit, 1996 +# +# 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. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010 Free Software Foundation, +# Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool 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 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU 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 Libtool 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 GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +]) + +# serial 57 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +m4_defun([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_WITH_SYSROOT])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PREPARE_SED_QUOTE_VARS +# -------------------------- +# Define a few sed substitution that help us do robust quoting. +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], +[# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +]) + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from `configure', and `config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# `config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain="$ac_aux_dir/ltmain.sh" +])# _LT_PROG_LTMAIN + + +## ------------------------------------- ## +## Accumulate code for creating libtool. ## +## ------------------------------------- ## + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the `libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + +## ------------------------ ## +## FIXME: Eliminate VARNAME ## +## ------------------------ ## + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to `config.status' so that its +# declaration there will have the same value as in `configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags="_LT_TAGS"dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into `config.status', and then the shell code to quote escape them in +# for loops in `config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$[]1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +_LT_OUTPUT_LIBTOOL_INIT +]) + +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) +# ------------------------------------ +# Generate a child script FILE with all initialization necessary to +# reuse the environment learned by the parent script, and make the +# file executable. If COMMENT is supplied, it is inserted after the +# `#!' sequence but before initialization text begins. After this +# macro, additional text can be appended to FILE to form the body of +# the child script. The macro ends with non-zero status if the +# file could not be fully written (such as if the disk is full). +m4_ifdef([AS_INIT_GENERATED], +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], +[m4_defun([_LT_GENERATED_FILE_INIT], +[m4_require([AS_PREPARE])]dnl +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl +[lt_write_fail=0 +cat >$1 <<_ASEOF || lt_write_fail=1 +#! $SHELL +# Generated by $as_me. +$2 +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$1 <<\_ASEOF || lt_write_fail=1 +AS_SHELL_SANITIZE +_AS_PREPARE +exec AS_MESSAGE_FD>&1 +_ASEOF +test $lt_write_fail = 0 && chmod +x $1[]dnl +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +\`$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2010 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test $[#] != 0 +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try \`$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try \`$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test "$silent" = yes && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +_LT_COPYING +_LT_LIBTOOL_TAGS + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + _LT_PROG_REPLACE_SHELLFNS + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +dnl AC_DEFUN([AC_LIBTOOL_RC], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS="$save_LDFLAGS" + ]) + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], + [lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD + echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[[012]]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES +# -------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + m4_if([$1], [CXX], +[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) +# ---------------------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +# Store the results from the different compilers for each TAGNAME. +# Allow to override them for all tags through lt_cv_aix_libpath. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ + lt_aix_libpath_sed='[ + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }]' + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi],[]) + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" + fi + ]) + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) +fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[m4_divert_text([M4SH-INIT], [$1 +])])# _LT_SHELL_INIT + + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Find how we can fake an echo command that does not interpret backslash. +# In particular, with Autoconf 2.60 or later we add some code to the start +# of the generated configure script which will find a shell with a builtin +# printf (which we can use as an echo command). +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +AC_MSG_CHECKING([how to print strings]) +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$[]1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +case "$ECHO" in + printf*) AC_MSG_RESULT([printf]) ;; + print*) AC_MSG_RESULT([print -r]) ;; + *) AC_MSG_RESULT([cat]) ;; +esac + +m4_ifdef([_AS_DETECT_SUGGESTED], +[_AS_DETECT_SUGGESTED([ + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test "X`printf %s $ECHO`" = "X$ECHO" \ + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) + +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_WITH_SYSROOT +# ---------------- +AC_DEFUN([_LT_WITH_SYSROOT], +[AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[ --with-sysroot[=DIR] Search for dependent libraries within DIR + (or the compiler's sysroot if not specified).], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([${with_sysroot}]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and in which our libraries should be installed.])]) + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" +])# _LT_ENABLE_LOCK + + +# _LT_PROG_AR +# ----------- +m4_defun([_LT_PROG_AR], +[AC_CHECK_TOOLS(AR, [ar], false) +: ${AR=ar} +: ${AR_FLAGS=cru} +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], + [lt_cv_ar_at_file=no + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([lt_ar_try]) + if test "$ac_status" -eq 0; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test "$ac_status" -ne 0; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test "x$lt_cv_ar_at_file" = xno; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi +_LT_DECL([], [archiver_list_spec], [1], + [How to feed a file listing to the archiver]) +])# _LT_PROG_AR + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[_LT_PROG_AR + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +_LT_DECL([], [lock_old_archive_extraction], [0], + [Whether to use a lock for old archive extraction]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test x"[$]$2" = xyes; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links="nottested" +if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", + [Define to the sub-directory in which libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || + test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; + *) lt_sed_strip_eq="s,=/,/,g" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[[4-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[123]]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +haiku*) + version_type=linux + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[[3-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], + [lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [lt_cv_shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ]) + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Add ABI-specific directories to the system library path. + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" + + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [install_override_mode], [1], + [Permission mode override for installation of shared libraries]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], + [Run-time system search path for libraries]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program which can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program which can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method = "file_magic"]) +_LT_DECL([], [file_magic_glob], [1], + [How to find potential files when deplibs_check_method = "file_magic"]) +_LT_DECL([], [want_nocaseglob], [1], + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi]) +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +# -------------------------------- +# how to determine the name of the shared library +# associated with a specific link library. +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +m4_require([_LT_DECL_DLLTOOL]) +AC_CACHE_CHECK([how to associate runtime and link libraries], +lt_cv_sharedlib_from_linklib_cmd, +[lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh + # decide which to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd="$ECHO" + ;; +esac +]) +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], + [Command to associate shared and link libraries]) +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB + + +# _LT_PATH_MANIFEST_TOOL +# ---------------------- +# locate the manifest tool +m4_defun([_LT_PATH_MANIFEST_TOOL], +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], + [lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&AS_MESSAGE_LOG_FD + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest*]) +if test "x$lt_cv_path_mainfest_tool" != xyes; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + case $cc_basename in + nvcc*) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; + *) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + esac + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* 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@&t@_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([], [nm_file_list_spec], [1], + [Specify filename containing input files for $NM]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Xcompiler -fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ F* | *Sun*Fortran*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +AC_CACHE_CHECK([for $compiler option to produce PIC], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global defined + # symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + ;; + esac + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + esac + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + m4_if($1, [], [ + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + _LT_LINKER_OPTION([if $CC understands -b], + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + ;; + esac + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], + [lt_cv_irix_exported_symbol], + [save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], + [lt_cv_irix_exported_symbol=yes], + [lt_cv_irix_exported_symbol=no]) + LDFLAGS="$save_LDFLAGS"]) + if test "$lt_cv_irix_exported_symbol" = yes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_CACHE_CHECK([whether -lc should be explicitly linked in], + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), + [$RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1], + [[If ld is used when linking, flag to hardcode $libdir into a binary + during linking. This must work even if $libdir does not exist]]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting ${shlibpath_var} if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [postlink_cmds], [2], + [Commands necessary for finishing linking programs]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report which library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC="$lt_save_CC" +])# _LT_LANG_C_CONFIG + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd[[12]]*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + gnu*) + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ + '"$_LT_TAGVAR(old_archive_cmds, $1)" + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ + '"$_LT_TAGVAR(reload_cmds, $1)" + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + + _LT_TAGVAR(GCC, $1)="$GXX" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_FUNC_STRIPNAME_CNF +# ---------------------- +# func_stripname_cnf prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# +# This function is identical to the (non-XSI) version of func_stripname, +# except this one can be used by m4 code that may be executed by configure, +# rather than the libtool script. +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl +AC_REQUIRE([_LT_DECL_SED]) +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) +func_stripname_cnf () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname_cnf +])# _LT_FUNC_STRIPNAME_CNF + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +esac + +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case ${prev}${p} in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test "$pre_test_object_deps_done" = no; then + case ${prev} in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)="${prev}${p}" + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)="$p" + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)="$p" + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC* | sunCC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_LANG_PUSH(Fortran 77) +if test -z "$F77" || test "X$F77" = "Xno"; then + _lt_disable_F77=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_F77" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$G77" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC="$lt_save_CC" + CFLAGS="$lt_save_CFLAGS" +fi # test "$_lt_disable_F77" != yes + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_LANG_PUSH(Fortran) + +if test -z "$FC" || test "X$FC" = "Xno"; then + _lt_disable_FC=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_FC" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test "$_lt_disable_FC" != yes + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +CFLAGS=$GCJFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + +# _LT_DECL_DLLTOOL +# ---------------- +# Ensure DLLTOOL variable is set. +m4_defun([_LT_DECL_DLLTOOL], +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) +AC_SUBST([DLLTOOL]) +]) + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,b/c, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +AC_MSG_RESULT([$xsi_shell]) +_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) + +AC_MSG_CHECKING([whether the shell understands "+="]) +lt_shell_append=no +( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +AC_MSG_RESULT([$lt_shell_append]) +_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) +# ------------------------------------------------------ +# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and +# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. +m4_defun([_LT_PROG_FUNCTION_REPLACE], +[dnl { +sed -e '/^$1 ()$/,/^} # $1 /c\ +$1 ()\ +{\ +m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) +} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: +]) + + +# _LT_PROG_REPLACE_SHELLFNS +# ------------------------- +# Replace existing portable implementations of several shell functions with +# equivalent extended shell implementations where those features are available.. +m4_defun([_LT_PROG_REPLACE_SHELLFNS], +[if test x"$xsi_shell" = xyes; then + _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac]) + + _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl + func_basename_result="${1##*/}"]) + + _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}"]) + + _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary parameter first. + func_stripname_result=${3} + func_stripname_result=${func_stripname_result#"${1}"} + func_stripname_result=${func_stripname_result%"${2}"}]) + + _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl + func_split_long_opt_name=${1%%=*} + func_split_long_opt_arg=${1#*=}]) + + _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) + + _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac]) + + _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) + + _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) + + _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) +fi + +if test x"$lt_shell_append" = xyes; then + _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) + + _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl + func_quote_for_eval "${2}" +dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ + eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) +fi +]) + +# _LT_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine which file name conversion functions should be used by +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed +# for certain cross-compile configurations and native mingw. +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_MSG_CHECKING([how to convert $build file names to $host format]) +AC_CACHE_VAL(lt_cv_to_host_file_cmd, +[case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac +]) +to_host_file_cmd=$lt_cv_to_host_file_cmd +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], + [0], [convert $build file names to $host format])dnl + +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, +[#assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac +]) +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], + [0], [convert $build files to toolchain format])dnl +])# _LT_PATH_CONVERSION_FUNCTIONS diff --git a/m4/ltoptions.m4 b/m4/ltoptions.m4 new file mode 100755 index 0000000..17cfd51 --- /dev/null +++ b/m4/ltoptions.m4 @@ -0,0 +1,369 @@ +# 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], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [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])]) diff --git a/m4/ltsugar.m4 b/m4/ltsugar.m4 new file mode 100755 index 0000000..9000a05 --- /dev/null +++ b/m4/ltsugar.m4 @@ -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 +]) diff --git a/m4/ltversion.m4 b/m4/ltversion.m4 new file mode 100755 index 0000000..07a8602 --- /dev/null +++ b/m4/ltversion.m4 @@ -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) +]) diff --git a/m4/lt~obsolete.m4 b/m4/lt~obsolete.m4 new file mode 100755 index 0000000..c573da9 --- /dev/null +++ b/m4/lt~obsolete.m4 @@ -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])]) diff --git a/mmdb.pc.in b/mmdb.pc.in new file mode 100644 index 0000000..dd654a4 --- /dev/null +++ b/mmdb.pc.in @@ -0,0 +1,10 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: mmdb +Description: Macromolecular coordinate library +Version: @VERSION@ +Libs: -L${libdir} -lmmdb +Cflags: -I${includedir} diff --git a/mmdb/bfgs_min.cpp b/mmdb/bfgs_min.cpp new file mode 100755 index 0000000..9b3a95e --- /dev/null +++ b/mmdb/bfgs_min.cpp @@ -0,0 +1,936 @@ +// $Id: bfgs_min.cpp,v 1.19 2012/01/26 17:52:19 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. + +// ================================================================= +// +// 27.06.01 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : bfgs_min +// ~~~~~~~~~ +// **** Classes : CBFGSMin ( minimization driver ) +// ~~~~~~~~~ +// +// (C) E. Krissinel 2000-2008 +// +// ================================================================= +// + +#ifndef __MATH_H +#include +#endif + +#ifndef __BFGS_Min__ +#include "bfgs_min.h" +#endif + + +// ============================================================== + +CBFGSMin::CBFGSMin() { + + MFunc = NULL; + MFuncData = NULL; + PFunc = NULL; + PFuncData = NULL; + + N = 0; + NAlloc = 0; + + Hsn = NULL; + TL = NULL; + LL = NULL; + XOpt = NULL; + XPlus = NULL; + Sx = NULL; + SN = NULL; + HDiag = NULL; + GradX = NULL; + GPlus = NULL; + StepSize = NULL; + FNeighbor = NULL; + us = NULL; + uy = NULL; + ut = NULL; + Freese = NULL; + Func = 0.0; + FPlus = 0.0; + FOpt = 0.0; + TakenLambda = 0.0; + ForDiff = False; + CalcHess = False; + + Etha = 0.0; + SqrtEtha = 0.0; + CubertEtha = 0.0; + TpF = 1.0; + GrdEps = 0.0; + StpEps = 0.0; + MxStep = MaxReal; + CnsMax = 0; + MaxItn = 100; + TermCode = BFGS_NoTermination; + ModF = False; + +} + +CBFGSMin::~CBFGSMin() { + FreeMemory(); +} + +void CBFGSMin::MinFunc ( rvector X, realtype & F ) { + if (MFunc) (*MFunc)(MFuncData,N,X,F); + else F = 0.0; +} + +void CBFGSMin::MinFunc1 ( rvector X, realtype & F ) { +int i; + MinFunc ( X,F ); + if (ModF && (FEtha) Etha = MachEps; + } + SqrtEtha = sqrt(Etha); + CubertEtha = Exp ( log(Etha)/3.0 ); + + if (Etha>0.01) { + TermCode = BFGS_TooFewDigits; + return; + } + + if (TypF<=0.0) TpF = 1.0; + else TpF = TypF; + + S1 = Exp(log(MachEps)/3.0); + if (GrdTol>0.0) GrdEps = GrdTol; + else { + GrdEps = sqrt(Etha); + if (S1>GrdEps) GrdEps = S1; + } + + if (StpTol>0.0) StpEps = StpTol; + else StpEps = Exp ( log(MachEps)*2.0/3.0 ); + + if (MaxStp>0.0) MxStep = MaxStp; + else { + S1 = 0.0; + S2 = 0.0; + for (i=1;i<=N;i++) { + S0 = Sx[i]; + S0 *= Sx[i]; + S2 += S0; + S0 *= x0[i]; + S1 += S0*x0[i]; + } + S1 = sqrt(S1); + S2 = sqrt(S2); + if (S2>S1) MxStep = S2; + else MxStep = S1; + MxStep *= 1000.0; + } + + if (ItnLmt>0) MaxItn = ItnLmt; + else MaxItn = 100; + + TermCode = BFGS_NoTermination; + +} + + +// ------------------------------------------------------------------- + +void CBFGSMin::UMStop0 ( rvector x0, rvector Grad ) { +int i; +realtype S,Fmax,St; + + CnsMax = 0; + if (TpF>fabs(Func)) Fmax = TpF; + else Fmax = fabs(Func); + S = 0.0; + for (i=1;i<=N;i++) { + St = fabs(x0[i]); + if (1.0/Sx[i]>St) St = 1.0/Sx[i]; + St = fabs(Grad[i])*St/Fmax; + if (St>S) S = St; + } + if (S>=0.001*GrdEps) TermCode = BFGS_NoTermination; + else TermCode = BFGS_SmallGradient; + +} + + +// ------------------------------------------------------------------- + +void CBFGSMin::UMStop ( rvector x0, rvector Grad, + int RetCode, int ItnCnt, + Boolean MaxTkn ) { + +// A7.2.1 : Checking the Stop Conditions + +int i; +realtype Max1,Max2,MaxGrad,MaxStep, BB1,BB2; + + TermCode = BFGS_NoTermination; + if (RetCode==1) TermCode = BFGS_LineSearchComplete; + else { + if (fabs(FPlus)>TpF) Max2 = fabs(FPlus); + else Max2 = TpF; + MaxGrad = 0.0; + MaxStep = 0.0; + for (i=1;i<=N;i++) { + BB1 = fabs(XPlus[i]); + BB2 = 1.0/Sx[i]; + if (BB1>BB2) Max1 = BB1; + else Max1 = BB2; + BB1 = fabs(Grad[i])*Max1/Max2; + if (BB1>MaxGrad) MaxGrad = BB1; + BB2 = fabs(XPlus[i]-x0[i])/Max1; + if (BB2>MaxStep) MaxStep = BB2; + } + if (MaxGradMaxItn) TermCode = BFGS_IterationLimit; + else if (MaxTkn) { + CnsMax++; + if (CnsMax==5) TermCode = BFGS_LargeSteps; + } else + CnsMax = 0; + } + +} + + +// ------------------------------------------------------------------- + +void CBFGSMin::MdHess ( rmatrix H, rvector HDg ) { + +// A5.5.1 : Setting up the hessian of model + +int i,j; +realtype MaxDiag,MaxOff, MinEv,Mue,MaxPosDiag; +realtype MaxOffl,MinDiag,MaxEv,MaxAdd,Sdd,OffRow; +realtype BB; + + // Scaling + for (i=1;i<=N;i++) + for (j=i;j<=N;j++) + H[i][j] /= (Sx[i]*Sx[j]); + + MaxDiag = H[1][1]; + MinDiag = H[1][1]; + MaxOff = 0.0; + for (i=1;i<=N;i++) { + if (H[i][i]>MaxDiag) MaxDiag = H[i][i]; + if (H[i][i]MaxOff) MaxOff = BB; + } + } + MaxPosDiag = 0.0; + if (MaxDiag>MaxPosDiag) MaxPosDiag = MaxDiag; + + // Computing the shift of the spectra (the Mue) + if (MinDiag>SqrtEps*MaxPosDiag) Mue = 0.0; + else { + Mue = 2.0*(MaxPosDiag-MinDiag)*SqrtEps-MinDiag; + MaxDiag += Mue; + } + BB = MaxOff*(1.0+2.0*SqrtEps); + if (BB>MaxDiag) { + Mue = Mue+(MaxOff-MaxDiag)+2.0*SqrtEps*MaxOff; + MaxDiag = BB; + } + if (MaxDiag==0.0) { // H = 0 + Mue = 1.0; + MaxDiag = 1.0; + } + if (Mue>0.0) + for (i=1;i<=N;i++) + Hsn[i][i] += Mue; + + MaxOffl = MaxOff/N; + if (MaxDiag>MaxOffl) MaxOffl = MaxDiag; + MaxOffl = sqrt(MaxOffl); + for (i=1;i<=N;i++) + HDg[i] = H[i][i]; + + PbCholDecomp ( N,HDg,MaxOffl,MachEps,H,MaxAdd ); + + if (MaxAdd>0.0) { + MaxEv = HDg[1]; + MinEv = HDg[1]; + for (i=1;i<=N;i++) { + OffRow = 0.0; + if (i>1) + for (j=1;jMaxEv) MaxEv = BB; + BB = HDg[i]-OffRow; + if (BBBB2) StepSizeJ = BB1; + else StepSizeJ = BB2; + if (X[j]<0.0) StepSizeJ = -StepSizeJ; + StepSizeJ *= SqrtEtha; + TempJ = X[j]; + X[j] += StepSizeJ; + StepSizeJ = X[j]-TempJ; + MinFunc1 ( X,Fj ); + if (TermCode!=BFGS_NoTermination) return; + G[j] = (Fj-Fc)/StepSizeJ; + X[j] = TempJ; + Freese[j] = False; + if (TL) { + if ((fabs(X[j]-TL[j])<=StepSizeJ) && (G[j]<0.0)) { + G[j] = 0.0; Freese[j] = True; + } + } + if (LL) { + if ((fabs(X[j]-LL[j])<=StepSizeJ) && (G[j]>0.0)) { + G[j] = 0.0; Freese[j] = True; + } + } + } + +} + + +// ------------------------------------------------------------------- + +void CBFGSMin::CDGrad ( rvector X, rvector G ) { + +// A5.6.4 : Central Differencies Approximation of +// Gradient + +realtype StepSizeJ,TempJ,Fp,Fm, BB1,BB2; +int j; + + for (j=1;j<=N;j++) { + BB1 = fabs(X[j]); + BB2 = 1.0/Sx[j]; + if (BB1>BB2) StepSizeJ = BB1; + else StepSizeJ = BB2; + if (X[j]<0.0) StepSizeJ = -StepSizeJ; + StepSizeJ *= CubertEtha; + TempJ = X[j]; + X[j] += StepSizeJ; + StepSizeJ = X[j]-TempJ; + MinFunc1 ( X,Fp ); + if (TermCode!=BFGS_NoTermination) return; + X[j] = TempJ-StepSizeJ; + MinFunc1 ( X,Fm ); + if (TermCode!=BFGS_NoTermination) return; + G[j] = (Fp-Fm)/(2.0*StepSizeJ); + X[j] = TempJ; + } + +} + + +// ------------------------------------------------------------------- + +void CBFGSMin::Gradient ( rvector X, rvector G, realtype Fc ) { + if (ForDiff) FDGrad ( X,G,Fc ); + else CDGrad ( X,G ); +} + + +// ------------------------------------------------------------------- + +void CBFGSMin::FDHessF ( realtype Fc, rvector X ) { + +// A5.6.2 : Finite-Difference Approximation of +// the Hessian employing only the +// function's values + +int i,j; +realtype S,TempI,Fii,TempJ,Fij, BB1,BB2; + + + for (i=1;i<=N;i++) + if (!Freese[i]) { + BB1 = fabs(X[i]); + BB2 = 1.0/Sx[i]; + if (BB1>BB2) S = BB1; + else S = BB2; + if (X[i]<0.0) S = -S; + StepSize[i] = S*CubertEtha; + TempI = X[i]; + X[i] += StepSize[i]; + StepSize[i] = X[i]-TempI; + MinFunc1 ( X,FNeighbor[i] ); + X[i] = TempI; + if (TermCode!=BFGS_NoTermination) return; + } + for (i=1;i<=N;i++) + if (!Freese[i]) { + TempI = X[i]; + X[i] += 2.0*StepSize[i]; + MinFunc1 ( X,Fii ); + if (TermCode!=BFGS_NoTermination) return; + Hsn[i][i] = (( Fc -FNeighbor[i] ) + + ( Fii-FNeighbor[i] )) / + (StepSize[i]*StepSize[i]); + X[i] = TempI+StepSize[i]; + if (iTemp) Temp = TpF; + for (i=1;i<=N;i++) { + H[i][i] = Temp*Sx[i]*Sx[i]; + if (isqrt(MachEps*NormS*NormY)) { + if (AnalGrad) Tol = Etha; + else Tol = sqrt(Etha); + SkipUpdate = True; + for (i=1;i<=N;i++) { + tt = 0.0; + for (j=1;j<=i;j++) + tt += H[j][i]*us[j]; + if (itt) tt = BB; + if (fabs(uy[i]-ut[i])>=Tol*tt) + SkipUpdate = False; + } + + if (!SkipUpdate) { + Temp2 = 0.0; + for (i=1;i<=N;i++) + Temp2 += us[i]*ut[i]; + for (i=1;i<=N;i++) + for (j=i;j<=N;j++) + H[i][j] += uy[i]*uy[j]/Temp1 - + ut[i]*ut[j]/Temp2; + } + + } + +} + + +// ------------------------------------------------------------------- + +void CBFGSMin::Choose_Lambda ( rvector X, rvector S, + realtype & Lambda0 ) { +int i; +realtype SS; + + for (i=1;i<=N;i++) + if ((S[i]!=0.0) && (!Freese[i])) { + SS = X[i] + Lambda0*S[i]; + if (TL) { + if (SS>TL[i]) Lambda0 = (TL[i]-X[i])/S[i]/(1.0+MachEps); + } + if (LL) { + if (SSMxStep) { // restrict Newtonian step to MxStep + S = MxStep/NewtLn; + for (i=1;i<=N;i++) + P[i] *= S; + NewtLn = MxStep; + } + + InitSp = 0.0; + RelLng = 0.0; + Lambda0 = 1.0; + Choose_Lambda ( px0,P,Lambda0 ); + for (i=1;i<=N;i++) { + InitSp += G[i]*P[i]; + B1 = fabs(px0[i]); + B2 = 1.0/Sx[i]; + if (B1>B2) S = B1; + else S = B2; + S = fabs(P[i])/S; + if (S>RelLng) RelLng = S; + } + InitSp *= Lambda0; + + MinLam = StpEps/RelLng; + Lambda = Lambda0; + do { + for (i=1;i<=N;i++) + XPlus[i] = px0[i] + Lambda*P[i]; + + MinFunc1 ( XPlus,FPlus ); + if (TermCode!=BFGS_NoTermination) return; + if (FPlus<=pFunc+Alpha*Lambda*InitSp) { + RetCode = 0; + MaxTkn = (Lambda==Lambda0) && (NewtLn>0.99*MxStep); + } else if (Lambda0.1*Lambda) Lambda = LamTem; + else { + Lambda *= 0.1; + Lambda0 = Lambda; + } + if (Lambda>Lambda0) { + Lambda = Lambda0; + RetCode = 0; + for (i=1;i<=N;i++) + XPlus[i] = px0[i] + Lambda*P[i]; + } + } else { + B1 = FPlus - pFunc - Lambda*InitSp; + B2 = FplPre - pFunc - LamPre*InitSp; + A = ( B1/(Lambda*Lambda) - B2/(LamPre*LamPre) ) / + ( Lambda - LamPre ); + B = ( -LamPre*B1/(Lambda*Lambda) + + Lambda*B2/(LamPre*LamPre) ) / + ( Lambda - LamPre ); + Disc = B*B - 3.0*A*InitSp; + if (A==0.0) LamTem = -InitSp/(2.0*B); + else LamTem = (-B+sqrt(RMax(Disc,0.0)))/(3.0*A); + B1 = 0.5*Lambda; + if (B10.1*Lambda) Lambda = LamTem; + else { + Lambda *= 0.1; + Lambda0 = Lambda; + } + if (Lambda>Lambda0) { + Lambda = Lambda0; + RetCode = 0; + for (i=1;i<=N;i++) + XPlus[i] = px0[i] + Lambda*P[i]; + } + } + + } while (RetCode>=2); + + TakenLambda = Lambda; + +} + + +// ------------------------------------------------------------------- + +void CBFGSMin::GetMemory() { + if (N!=NAlloc) { + FreeMemory(); + GetMatrixMemory ( Hsn , N,N, 1,1 ); + GetVectorMemory ( GPlus , N, 1 ); + GetVectorMemory ( GradX , N, 1 ); + GetVectorMemory ( HDiag , N, 1 ); + GetVectorMemory ( SN , N, 1 ); + GetVectorMemory ( Sx , N, 1 ); + GetVectorMemory ( XPlus , N, 1 ); + GetVectorMemory ( XOpt , N, 1 ); + GetVectorMemory ( Freese, N, 1 ); + if (CalcHess) { + GetVectorMemory ( StepSize , N, 1 ); + GetVectorMemory ( FNeighbor, N, 1 ); + } else { + GetVectorMemory ( us , N, 1 ); + GetVectorMemory ( uy , N, 1 ); + GetVectorMemory ( ut , N, 1 ); + } + NAlloc = N; + } +} + +void CBFGSMin::FreeMemory() { + if (NAlloc>0) { + FreeVectorMemory ( us , 1 ); + FreeVectorMemory ( uy , 1 ); + FreeVectorMemory ( ut , 1 ); + FreeVectorMemory ( Freese , 1 ); + FreeVectorMemory ( StepSize , 1 ); + FreeVectorMemory ( FNeighbor, 1 ); + FreeVectorMemory ( XOpt , 1 ); + FreeVectorMemory ( XPlus , 1 ); + FreeVectorMemory ( Sx , 1 ); + FreeVectorMemory ( SN , 1 ); + FreeVectorMemory ( HDiag , 1 ); + FreeVectorMemory ( GradX , 1 ); + FreeVectorMemory ( GPlus , 1 ); + FreeMatrixMemory ( Hsn , NAlloc, 1,1 ); + } + NAlloc = 0; +} + + +// ------------------------------------------------------------------- + +void CBFGSMin::Relax() { +int i; + if (FPlus>FOpt) { + for (i=1;i<=N;i++) + XPlus[i] = XOpt[i]; + FPlus = FOpt; + } else { + for (i=1;i<=N;i++) + XOpt[i] = XPlus[i]; + FOpt = FPlus; + } +} + +void CBFGSMin::CopyPlus ( rvector x0 ) { +int i; + for (i=1;i<=N;i++) { + x0 [i] = XPlus[i]; + GradX[i] = GPlus[i]; + } + Func = FPlus; +} + + +// ------------------------------------------------------------------- + +void CBFGSMin::BFGS_Driver ( int MinN, + rvector x0, + rvector TypX, + realtype & FuncValue, + int & TerminationCode, + int Digits, + int ItnLmt, + realtype TypF, + realtype GrdTol, + realtype StpTol, + realtype MaxStp, + Boolean Hess, + rvector LowLimit, + rvector TopLimit ) { + +// D6.1.1 : Unconstrained Minimization Driver + +int i,RetCode; +int ItnCnt; +Boolean MaxTkn; + + TL = TopLimit; + LL = LowLimit; + ForDiff = True; + N = MinN; + CalcHess = Hess; + + ModF = False; + + GetMemory(); + + UMInCk ( x0,TypX,Digits,TypF, + GrdTol,StpTol,MaxStp, + ItnLmt ); + if (TermCode!=BFGS_NoTermination) { + FreeMemory(); + FuncValue = Func; + TerminationCode = TermCode; + return; + } + + ItnCnt = 0; + + MinFunc1 ( x0,Func ); + if (TermCode!=BFGS_NoTermination) { + FreeMemory(); + FuncValue = Func; + TerminationCode = TermCode; + return; + } + FOpt = Func; + FPlus = Func; + for (i=1;i<=N;i++) { + XOpt [i] = x0[i]; + XPlus[i] = x0[i]; + } + ModF = True; + Gradient ( x0,GradX,Func ); + Print ( ItnCnt,x0,GradX,Func ); + for (i=1;i<=N;i++) + GPlus[i] = GradX[i]; + if (TermCode!=BFGS_NoTermination) { + Relax (); + CopyPlus ( x0 ); + FreeMemory(); + FuncValue = Func; + TerminationCode = TermCode; + return; + } + + UMStop0 ( x0,GradX ); + if (TermCode!=BFGS_NoTermination) { + FreeMemory(); + FuncValue = Func; + TerminationCode = TermCode; + return; + } + + if (!CalcHess) InitHessUnFac ( Func,Hsn ); + + RetCode = 0; + while (TermCode==BFGS_NoTermination) { + ItnCnt++; + if (RetCode>=0) { + if (CalcHess) { + FDHessF ( Func,x0 ); + if (TermCode!=BFGS_NoTermination) { + Relax (); + CopyPlus ( x0 ); + FreeMemory(); + FuncValue = Func; + TerminationCode = TermCode; + return; + } + } + MdHess ( Hsn,HDiag ); + } + ChSolve ( N,Hsn,GradX,SN ); + LineSearch ( x0,GradX,SN,Func,RetCode,MaxTkn ); + if ((RetCode==1) && ForDiff) { + RetCode = -1; + ForDiff = False; + } else + Relax(); + if (TermCode!=BFGS_NoTermination) { + Relax (); + CopyPlus ( x0 ); + FreeMemory(); + FuncValue = Func; + TerminationCode = TermCode; + return; + } else + Gradient ( XPlus,GPlus,FPlus ); + if (TermCode!=BFGS_NoTermination) { + Relax (); + CopyPlus ( x0 ); + FreeMemory(); + FuncValue = Func; + TerminationCode = TermCode; + return; + } + if (RetCode>=0) { + UMStop ( x0,GPlus,RetCode,ItnCnt,MaxTkn ); + if ((!CalcHess) && (TermCode==BFGS_NoTermination)) + BFGSUnFac ( x0,XPlus,GradX,GPlus,False,HDiag,Hsn ); + } + CopyPlus ( x0 ); + Print ( ItnCnt, x0,GradX,Func ); + } + + Relax (); + FreeMemory(); + FuncValue = Func; + TerminationCode = TermCode; + +} + + diff --git a/mmdb/bfgs_min.h b/mmdb/bfgs_min.h new file mode 100755 index 0000000..ec6741b --- /dev/null +++ b/mmdb/bfgs_min.h @@ -0,0 +1,257 @@ +// $Id: bfgs_min.h,v 1.20 2012/01/26 17:52:19 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 27.06.01 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : bfgs_min +// ~~~~~~~~~ +// **** Classes : CBFGSMin ( minimization driver ) +// ~~~~~~~~~ +// +// (C) E. Krissinel 2000-2008 +// +// ================================================================= +// + +#ifndef __BFGS_Min__ +#define __BFGS_Min__ + +#ifndef __STDLIB_H +#include +#endif + +#ifndef __MatType__ +#include "mattype_.h" +#endif + +#ifndef __LinAlg__ +#include "linalg_.h" +#endif + + +// ============================================================== + +#define BFGS_TooFewDigits -2 +#define BFGS_WrongSpaceDim -1 +#define BFGS_NoTermination 0 +#define BFGS_SmallGradient 1 +#define BFGS_SmallStep 2 +#define BFGS_LineSearchComplete 3 +#define BFGS_IterationLimit 4 +#define BFGS_LargeSteps 5 +#define BFGS_Stopped 6 + +typedef void BFGSMinFunc ( void * UserData, int N, rvector X, + realtype & F ); +typedef BFGSMinFunc * PBFGSMinFunc; + +typedef void BFGSPrintFunc ( void * UserData, int N, int Itn, + rvector X, rvector G, realtype F ); +typedef BFGSPrintFunc * PBFGSPrintFunc; + +DefineClass(CBFGSMin); + +class CBFGSMin { + + public : + + CBFGSMin (); + virtual ~CBFGSMin(); + + virtual void MinFunc ( rvector X, realtype & F ); + virtual void Print ( int Itn, rvector X, rvector G, + realtype F ); + + void SetMinFunction ( void * UserData, PBFGSMinFunc Fnc ); + void SetPrintFunction ( void * UserData, PBFGSPrintFunc Fnc ); + + + // ====================================================== + // + // .--------------------------------------------. + // | | + // | UNCONSTRAINED MINIMIZATION DRIVER | + // | | + // `--------------------------------------------' + // + // Finds a minimum of function F(X), X is vector [1..N], defined + // by virtual MinFunc. Virtual Print provides information on every + // iteration step. + // + // + // Input parameters : + // ----------------------- + // + // N is the dimension the minimization space + // + // x0 [1..N] is the initial point for minimization + // + // TypX [1..N] is the array of the typical ranges of + // X - components, which are used for the scaling. + // If TypX<=0.0 then 1.0 will be substituted + // + // Digits is the number of valid decimal digits in + // the calculated value of minimizing function ( F ). + // If Digits<=0 then the Driver will consider + // that the F is computed with usual machine's + // noise + // + // ItnLmt is the maximum available number of iterations. + // If ItnLmt=0 then 100 will be substituted + // + // TypF is the expected absolute value of F in the + // minimum, which is used in the stop criterion. + // If TypF<=0.0 then 1.0 will be substituted + // + // GrdTol is the desired absolute value of the gradient + // vector in the minimum of F . If GrdTol<=0.0 + // then the some value correlated with machine's + // noise will be substituted + // + // StpTol is the minimum available step for the minimi- + // zation. The execution stops if the distance + // between two consequential approximation will be + // less then StpTol . If StpTol<=0.0 then the + // some value correlated with machine's noise + // will be substituted + // + // MaxStp is the maximum available step for then minimi- + // zation. This parameter only prevents the appea- + // rance of the too large steps, but the execution + // stops if more than 5 steps with length of MaxStep + // will consequently appear. + // + // + // + // Outpute parameters : + // -------------------------- + // + // x0 will be the point at which the minimisation + // had stopped + // + // Func will be the function's value at x0 + // + // TermCode will be the reason of stopping : + // + // 1 <=> the norm of gradient vector at x0 is + // less than GrdTol ; the x0 is probable + // point of the minimum + // 2 <=> the distance between two last approxima- + // tions was less than StpTol ; the x0 + // may be the point of minimum + // 3 <=> the gradient length is greater than + // GrdTol , but future minimization fails ; + // it may be the consequence of the errors + // at the computing of gradient, but also + // x0 could be the point of minimum + // 4 <=> the iteration limit had been exchausted + // 5 <=> more than 5 steps with length of + // MaxStp had been made + // 6 <=> the termination key ( Esc or End ) + // had been pressed. + // + // + // ======================================================== + + void BFGS_Driver ( int MinN, + rvector x0, + rvector TypX, + realtype & FuncValue, + int & TerminationCode, + int Digits = 0, + int ItnLmt = 0, + realtype TypF = 0.0, + realtype GrdTol = 0.0, + realtype StpTol = 0.0, + realtype MaxStp = MaxReal, + Boolean Hess = False, + rvector LowLimit = NULL, + rvector TopLimit = NULL ); + + void Stop(); // generates stop signal to stop optimization + + + protected : + + PBFGSMinFunc MFunc; + void * MFuncData; + PBFGSPrintFunc PFunc; + void * PFuncData; + + int N,NAlloc; + rmatrix Hsn; + rvector TL,LL,XOpt,XPlus,Sx,SN,HDiag,GradX,GPlus; + rvector StepSize,FNeighbor; + rvector us,uy,ut; + bvector Freese; + realtype Func,FPlus,FOpt; + realtype TakenLambda; + Boolean ForDiff; // if True then forward differences are + // used for the 1st estimation of the + // Hessian (which is less expensive), + // otherwise central differences will + // be employed (which is more expensive). + Boolean CalcHess; + + realtype Etha,SqrtEtha,CubertEtha,TpF,GrdEps,StpEps,MxStep; + realtype SqrtEps; + int CnsMax,MaxItn,TermCode; + Boolean ModF; + + void MinFunc1 ( rvector X, realtype & F ); + void UMInCk ( rvector x0, rvector TypX, + int Digits, realtype TypF, + realtype GrdTol, realtype StpTol, + realtype MaxStp, int ItnLmt ); + void UMStop0 ( rvector x0, rvector Grad ); + void UMStop ( rvector x0, rvector Grad, int RetCode, + int ItnCnt, Boolean MaxTkn ); + + virtual void Gradient ( rvector X, rvector G, realtype Fc ); + virtual void FDHessF ( realtype Fc, rvector X ); + + void FDGrad ( rvector X, rvector G, realtype Fc ); + void CDGrad ( rvector X, rvector G ); + void MdHess ( rmatrix H, rvector HDg ); + void InitHessUnFac ( realtype F, rmatrix H ); + void BFGSUnFac ( rvector Xc, rvector Xp, + rvector Gc, rvector Gp, + Boolean AnalGrad, rvector HDg, + rmatrix H ); + void Choose_Lambda ( rvector X, rvector S, realtype & Lambda0 ); + void LineSearch ( rvector px0, rvector G, + rvector P, realtype pFunc, + int & RetCode, Boolean & MaxTkn ); + void GetMemory (); + void FreeMemory (); + void Relax (); + void CopyPlus ( rvector x0 ); + +}; + +#endif + + diff --git a/mmdb/file_.cpp b/mmdb/file_.cpp new file mode 100755 index 0000000..b85b697 --- /dev/null +++ b/mmdb/file_.cpp @@ -0,0 +1,1857 @@ +// $Id: file_.cpp,v 1.29 2012/01/26 17:52:19 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 29.01.10 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : file_ +// ~~~~~~~~~ +// **** Classes : CFile - file I/O Support. +// ~~~~~~~~~ +// +// (C) E. Krissinel 2000-2010 +// +// ================================================================= +// + + +#ifndef __STDLIB_H +#include +#endif + +#ifdef _WIN32 +# include +# define sleep Sleep +# endif + +#ifndef __STDIO_H +#include +#endif + +#ifndef __STRING_H +#include +#endif + +#ifndef _WIN32 +#ifndef __UNISTD_H +#include +#endif +#endif + +#ifndef __File__ +#include "file_.h" +#endif + + +// _WIN32_NEWLINE should be raised when compilinig on Windows in +// order to enforce Windows' line endings when writing text in +// files opened for *binary* output. Otherwise, writing text lines +// in binary files will results in UNIX line endings. Line endings +// in files, opened for output in text mode, will be always +// platform-specific. + +#ifdef _WIN32_NEWLINE +// for DOS/WINDOWS machines: +#define NEWLINE "\r\n" +#else +// for UNIX machines: +#define NEWLINE "\n" +#endif + + +// =================== Auxilary Functions ========================= + +cpstr GetFPath ( pstr FilePath, int syskey ) { +pstr P; + + if (syskey==syskey_unix) + P = strrchr(FilePath,'/'); + else if (syskey==syskey_win) + P = strrchr(FilePath,'\\'); + else if (syskey==syskey_all) { + P = strrchr(FilePath,'/'); + if (!P) P = strrchr(FilePath,'\\'); + } else + P = NULL; + + if (P) { + P = P + 1; + *P = char(0); + } else + FilePath[0] = char(0); + + return FilePath; + +} + +cpstr GetFName ( cpstr FilePath, int syskey ) { +pstr P; + if (syskey==syskey_unix) + P = strrchr(FilePath,'/'); + else if (syskey==syskey_win) + P = strrchr(FilePath,'\\'); + else if (syskey==syskey_all) { + P = strrchr(FilePath,'/'); + if (!P) P = strrchr(FilePath,'\\'); + } else + P = NULL; + if (!P) return FilePath; + else return P + 1; +} + +cpstr GetFExt ( cpstr FilePath ) { +pstr P; + P = strchr ( GetFName(FilePath),'.'); + if (!P) return &(FilePath[strlen(FilePath)]); + else return P; +} + +cpstr ChangeExt ( pstr FilePath, cpstr newExt, int syskey ) { +int i; + i = strlen(FilePath)-1; + if (syskey==syskey_unix) + while ((i>0) && (FilePath[i]!='.') && (FilePath[i]!='/')) i--; + else if (syskey==syskey_win) + while ((i>0) && (FilePath[i]!='.') && (FilePath[i]!='\\')) i--; + else if (syskey==syskey_all) + while ((i>0) && (FilePath[i]!='.') && + (FilePath[i]!='/') && (FilePath[i]!='\\')) i--; + if (FilePath[i]=='.') { + FilePath[i+1] = char(0); + strcat ( FilePath,newExt ); + } else { + strcat ( FilePath,"." ); + strcat ( FilePath,newExt ); + } + return FilePath; +} + +Boolean FileExists ( cpstr FileName, PCFile f ) { +PCFile g; +Boolean B; + if (FileName) { + if (!f) g = new CFile(); + else g = f; + g->assign ( FileName ); + B = g->exists(); + if (!f) delete g; + return B; + } else + return False; +} + + +// ======================== CFile Class ======================== + +#define ARCH_NONE 0 +#define ARCH_GZIP 1 +#define ARCH_COMPRESS 2 +#define ARCH_ENFORCE 3 + +CFile::CFile ( word BufSize ) { + Buf_Size = BufSize; + BufLen = 0; + BufInc = 1; + EofFile = False; + hFile = NULL; + FName = NULL; + BufCnt = 0; + IOBuf = NULL; + IOSuccess = True; + TextMode = False; + UniBin = False; + StdIO = False; + gzipIO = ARCH_NONE; + memIO = False; +} + +CFile::~CFile() { + shut (); + FreeBuffer(); +} + +void CFile::FreeBuffer () { + if (IOBuf) { + if (!memIO) delete[] IOBuf; + IOBuf = NULL; + } + if (FName) { + delete[] FName; + FName = NULL; + } +} + +void CFile::assign ( cpstr FileName, Boolean Text, Boolean UniB, + byte gzMode ) { +pstr p; + + shut(); + + FreeBuffer(); + + CreateCopy ( FName,FileName ); + StdIO = (!strcmp(FName,"stdin" )) || + (!strcmp(FName,"stdout")) || + (!strcmp(FName,"stderr")); + + if (StdIO) TextMode = True; + else TextMode = Text; + + UniBin = UniB; + + gzipMode = gzMode; + gzipIO = ARCH_NONE; + if ((gzipMode==GZM_ENFORCE) || (gzipMode==GZM_ENFORCE_GZIP)) + gzipIO = ARCH_GZIP; + else if (gzipMode==GZM_ENFORCE_COMPRESS) + gzipIO = ARCH_COMPRESS; + else if (gzipMode==GZM_CHECK) { + p = strrchr ( FName,'.' ); + if (p) { + if (!strcmp(p,".gz")) gzipIO = ARCH_GZIP; + else if (!strcmp(p,".Z")) gzipIO = ARCH_COMPRESS; + } + } + + memIO = False; + +} + + +void CFile::assign ( word poolSize, word sizeInc, pstr filePool ) { + + shut (); + FreeBuffer(); + + IOBuf = (pstr)filePool; + BufLen = poolSize; + FLength = poolSize; + BufInc = sizeInc; + BufCnt = 0; + + memIO = True; + gzipMode = GZM_NONE; + gzipIO = ARCH_NONE; + +} + +void CFile::GetFilePool ( pstr & filePool, word & fileSize ) { + if (memIO) { + filePool = IOBuf; + fileSize = FLength; + IOBuf = NULL; + BufLen = 0; + BufCnt = 0; + FLength = 0; + } else { + filePool = NULL; + fileSize = 0; + } +} + +static pstr gzip_path = pstr("gzip "); +static pstr ungzip_path = pstr("gzip -dc "); +static pstr compress_path = pstr("compress "); +static pstr uncompress_path = pstr("uncompress -c "); + +void SetGZIPPath ( pstr gzipPath, pstr ungzipPath ) { + if (!gzipPath) gzip_path = pstr("gzip "); + else gzip_path = gzipPath; + if (!ungzipPath) ungzip_path = pstr("gzip -d "); + else ungzip_path = ungzipPath; +} + +void SetCompressPath ( pstr compressPath, pstr uncompressPath ) { + if (!compressPath) compress_path = pstr("compress "); + else compress_path = compressPath; + if (!uncompressPath) uncompress_path = pstr("uncompress -c "); + else uncompress_path = uncompressPath; +} + + +Boolean CFile::reset ( Boolean ReadOnly, int retry ) { +#ifndef _MSC_VER +pstr p; +int i; +#endif + + if (memIO) { + + shut(); + if (!IOBuf) return False; + BufCnt = 0; + IOSuccess = True; + + } else { + + if (!FName) return False; + shut(); + BufLen = 0; + BufCnt = 0; + + if (!strcmp(FName,"stdin")) { + + hFile = stdin; + StdIO = True; + TextMode = True; + FLength = 1; + EofFile = False; + IOSuccess = True; + + } else { + + StdIO = False; + if (gzipIO==ARCH_GZIP) { +#ifndef _MSC_VER + p = NULL; + CreateConcat ( p,ungzip_path,FName ); + for (i=0;(i<=retry) && (!hFile);i++) { + if (i>0) sleep ( 1 ); + hFile = popen ( p,"r" ); + } + if (p) delete[] p; +#endif + + } else if (gzipIO==ARCH_COMPRESS) { +#ifndef _MSC_VER + p = NULL; + CreateConcat ( p,uncompress_path,FName ); + for (i=0;(i<=retry) && (!hFile);i++) { + if (i>0) sleep ( 1 ); + hFile = popen ( p,"r" ); + } + if (p) delete[] p; +#endif + + } else { + +#ifndef _MSC_VER + for (i=0;(i<=retry) && (!hFile);i++) { + if (i>0) sleep ( 1 ); + if (TextMode) { + if (ReadOnly) hFile = fopen ( FName,"rt" ); + else hFile = fopen ( FName,"r+t" ); + } else { + if (ReadOnly) hFile = fopen ( FName,"rb" ); + else hFile = fopen ( FName,"r+b" ); + } + } +#endif + + } + + if (hFile) { + if (gzipIO==ARCH_NONE) { + fseek ( hFile,0L,SEEK_END ); + FLength = ftell ( hFile ); + fseek ( hFile,0L,SEEK_SET ); + EofFile = (FLength<=0); + } else { + FLength = 1; + EofFile = False; + } + IOSuccess = True; + } else { + EofFile = True; + IOSuccess = False; + } + + } + + } + + return IOSuccess; + +} + +Boolean CFile::rewrite() { +#ifndef _MSC_VER +pstr p; +#endif + + if (memIO) { + + shut(); + FreeBuffer(); + IOBuf = new char[BufLen]; + BufCnt = 0; + FLength = 0; + IOSuccess = True;; + + } else { + + if (!FName) return False; + shut(); + BufLen = 0; + BufCnt = 0; + + if (gzipIO==ARCH_GZIP) { +#ifndef _MSC_VER + p = NULL; + CreateConcat ( p,gzip_path,pstr(" > "),FName ); + hFile = popen ( p,"w" ); + if (p) delete[] p; +#else + hFile = NULL; +#endif + StdIO = False; + } else if (gzipIO==ARCH_COMPRESS) { +#ifndef _MSC_VER + p = NULL; + CreateConcat ( p,compress_path,pstr(" > "),FName ); + hFile = popen ( p,"w" ); + if (p) delete[] p; +#else + hFile = NULL; +#endif + StdIO = False; + } else if (!TextMode) { + hFile = fopen ( FName,"w+b" ); + StdIO = False; + } else if (!strcmp(FName,"stdout")) { + hFile = stdout; + StdIO = True; + } else if (!strcmp(FName,"stderr")) { + hFile = stderr; + StdIO = True; + } else { + hFile = fopen ( FName,"w+t" ); + StdIO = False; + } + + FLength = 0; + IOSuccess = (hFile!=NULL); + + } + + return IOSuccess; + +} + + +Boolean CFile::append() { +#ifndef _MSC_VER +pstr p; +#endif + + if (memIO) { + + if (!IOBuf) { + IOBuf = new char[BufLen]; + BufCnt = 0; + } + FLength = BufCnt; + IOSuccess = True; + + } else { + + if (!FName) return False; + + shut(); + BufLen = 0; + BufCnt = 0; + if (gzipIO==ARCH_GZIP) { +#ifndef _MSC_VER + p = NULL; + CreateConcat ( p,gzip_path,pstr(" >> "),FName ); + hFile = popen ( p,"w" ); + if (p) delete[] p; +#else + hFile = NULL; +#endif + StdIO = False; + } else if (gzipIO==ARCH_COMPRESS) { +#ifndef _MSC_VER + p = NULL; + CreateConcat ( p,compress_path,pstr(" >> "),FName ); + hFile = popen ( p,"w" ); + if (p) delete[] p; +#else + hFile = NULL; +#endif + StdIO = False; + } else if (!TextMode) { + hFile = fopen ( FName,"ab" ); + StdIO = False; + } else if (!strcmp(FName,"stdout")) { + hFile = stdout; + StdIO = True; + } else if (!strcmp(FName,"stderr")) { + hFile = stderr; + StdIO = True; + } else { + hFile = fopen ( FName,"at" ); + StdIO = False; + } + + FLength = 0; + IOSuccess = hFile!=NULL; + + } + + return IOSuccess; + +} + +Boolean CFile::erase() { + if (!FName) return False; + shut(); + if (!StdIO) { + BufLen = 0; + BufCnt = 0; + if (FName) + IOSuccess = (remove(FName)==0); + FLength = 0; + } else + IOSuccess = True; + return IOSuccess; +} + +Boolean CFile::exists() { + + if (memIO) { + + IOSuccess = (IOBuf!=NULL); + + } else { + + if (!FName) return False; + shut(); + if (!StdIO) { + hFile = fopen ( FName,"r" ); + IOSuccess = (hFile!=NULL); + BufLen = 0; + BufCnt = 0; + FLength = 0; + if (hFile) fclose ( hFile ); + } else + IOSuccess = True; + hFile = NULL; + } + + return IOSuccess; + +} + +Boolean CFile::parse ( cpstr FileName ) { +UNUSED_ARGUMENT(FileName); + return True; +} + +Boolean CFile::rename ( cpstr NewFileName ) { + if (!FName) return False; + shut(); + if (!StdIO) + IOSuccess = (::rename(FName,NewFileName)==0); + if (IOSuccess) assign ( NewFileName,TextMode,UniBin,gzipMode ); + return IOSuccess; +} + +long CFile::Position() { +// do not use on text files + + if (memIO) return BufCnt; + + if (hFile==NULL) return 0L; + return ftell ( hFile ); + +} + +Boolean CFile::seek ( long Position ) { +// do not use on text files + if (memIO) { + if (Position<=(long)BufLen) { + BufCnt = Position; + IOSuccess = True; + } else + IOSuccess = False; + return IOSuccess; + } else if (hFile==NULL) + return False; + else if (!StdIO) { + IOSuccess = fseek(hFile,Position,SEEK_SET)==0; + return IOSuccess; + } else + return True; +} + +Boolean CFile::FileEnd() { + + if (memIO) return ((long)BufCnt>=FLength); + + if (TextMode) { + if (EofFile || ((!hFile) && (!StdIO))) + return True; + if (feof(hFile)==0) + return False; + return True; + } + + return EofFile && (BufLen==0); + +} + +void CFile::shut () { + + if (hFile!=NULL) { + if (!StdIO) { +#ifndef _MSC_VER + if (gzipIO!=ARCH_NONE) pclose ( hFile ); + else fclose ( hFile ); +#else + fclose ( hFile ); +#endif + } + hFile = NULL; + } + +} + +Boolean CFile::isOpen() { + if (memIO) return (IOBuf!=NULL); + return (hFile!=NULL); +} + +word CFile::ReadLine ( pstr Line, word MaxLen ) { +word LCnt; +int Done; +Boolean HSuccess = IOSuccess; + + if (memIO) { + + LCnt = 0; + while (((long)BufCnt0) { + if ((Line[LCnt-1]!='\n') && + (Line[LCnt-1]!='\r')) break; + Line[LCnt-1] = char(0); + LCnt--; + } + } else + LCnt = 0; + return LCnt; + } else { + if (IOBuf==NULL) { + IOBuf = new char[Buf_Size]; + BufLen = ReadFile ( IOBuf,Buf_Size ); + IOSuccess = HSuccess; + BufCnt = 0; + } + LCnt = 0; + do { + while ((BufCnt=BufLen) { + HSuccess = IOSuccess; + BufLen = ReadFile ( IOBuf,Buf_Size ); + IOSuccess = HSuccess; + BufCnt = 0; + } + if (IOBuf[BufCnt]=='\r') Done = 1; + else if (IOBuf[BufCnt]=='\n') Done = 2; + else Done = 0; + if (Done) BufCnt++; + if (BufCnt>=BufLen) { + HSuccess = IOSuccess; + BufLen = ReadFile ( IOBuf,Buf_Size ); + IOSuccess = HSuccess; + BufCnt = 0; + } + if (BufLen>0) { + if (((Done==2) && (IOBuf[BufCnt]=='\r')) || + ((Done==1) && (IOBuf[BufCnt]=='\n'))) + BufCnt++; + } + } while ((!Done) && (LCnt0)); + Line[LCnt] = char(0); + return LCnt; + } + + } + +} + +word CFile::ReadNonBlankLine ( pstr S, word MaxLen ) { +word i,j; + do { + j = ReadLine ( S,MaxLen ); + i = 0; + while ((i=j) && (!FileEnd())); + if (i>=j) { + S[0] = char(0); + j = 0; + } + return j; +} + + +Boolean CFile::WriteLine ( cpstr Line ) { + if ((!memIO) && TextMode) { + if (hFile==NULL) return False; + fputs ( Line,hFile ); +// return (fputs(NEWLINE,hFile)>=0); + return (fputs("\n",hFile)>=0); + } else { + if (WriteFile(Line,strlen(Line))) + return WriteFile ( (void *)NEWLINE,strlen(NEWLINE) ); + else return False; + } +} + +Boolean CFile::Write ( cpstr Line ) { + if ((!memIO) && TextMode) { + if (hFile==NULL) return False; + return (fputs(Line,hFile)>=0); + } else + return WriteFile(Line,strlen(Line)); +} + +Boolean CFile::Write ( realtype V, int length ) { +char N[50]; + sprintf ( N,"%-.*g",length,V ); + if ((!memIO) && TextMode) { + if (hFile==NULL) return False; + return (fputs(N,hFile)>=0); + } else + return WriteFile(N,strlen(N)); +} + +Boolean CFile::Write ( int iV, int length ) { +char N[50]; + sprintf ( N,"%*i",length,iV ); + if ((!memIO) && TextMode) { + if (hFile==NULL) return False; + return (fputs(N,hFile)>=0); + } else + return WriteFile(N,strlen(N)); +} + +Boolean CFile::LF() { + if ((!memIO) && TextMode) { + if (hFile==NULL) return False; +// return (fputs(NEWLINE,hFile)>=0); + return (fputs("\n",hFile)>=0); + } else + return WriteFile ( (void *)NEWLINE,strlen(NEWLINE) ); +} + +Boolean CFile::WriteDataLine ( realtype X, realtype Y, int length ) { + Write ( pstr(" ") ); + Write ( X,length ); + Write ( pstr(" ") ); + Write ( Y,length ); + return LF(); +} + +Boolean CFile::WriteParameter ( cpstr S, realtype X, + int ParColumn, int length ) { +int l=strlen(S); + if ((!memIO) && TextMode) { + fputs ( S,hFile ); + while (lParColumn) { +// X = atof ( &(S[ParColumn]) ); + X = GetNumber ( &(S[ParColumn]) ); + return True; + } else { + X = 0.0; + return False; + } +} + +Boolean CFile::ReadParameters ( pstr S, int & n_X, rvector X, + int MaxLen, int ParColumn ) { +pstr S1,S2; + ReadLine ( S,MaxLen ); + if ((int)strlen(S)>ParColumn) { + n_X = 0; + S2 = &(S[ParColumn]); + S1 = S2; + while (*S1!=char(0)) { + if (*S1==',') *S1 = ' '; + S1++; + } + while (*S2!=char(0)) { + S1 = S2; + X[n_X] = strtod ( S1,&S2 ); + n_X++; + while ((*S2!=char(0)) && (*S2==' ')) S2++; + } + return True; + } else { + n_X = 0; + X[0] = 0.0; + return False; + } +} + +Boolean CFile::ReadParameter ( pstr S, int & X, + int ParColumn ) { +realtype V; + if (ReadParameter(S,V,ParColumn)) { + X = mround(V); + return True; + } else { + X = 0; + return False; + } +} + +Boolean CFile::CreateWrite ( cpstr Line ) { +wordUniBin wUB; +word i; + if (UniBin) { + if (Line) { + i = strlen(Line)+1; + word2UniBin ( i,wUB ); + if (WriteFile(wUB,sizeof(wordUniBin))) + return WriteFile ( Line,i ); + else return False; + } else { + i = 0; + word2UniBin ( i,wUB ); + return WriteFile ( wUB,sizeof(wordUniBin) ); + } + } else { + if (Line) { + i = strlen(Line)+1; + if (WriteFile(&i,sizeof(i))) + return WriteFile ( Line,i ); + else return False; + } else { + i = 0; + return WriteFile ( &i,sizeof(i) ); + } + } +} + +#define _max_dyn_string_len 1073741824 + +word CFile::CreateRead ( pstr & Line ) { +wordUniBin wUB; +word i; +//unsigned short int i; + if (Line) { + delete[] Line; + Line = NULL; + } + if (UniBin) { + ReadFile ( wUB,sizeof(wordUniBin) ); + UniBin2word ( wUB,i ); + } else + ReadFile ( &i,sizeof(i) ); + if ((i>0) && (i<_max_dyn_string_len)) { + Line = new char[i]; + ReadFile ( Line,i ); + } + return i; +} + +Boolean CFile::WriteTerLine ( cpstr Line, Boolean longLine ) { +wordUniBin wUB; +word ll; +byte sl; +Boolean B; + if (Line) ll = strlen(Line); + else ll = 0; + if (!longLine) { + sl = byte(ll); + B = WriteFile ( &sl,sizeof(sl) ); + } else if (UniBin) { + word2UniBin ( ll,wUB ); + B = WriteFile ( wUB,sizeof(wordUniBin) ); + } else + B = WriteFile ( &ll,sizeof(ll) ); + if (B && (ll>0)) B = WriteFile ( Line,ll ); + return B; +} + +word CFile::ReadTerLine ( pstr Line, Boolean longLine ) { +wordUniBin wUB; +word ll; +byte sl; + if (!longLine) { + ReadFile ( &sl,sizeof(sl) ); + ll = sl; + } else if (UniBin) { + ReadFile ( wUB,sizeof(wordUniBin) ); + UniBin2word ( wUB,ll ); + } else + ReadFile ( &ll,sizeof(ll) ); + if (ll>0) ReadFile ( Line,ll ); + Line[ll] = char(0); + return ll+1; +} + +word CFile::ReadFile ( void * Buffer, word Count ) { +word Cnt; + if (memIO) { + Cnt = WMin(Count,FLength-BufCnt); + if (Cnt>0) { + memcpy ( Buffer,&(IOBuf[BufCnt]),Cnt ); + BufCnt += Cnt; + } + IOSuccess = (Cnt==Count); + EofFile = ((Cnt=FLength)); + return Cnt; + } else if (hFile) { + Cnt = (word)fread ( Buffer,1,Count,hFile ); + EofFile = (CntBufLen) { + Cnt += BufInc; + IOB = new char[Cnt]; + if (IOBuf) { + memcpy ( IOB,IOBuf,BufCnt ); + delete[] IOBuf; + } + IOBuf = IOB; + BufLen = Cnt; + } + memcpy ( &(IOBuf[BufCnt]),Buffer,Count ); + BufCnt += Count; + FLength = BufCnt; + IOSuccess = True; + + } else { + + if (hFile==NULL) return False; + Cnt = (word)fwrite ( Buffer,1,Count,hFile ); + Pos = Position(); + if (Pos>FLength) FLength = Pos; + IOSuccess = Cnt==Count; + + } + + return IOSuccess; + +} + +Boolean CFile::WriteReal ( realtype * V ) { +realUniBin rUB; + if (UniBin) { + real2UniBin ( *V,rUB ); + return WriteFile ( rUB,sizeof(realUniBin) ); + } else + return WriteFile ( V,sizeof(realtype) ); +} + +Boolean CFile::WriteFloat ( realtype * V ) { +floatUniBin fUB; +float fV; + if (UniBin) { + float2UniBin ( *V,fUB ); + return WriteFile ( fUB,sizeof(floatUniBin) ); + } else { + fV = (float)*V; + return WriteFile ( &fV,sizeof(float) ); + } +} + +Boolean CFile::WriteInt ( int * I ) { +intUniBin iUB; + if (UniBin) { + int2UniBin ( *I,iUB ); + return WriteFile ( iUB,sizeof(intUniBin) ); + } else + return WriteFile ( I,sizeof(int) ); +} + +Boolean CFile::WriteShort ( short * S ) { +shortUniBin sUB; + if (UniBin) { + short2UniBin ( *S,sUB ); + return WriteFile ( sUB,sizeof(shortUniBin) ); + } else + return WriteFile ( S,sizeof(short) ); +} + +Boolean CFile::WriteLong ( long * L ) { +longUniBin lUB; + if (UniBin) { + long2UniBin ( *L,lUB ); + return WriteFile ( lUB,sizeof(longUniBin) ); + } else + return WriteFile ( L,sizeof(long) ); +} + +Boolean CFile::WriteBool ( Boolean * B ) { +intUniBin iUB; +int k; + if (UniBin) { + if (*B) k = 1; + else k = 0; + int2UniBin ( k,iUB ); + return WriteFile ( iUB,sizeof(intUniBin) ); + } else + return WriteFile ( B,sizeof(Boolean) ); +} + +Boolean CFile::WriteByte ( byte * B ) { + return WriteFile ( B,sizeof(byte) ); +} + +Boolean CFile::WriteWord ( word * W ) { +wordUniBin wUB; + if (UniBin) { + word2UniBin ( *W,wUB ); + return WriteFile ( wUB,sizeof(wordUniBin) ); + } else + return WriteFile ( W,sizeof(word) ); +} + +Boolean CFile::ReadReal ( realtype * V ) { +realUniBin rUB; + if (UniBin) { + if (ReadFile(rUB,sizeof(realUniBin))==sizeof(realUniBin)) { + UniBin2real ( rUB,*V ); + return True; + } else + return False; + } else + return ( ReadFile(V,sizeof(realtype))==sizeof(realtype) ); +} + +Boolean CFile::ReadFloat ( realtype * V ) { +floatUniBin fUB; +float fV; + if (UniBin) { + if (ReadFile(fUB,sizeof(floatUniBin))==sizeof(floatUniBin)) { + UniBin2float ( fUB,*V ); + return True; + } + } else if (ReadFile(&fV,sizeof(float))==sizeof(float)) { + *V = fV; + return True; + } + return False; +} + +Boolean CFile::ReadInt ( int * I ) { +intUniBin iUB; + if (UniBin) { + if (ReadFile(iUB,sizeof(intUniBin))==sizeof(intUniBin)) { + UniBin2int ( iUB,*I ); + return True; + } else + return False; + } else + return ( ReadFile(I,sizeof(int))==sizeof(int) ); +} + +Boolean CFile::ReadShort ( short * S ) { +shortUniBin sUB; + if (UniBin) { + if (ReadFile(sUB,sizeof(shortUniBin))==sizeof(shortUniBin)) { + UniBin2short ( sUB,*S ); + return True; + } else + return False; + } else + return ( ReadFile(S,sizeof(short))==sizeof(short) ); +} + +Boolean CFile::ReadLong ( long * L ) { +longUniBin lUB; + if (UniBin) { + if (ReadFile(lUB,sizeof(longUniBin))==sizeof(longUniBin)) { + UniBin2long ( lUB,*L ); + return True; + } else + return False; + } else + return ( ReadFile(L,sizeof(long))==sizeof(long) ); +} + +Boolean CFile::ReadBool ( Boolean * B ) { +intUniBin iUB; +int k; + if (UniBin) { + if (ReadFile(iUB,sizeof(intUniBin))==sizeof(intUniBin)) { + UniBin2int ( iUB,k ); + *B = (k!=0); + return True; + } else + return False; + } else + return ( ReadFile(B,sizeof(Boolean))==sizeof(Boolean) ); +} + +Boolean CFile::ReadByte ( byte * B ) { + return ( ReadFile(B,sizeof(byte))==sizeof(byte) ); +} + +Boolean CFile::ReadWord ( word * W ) { +wordUniBin wUB; + if (UniBin) { + if (ReadFile(wUB,sizeof(wordUniBin))==sizeof(wordUniBin)) { + UniBin2word ( wUB,*W ); + return True; + } else + return False; + } else + return ( ReadFile(W,sizeof(word))==sizeof(word) ); +} + +Boolean CFile::AddReal ( realtype * V ) { +realtype x; + if (ReadReal(&x)) { + *V += x; + return True; + } + return False; +} + +Boolean CFile::AddFloat ( realtype * V ) { +realtype x; + if (ReadFloat(&x)) { + *V += x; + return True; + } + return False; +} + + +Boolean CFile::AddInt ( int * I ) { +int k; + if (ReadInt(&k)) { + *I += k; + return True; + } + return False; +} + +Boolean CFile::AddShort ( short * S ) { +short k; + if (ReadShort(&k)) { + *S += k; + return True; + } + return False; +} + +Boolean CFile::AddLong ( long * L ) { +long k; + if (ReadLong(&k)) { + *L += k; + return True; + } + return False; +} + +Boolean CFile::AddByte ( byte * B ) { +byte k; + if (ReadByte(&k)) { + *B += k; + return True; + } + return False; +} + +Boolean CFile::AddWord ( word * W ) { +word k; + if (ReadWord(&k)) { + *W += k; + return True; + } + return False; +} + +Boolean CFile::WriteVector ( rvector V, int len, int Shift ) { +intUniBin iUB; +realUniBin rUB; +int i; +int l = len; + if (V==NULL) l = 0; + if (UniBin) { + int2UniBin ( l,iUB ); + WriteFile ( iUB,sizeof(intUniBin) ); + for (i=0;i0) WriteFile ( &(V[Shift]),sizeof(realtype)*l ); + } + return IOSuccess; +} + +Boolean CFile::WriteVector ( ivector iV, int len, int Shift ) { +intUniBin iUB; +int i; +int l = len; + if (iV==NULL) l = 0; + if (UniBin) { + int2UniBin ( l,iUB ); + WriteFile ( iUB,sizeof(intUniBin) ); + for (i=0;i0) WriteFile ( &(iV[Shift]),sizeof(int)*l ); + } + return IOSuccess; +} + +Boolean CFile::WriteVector ( lvector lV, int len, int Shift ) { +intUniBin iUB; +longUniBin lUB; +int i; +int l = len; + if (lV==NULL) l = 0; + if (UniBin) { + int2UniBin ( l,iUB ); + WriteFile ( iUB,sizeof(intUniBin) ); + for (i=0;i0) WriteFile ( &(lV[Shift]),sizeof(long)*l ); + } + return IOSuccess; +} + +Boolean CFile::WriteVector ( bvector B, int len, int Shift ) { +intUniBin iUB; +int l = len; + if (B==NULL) l = 0; + if (UniBin) { + int2UniBin ( l,iUB ); + WriteFile ( iUB,sizeof(intUniBin) ); + } else + WriteFile ( &l,sizeof(l) ); + if (l>0) WriteFile ( &(B[Shift]),sizeof(byte)*l ); + return IOSuccess; +} + +Boolean CFile::ReadVector ( rvector V, int maxlen, int Shift ) { +intUniBin iUB; +realUniBin rUB; +int i,l,ll; +realtype B; + if (UniBin) { + ReadFile ( iUB,sizeof(intUniBin) ); + UniBin2int ( iUB,l ); + if (IOSuccess && (l>0)) { + ll = IMin(l,maxlen); + if (V) + for (i=0;i<=ll;i++) { + ReadFile ( rUB,sizeof(realUniBin) ); + UniBin2real ( rUB,V[Shift+i] ); + } + for (i=ll+1;i<=l;i++) + ReadFile ( rUB,sizeof(realUniBin) ); + } + } else { + ReadFile ( &l,sizeof(l) ); + if (IOSuccess && (l>0)) { + ll = IMin(l,maxlen); + if (V) ReadFile ( &(V[Shift]),sizeof(realtype)*ll ); + for (i=ll+1;i<=l;i++) ReadFile ( &B,sizeof(B) ); + } + } + return IOSuccess; +} + +Boolean CFile::ReadVector ( ivector iV, int maxlen, int Shift ) { +intUniBin iUB; +int i,l,ll,iB; + if (UniBin) { + ReadFile ( iUB,sizeof(intUniBin) ); + UniBin2int ( iUB,l ); + if (IOSuccess && (l>0)) { + ll = IMin(l,maxlen); + if (iV) + for (i=0;i<=ll;i++) { + ReadFile ( iUB,sizeof(intUniBin) ); + UniBin2int ( iUB,iV[Shift+i] ); + } + for (i=ll+1;i<=l;i++) + ReadFile ( iUB,sizeof(intUniBin) ); + } + } else { + ReadFile ( &l,sizeof(l) ); + if (IOSuccess && (l>0)) { + ll = IMin(l,maxlen); + if (iV) ReadFile ( &(iV[Shift]),sizeof(int)*ll ); + for (i=ll+1;i<=l;i++) ReadFile ( &iB,sizeof(iB) ); + } + } + return IOSuccess; +} + +Boolean CFile::ReadVector ( lvector lV, int maxlen, int Shift ) { +intUniBin iUB; +longUniBin lUB; +int i,l,ll; +long lB; + if (UniBin) { + ReadFile ( iUB,sizeof(intUniBin) ); + UniBin2int ( iUB,l ); + if (IOSuccess && (l>0)) { + ll = IMin(l,maxlen); + if (lV) + for (i=0;i<=ll;i++) { + ReadFile ( lUB,sizeof(longUniBin) ); + UniBin2long ( lUB,lV[Shift+i] ); + } + for (i=ll+1;i<=l;i++) + ReadFile ( lUB,sizeof(longUniBin) ); + } + } else { + ReadFile ( &l,sizeof(l) ); + if (IOSuccess && (l>0)) { + ll = IMin(l,maxlen); + if (lV) ReadFile ( &(lV[Shift]),sizeof(long)*ll ); + for (i=ll+1;i<=l;i++) ReadFile ( &lB,sizeof(lB) ); + } + } + return IOSuccess; +} + +Boolean CFile::ReadVector ( bvector B, int maxlen, int Shift ) { +intUniBin iUB; +int i,l,ll; +byte t; + if (UniBin) { + ReadFile ( iUB,sizeof(intUniBin) ); + UniBin2int ( iUB,l ); + } else + ReadFile ( &l,sizeof(l) ); + if (IOSuccess && (l>0)) { + ll = IMin(l,maxlen); + if (B) ReadFile ( &(B[Shift]),sizeof(byte)*ll ); + for (i=ll+1;i<=l;i++) ReadFile ( &t,sizeof(t) ); + } + return IOSuccess; +} + +Boolean CFile::CreateReadVector ( rvector & V, int & len, + int Shift ) { +intUniBin iUB; +realUniBin rUB; +int i; +realtype B; + FreeVectorMemory ( V,Shift ); + if (UniBin) { + ReadFile ( iUB,sizeof(intUniBin) ); + UniBin2int ( iUB,len ); + if (IOSuccess && (len>0)) { + GetVectorMemory ( V,len,Shift ); + if (V) + for (i=0;i0)) { + GetVectorMemory ( V,len,Shift ); + if (V) ReadFile ( &(V[Shift]),sizeof(realtype)*len ); + else for (i=0;i0)) { + GetVectorMemory ( iV,len,Shift ); + if (iV) + for (i=0;i0)) { + GetVectorMemory ( iV,len,Shift ); + if (iV) ReadFile ( &(iV[Shift]),sizeof(int)*len ); + else for (i=0;i0)) { + GetVectorMemory ( lV,len,Shift ); + if (lV) + for (i=0;i0)) { + GetVectorMemory ( lV,len,Shift ); + if (lV) ReadFile ( &(lV[Shift]),sizeof(long)*len ); + else for (i=0;i0)) { + GetVectorMemory ( B,len,Shift ); + if (B) ReadFile ( &(B[Shift]),sizeof(byte)*len ); + else for (i=0;i0)) { + ReadFile ( iUB,sizeof(intUniBin) ); + UniBin2int ( iUB,M ); + if (IOSuccess && (M>0)) { + GetMatrixMemory ( A,N,M,ShiftN,ShiftM ); + for (i=0;i0) { + ReadFile ( &M,sizeof(M) ); + if (M>0) { + GetMatrixMemory ( A,N,M,ShiftN,ShiftM ); + for (i=0;i=j) DataLen--; + if (DataLen>0) { + Ok = GetVectorMemory(X,DataLen,Shift); + if (Ok && (yCol>=0)) + Ok = Ok && GetVectorMemory(Y,DataLen,Shift); + if (Ok && (zCol>=0)) + Ok = Ok && GetVectorMemory(Z,DataLen,Shift); + if (Ok) { + reset(); + _ReadColumns ( DataLen,S,sizeof(S),X,Y,Z,xCol,yCol, + zCol,Shift ); + } else ErrCode = FileError_NoMemory; + } else ErrCode = FileError_NoDataFound; + } else ErrCode = FileError_NoDataFound; + return DataLen; +} + +int CFile::CreateReadColumns ( rvector & X, rvector & Y, + int xCol, int yCol, int Shift ) { + return CreateReadColumns ( X,Y,X,xCol,yCol,-1,Shift ); +} + +void CFile::_ReadColumns ( int & DLen, pstr S, int SLen, + rvector X, rvector Y, rvector Z, + int xCol, int yCol, int zCol, + int Shift ) { +int i,is,j,k,m,n,cmax; +char SV[256]; +realtype Res; + ErrCode = 0; + i = 0; + cmax = IMax(zCol,IMax(xCol,yCol)); + while ((i=k)) { + DLen = i; + return; + } + m++; + } while ((m!=xCol) && (m!=yCol) && (m!=zCol)); + if (SV[0]==char(0)) { + if (n>0) ErrCode = FileError_NoColumn; + else ErrCode = FileError_ShortData; + } else { + Res = GetNumber ( SV ); + if (ErrCode==0) { + is = i+Shift; + if (m==xCol) X[is] = Res; + else if (m==yCol) Y[is] = Res; + else Z[is] = Res; + n++; + } + } + } + if ((ErrCode==0) && (n<2)) ErrCode = FileError_NoColumn; + i++; + } + if ((ErrCode==FileError_ShortData) && (i>1)) { + ErrCode = 0; + DLen = i-1; + } + if (ErrCode!=0) ErrCode = FileError_BadData; +} + +void RemoveDelimiters ( pstr S, int SLen ) { +int j; + for (j=0;j +// ~~~~~~~~~ +// **** Classes : CFile - file I/O Support. +// ~~~~~~~~~ +// +// (C) E. Krissinel 2000-2010 +// +// ================================================================= +// + +#ifndef __File__ +#define __File__ + +#ifndef __STDIO_H +#include +#endif + +#ifndef __MatType__ +#include "mattype_.h" +#endif + + +// ======================== CFile Class ======================== + +#define MaxFileNameLength 512 + +#define FM_Binary False +#define FM_Text True + +#define GZM_NONE 0 +#define GZM_CHECK 1 +#define GZM_ENFORCE 2 +#define GZM_ENFORCE_GZIP 2 +#define GZM_ENFORCE_COMPRESS 3 + + +#define FileError_NoMemory 110 +#define FileError_ShortData 111 +#define FileError_NoDataFound 112 +#define FileError_NoColumn 113 +#define FileError_BadData 114 +#define FileError_WrongMemoryAllocation 115 + + +// =================== Auxilary Functions ========================= + +#define syskey_unix 1 +#define syskey_win 2 +#define syskey_all 3 + +extern cpstr GetFPath ( pstr FilePath, int syskey=syskey_unix ); +extern cpstr GetFName ( cpstr FilePath, int syskey=syskey_unix ); +extern cpstr GetFExt ( cpstr FilePath ); +extern cpstr ChangeExt ( pstr FilePath, cpstr newExt, + int syskey=syskey_unix ); +extern cpstr FileError ( int ErrCode ); +extern void RemoveDelimiters ( pstr S, int SLen ); +extern void PickOutNumber ( cpstr S, pstr SV, int SLen, int & j ); + + +#ifdef _WIN32 +#define _dir_sep_c '\\' +#define _dir_sep "\\" +#else +#define _dir_sep_c '/' +#define _dir_sep "/" +#endif + + +// ========================= CFile ================================ + +DefineClass(CFile) + +class CFile { + + public : + + CFile ( word BufSize=4096 ); + virtual ~CFile(); + + // ---- control functions + // FileName allows for "stdin", "stdout" and "stderr" as + // for standard UNIX streams. + void assign ( cpstr FileName, + Boolean Text=False, + Boolean UniB=False, + byte gzMode=GZM_NONE ); + // assign for memory IO + void assign ( word poolSize, word sizeInc, pstr filePool ); + void GetFilePool ( pstr & filePool, word & fileSize ); + + pstr FileName () { return FName; } + Boolean reset ( Boolean ReadOnly=False, int retry=0 ); + // = true if opened, each retry 1 sec sleep + Boolean erase (); // = true if erased + Boolean exists (); // = true if exists + Boolean parse ( cpstr FileName ); // true if filled + Boolean rename ( cpstr NewFileName ); // true if renamed + Boolean rewrite (); // = true if opened + Boolean append (); // = true if opened + Boolean isOpen (); + long Position (); + long FileLength () { return FLength; } + Boolean seek ( long Position ); + Boolean FileEnd (); + Boolean Success () { return IOSuccess; } + void SetSuccess () { IOSuccess = True; } + void shut (); + + // ---- binary I/O + word ReadFile ( void * Buffer, word Count ); + word CreateRead ( pstr & Line ); + word ReadTerLine ( pstr Line, Boolean longLine=False ); + Boolean WriteFile ( const void * Buffer, word Count ); + Boolean CreateWrite ( cpstr Line ); + Boolean WriteTerLine ( cpstr Line, Boolean longLine=False ); + // machine-dependent binary I/O + Boolean WriteReal ( realtype * V ); + Boolean WriteFloat ( realtype * V ); + Boolean WriteInt ( int * I ); + Boolean WriteShort ( short * S ); + Boolean WriteLong ( long * L ); + Boolean WriteBool ( Boolean * B ); + Boolean WriteByte ( byte * B ); + Boolean WriteWord ( word * W ); + Boolean ReadReal ( realtype * V ); + Boolean ReadFloat ( realtype * V ); + Boolean ReadInt ( int * I ); + Boolean ReadShort ( short * S ); + Boolean ReadLong ( long * L ); + Boolean ReadBool ( Boolean * B ); + Boolean ReadByte ( byte * B ); + Boolean ReadWord ( word * B ); + Boolean AddReal ( realtype * V ); + Boolean AddFloat ( realtype * V ); + Boolean AddInt ( int * I ); + Boolean AddShort ( short * S ); + Boolean AddLong ( long * L ); + Boolean AddByte ( byte * B ); + Boolean AddWord ( word * B ); + // complex data binary I/O + Boolean WriteVector ( rvector V, int len, int Shift ); + Boolean WriteVector ( ivector iV, int len, int Shift ); + Boolean WriteVector ( lvector lV, int len, int Shift ); + Boolean WriteVector ( bvector B, int len, int Shift ); + Boolean ReadVector ( rvector V, int maxlen, int Shift ); + Boolean ReadVector ( ivector iV, int maxlen, int Shift ); + Boolean ReadVector ( lvector lV, int maxlen, int Shift ); + Boolean ReadVector ( bvector B, int maxlen, int Shift ); + Boolean CreateReadVector ( rvector & V, int & len, int Shift ); + Boolean CreateReadVector ( ivector & iV, int & len, int Shift ); + Boolean CreateReadVector ( lvector & lV, int & len, int Shift ); + Boolean CreateReadVector ( bvector & B, int & len, int Shift ); + Boolean CreateReadVector ( rvector & V, int Shift ); + Boolean CreateReadVector ( ivector & iV, int Shift ); + Boolean CreateReadVector ( lvector & lV, int Shift ); + Boolean CreateReadVector ( bvector & B, int Shift ); + Boolean WriteMatrix ( rmatrix & A, int N, int M, + int ShiftN, int ShiftM ); + Boolean CreateReadMatrix ( rmatrix & A, int ShiftN, int ShiftM ); + Boolean CreateReadMatrix ( rmatrix & A, int & N, int & M, + int ShiftN, int ShiftM ); + + /// ---- text I/O + Boolean Write ( cpstr Line ); //!< writes without LF + Boolean Write ( realtype V, int length=10 ); //!< w/o LF + Boolean Write ( int iV, int length=5 ); //!< w/o LF + Boolean WriteLine ( cpstr Line ); //!< writes and adds LF + Boolean LF (); //!< just adds LF + word ReadLine ( pstr Line, word MaxLen=255 ); + word ReadNonBlankLine ( pstr S, word MaxLen=255 ); + + /// complex data text I/O + + // writes with spaces and adds LF + Boolean WriteDataLine ( realtype X, realtype Y, + int length=10 ); + + Boolean WriteParameter ( cpstr S, realtype X, // writes parameter + int ParColumn=40, // name S and value X + int length=10 ); // at column ParColumn + // and adds LF. + + Boolean WriteParameters ( cpstr S, int n_X, // writes parameter + rvector X, // name S and n_X values + int ParColumn=40, // X[0..n_X-1] at col + int length=10 ); // ParColumn, ads LF. + + Boolean ReadParameter ( pstr S, realtype & X, // reads parameter + int ParColumn=40 ); // name S and val X + Boolean ReadParameter ( pstr S, int & X, + int ParColumn=40 ); + + Boolean ReadParameters ( pstr S, int & n_X, // reads parameter + rvector X, // name S, counts the + int MaxLen=255, // of values n_X and + int ParColumn=40 ); // reads X[0..n_X-1]. + // MaxLen gives sizeof(S) + + // WriteColumns writes data stored in X, Y and Z in the form + // of columns, adding a blank line in the end. If Z (or Z and Y) + // are set to NULL, then only X and Y (or only X) are written. + // Shift corresponds to the begining of arrays' enumeration + // X[Shift..Shift+len-1]. + Boolean WriteColumns ( rvector X, rvector Y, rvector Z, + int len, int Shift, int MLength ); + Boolean WriteColumns ( rvector X, rvector Y, + int len, int Shift, int MLength ); + + // ReadColumns reads data stored by WriteColumns. X, Y, and Z + // must be allocated prior to call. + // xCol, yCol and zCol specify the order number of columns + // (starting from 0) to be read into X, Y and Z, correspondingly. + // If zCol (or zCol and yCol) < 0 then Z (or Z and Y) are not read. + // Shift corresponds to the begining of arrays' enumeration + // X[Shift..Shift+len-1]. + // Returns number of lines read. + int ReadColumns ( int maxlen, rvector X, rvector Y, rvector Z, + int xCol, int yCol, int zCol, int Shift ); + int ReadColumns ( int maxlen, rvector X, rvector Y, + int xCol, int yCol, int Shift ); + + // CreateReadColumns reads data stored by WriteColumns. X, Y, + // and Z must be set to NULL prior to call. They will be allocated + // within the procedure. + // xCol, yCol and zCol specify the order number of columns + // (starting from 0) to be read into X, Y and Z, correspondingly. + // If zCol (or zCol and yCol) < 0 then Z (or Z and Y) are not read. + // Shift corresponds to the begining of arrays' enumeration + // X[Shift..Shift+len-1]. + // Returns number of lines read, errors are reported by + // ErrorCode(). + int CreateReadColumns ( rvector & X, rvector & Y, rvector & Z, + int xCol, int yCol, int zCol, int Shift ); + int CreateReadColumns ( rvector & X, rvector & Y, + int xCol, int yCol, int Shift ); + + // ---- miscellaneous + realtype GetNumber ( cpstr S ); + FILE * GetHandle () { return hFile; } + + protected : + word Buf_Size; + Boolean TextMode,UniBin; + byte gzipMode; + pstr IOBuf; + word BufCnt,BufLen,BufInc; + FILE * hFile; + Boolean EofFile; + pstr FName; + long FLength; + Boolean IOSuccess; + int ErrCode; + + void FreeBuffer (); + void _ReadColumns ( int & DLen, pstr S, int SLen, + rvector X, rvector Y, rvector Z, + int xCol, int yCol, int zCol, int Shift ); + + private : + int gzipIO; + Boolean StdIO,memIO; + +}; + + +extern void SetGZIPPath ( pstr gzipPath, pstr ungzipPath ); +extern void SetCompressPath ( pstr compressPath, pstr uncompressPath ); + +extern Boolean FileExists ( cpstr FileName, PCFile f=NULL ); + + +#endif + diff --git a/mmdb/hybrid_36.cpp b/mmdb/hybrid_36.cpp new file mode 100755 index 0000000..243f660 --- /dev/null +++ b/mmdb/hybrid_36.cpp @@ -0,0 +1,320 @@ + +// +// This is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// + +/*! C port of the hy36encode() and hy36decode() functions in the + hybrid_36.py Python prototype/reference implementation. + See the Python script for more information. + + This file has no external dependencies, NOT even standard C headers. + Optionally, use hybrid_36_c.h, or simply copy the declarations + into your code. + + This file is unrestricted Open Source (cctbx.sf.net). + Please send corrections and enhancements to cctbx@cci.lbl.gov . + + See also: http://cci.lbl.gov/hybrid_36/ + + Ralf W. Grosse-Kunstleve, Feb 2007. + */ + +/* The following #include may be commented out. + It is here only to enforce consistency of the declarations + and the definitions. + */ +#ifndef IOTBX_PDB_HYBRID_36_C_H +#include "hybrid_36.h" +#endif + +/* All static functions below are implementation details + (and not accessible from other translation units). + */ + +static +const char* +digits_upper() { return "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; } + +static +const char* +digits_lower() { return "0123456789abcdefghijklmnopqrstuvwxyz"; } + +static +const char* +value_out_of_range() { return "value out of range."; } + +static +const char* invalid_number_literal() { return "invalid number literal."; } + +static +const char* unsupported_width() { return "unsupported width."; } + +static +void +fill_with_stars(unsigned width, char* result) +{ + while (width) { + *result++ = '*'; + width--; + } + *result = '\0'; +} + +static +void +encode_pure( + const char* digits, + unsigned digits_size, + unsigned width, + int value, + char* result) +{ + char buf[16]; + int rest; + unsigned i, j; + i = 0; + j = 0; + if (value < 0) { + j = 1; + value = -value; + } + while (1) { + rest = value / digits_size; + buf[i++] = digits[value - rest * digits_size]; + if (rest == 0) break; + value = rest; + } + if (j) buf[i++] = '-'; + for(j=i;j 127) { + *result = 0; + return invalid_number_literal(); + } + if (si == ' ') { + if (!have_non_blank) continue; + value *= digits_size; + } + else if (si == '-') { + if (have_non_blank) { + *result = 0; + return invalid_number_literal(); + } + have_non_blank = 1; + have_minus = 1; + continue; + } + else { + have_non_blank = 1; + dv = digits_values[si]; + if (dv < 0 || dv >= (int)digits_size) { + *result = 0; + return invalid_number_literal(); + } + value *= digits_size; + value += dv; + } + } + if (have_minus) value = -value; + *result = value; + return 0; +} + +/*! hybrid-36 encoder: converts integer value to string result + + width: must be 4 (e.g. for residue sequence numbers) + or 5 (e.g. for atom serial numbers) + + value: integer value to be converted + + result: pointer to char array of size width+1 or greater + on return result is null-terminated + + return value: pointer to error message, if any, + or 0 on success + + Example usage (from C++): + char result[4+1]; + const char* errmsg = hy36encode(4, 12345, result); + if (errmsg) throw std::runtime_error(errmsg); + */ +const char* +hy36encode(unsigned width, int value, char* result) +{ + int i = value; + if (width == 4U) { + if (i >= -999) { + if (i < 10000) { + encode_pure(digits_upper(), 10U, 4U, i, result); + return 0; + } + i -= 10000; + if (i < 1213056 /* 26*36**3 */) { + i += 466560 /* 10*36**3 */; + encode_pure(digits_upper(), 36U, 0U, i, result); + return 0; + } + i -= 1213056; + if (i < 1213056) { + i += 466560; + encode_pure(digits_lower(), 36U, 0U, i, result); + return 0; + } + } + } + else if (width == 5U) { + if (i >= -9999) { + if (i < 100000) { + encode_pure(digits_upper(), 10U, 5U, i, result); + return 0; + } + i -= 100000; + if (i < 43670016 /* 26*36**4 */) { + i += 16796160 /* 10*36**4 */; + encode_pure(digits_upper(), 36U, 0U, i, result); + return 0; + } + i -= 43670016; + if (i < 43670016) { + i += 16796160; + encode_pure(digits_lower(), 36U, 0U, i, result); + return 0; + } + } + } + else { + fill_with_stars(width, result); + return unsupported_width(); + } + fill_with_stars(width, result); + return value_out_of_range(); +} + +/*! hybrid-36 decoder: converts string s to integer result + + width: must be 4 (e.g. for residue sequence numbers) + or 5 (e.g. for atom serial numbers) + + s: string to be converted + does not have to be null-terminated + + s_size: size of s + must be equal to width, or an error message is + returned otherwise + + result: integer holding the conversion result + + return value: pointer to error message, if any, + or 0 on success + + Example usage (from C++): + int result; + const char* errmsg = hy36decode(width, "A1T5", 4, &result); + if (errmsg) throw std::runtime_error(errmsg); + */ +const char* +hy36decode(unsigned width, const char* s, unsigned s_size, int* result) +{ + static int first_call = 1; + static int digits_values_upper[128U]; + static int digits_values_lower[128U]; + static const char* + ie_range = "internal error hy36decode: integer value out of range."; + unsigned i; + int di; + const char* errmsg; + if (first_call) { + first_call = 0; + for(i=0;i<128U;i++) digits_values_upper[i] = -1; + for(i=0;i<128U;i++) digits_values_lower[i] = -1; + for(i=0;i<36U;i++) { + di = digits_upper()[i]; + if (di < 0 || di > 127) { + *result = 0; + return ie_range; + } + digits_values_upper[di] = i; + } + for(i=0;i<36U;i++) { + di = digits_lower()[i]; + if (di < 0 || di > 127) { + *result = 0; + return ie_range; + } + digits_values_lower[di] = i; + } + } + if (s_size == width) { + di = s[0]; + if (di >= 0 && di <= 127) { + if (digits_values_upper[di] >= 10) { + errmsg = decode_pure(digits_values_upper, 36U, s, s_size, result); + if (errmsg == 0) { + /* result - 10*36**(width-1) + 10**width */ + if (width == 4U) (*result) -= 456560; + else if (width == 5U) (*result) -= 16696160; + else { + *result = 0; + return unsupported_width(); + } + return 0; + } + } + else if (digits_values_lower[di] >= 10) { + errmsg = decode_pure(digits_values_lower, 36U, s, s_size, result); + if (errmsg == 0) { + /* result + 16*36**(width-1) + 10**width */ + if (width == 4U) (*result) += 756496; + else if (width == 5U) (*result) += 26973856; + else { + *result = 0; + return unsupported_width(); + } + return 0; + } + } + else { + errmsg = decode_pure(digits_values_upper, 10U, s, s_size, result); + if (errmsg) return errmsg; + if (!(width == 4U || width == 5U)) { + *result = 0; + return unsupported_width(); + } + return 0; + } + } + } + *result = 0; + return invalid_number_literal(); +} diff --git a/mmdb/hybrid_36.h b/mmdb/hybrid_36.h new file mode 100755 index 0000000..4811b00 --- /dev/null +++ b/mmdb/hybrid_36.h @@ -0,0 +1,21 @@ +/* If you change the include guards, please be sure to also rename the + functions below. Otherwise your project will clash with the original + iotbx declarations and definitions. + */ +#ifndef IOTBX_PDB_HYBRID_36_C_H +#define IOTBX_PDB_HYBRID_36_C_H + +#ifdef __cplusplus +extern "C" { +#endif + +const char* +hy36encode(unsigned width, int value, char* result); + +const char* +hy36decode(unsigned width, const char* s, unsigned s_size, int* result); + +#ifdef __cplusplus +} +#endif +#endif /* IOTBX_PDB_HYBRID_36_C_H */ diff --git a/mmdb/linalg_.cpp b/mmdb/linalg_.cpp new file mode 100755 index 0000000..26012d1 --- /dev/null +++ b/mmdb/linalg_.cpp @@ -0,0 +1,987 @@ +// $Id: linalg_.cpp,v 1.21 2012/01/26 17:52:19 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 27.06.01 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : linalg_ +// ~~~~~~~~~ +// **** Project : MMDB ( MacroMolecular Data Base ) +// ~~~~~~~~~ +// +// (C) E. Krissinel 2000-2008 +// +// ================================================================= +// + +#include + +#ifndef __MATH_H +#include +#endif + +#ifndef __LinAlg__ +#include "linalg_.h" +#endif + + +// ========================== Jacobi ============================= + + +void Jacobi ( int N, // dimension of the matrix + rmatrix A, // matrix to diagonalize; the lower + // triangle, except the diagonal, + // will remain unchanged + rmatrix T, // eigenvectors placed as columns + rvector Eigen, // vector of eigenvalues, orderd + // by increasing + rvector Aik, // working array + int & Signal // 0 <=> Ok, ItMax <=> iteration limit + // exchausted. + ) { +// Diagonalization of symmetric matrices by the method of Jacobi. +// Key variables: +// ItMax - the maximum available number of iterations +// Eps1 - is used in SNA and CSA calculations +// Eps2 - is the level of the elimination of the +// non-diagonal matrix elements +// Eps3 - the criterion to stop the iterations. +// The iterations stop if (1-Sigma1/Sigma2)<=Eps3 +// where Sigma1 is the dekart norm of the eigenvalues +// at the preceding iteration and Sigma2 is +// the same for the current iteration. + +realtype Eps1,Eps2,Eps3; +realtype Sigma1,Sigma2,OffDsq, SPQ,CSA,SNA,Q,P, HoldIK,HoldKI; +int ItMax; +int i,j,k,Iter; + + Eps1 = 6.0e-9; + Eps2 = 9.0e-12; + Eps3 = 1.0e-8; + ItMax = 9999; + + Signal = 0; + + if (N<=1) { + T[1][1] = 1.0; + Eigen[1] = A[1][1]; + return; + } + + for (i=1;i<=N;i++) { + for (j=1;j<=N;j++) + T[i][j] = 0.0; + T[i][i] = 1.0; + Eigen[i] = A[i][i]; + } + + Sigma1 = 0.0; + OffDsq = 0.0; + + // Sigma1 is the Dekart measure of the diagonal elements + // OffDsq is the Dekart measure of the non-diagonal elements + + for (i=1;i<=N;i++) { + Sigma1 += A[i][i]*A[i][i]; + if (iEps3)) { + + for (i=1;iEps2)) { + if (Q>Eps1) { + P = 2.0*A[i][j]*(Q/(A[i][i]-A[j][j])); + SPQ = sqrt(P*P+Q*Q); + CSA = sqrt((1.0+Q/SPQ)/2.0); + SNA = P/(SPQ*CSA*2.0); + } else { + CSA = sqrt(0.5); + SNA = CSA; + } + for (k=1;k<=N;k++) { + HoldKI = T[k][i]; + T[k][i] = HoldKI*CSA + T[k][j]*SNA; + T[k][j] = HoldKI*SNA - T[k][j]*CSA; + } + + for (k=i;k<=N;k++) + if (k<=j) { + Aik[k] = A[i][k]; + A[i][k] = CSA*Aik[k] + SNA*A[k][j]; + if (k==j) { + A[j][k] = SNA*Aik[k] - CSA*A[j][k]; + Aik[j] = SNA*Aik[i] - CSA*Aik[j]; + } + } else { + HoldIK = A[i][k]; + A[i][k] = CSA*HoldIK + SNA*A[j][k]; + A[j][k] = SNA*HoldIK - CSA*A[j][k]; + } + + for (k=1;k<=j;k++) + if (k>i) + A[k][j] = SNA*Aik[k] - CSA*A[k][j]; + else { + HoldKI = A[k][i]; + A[k][i] = CSA*HoldKI + SNA*A[k][j]; + A[k][j] = SNA*HoldKI - CSA*A[k][j]; + } + + } + + } + + Sigma2 = 0.0; + for (i=1;i<=N;i++) { + Eigen[i] = A[i][i]; + Sigma2 += Eigen[i]*Eigen[i]; + } + + HoldIK = fabs(1.0-Sigma1/Sigma2); + Sigma1 = Sigma2; + Iter++; + + } + + if (Iter>ItMax) Signal = ItMax; + + for (i=1;i<=N;i++) { + k = i; + for (j=i;j<=N;j++) + if (Eigen[j]MaxOffl) MaxOffl = BB; + } + MaxOffl = sqrt(MaxOffl); + } + + MinL2 = sqrt(MachEps)*MaxOffl; + MaxAdd = 0.0; + for (j=1;j<=N;j++) { + S = 0.0; + if (j>1) + for (i=1;i1) + for (k=1;kMinLjj) MinLjj = BB; + } + BB = MinLjj/MaxOffl; + if (BB>MinL) MinLjj = BB; + else MinLjj = MinL; + if (L[j][j]>MinLjj*MinLjj) L[j][j] = sqrt(L[j][j]); + else { + if (MinL2>MinLjj) MinLjj = MinL2; + BB = MinLjj*MinLjj-L[j][j]; + if (BB>MaxAdd) MaxAdd = BB; + L[j][j] = MinLjj; + } + if (j1) + for (i=2;i<=N;i++) { + Y[i] = B[i]; + for (j=1;j1) + for (i=N-1;i>=1;i--) { + X[i] = Y[i]; + for (j=i+1;j<=N;j++) + X[i] -= L[j][i]*X[j]; + X[i] /= L[i][i]; + } +} + + +// ----------------------------------------------------- + +void ChSolve ( int N, rmatrix L, rvector G, rvector S ) { +// A3.2.3 : Solution of the equation L*LT*S = G +// by the Cholesky's method +//int i; + LSolve ( N,L,G,S ); + LTSolve ( N,L,S,S ); +// for (i=1;i<=N;i++) +// S[i] = -S[i]; +} + + + +// ---------------------------------------------------- + +void FastInverse ( int N, rmatrix A, ivector J0, +//#D realtype & Det, + int & Signal ) { +// +// 17.01.91 <-- Last Date of Modification. +// ---------------------------- +// +// ================================================ +// +// Fast Inversion of the matrix A +// by the method of GAUSS - JOIRDAN . +// +// ------------------------------------------------ +// +// Input parameters are : +// +// N - dimension of the matrix +// A - the matrix [1..N][1..N] to be inverted. +// +// ------------------------------------------------ +// +// J0 - integer vector [1..N] for temporal storage +// +// +// ------------------------------------------------ +// +// Output parameters are : +// +// A - the inverted matrix +// Signal - the error key : +// = 0 <=> O'K +// else +// degeneration was found, and +// the rang of matrix is Signal-1. +// +// Variable Det may return the determinant +// of matrix A. To obtain it, remove all comments +// of form //#D . +// +// ------------------------------------------------ +// +// Key Variables are : +// +// Eps - is the level for the degeneration +// detection. Keep in mind, that +// this routine does not norm the +// matrix given, and thus Eps1 +// is the ABSOLUTE value. +// +// ================================================ +// + +realtype Eps = 1.0e-16; + +int i,j,k,i0; +realtype A0,B; +rvector Ai,Ai0; + + Signal = 0; + if (N<=1) { + if (fabs(A[1][1])A0) { + A0 = fabs(A[j][i]); + i0 = j; + } + } + if (A0=1;i--) { + j = J0[i]; + if (j!=i) { +//#D Det = -Det; + for (k=1;k<=N;k++) { + B = A[k][i]; + A[k][i] = A[k][j]; + A[k][j] = B; + } + } + } + + return; + +} // End of the procedure FastInverse + + + + +// ---------------------------------------------------- + +realtype Sign ( realtype A, realtype B ) { + if (B>=0.0) return A; + else return -A; +} + +realtype SrX2Y2 ( realtype X, realtype Y ) { +realtype Ax,Ay; + Ax = fabs(X); + Ay = fabs(Y); + if (Ay>Ax) return Ay*sqrt((X*X)/(Y*Y)+1.0); + if (Ay==Ax) return Ax*sqrt(2.0); + return Ax*sqrt((Y*Y)/(X*X)+1.0); +} + + +// ---------------------------------------------------- + +void SVD ( int NA, int M, int N, + rmatrix A, rmatrix U, rmatrix V, + rvector W, rvector RV1, + Boolean MatU, Boolean MatV, + int & RetCode ) { +// +// 13.12.01 <-- Last Modification Date +// ------------------------ +// +// ================================================ +// +// The Singular Value Decomposition +// of the matrix A by the algorithm from +// G.Forsait, M.Malkolm, K.Mouler. Numerical +// methods of mathematical calculations +// M., Mir, 1980. +// +// Matrix A is represented as +// +// A = U * W * VT +// +// ------------------------------------------------ +// +// All dimensions are indexed from 1 on. +// +// ------------------------------------------------ +// +// Input parameters: +// +// NA - number of lines in A. NA may be +// equal to M or N only. If NA=M +// then usual SVD will be made. If MA=N +// then matrix A is transposed before +// the decomposition, and the meaning of +// output parameters U and V is +// swapped (U accepts VT and VT accepts U). +// In other words, matrix A has physical +// dimension of M x N , same as U and V; +// however the logical dimension of it +// remains that of N x M . +// M - number of lines in U +// N - number of columns in U,V and length +// of W,RV1 . Always provide M >= N ! +// A - matrix [1..M][1..N] or [1..N][1..M] +// to be decomposed. The matrix does not +// change, and it may coincide with U or +// V, if NA=M (in which case A does change) +// MatU - compute U , if set True +// MatV - compute V , if set True +// RV1 - temporary array [1..N]. +// U - should be always supplied as an array of +// [1..M][1..N], M>=N . +// V - should be suuplied as an array of +// [1..N][1..N] if MatV is True . +// +// ------------------------------------------------ +// +// Output parameters are : +// +// W - N non-ordered singular values, +// if RetCode=0. If RetCode<>0, the +// RetCode+1 ... N -th values are still +// valid +// U - matrix of right singular vectors +// (arranged in columns), corresponding +// to the singular values in W, if +// RetCode=0 and MatU is True. If MatU +// is False, U is still used as a +// temporary array. If RetCode<>0 then +// the RetCode+1 ... N -th vectors +// are valid +// V - matrix of left singular vectors +// (arranged in columns), corresponding +// to the singular values in W, if +// RetCode=0 and MatV is True. If MatV +// is False, V is not used and may be set +// to NULL. If RetCode<>0 then the +// RetCode+1 ... N -th vectors are valid +// RetCode - the error key : +// = 0 <=> O'K +// else +// = k, if the k-th singular value +// was not computed after 30 iterations. +// +// ------------------------------------------------ +// +// Key Variables are : +// +// ItnLimit - the limit for iterations +// +// This routine does not use any machine-dependent +// constants. +// +// ================================================ +// +// +int ItnLimit=300; +int i,j,k,l,i1,k1,l1,its,mn,ExitKey; +realtype C,G,F,X,S,H,Y,Z,Scale,ANorm,GG; + + l1 = 0; // this is to keep compiler happy + RetCode = 0; + + if (U!=A) { + if (NA==M) + for (i=1;i<=M;i++) + for (j=1;j<=N;j++) + U[i][j] = A[i][j]; + else + for (i=1;i<=M;i++) + for (j=1;j<=N;j++) + U[i][j] = A[j][i]; + } + + G = 0.0; + Scale = 0.0; + ANorm = 0.0; + + for (i=1;i<=N;i++) { + l = i+1; + RV1[i] = Scale*G; + G = 0.0; + S = 0.0; + Scale = 0.0; + if (i<=M) { + for (k=i;k<=M;k++) + Scale += fabs(U[k][i]); + if (Scale!=0.0) { + for (k=i;k<=M;k++) { + U[k][i] /= Scale; + S += U[k][i]*U[k][i]; + } + F = U[i][i]; + G = -Sign(sqrt(S),F); + H = F*G-S; + U[i][i] = F-G; + if (i!=N) + for (j=l;j<=N;j++) { + S = 0.0; + for (k=i;k<=M;k++) + S += U[k][i]*U[k][j]; + F = S/H; + for (k=i;k<=M;k++) + U[k][j] += F*U[k][i]; + } + for (k=i;k<=M;k++) + U[k][i] *= Scale; + } + } + + W[i] = Scale*G; + G = 0.0; + S = 0.0; + Scale = 0.0; + + if ((i<=M) && (i!=N)) { + for (k=l;k<=N;k++) + Scale += fabs(U[i][k]); + if (Scale!=0.0) { + for (k=l;k<=N;k++) { + U[i][k] /= Scale; + S += U[i][k]*U[i][k]; + } + F = U[i][l]; + G = -Sign(sqrt(S),F); + H = F*G-S; + U[i][l] = F-G; + for (k=l;k<=N;k++) + RV1[k] = U[i][k]/H; + if (i!=M) + for (j=l;j<=M;j++) { + S = 0.0; + for (k=l;k<=N;k++) + S += U[j][k]*U[i][k]; + for (k=l;k<=N;k++) + U[j][k] += S*RV1[k]; + } + for (k=l;k<=N;k++) + U[i][k] *= Scale; + } + } + + ANorm = RMax( ANorm,fabs(W[i])+fabs(RV1[i]) ); + + } + + // Accumulation of the right-hand transformations + + if (MatV) + for (i=N;i>=1;i--) { + if (i!=N) { + if (G!=0.0) { + for (j=l;j<=N;j++) + V[j][i] = (U[i][j]/U[i][l]) / G; + for (j=l;j<=N;j++) { + S = 0.0; + for (k=l;k<=N;k++) + S += U[i][k]*V[k][j]; + for (k=l;k<=N;k++) + V[k][j] += S*V[k][i]; + } + } + for (j=l;j<=N;j++) { + V[i][j] = 0.0; + V[j][i] = 0.0; + } + } + + V[i][i] = 1.0; + G = RV1[i]; + l = i; + + } + + + // Accumulation of the left-hand transformations + + if (MatU) { + mn = N; + if (M=1;i--) { + l = i+1; + G = W[i]; + if (i!=N) + for (j=l;j<=N;j++) + U[i][j] = 0.0; + if (G!=0.0) { + if (i!=mn) + for (j=l;j<=N;j++) { + S = 0.0; + for (k=l;k<=M;k++) + S += U[k][i]*U[k][j]; + F = (S/U[i][i]) / G; + for (k=i;k<=M;k++) + U[k][j] += F*U[k][i]; + } + for (j=i;j<=M;j++) + U[j][i] /= G; + } else + for (j=i;j<=M;j++) + U[j][i] = 0.0; + + U[i][i] += 1.0; + + } + } + + // Diagonalization of the two-diagonal form. + + for (k=N;k>=1;k--) { + k1 = k-1; + its = 0; + + do { + ExitKey = 0; + l = k+1; + while ((ExitKey==0) && (l>1)) { + l--; + l1 = l-1; + if (fabs(RV1[l])+ANorm==ANorm) ExitKey=1; + else if (l1>0) { + if (fabs(W[l1])+ANorm==ANorm) ExitKey=2; + } + } + +// if (ExitKey!=1) { <-- this is original statement + if (ExitKey>1) { // <-- prevents from corruption due to l1<1. + // This is a rare case as RV1[1] should be + // always 0.0 . Apparently this logics is + // on the edge of float-point arithmetic, + // therefore extra precaution for the case + // of l1<1 was found necessary. + C = 0.0; + S = 1.0; + ExitKey = 0; + i = l; + while ((ExitKey==0) && (i<=k)) { + F = S*RV1[i]; + RV1[i] = C*RV1[i]; + if (fabs(F)+ANorm==ANorm) ExitKey = 1; + else { + G = W[i]; + H = SrX2Y2(F,G); + W[i] = H; + C = G/H; + S = -F/H; + if (MatU) + for (j=1;j<=M;j++) { + Y = U[j][l1]; + Z = U[j][i]; + U[j][l1] = Y*C+Z*S; + U[j][i] = -Y*S+Z*C; + } + i++; + } + } + } + + // Convergence Checking + + Z = W[k]; + if (l!=k) { + if (its>=ItnLimit) { + RetCode = k; + return; + } + its++; + X = W[l]; + Y = W[k1]; + G = RV1[k1]; + H = RV1[k]; + F = ((Y-Z)*(Y+Z) + (G-H)*(G+H)) / ( 2.0*H*Y ); + if (fabs(F)<=1.0) GG = Sign(sqrt(F*F+1.0),F); + else GG = F*sqrt(1.0+1.0/F/F); + F = ((X-Z)*(X+Z) + H*(Y/(F+GG)-H)) / X; + + // Next QR - Transformation + + C = 1.0; + S = 1.0; + for (i1=l;i1<=k1;i1++) { + i = i1+1; + G = RV1[i]; + Y = W[i]; + H = S*G; + G = C*G; + Z = SrX2Y2(F,H); + RV1[i1] = Z; + C = F/Z; + S = H/Z; + F = X*C+G*S; + G = -X*S+G*C; + H = Y*S; + Y = Y*C; + if (MatV) + for (j=1;j<=N;j++) { + X = V[j][i1]; + Z = V[j][i]; + V[j][i1] = X*C+Z*S; + V[j][i] = -X*S+Z*C; + } + + Z = SrX2Y2(F,H); + W[i1] = Z; + if (Z!=0.0) { + C = F/Z; + S = H/Z; + } + F = C*G+S*Y; + X = -S*G+C*Y; + if (MatU) + for (j=1;j<=M;j++) { + Y = U[j][i1]; + Z = U[j][i]; + U[j][i1] = Y*C+Z*S; + U[j][i] = -Y*S+Z*C; + } + + } + + RV1[l] = 0.0; + RV1[k] = F; + W[k] = X; + + } else if (Z<0.0) { + + W[k] = -Z; + if (MatV) + for (j=1;j<=N;j++) + V[j][k] = -V[j][k]; + } + + } while (l!=k); + + } + +} + +// ----------------------------------------------------- + +void OrderSVD ( int M, int N, rmatrix U, rmatrix V, + rvector W, Boolean MatU, Boolean MatV ) { + +int i,k,j; +realtype P; + + // External loop of the re-ordering + for (i=1;iP) { + k = j; + P = W[j]; + } + + if (k!=i) { + // Swapping the singular value + W[k] = W[i]; + W[i] = P; + // Swapping the U's columns ( if needed ) + if (MatU) + for (j=1;j<=M;j++) { + P = U[j][i]; + U[j][i] = U[j][k]; + U[j][k] = P; + } + // Swapping the V's columns ( if needed ) + if (MatV) + for (j=1;j<=N;j++) { + P = V[j][i]; + V[j][i] = V[j][k]; + V[j][k] = P; + } + } + + } + +} + + +/* + +#ifndef __STDIO_H +#include +#endif + +int main ( int argc, char ** argv, char ** env ) { +// Test Jacobi +matrix A,T,A1; +vector Eigen,Aik; +realtype SR; +int N,i,j,k,Signal; + + N = 4; + + GetMatrixMemory ( A,N,N,1,1 ); + GetMatrixMemory ( T,N,N,1,1 ); + GetMatrixMemory ( A1,N,N,1,1 ); + GetVectorMemory ( Eigen,N,1 ); + GetVectorMemory ( Aik ,N,1 ); + + k = 1; + for (i=1;i<=N;i++) + for (j=i;j<=N;j++) { + A[i][j] = k++; + A[i][j] *= 1000.0; + A[j][i] = A[i][j]; + } + + printf ( " INITIAL MATRIX:\n" ); + for (i=1;i<=N;i++) { + for (j=1;j<=N;j++) + printf ( " %10.4f",A[i][j] ); + printf ( "\n" ); + } + + Jacobi ( N,A,T,Eigen,Aik,Signal ); + + printf ( "\n EIGEN VALUES AND EIGEN VECTORS:\n" ); + for (i=1;i<=N;i++) { + printf ( " %10.4f ",Eigen[i] ); + for (j=1;j<=N;j++) + printf ( " %10.4f",T[j][i] ); + printf ( "\n" ); + } + printf ( "\n measure: " ); + for (i=1;i<=N;i++) { + SR = 0.0; + for (j=1;j<=N;j++) + SR += T[j][i]*T[j][i]; + printf ( " %10.4f",sqrt(SR) ); + } + printf ( "\n" ); + + for (i=1;i<=N;i++) + for (j=1;j<=N;j++) { + A1[i][j] = 0.0; + for (k=1;k<=N;k++) + A1[i][j] += T[i][k]*Eigen[k]*T[j][k]; + } + + printf ( "\n RESTORED INITIAL MATRIX:\n" ); + for (i=1;i<=N;i++) { + for (j=1;j<=N;j++) + printf ( " %10.4f",A1[j][i] ); + printf ( "\n" ); + } + + FreeMatrixMemory ( A,N,1,1 ); + FreeMatrixMemory ( T,N,1,1 ); + FreeMatrixMemory ( A1,N,1,1 ); + FreeVectorMemory ( Eigen,1 ); + FreeVectorMemory ( Aik ,1 ); + + +} + +*/ + diff --git a/mmdb/linalg_.h b/mmdb/linalg_.h new file mode 100755 index 0000000..9813ee3 --- /dev/null +++ b/mmdb/linalg_.h @@ -0,0 +1,233 @@ +// $Id: linalg_.h,v 1.21 2012/01/26 17:52:19 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 27.06.01 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : linalg_ +// ~~~~~~~~~ +// **** Project : MMDB ( MacroMolecular Data Base ) +// ~~~~~~~~~ +// +// (C) E.Krissinel 2000-2008 +// +// ================================================================= +// +// + +#ifndef __LinAlg__ +#define __LinAlg__ + +#ifndef __MatType__ +#include "mattype_.h" +#endif + + +// ========================== Jacobi ============================= + + +/// Diagonalization of symmetric matrices A[1..N][1..N] +/// by the method of Jacobi. +extern void Jacobi ( int N, //!< dimension of the matrix + rmatrix A, //!< matrix to diagonalize; the + /// lower triangle, except the + /// diagonal, will remain unchanged + rmatrix T, //!< eigenvectors placed as columns + rvector Eigen, //!< vector of eigenvalues, orderd + /// by increasing + rvector Aik, //!< working array + int & Signal //!< 0 <=> Ok, ItMax <=> iteration + /// limit exchausted. + ); + + +// A5.5.2 : Perturbed Cholesky Decomposition +extern void PbCholDecomp ( int N, + rvector HDiag, + realtype MaxOff, + realtype MachEps, + rmatrix L, + realtype & MaxAdd ); + +// A3.2.3a : Cholesky's L - Solution of +// L*Y = B ( given B ) +extern void LSolve ( int N, rmatrix L, rvector B, rvector Y ); + +// A3.2.3b : Cholesky's LT - Solution of +// LT*X = Y ( given Y ) +extern void LTSolve ( int N, rmatrix L, rvector Y, rvector X ); + +// A3.2.3 : Solution of the equation L*LT*S = G +// by the Cholesky's method +extern void ChSolve ( int N, rmatrix L, rvector G, rvector S ); + + +// ---------------------------------------------------- + +extern void FastInverse ( int N, rmatrix A, ivector J0, +//#D realtype & Det, + int & Signal ); +// +// 13.09.90 <-- Last Modification Date +// ------------------------ +// +// ================================================ +// +// Fast Inversion of the matrix A +// by the method of GAUSS - JORDAN . +// +// ------------------------------------------------ +// +// Input parameters are : +// +// N - dimension of the matrix +// A - the matrix [1..N][1..N] to be inverted. +// ------------------------------------------------ +// +// J0 - integer vector [1..N] for temporal storage +// +// ------------------------------------------------ +// +// Output parameters are : +// +// A - the inverted matrix +// Signal - the error key : +// = 0 <=> O'K +// else +// degeneration was found, and +// the rang of matrix is Signal-1. +// +// Variable Det may return the determinant +// of matrix A. To obtain it, remove all comments +// of form //#D. +// +// ================================================ + + +// ---------------------------------------------------- + + +void SVD ( int NA, int M, int N, + rmatrix A, rmatrix U, rmatrix V, + rvector W, rvector RV1, + Boolean MatU, Boolean MatV, + int & RetCode ); +// +// 13.12.01 <-- Last Modification Date +// ------------------------ +// +// ================================================ +// +// The Singular Value Decomposition +// of the matrix A by the algorithm from +// G.Forsait, M.Malkolm, K.Mouler. Numerical +// methods of mathematical calculations // +// M., Mir, 1980. +// +// Matrix A is represented as +// +// A = U * W * VT +// +// ------------------------------------------------ +// +// All dimensions are indexed from 1 on. +// +// ------------------------------------------------ +// +// Input parameters: +// +// NA - number of lines in A. NA may be +// equal to M or N only. If NA=M +// then usual SVD will be made. If MA=N +// then matrix A is transposed before +// the decomposition, and the meaning of +// output parameters U and V is +// swapped (U accepts VT and VT accepts U). +// In other words, matrix A has physical +// dimension of M x N , same as U and V; +// however the logical dimension of it +// remains that of N x M . +// M - number of lines in U +// N - number of columns in U,V and length +// of W,RV1 . Always provide M >= N ! +// A - matrix [1..M][1..N] or [1..N][1..M] +// to be decomposed. The matrix does not +// change, and it may coincide with U or +// V, if NA=M (in which case A does change) +// MatU - compute U , if set True +// MatV - compute V , if set True +// RV1 - temporary array [1..N]. +// U - should be always supplied as an array of +// [1..M][1..N], M>=N . +// V - should be suuplied as an array of +// [1..N][1..N] if MatV is True . +// +// ------------------------------------------------ +// +// Output parameters are : +// +// W - N non-ordered singular values, +// if RetCode=0. If RetCode<>0, the +// RetCode+1 ... N -th values are still +// valid +// U - matrix of right singular vectors +// (arranged in columns), corresponding +// to the singular values in W, if +// RetCode=0 and MatU is True. If MatU +// is False, U is still used as a +// temporary array. If RetCode<>0 then +// the RetCode+1 ... N -th vectors +// are valid +// V - matrix of left singular vectors +// (arranged in columns), corresponding +// to the singular values in W, if +// RetCode=0 and MatV is True. If MatV +// is False, V is not used and may be set +// to NULL. If RetCode<>0 then the +// RetCode+1 ... N -th vectors are valid +// RetCode - the error key : +// = 0 <=> O'K +// else +// = k, if the k-th singular value +// was not computed after 30 iterations. +// +// ------------------------------------------------ +// +// Key Variables are : +// +// ItnLimit - the limit for iterations +// +// This routine does not use any machine-dependent +// constants. +// +// ================================================ +// +// + +void OrderSVD ( int M, int N, rmatrix U, rmatrix V, + rvector W, Boolean MatU, Boolean MatV ); + + +#endif diff --git a/mmdb/machine_.cpp b/mmdb/machine_.cpp new file mode 100755 index 0000000..0e3e55b --- /dev/null +++ b/mmdb/machine_.cpp @@ -0,0 +1,148 @@ +// $Id: machine_.cpp,v 1.21 2012/01/26 17:52:19 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 08.07.08 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : machine_ +// ~~~~~~~~~ +// **** Functions : GetMachineID - returns ID code for the machine +// ~~~~~~~~~~~ GetMachineName - returns name of a machine +// +// (C) E. Krissinel 2000-2008 +// +// ================================================================= +// + +#ifndef __Machine__ +#include "machine_.h" +#endif + + +#ifdef CALL_LIKE_SUN + +int GetMachineID() { +int k = CALL_LIKE_SUN; + switch (k) { + case 1 : return MACHINE_ALLIANT; + case 2 : return MACHINE_CONVEX; + case 3 : return MACHINE_ESV; + case 4 : return MACHINE_SGI; + case 5 : return MACHINE_SOLBOURNE; + case 6 : return MACHINE_SOLARIS; + case 7 : return MACHINE_ALPHA; + case 8 : return MACHINE_F2C_G77; + case 9 : return MACHINE_LINUX; + default : return MACHINE_UNKNOWN; + } +} + +#elif defined(CALL_LIKE_HPUX) + +int GetMachineID() { +int k = CALL_LIKE_HPUX; + switch (k) { + case 1 : return MACHINE_RS6000; + case 2 : return MACHINE_HP9000; + default : return MACHINE_UNKNOWN; + } +} + +#elif defined(CALL_LIKE_STARDENT) + +int GetMachineID() { +int k = CALL_LIKE_STARDENT; + switch (k) { + case 1 : return MACHINE_ARDENT; + case 2 : return MACHINE_TITAN; + case 3 : return MACHINE_STARDENT; + default : return MACHINE_UNKNOWN; + } +} + +#elif defined(CALL_LIKE_VMS) + +int GetMachineID() { + return MACHINE_VMS; +} + +#elif defined(CALL_LIKE_MVS) + +int GetMachineID() { + return MACHINE_MVS; +} + +#else + +int GetMachineID() { + return MACHINE_UNKNOWN; +} + +#endif + +static cpstr MCH_SGI = cpstr("Silicon Graphics"); +static cpstr MCH_RS6000 = cpstr("IBM RS/6000"); +static cpstr MCH_ALLIANT = cpstr("Alliant"); +static cpstr MCH_ARDENT = cpstr("Ardent"); +static cpstr MCH_TITAN = cpstr("Titan"); +static cpstr MCH_STARDENT = cpstr("Stardent"); +static cpstr MCH_CONVEX = cpstr("Convex"); +static cpstr MCH_ESV = cpstr("Evans or Sutherland"); +static cpstr MCH_HP9000 = cpstr("Hewlett Packard 9000"); +static cpstr MCH_SOLBOURNE = cpstr("Solbourne"); +static cpstr MCH_SOLARIS = cpstr("Solaris"); +static cpstr MCH_ALPHA = cpstr("DEC Alpha"); +static cpstr MCH_VMS = cpstr("A VMS machine"); +static cpstr MCH_MVS = cpstr("MS Windows"); +static cpstr MCH_F2C_G77 = cpstr("SUN compatible"); +static cpstr MCH_LINUX = cpstr("Linux"); + +cpstr GetMachineName ( int MachineID ) { + switch (MachineID) { + case MACHINE_SGI : return MCH_SGI; + case MACHINE_RS6000 : return MCH_RS6000; + case MACHINE_ALLIANT : return MCH_ALLIANT; + case MACHINE_ARDENT : return MCH_ARDENT; + case MACHINE_TITAN : return MCH_TITAN; + case MACHINE_STARDENT : return MCH_STARDENT; + case MACHINE_CONVEX : return MCH_CONVEX; + case MACHINE_ESV : return MCH_ESV; + case MACHINE_HP9000 : return MCH_HP9000; + case MACHINE_SOLBOURNE : return MCH_SOLBOURNE; + case MACHINE_SOLARIS : return MCH_SOLARIS; + case MACHINE_ALPHA : return MCH_ALPHA; + case MACHINE_VMS : return MCH_VMS; + case MACHINE_MVS : return MCH_MVS; + case MACHINE_F2C_G77 : return MCH_F2C_G77; + case MACHINE_LINUX : return MCH_LINUX; + default : + case MACHINE_UNKNOWN : return pstr("Unidentified machine"); + } +} + +cpstr GetMachineName() { + return GetMachineName ( GetMachineID() ); +} + diff --git a/mmdb/machine_.h b/mmdb/machine_.h new file mode 100755 index 0000000..e7f812b --- /dev/null +++ b/mmdb/machine_.h @@ -0,0 +1,470 @@ +// $Id: machine_.h,v 1.31 2012/01/26 17:52:19 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 08.07.08 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : machine_ +// ~~~~~~~~~ +// **** Functions : GetMachineID - returns ID code for the machine +// ~~~~~~~~~~~ GetMachineName - returns name of a machine +// +// (C) E. Krissinel 2000-2008 +// +// ================================================================= +// + +#ifndef __Machine__ +#define __Machine__ + +#ifndef __MatType__ +#include "mattype_.h" +#endif + +/* +// Programs written in plain C, should define __PlainC each time +// this header is invoked. + +#ifdef __PlainC +# undef __CPlusPlus +#else +# define __CPlusPlus +#endif +*/ + + +// ================== List of known machines ======================== + +#define MACHINE_SGI 1 +#define MACHINE_RS6000 2 +#define MACHINE_ALLIANT 3 +#define MACHINE_ARDENT 4 +#define MACHINE_TITAN 5 +#define MACHINE_STARDENT 6 +#define MACHINE_CONVEX 7 +#define MACHINE_ESV 8 +#define MACHINE_HP9000 9 +#define MACHINE_SOLBOURNE 10 +#define MACHINE_SOLARIS 11 +#define MACHINE_ALPHA 12 +#define MACHINE_VMS 13 +#define MACHINE_MVS 14 +#define MACHINE_F2C_G77 15 +#define MACHINE_LINUX 16 +#define MACHINE_UNKNOWN 100 + + +// ================ Identification of the machine =================== + +// IBM Unix RS/6000 +#if defined(_AIX) || defined(___AIX) +# define CALL_LIKE_HPUX 1 + +// Alliant +#elif defined(alliant) +# define CALL_LIKE_SUN 1 + +// Ardent, Stardent/Titan +#elif defined(ardent) +# define CALL_LIKE_STARDENT 1 +#elif defined(titan) +# define CALL_LIKE_STARDENT 2 +#elif defined(stardent) +# define CALL_LIKE_STARDENT 3 + +// Convex +#elif defined(__convex__) || defined(__convexc__) +# define CALL_LIKE_SUN 2 + +// Evans and Sutherland +#elif defined(ESV) +# define CALL_LIKE_SUN 3 + +// Hewlett Packard 9000/750 (RISC) models +#elif defined(__hpux) +# define CALL_LIKE_HPUX 2 + +// Silicon Graphics IRIX systems, Iris'es, Indigo's, Crimson's etc. +#elif defined(__sgi) || defined(sgi) +# define CALL_LIKE_SUN 4 + +// Solbourne's are Sun clones. +#elif defined(solbourne) +# define CALL_LIKE_SUN 5 + +// Solaris 1 and 2 +#elif defined(sun) || defined(__sun) +# define CALL_LIKE_SUN 6 + +// DEC, OSF/1, Alpha and Ultrix +#elif defined(ultrix) || defined(__OSF1__) || defined(__osf__) +# define CALL_LIKE_SUN 7 + +// VMS +#elif defined(vms) || defined(__vms) || defined(__VMS) +# define CALL_LIKE_VMS 1 + +// MVS stands for Microsoft Visual Studio +#elif defined(_MVS) +# define CALL_LIKE_MVS 1 + +#elif defined(F2C) || defined(G77) +# define CALL_LIKE_SUN 8 + +#elif defined(linux) +# define CALL_LIKE_SUN 9 + +#else +//# error System type is not known -- see the Installation Guide +# define CALL_LIKE_SUN 100 + +#endif + + + +// ================= Machine-dependent definitions ================== + +#ifdef CALL_LIKE_STARDENT + // SStrParam is used in Ardent-like machines' fortran calls + // for passing a string parameter + DefineStructure(SStrPar) + struct SStrPar { + pstr S; + int len; + int id; + }; +#endif + + +// +// Macro FORTRAN_SUBR(NAME,name,p_send,p_sstruct,p_sflw) +// makes function header statements that allow for linking with +// programs written in FORTRAN. +// +// Parameters: +// +// NAME name of the FORTRAN subroutine in capital letters +// name name of the FORTRAN subroutine in small letters +// p_send parameter list (in brackets) with string lengths +// attached to the end of it (see below) +// p_sstruct parameter list (in brackets) with strings passed +// as complex parameters, or structures +// p_sflw parameter list (in brackets) with string lengths +// following immediately the string parameters +// (see below) +// +// All non-string parameters must be passed as pointers, in +// the same order as they enter the FORTRAN call. Rules for +// the string parameters are as follows. +// +// 1. All strings should be specified as of 'fpstr' type. +// The 'fpstr' type is defined below and depends on the +// platform: +// +// a) whenever length of string is passed as a separate +// parameter ( CALL_LIKE_SUN, CALL_LIKE_HPUX, +// CALL_LIKE_MVS ) 'fpstr' is identical to 'pstr'. +// You may choose arbitrary name for the string, +// but you MUST use the same name, appended with +// suffix '_len', for its length (see example below). +// +// b) whenever string and its length are passed as +// complex parameter, 'fpstr' is identical to the +// pointer on the corresponding structure: +// CALL_LIKE_STARDENT : +// 'fpstr' is identical to 'PSStrPar' +// CALL_LIKE_VMS : +// 'fpstr' is identical to 'dsc$descriptor_s *' +// +// With 'fpstr' type, two important macro definition come: +// +// i) FTN_STR(s) - returns pointer to fortran-passed +// string s. This pointer is always +// of 'pstr' type +// ii) FTN_LEN(s) - returns integer length of fortran- +// passed string s. For this macro to +// work properly with SUN- and MVS-like +// machines, always use suffix '_len' +// for the string length parameters as +// described in a) above. +// +// 2. Three parameter lists, each enclosed in brackets, should +// be given. These lists retain the general order of +// parameters in the corresponding fortran call. Non-string +// parameters are passed as pointers. String parameters +// and their lengths are passed differently in different +// lists: +// +// p_send strings enter their place in the list as in +// the corresponding FORTRAN call, having 'fpstr' +// parameter type. Their lengths are appended as +// 'int' to the end of the list. They should +// retain the order in which the strings appear +// in the list. +// +// p_sstruct strings enter their place in the list as in +// the corresponding FORTRAN call, having 'fpstr' +// parameter type. +// +// p_sflw strings enter their place in the list as in +// the corresponding FORTRAN call, having 'fpstr' +// type and being immediately followed by their +// lengths as 'int' parameters. +// +// +// +// Example: +// +// FORTRAN statement +// +// subroutine SomeSub ( k,s1,a,s2,m ) +// integer k,m +// real a +// character*(*) s1,s2 +// +// is translated to +// +// FORTRAN_SUBR ( SOMESUB, somesub, +// ( int * k, fpstr s1, float * a, fpstr s2, int * m, +// int s1_len, int s2_len ), +// ( int * k, fpstr s1, float * a, fpstr s2, int * m ), +// ( int * k, fpstr s1, int s1_len, float * a, +// fpstr s2, int s2_len, int * m ) ) +// +// +// The macro should replace ordinary function header +// statements to assure compatibility with FORTRAN links. +// In header files, do not forget to add semicolumn: +// +// FORTRAN_SUBR ( .... ); +// +// while in source files use simply +// +// FORTRAN_SUBR ( .... ) { +// +// } +// +// +// +// Macro FORTRAN_CALL(NAME,name,p_send,p_sstruct,p_sflw) +// calls function defined with macro FORTRAN_SUBR(...), from +// a C/C++ application. Its parameters and their meaning are +// exactly identical to those of FORTRAN_SUBR(...). +// FORTRAN_CALL(...) should be followed by semicolon. +// + + +// **** type of real numbers in the API functions +// comment or uncomment the proper string + +typedef float apireal; // FORTRAN real*4 +/* +typedef double apireal; // FORTRAN real*8 +*/ + + +#if defined(CALL_LIKE_SUN) + + typedef pstr fpstr; + +# define FTN_STR(s) s +# define FTN_LEN(s) s##_len + +# define char_struct(s) \ + pstr s; \ + int s##_len; +# define fill_char_struct(s,str) \ + s = str; \ + s##_len = strlen(str); + +# ifdef __cplusplus +# define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ + extern "C" void name##_ p_sun +# else +# define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ + void name##_ p_sun +# endif + +# define FORTRAN_EXTERN(NAME,name,p_sun,p_stardent,p_mvs) \ + extern "C" void name##_ p_sun + +# define FORTRAN_CALL(NAME,name,p_sun,p_stardent,p_mvs) \ + name##_ p_sun + +# elif defined(CALL_LIKE_HPUX) + + typedef pstr fpstr; + +# define FTN_STR(s) s +# define FTN_LEN(s) s##_len + +# define char_struct(s) \ + pstr s; \ + int s##_len; +# define fill_char_struct(s,str) \ + s = str; \ + s##_len = strlen(str); + +# ifdef __cplusplus +# define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ + extern "C" void name p_sun +# else +# define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ + void name p_sun +# endif + +# define FORTRAN_EXTERN(NAME,name,p_sun,p_stardent,p_mvs) \ + extern "C" void name p_sun + +# define FORTRAN_CALL(NAME,name,p_sun,p_stardent,p_mvs) \ + name p_sun + +#elif defined(CALL_LIKE_STARDENT) + + typedef PStrPar fpstr; + +# define FTN_STR(s) s->S +# define FTN_LEN(s) s->len + +# define char_struct(s) \ + SStrPar s; +# define fill_char_struct(s,str) \ + s.S = str; \ + s.len = strlen(FName); \ + s.id = 0; + +# ifdef __cplusplus +# define FORTRAN_SUBR(NAME,name,p_send,p_sstruct,p_sflw) \ + extern "C" void NAME p_stardent +# else +# define FORTRAN_SUBR(NAME,name,p_send,p_sstruct,p_sflw) \ + void NAME p_stardent +# endif + +# define FORTRAN_EXTERN(NAME,name,p_sun,p_stardent,p_mvs) \ + extern "C" void NAME p_stardent + +# define FORTRAN_CALL(NAME,name,p_send,p_sstruct,p_sflw) \ + NAME p_stardent + +#elif defined(CALL_LIKE_VMS) + + typedef dsc$descriptor_s * fpstr; + +# define FTN_STR(s) s->dsc$a_pointer; +# define FTN_LEN(s) s->dsc$w_length; + +# define character(s) \ + dsc$descriptor_s s; +# define fill_char_struct(s,str) \ + s.dsc$a_pointer = str; \ + s.dsc$w_length = strlen(str); \ + s.dsc$b_dtype = DSC$K_DTYPE_T; \ + s.dsc$b_class = DSC$K_CLASS_S; + +# ifdef __cplusplus +# define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ + extern "C" void NAME p_stardent +# else +# define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ + void NAME p_stardent +# endif + +# define FORTRAN_EXTERN(NAME,name,p_sun,p_stardent,p_mvs) \ + extern "C" void NAME p_stardent + +# define FORTRAN_CALL(NAME,name,p_sun,p_stardent,p_mvs) \ + NAME p_stardent + +#elif defined(CALL_LIKE_MVS) + + typedef pstr fpstr; + +# define FTN_STR(s) s +# define FTN_LEN(s) s##_len + +# define char_struct(s) \ + pstr s; \ + int s##_len; +# define fill_char_struct(s,str) \ + s = str; \ + s##_len = strlen(str); + +# ifdef __cplusplus +# define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ + extern "C" void __stdcall NAME p_mvs +# else +# define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ + void __stdcall NAME p_mvs +# endif + +# define FORTRAN_EXTERN(NAME,name,p_sun,p_stardent,p_mvs) \ + extern "C" void NAME p_mvs + +# define FORTRAN_CALL(NAME,name,p_sun,p_stardent,p_mvs) \ + NAME p_mvs + +#else + +# error Unknown machine!!! + + typedef pstr fpstr; + +# define FTN_STR(s) s +# define FTN_LEN(s) s##_len + +# define char_struct(s) \ + pstr s; \ + int s##_len; +# define fill_char_struct(s,str) \ + s = str; \ + s##_len = strlen(str); + +# ifdef __cplusplus +# define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ + extern "C" void name##_ p_sun +# else +# define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ + void name##_ p_sun +# endif + +# define FORTRAN_EXTERN(NAME,name,p_sun,p_stardent,p_mvs) \ + extern "C" void name##_ p_sun + +# define FORTRAN_CALL(NAME,name,p_sun,p_stardent,p_mvs) \ + name##_ p_sun + +#endif + + + +// ================ Machine-dependent functions ================= + +extern int GetMachineID (); +extern cpstr GetMachineName (); +extern cpstr GetMachineName ( int MachineID ); + + +#endif diff --git a/mmdb/math_.cpp b/mmdb/math_.cpp new file mode 100755 index 0000000..35e7fa2 --- /dev/null +++ b/mmdb/math_.cpp @@ -0,0 +1,199 @@ +// $Id: math_.cpp,v 1.20 2012/01/26 17:52:19 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 10.04.03 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : Math_ +// ~~~~~~~~~ +// **** Functions : GetTorsion +// ~~~~~~~~~~~ GetAngle +// +// (C) E. Krissinel 2000-2008 +// +// ================================================================= +// + +#ifndef __MATH_H +#include +#endif + +#ifndef __Math__ +#include "math_.h" +#endif + +// ------------------------------------------------------------------ + +realtype GetTorsion ( rvector U, rvector W, rvector V ) { +// U W V +// o<----o----->o----->o +// +realtype A[3],B[3],C[3],Wmag,S,T; + + A[0] = U[1]*W[2] - W[1]*U[2]; + A[1] = U[2]*W[0] - W[2]*U[0]; + A[2] = U[0]*W[1] - W[0]*U[1]; + + B[0] = V[1]*W[2] - W[1]*V[2]; + B[1] = V[2]*W[0] - W[2]*V[0]; + B[2] = V[0]*W[1] - W[0]*V[1]; + + C[0] = A[1]*B[2] - B[1]*A[2]; + C[1] = A[2]*B[0] - B[2]*A[0]; + C[2] = A[0]*B[1] - B[0]*A[1]; + + Wmag = sqrt(W[0]*W[0]+W[1]*W[1]+W[2]*W[2]); + + S = C[0]*W[0] + C[1]*W[1] + C[2]*W[2]; + T = A[0]*B[0] + A[1]*B[1] + A[2]*B[2]; + T *= Wmag; + + if ((S==0.0) && (T==0.0)) return NO_TORSION; + else return atan2(S,T); + +} + + +realtype GetAngle ( rvector v1, rvector v2 ) { +realtype l1,l2; + + l1 = v1[0]*v1[0] + v1[1]*v1[1] + v1[2]*v1[2]; + if (l1==0.0) l1 = 1.0; + l2 = v2[0]*v2[0] + v2[1]*v2[1] + v2[2]*v2[2]; + if (l2==0.0) l2 = 1.0; + + return acos((v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2])/sqrt(l1*l2)); + +} + + +#define nCombMax 500 + +realtype Combinations ( int n, int m ) { +// 0<=n<=nCombMax, 0<=m<=n +realtype P[nCombMax+1]; +int i,j; + if ((m<0) || (m>n)) return 0.0; + if ((m==0) || (m==n)) return 1.0; + if ((m==1) || (m==n-1)) return realtype(n); + P[0] = 1.0; + P[1] = 3.0; + P[2] = 3.0; + P[3] = 1.0; + for (i=4;i<=n;i++) { + P[i] = 1.0; + for (j=i-1;j>0;j--) + P[j] += P[j-1]; + } + return P[m]; +} + +realtype log1mx ( realtype x ) { +// Calculates precisely log(1-x) for x<1, including +// very small x +realtype z,z1,z2,n; + + if (x>=1.0-10.0*MachEps) z = -MaxReal; + else if (fabs(x)>1.0e-8) z = log(1.0-x); + else { + z1 = x; + z = 0.0; + n = 1.0; + do { + z2 = z; + z -= z1/n; + z1 *= x; + n += 1.0; + } while (z!=z2); + } + + return z; + +} + +realtype expc ( realtype x ) { +// Calculates precisely 1 - exp(x) for any x including +// very small values +realtype z,z1,z2,n; + + if (x>LnMaxReal) z = -MaxReal; + else if (x<-LnMaxReal) z = 1.0; + else if (fabs(x)>1.0e-8) z = 1.0 - Exp(x); + else { + z1 = x; + z = x; + n = 1.0; + do { + z2 = z; + n += 1.0; + z1 *= x/n; + z += z1; + } while (z!=z2); + z = -z; + } + + return z; + +} + + +realtype expc1mx ( realtype x, realtype y ) { +// Calculates precisely 1-(1-x)**y including very small x and +// very large y +realtype z,z1,z2,n,s; + + // Calculate (1-x)**y as exp(y*log(1-x)). Get log(1-x) first: + if (x>1.0e-8) z = log(1.0-x); + else { + z1 = x; + z = 0.0; + n = 1.0; + do { + z2 = z; + z -= z1/n; + z1 *= x; + n += 1.0; + } while (z!=z2); + } + + // Now calculate 1 - exp(y*log(1-x)) : + z *= y; + if (fabs(z)>1.0e-8) s = 1.0 - exp(z); + else { + z1 = z; + s = z; + n = 1.0; + do { + z2 = s; + n += 1.0; + z1 *= z/n; + s += z1; + } while (s!=z2); + s = -s; + } + + return s; + +} diff --git a/mmdb/math_.h b/mmdb/math_.h new file mode 100755 index 0000000..9c68241 --- /dev/null +++ b/mmdb/math_.h @@ -0,0 +1,73 @@ +// $Id: math_.h,v 1.20 2012/01/26 17:52:19 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 09.04.03 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : Math_ +// ~~~~~~~~~ +// **** Functions : GetTorsion +// ~~~~~~~~~~~ GetAngle +// +// (C) E. Krissinel 2000-2008 +// +// ================================================================= +// + + +#ifndef __Math__ +#define __Math__ + +#ifndef __MatType__ +#include "mattype_.h" +#endif + + +// ------------------------------------------------------------------ + +#define NO_TORSION (-MaxReal) +// U[0,1,2] = x,y,z +extern realtype GetTorsion ( rvector U, rvector W, rvector V ); +extern realtype GetAngle ( rvector U, rvector V ); + +// Calculates the binomial coefficient n choose m, 0<=n<=500, 0<=m<=n +extern realtype Combinations ( int n, int m ); + +// Calculates precisely log(1-x) for x<1, including very small x +extern realtype log1mx ( realtype x ); + +// Calculates precisely 1 - exp(x) for any x including very small values +extern realtype expc ( realtype x ); + +inline double exp10 ( double x ) { return exp(x*ln10); } + +// Calculates precisely 1-(1-x)**y including very small x and very large y +extern realtype expc1mx ( realtype x, realtype y ); + + + +#endif + + diff --git a/mmdb/mattype_.cpp b/mmdb/mattype_.cpp new file mode 100755 index 0000000..c3fb873 --- /dev/null +++ b/mmdb/mattype_.cpp @@ -0,0 +1,2116 @@ +// $Id: mattype_.cpp,v 1.30 2012/01/26 17:52:19 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 29.01.10 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : MatType_ +// ~~~~~~~~~ +// +// (C) E. Krissinel 2000-2010 +// +// ================================================================= +// + + +#ifndef __STDLIB_H +#include +#endif + +#ifndef __STRING_H +#include +#endif + +#ifndef __CTYPE_H +#include +#endif + +#ifndef __MatType__ +#include "mattype_.h" +#endif + +#include +#include + +// ------------------------------------------------------- + +realtype MachEps; +realtype floatMachEps; +realtype LnMaxReal; +realtype LnMinReal; +static realtype LnMaxRealExp; +static realtype LnMinRealExp; + +// Initialization. Some C++ enviroments do not do the +// following statements automatically, therefore it is +// always advisable to call InitMatType() explicitely +// from the top of main(). See body of InitMatType() +// in the very end of this file. It is completely +// harmless and cheap to call InitMatType() multiple +// times. + +static Boolean MatTypeInit = InitMatType(); + + +// ------------------------------------------------------- + +/* +int mround ( realtype X ) { + return (int)floor(X+0.5); +} + +int ifloor ( realtype X ) { + return (int)floor(X); +} + +int Abs ( int x ) { + return ( x >= 0 ? x : -x ); +} +*/ + +#ifdef _WIN32 +pstr strcasestr ( pstr s1, cpstr s2 ) { +pstr l1,l2,l; + l1 = NULL; + l2 = NULL; + CreateCopy ( l1,s1 ); + CreateCopy ( l2,s2 ); + LowerCase ( l1 ); + LowerCase ( l2 ); + l = strstr ( l1,l2 ); + if (l) + l = s1 + (l-l1); + delete[] l1; + delete[] l2; + return l; +} +#endif + +// ------------------------------------------------------- + +/* +void ISwap ( int & x, int & y ) { +int b; + b = x; x = y; y = b; +} +void WSwap ( word & x, word & y ) { +word b; + b = x; x = y; y = b; +} +void BSwap ( byte & x, byte & y ) { +byte b; + b = x; x = y; y = b; +} +void LSwap ( long & x, long & y ) { +long b; + b = x; x = y; y = b; +} +void RSwap ( realtype & x, realtype & y ) { +realtype b; + b = x; x = y; y = b; +} +*/ + +// ------------------------------------------------------- +/* +realtype RMax ( const realtype x1, const realtype x2 ) +{ return ( x1 > x2 ? x1 : x2 ); } + +long LMax ( const long x1, const long x2 ) +{ return ( x1 > x2 ? x1 : x2 ); } + +word WMax ( const word x1, const word x2 ) +{ return ( x1 > x2 ? x1 : x2 ); } + +int IMax ( const int x1, const int x2 ) +{ return ( x1 > x2 ? x1 : x2 ); } + +realtype RMin ( const realtype x1, const realtype x2 ) +{ return ( x1 < x2 ? x1 : x2 ); } + +long LMin ( const long x1, const long x2 ) +{ return ( x1 < x2 ? x1 : x2 ); } + +word WMin ( const word x1, const word x2 ) +{ return ( x1 < x2 ? x1 : x2 ); } + +int IMin ( const int x1, const int x2 ) +{ return ( x1 < x2 ? x1 : x2 ); } +*/ + +// ------------------------------------------------------- +/* +realtype fsign ( const realtype x1, const realtype x2 ) { +realtype ax; + if (x1>=0.0) ax = x1; + else ax = -x1; + return ( x2 >= 0.0 ? ax : -ax ); +} +*/ + +// ------------------------------------------------------- +Boolean GetVectorMemory ( rvector & V, word N, word Shift ) { + V = new realtype[N]; + if (V!=NULL) V = V - Shift; // shift for abovementioned enumeration + return (V!=NULL); +} + +Boolean GetVectorMemory ( ivector & I, word N, word Shift ) { + I = new int[N]; + if (I!=NULL) I = I - Shift; // shift for abovementioned enumeration + return (I!=NULL); +} + +Boolean GetVectorMemory ( wvector & W, word N, word Shift ) { + W = new word[N]; + if (W!=NULL) W = W - Shift; // shift for abovementioned enumeration + return (W!=NULL); +} + +Boolean GetVectorMemory ( bvector & B, word N, word Shift ) { + B = new byte[N]; + if (B!=NULL) B = B - Shift; // shift for abovementioned enumeration + return (B!=NULL); +} + +Boolean GetVectorMemory ( lvector & L, word N, word Shift ) { + L = new long[N]; + if (L!=NULL) L = L - Shift; // shift for abovementioned enumeration + return (L!=NULL); +} + +Boolean GetVectorMemory ( lwvector & L, word N, word Shift ) { + L = new lword[N]; + if (L!=NULL) L = L - Shift; // shift for abovementioned enumeration + return (L!=NULL); +} + +Boolean GetVectorMemory ( psvector & P, word N, word Shift ) { + P = new pstr[N]; + if (P!=NULL) P = P - Shift; // shift for abovementioned enumeration + return (P!=NULL); +} + +void FreeVectorMemory ( rvector & V, word Shift ) { + if (V!=NULL) { + V = V + Shift; // back shift for the work of heap system + delete[] V; + V = NULL; + } +} + +void FreeVectorMemory ( ivector & I, word Shift ) { + if (I!=NULL) { + I = I + Shift; // back shift for the work of heap system + delete[] I; + I = NULL; + } +} + +void FreeVectorMemory ( wvector & W, word Shift ) { + if (W!=NULL) { + W = W + Shift; // back shift for the work of heap system + delete[] W; + W = NULL; + } +} + +void FreeVectorMemory ( bvector & B, word Shift ) { + if (B!=NULL) { + B = B + Shift; // back shift for the work of heap system + delete[] B; + B = NULL; + } +} + +void FreeVectorMemory ( lvector & L, word Shift ) { + if (L!=NULL) { + L = L + Shift; // back shift for the work of heap system + delete[] L; + L = NULL; + } +} + +void FreeVectorMemory ( lwvector & L, word Shift ) { + if (L!=NULL) { + L = L + Shift; // back shift for the work of heap system + delete[] L; + L = NULL; + } +} + +void FreeVectorMemory ( psvector & P, word Shift ) { + if (P!=NULL) { + P = P + Shift; // back shift for the work of heap system + delete[] P; + P = NULL; + } +} + +Boolean GetMatrixMemory ( rmatrix & A, word N, word M, + word ShiftN, word ShiftM ) { + A = new rvector[N]; + if (A!=NULL) { + for (word i=0;i::epsilon(); +} + +realtype floatMachinEps() { +// A1.3.1 : Calculation of the machine's epsilon +/* +float fMachEps = 1.0; + do + fMachEps /= 2.0; + while (float(1.0+fMachEps)!=1.0); + return 2.0*fMachEps; +*/ + return std::numeric_limits::epsilon(); +} + +realtype frac ( realtype R ) { +realtype i; + return modf ( R,&i ); +} + +long mod ( long x, long y ) { +long k=x/y; +long f=x-k*y; + while (f<0) f += y; + return f; +} + +realtype Pow ( realtype X, int y ) { +int m,l; +realtype B; + if (y==0) return 1.0; + else if (X!=0.0) { + B = X; + m = 1; + if (y>=0) l = y; + else l = -y; + while (m++=0) return B; + else return 1.0/B; + } else return 0.0; +} + +realtype Pow1 ( realtype X, realtype Y ) { +int k = mround(Y); + if (fabs(k-Y)<=100.0*MachEps) return Pow(X,k); + if (X==0.0) return 0.0; + else return pow(X,Y); +} + +realtype Exp ( realtype X ) { +//realtype X1 = X; +//realtype B = 1.0; + if (X>=LnMaxRealExp) return MaxReal; + else if (X<=LnMinRealExp) return 0.0; + else { + return exp(X); + /* + while (X1>LnMaxReal) { + X1 -= LnMaxReal; + B *= MaxExponent; + } + while (X1<-LnMaxReal) { + X1 += LnMaxReal; + B /= MaxExponent; + } + return B*exp(X1); + */ + } +} + +Boolean Odd ( int i ) { + return (i & 1); +} + + +// ---------------------------------------------------- + +long HexValL ( cpstr S ) { +char C; +int i; +long z=0; + for (i=0;S[i];i++) { + z <<= 4; + C = (char)toupper(S[i]); + if (isdigit(C)) z += S[i]-'0'; + else z += C-'A'+10; + } + return z; +} + + +// ---------------------------------------------------- + +long OctValL ( cpstr S ) { +int i; +long z=0; + for (i=0;S[i];i++) { + z <<= 3; + z += S[i]-'0'; + } + return z; +} + + +// ---------------------------------------------------- + +long BinValL ( cpstr S ) { +int i; +long z=0; + for (i=0;S[i];i++) { + z <<= 1; + z += S[i]-'0'; + } + return z; +} + +pstr BinValS ( long L, pstr S ) { +int i; +long z; + z = long(1) << (8*sizeof(long)-1); + for (i=0;i<8*(int)sizeof(long);i++) { + if (L & z) S[i] = '1'; + else S[i] = '0'; + z >>= 1; + } + S[8*sizeof(long)] = char(0); + return S; +} + + + +// ---------------------------------------------------- + +pstr ParamStr ( pstr D, cpstr S, realtype V, int M, cpstr S1 ) { +char VS[30]; + strcat ( D,S ); + sprintf ( VS,"%-.*g",M,V ); + strcat ( D,VS ); + return strcat(D,S1); +} + + +pstr ParamStr ( pstr D, cpstr S, realtype V, int M, + cpstr S1, realtype V2, int M2, cpstr S2 ) { +char VS[30]; + ParamStr ( D,S,V,M,S1 ); + sprintf ( VS,"%-.*g",M2,V2 ); + strcat ( D,VS ); + return strcat(D,S2); +} + + +pstr CreateCopy ( pstr & Dest, cpstr Source ) { + if (Dest) delete[] Dest; + if (Source) { + Dest = new char[strlen(Source)+1]; + strcpy ( Dest,Source ); + } else + Dest = NULL; + return Dest; +} + +pstr CreateCopy_n ( pstr & Dest, cpstr Source, int n ) { +int l; + if (Dest) delete[] Dest; + if (Source) { + l = IMin ( strlen(Source),n ); + Dest = new char[l+1]; + strncpy ( Dest,Source,l ); + Dest[l] = char(0); + } else + Dest = NULL; + return Dest; +} + +pstr CreateCopCat ( pstr & Dest, + cpstr Source1, cpstr Source2, + cpstr Source3, cpstr Source4, + cpstr Source5 ) { + if (Dest) { + delete[] Dest; + Dest = NULL; + } + return CreateConcat ( Dest,Source1,Source2,Source3,Source4,Source5 ); +} + +pstr CreateCopCat ( pstr & Dest, + cpstr Source1, cpstr Source2, + cpstr Source3, cpstr Source4 ) { + if (Dest) { + delete[] Dest; + Dest = NULL; + } + return CreateConcat ( Dest,Source1,Source2,Source3,Source4 ); +} + +pstr CreateCopCat ( pstr & Dest, + cpstr Source1, cpstr Source2, + cpstr Source3 ) { + if (Dest) { + delete[] Dest; + Dest = NULL; + } + return CreateConcat ( Dest,Source1,Source2,Source3 ); +} + +pstr CreateCopCat ( pstr & Dest, + cpstr Source1, cpstr Source2 ) { + if (Dest) { + delete[] Dest; + Dest = NULL; + } + return CreateConcat ( Dest,Source1,Source2 ); +} + + +pstr CreateConcat ( pstr & Dest, + cpstr Source1, cpstr Source2, + cpstr Source3, cpstr Source4, + cpstr Source5 ) { +pstr S; +int ld,ls; + if (Dest) ld = strlen(Dest); + else ld = 0; + ls = 0; + if (Source1) ls += strlen(Source1); + if (Source2) ls += strlen(Source2); + if (Source3) ls += strlen(Source3); + if (Source4) ls += strlen(Source4); + if (Source5) ls += strlen(Source5); + if (ls>0) { + S = new char[ls+ld+1]; + if (Dest) { + strcpy ( S,Dest ); + delete[] Dest; + } else + S[0] = char(0); + if (Source1) strcat ( S,Source1 ); + if (Source2) strcat ( S,Source2 ); + if (Source3) strcat ( S,Source3 ); + if (Source4) strcat ( S,Source4 ); + if (Source5) strcat ( S,Source5 ); + Dest = S; + } + return Dest; +} + + +pstr CreateConcat ( pstr & Dest, + cpstr Source1, cpstr Source2, + cpstr Source3, cpstr Source4 ) { +pstr S; +int ld,ls; + if (Dest) ld = strlen(Dest); + else ld = 0; + ls = 0; + if (Source1) ls += strlen(Source1); + if (Source2) ls += strlen(Source2); + if (Source3) ls += strlen(Source3); + if (Source4) ls += strlen(Source4); + if (ls>0) { + S = new char[ls+ld+1]; + if (Dest) { + strcpy ( S,Dest ); + delete[] Dest; + } else + S[0] = char(0); + if (Source1) strcat ( S,Source1 ); + if (Source2) strcat ( S,Source2 ); + if (Source3) strcat ( S,Source3 ); + if (Source4) strcat ( S,Source4 ); + Dest = S; + } + return Dest; +} + + +pstr CreateConcat ( pstr & Dest, + cpstr Source1, cpstr Source2, + cpstr Source3 ) { +pstr S; +int ld,ls; + if (Dest) ld = strlen(Dest); + else ld = 0; + ls = 0; + if (Source1) ls += strlen(Source1); + if (Source2) ls += strlen(Source2); + if (Source3) ls += strlen(Source3); + if (ls>0) { + S = new char[ls+ld+1]; + if (Dest) { + strcpy ( S,Dest ); + delete[] Dest; + } else + S[0] = char(0); + if (Source1) strcat ( S,Source1 ); + if (Source2) strcat ( S,Source2 ); + if (Source3) strcat ( S,Source3 ); + Dest = S; + } + return Dest; +} + +pstr CreateConcat ( pstr & Dest, + cpstr Source1, cpstr Source2 ) { +pstr S; +int ld,ls; + if (Dest) ld = strlen(Dest); + else ld = 0; + ls = 0; + if (Source1) ls += strlen(Source1); + if (Source2) ls += strlen(Source2); + if (ls>0) { + S = new char[ls+ld+1]; + if (Dest) { + strcpy ( S,Dest ); + delete[] Dest; + } else + S[0] = char(0); + if (Source1) strcat ( S,Source1 ); + if (Source2) strcat ( S,Source2 ); + Dest = S; + } + return Dest; +} + +pstr CreateConcat ( pstr & Dest, cpstr Source ) { +pstr S; +int ld,ls; + if (Dest) ld = strlen(Dest); + else ld = 0; + if (Source) ls = strlen(Source); + else ls = 0; + if (ls>0) { + S = new char[ls+ld+1]; + if (Dest) { + strcpy ( S,Dest ); + delete[] Dest; + } else + S[0] = char(0); + strcat ( S,Source ); + Dest = S; + } + return Dest; +} + + +pstr LastOccurence ( cpstr S, char c ) { +pstr P=(pstr)S; +pstr R=NULL; + while (*P) { + if (*P==c) R = P; + P++; + } + return R; +} + + +pstr FirstOccurence ( cpstr S, char c ) { +pstr P=(pstr)S; + while (*P) { + if (*P==c) return P; + P++; + } + return NULL; +} + +int indexOf ( cpstr S, char c ) { +int i=0; + while (S[i]) { + if (S[i]==c) return i; + i++; + } + return -1; +} + +pstr FirstOccurence ( cpstr S, int Slen, cpstr Q, int Qlen ) { +int i,j,k,l; + l = Slen-Qlen; + for (i=0;i<=l;i++) { + j = 0; + k = i; + while (j=Qlen) return pstr(&(S[i])); + } + return NULL; +} + +int indexOf ( cpstr S, int Slen, cpstr Q, int Qlen ) { +int i,j,k,l; + l = Slen-Qlen; + for (i=0;i<=l;i++) { + j = 0; + k = i; + while (j=Qlen) return i; + } + return -1; +} + + +pstr LowerCase ( pstr s ) { +pstr p=s; + while (*p) { + *p = char(tolower(int(*p))); + p++; + } + return s; +} + +pstr UpperCase ( pstr s ) { +pstr p=s; + while (*p) { + *p = char(toupper(int(*p))); + p++; + } + return s; +} + + +void GetString ( pstr L, cpstr S, int M ) { +// Copies first M characters of string S into string L, +// appending the terminating null. If S contains less +// then M characters, L will be padded with spaces. +int i,j; + i = 0; + j = 0; + while (S[i] && (i=SMax) || (!S[k])) { + lm1 = IMin(n,lm1); + while (k=SMax)) { + lm1 = IMin(n,lm1); + while (k=0) && (k>=0)) + d[i--] = s[k--]; + while (i>=0) + d[i--] = ' '; +} + +void strcpy_nr ( pstr d, cpstr s, int n ) { +// Copies at most n symbols from string s to d, but +// no more than strlen(s) (s must contain a terminating null). +// The string in d is aligned to the right and added with +// spaces at the left, if necessary. The terminating null +// IS NEITHER appended NOR copied to d. +int i,k; + i = n-1; + k = IMin(i,strlen(s)-1); + while ((i>=0) && (k>=0)) + d[i--] = s[k--]; + while (i>=0) + d[i--] = ' '; +} + + +void strcpy_ns ( pstr d, cpstr s, int n ) { +// Copies at most n symbols from string s to d, but +// no more than strlen(s) (s must contain a terminating +// null). The terminating null IS NEITHER appended NOR +// copied to d; rather, d is padded with spaces if +// strlen(s)0) && (d[i]==' ')) i--; + if (d[i]==' ') d[i] = char(0); + else d[i+1] = char(0); + return d; +} + + +pstr strcpy_ncs ( pstr d, cpstr s, int n ) { +// Copies at most n characters from string s to string d +// cutting all spaces at at the end. Thus, " abcde " will +// be copied like " abc" at n=4 and like " abcde" at n>5 +// (terminating null appended). +// The function returns d. +int i; + i = 0; + while (s[i] && (i0) && (d[i]==' ')) i--; + if (d[i]==' ') d[i] = char(0); + else d[i+1] = char(0); + return d; +} + +pstr strcpy_css ( pstr d, cpstr s ) { +// Copies string s to string d cutting all spaces at +// at the begining and at the end. Thus, " ab c de " +// will be copied like "ab c de" (terminating null +// appended). +// The function returns d. +int i,k; + i = 0; + while (s[i]==' ') i++; + k = 0; + while (s[i]) + d[k++] = s[i++]; + if (k>0) { + k--; + while ((k>0) && (d[k]==' ')) k--; + if (d[k]==' ') d[k] = char(0); + else d[k+1] = char(0); + } else + d[k] = char(0); + return d; +} + +pstr strcpy_ncss ( pstr d, cpstr s, int n ) { +// Copies at most n characters from string s to string d cutting +// all spaces at the begining and at the end. Thus, " ab c de " +// will be copied like "ab" at n=3 (terminating null appended). +// The function returns d. +int i,k; + i = 0; + while ((s[i]==' ') && (i0) { + k--; + while ((k>0) && (d[k]==' ')) k--; + if (d[k]==' ') d[k] = char(0); + else d[k+1] = char(0); + } else + d[k] = char(0); + return d; +} + + +pstr strcpy_n0 ( pstr d, cpstr s, int n ) { +// Copies at most n symbols from string s to d, but +// no more than strlen(s) (s must contain a terminating +// null). The terminating null IS appended to d. +// The function returns d. +int i; + i = 0; + while ((i0)) { + k--; + while ((k>0) && (S[k]==' ')) k--; + if (S[k]!=' ') k++; + } + S[k] = char(0); + return S; +} + + +pstr DelSpaces ( pstr S, char c ) { +// Removes all spaces (or other symbols as specified by 'c') +// from the string. The string is then shrinked by the number +// of removed characters. Thus, " as ttt " becomes "asttt". +int i,j; + j = 0; + for (i=0;S[i];i++) + if (S[i]!=c) { + if (j=0;j--) { + n = (I >> sh) & 0xFF; + iUB[j] = byte(n); + sh -= 8; + } +} +*/ + +void int2UniBin ( int I, intUniBin iUB ) { +int n; +word j; + n = I; + for (j=0;j>= 8; + } +} + +void short2UniBin ( short S, shortUniBin sUB ) { +int j,sh; +short n; + sh = 8*(sizeof(shortUniBin)-1); + for (j=sizeof(shortUniBin)-1;j>=0;j--) { + n = (S >> sh) & 0xFF; + sUB[j] = byte(n); + sh -= 8; + } +} + +void long2UniBin ( long L, longUniBin lUB ) { +int j,sh; +long n; + sh = 8*(sizeof(longUniBin)-1); + for (j=sizeof(longUniBin)-1;j>=0;j--) { + n = (L >> sh) & 0xFF; + lUB[j] = byte(n); + sh -= 8; + } +} + +void word2UniBin ( word W, wordUniBin wUB ) { +int j,sh; +word n; + sh = 8*(sizeof(wordUniBin)-1); + for (j=sizeof(wordUniBin)-1;j>=0;j--) { + n = (W >> sh) & 0xFF; + wUB[j] = byte(n); + sh -= 8; + } +} + + +void real2UniBin ( realtype R, realUniBin rUB ) { +int k1,k2,k; +realtype Q,L; + if (R>=0) Q = R; + else Q = -R; + k1 = 0; + k2 = _nfPowers; + do { + k = (k1+k2)/2; + if (Q>=_fpower[k]) k1 = k; + else k2 = k; + } while (k2>k1+1); + if (Q<=_fpower[0]) k2 = 0; + Q = (Q/_fpower[k2])*_fpower8; + rUB[0] = byte(k2); + for (k=sizeof(realUniBin)-1;k>0;k--) { + L = floor(Q/_rfbase); + rUB[k] = byte(int(Q-L*_rfbase)); + Q = L; + } + if (R<0) rUB[1] |= _fsign; + +} + +void shortreal2UniBin ( shortreal R, shortrealUniBin srUB ) { +int k1,k2,k; +realtype Q,L; + + if (R>=0) Q = R; + else Q = -R; + k1 = 0; + k2 = _nfPowers; + do { + k = (k1+k2)/2; + if (Q>=_fpower[k]) k1 = k; + else k2 = k; + } while (k2>k1+1); + if (Q<=_fpower[0]) k2 = 0; + Q = (Q/_fpower[k2])*_fpower4; + srUB[0] = byte(k2); + for (k=sizeof(shortrealUniBin)-1;k>0;k--) { + L = floor(Q/_rfbase); + srUB[k] = byte(int(Q-L*_rfbase)); + Q = L; + } + if (R<0) srUB[1] |= _fsign; + +} + +/* +#undef _new_float_unibin + +#ifdef _new_float_unibin + +void float2UniBin ( realtype R, floatUniBin fUB ) { +int k1,k2,k; +realtype Q,L; + + if (R>=0) Q = R; + else Q = -R; + k1 = 0; + k2 = _nfPowers; + do { + k = (k1+k2)/2; + if (Q>=_fpower[k]) k1 = k; + else k2 = k; + } while (k2>k1+1); + if (Q<=_fpower[0]) k2 = 0; + Q = (Q/_fpower[k2])*_fpower4; + fUB[0] = byte(k2); + for (k=sizeof(floatUniBin)-1;k>0;k--) { + L = floor(Q/_rfbase); + fUB[k] = byte(int(Q-L*_rfbase)); + Q = L; + } + if (R<0) fUB[1] |= _fsign; + +} + +#else + +void float2UniBin ( realtype R, floatUniBin fUB ) { +int k1,k2,k; +realtype Q,L; + if (R>=0) Q = R; + else Q = -R; + k1 = 0; + k2 = _nfPowers; + do { + k = (k1+k2)/2; + if (Q>=_fpower[k]) k1 = k; + else k2 = k; + } while (k2>k1+1); + if (Q<=_fpower[0]) k2 = 0; + Q = (Q/_fpower[k2])*_fpower8; + fUB[0] = byte(k2); + for (k=sizeof(realUniBin)-1;k>0;k--) { + L = floor(Q/_rfbase); + if (k<=sizeof(floatUniBin)) + fUB[k] = byte(int(Q-L*_rfbase)); + Q = L; + } + if (R<0) fUB[1] |= _fsign; + +} + +#endif +*/ + +void float2UniBin ( realtype R, floatUniBin fUB ) { +int k1,k2,k; +realtype Q,L; + + if (R>=0) Q = R; + else Q = -R; + k1 = 0; + k2 = _nfPowers; + do { + k = (k1+k2)/2; + if (Q>=_fpower[k]) k1 = k; + else k2 = k; + } while (k2>k1+1); + if (Q<=_fpower[0]) k2 = 0; + fUB[0] = byte(k2); + + if (_old_float_unibin) { + // this is wrong but compatible with already existing files :( + // in the result, it gives errors in 6th digit at back conversion + Q = (Q/_fpower[k2])*_fpower8; + for (k=sizeof(realUniBin)-1;k>0;k--) { + L = floor(Q/_rfbase); + if (k<=(int)sizeof(floatUniBin)) + fUB[k] = byte(int(Q-L*_rfbase)); + Q = L; + } + } else { + // this is correct + Q = (Q/_fpower[k2])*_fpower4; + for (k=sizeof(floatUniBin)-1;k>0;k--) { + L = floor(Q/_rfbase); + fUB[k] = byte(int(Q-L*_rfbase)); + Q = L; + } + } + +//if (fUB[1] & _fsign) printf ( " error!\n" ); + + if (R<0) fUB[1] |= _fsign; + +} + + +void UniBin2float ( floatUniBin fUB, realtype & R ) { +int j,s; + + if (fUB[1] & _fsign) { + s = 1; + fUB[1] &= _fsign1; + } else + s = 0; + + R = int(fUB[1]); + + if (_old_float_unibin) { + // this is wrong and gives a conversion error in 6th digit :( + // we have to keep this for compatibility with already existing + // files + for (j=2;j<(int)sizeof(floatUniBin);j++) + R = R*_rfbase + int(fUB[j]); + for (j=sizeof(floatUniBin);j<(int)sizeof(realUniBin);j++) + R *= _rfbase; + R = (R/_fpower8)*_fpower[int(fUB[0])]; + } else { + // this is correct + for (j=2;j<(int)sizeof(floatUniBin);j++) + R = R*_rfbase + int(fUB[j]); + R = (R/_fpower4)*_fpower[int(fUB[0])]; + } + if (s) R = -R; +} + + +/* ------------------------------------------------------- + This piece of code shows that float2Unibin - Unbin2float + pair does same-quality job as the native float - double + conversion: + + InitMatType(); + set_new_float_unibin(); + + floatUniBin fUB; + realUniBin rUB; + realtype maxsh = MaxShortReal/2.0; // max manageable /2! + float maxshf = maxsh; + realtype maxshr = maxshf; + realtype maxsh1; + + float2UniBin ( maxsh,fUB ); + UniBin2float ( fUB,maxsh1 ); + + printf ( " float\n %10.3f\n %10.3f\n %10.3f\n %10.3f\n", + maxsh,maxsh1,maxshf,maxshr ); + + maxsh = MaxShortReal; + real2UniBin ( maxsh,rUB ); + UniBin2real ( rUB,maxsh1 ); + + printf ( " real\n %10.3f\n %10.3f\n",maxsh,maxsh1 ); + +---- RESULTS: + + float + 170099999999999990938343446679146987520.000 + 170099999948540854500627141228603899904.000 + 170100000027769017014891478822147850240.000 + 170100000027769017014891478822147850240.000 + real + 340199999999999981876686893358293975040.000 + 340199999999999981876686893358293975040.000 + +-------------------------------------------------------------- */ + +/* +void shortreal2UniBin ( shortreal R, shortrealUniBin srUB ) { +int k1,k2,k; +realtype Q,L; + + if (R>=0) Q = R; + else Q = -R; + k1 = 0; + k2 = _nfPowers; + do { + k = (k1+k2)/2; + if (Q>=_fpower[k]) k1 = k; + else k2 = k; + } while (k2>k1+1); + if (Q<=_fpower[0]) k2 = 0; + Q = (Q/_fpower[k2])*_fpower8; + srUB[0] = byte(k2); + for (k=sizeof(realUniBin)-1;k>0;k--) { + L = floor(Q/_rfbase); + if (k<=(int)sizeof(shortrealUniBin)) + srUB[k] = byte(int(Q-L*_rfbase)); + Q = L; + } + if (R<0) srUB[1] |= _fsign; + +} + +void float2UniBin ( realtype R, floatUniBin fUB ) { +int k1,k2,k; +realtype Q,L; + + if (R>=0) Q = R; + else Q = -R; + k1 = 0; + k2 = _nfPowers; + do { + k = (k1+k2)/2; + if (Q>=_fpower[k]) k1 = k; + else k2 = k; + } while (k2>k1+1); + if (Q<=_fpower[0]) k2 = 0; + Q = (Q/_fpower[k2])*_fpower8; + fUB[0] = byte(k2); + for (k=sizeof(realUniBin)-1;k>0;k--) { + L = floor(Q/_rfbase); + if (k<=(int)sizeof(floatUniBin)) + fUB[k] = byte(int(Q-L*_rfbase)); + Q = L; + } + if (R<0) fUB[1] |= _fsign; + +} +*/ + +/* +void UniBin2int ( intUniBin iUB, int & I ) { +int j,n,sh; + sh = 8*sizeof(intUniBin); + I = 0x00; + for (j=sizeof(intUniBin)-1;j>=0;j--) { + sh -= 8; + n = byte(iUB[j]); + I = I | (n << sh); + } +} +*/ + +void UniBin2int ( intUniBin iUB, int & I ) { +int j; + I = 0x00; + for (j=sizeof(intUniBin)-1;j>=0;j--) { + I <<= 8; + I |= int(iUB[j]); + } +} + +void UniBin2short ( shortUniBin sUB, short & S ) { +int j,sh; +short n; + sh = 8*sizeof(shortUniBin); + S = 0x00; + for (j=sizeof(shortUniBin)-1;j>=0;j--) { + sh -= 8; + n = byte(sUB[j]); + S = S | (n << sh); + } +} + +void UniBin2long ( longUniBin lUB, long & L ) { +int j,sh; +long n; + sh = 8*sizeof(longUniBin); + L = 0x00; + for (j=sizeof(longUniBin)-1;j>=0;j--) { + sh -= 8; + n = byte(lUB[j]); + L = L | (n << sh); + } +} + +void UniBin2word ( wordUniBin wUB, word & W ) { +int j,sh; +word n; + sh = 8*sizeof(wordUniBin); + W = 0x00; + for (j=sizeof(wordUniBin)-1;j>=0;j--) { + sh -= 8; + n = byte(wUB[j]); + W = W | (n << sh); + } +} + +void UniBin2real ( realUniBin rUB, realtype & R ) { +int j,s; + if (rUB[1] & _fsign) { + s = 1; + rUB[1] &= _fsign1; + } else + s = 0; + R = int(rUB[1]); + for (j=2;j<(int)sizeof(realUniBin);j++) + R = R*_rfbase + int(rUB[j]); + R = (R/_fpower8)*_fpower[int(rUB[0])]; + if (s) R = -R; +} + +void UniBin2shortreal ( shortrealUniBin srUB, shortreal & R ) { +int j,s; + if (srUB[1] & _fsign) { + s = 1; + srUB[1] &= _fsign1; + } else + s = 0; + R = int(srUB[1]); + for (j=2;j<(int)sizeof(shortrealUniBin);j++) + R = R*_rfbase + int(srUB[j]); + R = (R/_fpower4)*_fpower[int(srUB[0])]; + if (s) R = -R; +} + +/* +#ifdef _new_float_unibin + +void UniBin2float ( floatUniBin fUB, realtype & R ) { +int j,s; + if (fUB[1] & _fsign) { + s = 1; + fUB[1] &= _fsign1; + } else + s = 0; + R = int(fUB[1]); + for (j=2;j<(int)sizeof(floatUniBin);j++) + R = R*_rfbase + int(fUB[j]); + R = (R/_fpower4)*_fpower[int(fUB[0])]; + if (s) R = -R; +} + +#else + +void UniBin2float ( floatUniBin fUB, realtype & R ) { +int j,s; + if (fUB[1] & _fsign) { + s = 1; + fUB[1] &= _fsign1; + } else + s = 0; + R = int(fUB[1]); + for (j=2;j0) { + memcpy ( &(S[l]),L,len ); + l += len; + S[l] = char(0); + } +} + +void mem_write ( Boolean B, pstr S, int & l ) { + if (B) S[l++] = 'Y'; + else S[l++] = 'N'; + S[l] = char(0); +} + +void mem_write_byte ( byte B, pstr S, int & l ) { + S[l++] = char(B); + S[l] = char(0); +} + + +void mem_read ( int & I, cpstr S, int & l ) { +intUniBin iUB; + memcpy ( iUB,&(S[l]),sizeof(intUniBin) ); + l += sizeof(intUniBin); + UniBin2int ( iUB,I ); +} + +void mem_read ( short & I, cpstr S, int & l ) { +shortUniBin sUB; + memcpy ( sUB,&(S[l]),sizeof(shortUniBin) ); + l += sizeof(shortUniBin); + UniBin2short ( sUB,I ); +} + +void mem_read ( long & I, cpstr S, int & l ) { +longUniBin lUB; + memcpy ( lUB,&(S[l]),sizeof(longUniBin) ); + l += sizeof(longUniBin); + UniBin2long ( lUB,I ); +} + +void mem_read ( word & W, cpstr S, int & l ) { +wordUniBin wUB; + memcpy ( wUB,&(S[l]),sizeof(wordUniBin) ); + l += sizeof(wordUniBin); + UniBin2word ( wUB,W ); +} + +void mem_read ( realtype & R, cpstr S, int & l ) { +realUniBin rUB; + memcpy ( rUB,&(S[l]),sizeof(realUniBin) ); + l += sizeof(realUniBin); + UniBin2real ( rUB,R ); +} + +void mem_read ( shortreal & R, cpstr S, int & l ) { +shortrealUniBin srUB; + memcpy ( srUB,&(S[l]),sizeof(shortrealUniBin) ); + l += sizeof(shortrealUniBin); + UniBin2shortreal ( srUB,R ); +} + +void mem_read ( pstr L, int len, cpstr S, int & l ) { + memcpy ( L,&(S[l]),len ); + l += len; +} + +void mem_read ( pstr & L, cpstr S, int & l ) { +int len; + if (L) { + delete[] L; + L = NULL; + } + mem_read ( len,S,l ); + if (len>0) { + L = new char[len+1]; + memcpy ( L,&(S[l]),len ); + L[len] = char(0); + l += len; + } +} + +void mem_read ( Boolean & B, cpstr S, int & l ) { + B = (S[l++]=='Y'); +} + +void mem_read_byte ( byte & B, cpstr S, int & l ) { + B = byte(S[l++]); +} + +// ------------------------------------------------------- + +Boolean InitMatType() { + MachEps = MachinEps(); + floatMachEps = floatMachinEps(); + LnMaxReal = log(fMaxReal); + LnMinReal = log(fMinReal); + LnMaxRealExp = LnMaxReal; + LnMinRealExp = LnMinReal; + InitFPowers(); + return True; +} + +/* =================================================== */ + +// *** end of diff --git a/mmdb/mattype_.h b/mmdb/mattype_.h new file mode 100755 index 0000000..43ecd4f --- /dev/null +++ b/mmdb/mattype_.h @@ -0,0 +1,659 @@ +// $Id: mattype_.h,v 1.30 2012/02/23 23:12:22 gxg60988 Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 29.01.10 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : MatType_ +// ~~~~~~~~~ +// **** Functions : +// ~~~~~~~~~~~ +// GetString ( reads substring from a string ) +// GetStrTer ( reads substring and put term-ing null ) +// strcpy_n ( copies not more than n characters ) +// strcpy_ns ( like strcpy_ns and pads with spaces ) +// strcpy_n0 ( like strcpy_n and adds terminating 0 ) +// PadSpaces ( pads a string with spaces ) +// +// (C) E. Krissinel 2000-2010 +// +// ================================================================= +// + + +#ifndef __MatType__ +#define __MatType__ + +#ifndef __MATH_H +#include +#endif + +#define UseDoubleFloat + +#ifndef __ClassMacros + +# define __ClassMacros + + // A Class definition macros +# define DefineClass(ClassName) \ + class ClassName; \ + typedef ClassName * P##ClassName; \ + typedef ClassName & R##ClassName; \ + typedef P##ClassName * PP##ClassName; \ + typedef P##ClassName & RP##ClassName; + + // A Structure definition macros +# define DefineStructure(StructureName) \ + struct StructureName; \ + typedef StructureName * P##StructureName; \ + typedef StructureName & R##StructureName; \ + typedef P##StructureName * PP##StructureName; \ + typedef P##StructureName & RP##StructureName; + +#endif + +#define UNUSED_ARGUMENT(x) (void)x + +// ----------------------------------------------------- + +#ifdef UseDoubleFloat + +# define MinReal 2.2250e-307 +# define MaxReal 1.7976e+308 +# define fMinReal 2.2250e-307 +# define fMaxReal 1.7976e+308 + typedef double realtype; + +#else + +# define MinReal 1.1755e-38 +# define MaxReal 3.4020e+38 +# define fMinReal 1.1755e-38 +# define fMaxReal 3.4020e+38 + typedef float realtype; + +#endif + +typedef float shortreal; +#define MinShortReal 1.1755e-38 +#define MaxShortReal 3.4020e+38 + +#define strrchr LastOccurence +#define fstrrchr LastOccurence +#define strchr FirstOccurence +#define fstrchr FirstOccurence + +typedef char * pstr; +typedef const char * cpstr; +typedef unsigned int word; +typedef unsigned char byte; +typedef signed char short_int; +typedef byte Boolean; +typedef unsigned int word2; +typedef byte * byteptr; +typedef unsigned long lword; + +typedef byte intUniBin [4]; +typedef byte shortUniBin [2]; +typedef byte longUniBin [4]; +typedef byte wordUniBin [4]; +typedef byte realUniBin [10]; +typedef byte floatUniBin [5]; +typedef byte shortrealUniBin[5]; + +#ifdef _WIN32 +pstr strcasestr ( pstr s1, cpstr s2 ); +#endif + +#ifdef _MSC_VER +#define strncasecmp _strnicmp +#define strcasecmp _stricmp +#endif + +#define True Boolean(1) +#define False Boolean(0) + +#define MaxInt 32767 +#define MinInt (-32768) +#define MaxWord 65535L +#define MaxInt4 2147483647 + +// MinInt4 would have to be defined as -2147483648, +// however some compilers do not like that. To be on safe, +// we define it as -2147483647: +#define MinInt4 (-2147483647) +#define MaxWord4 4294967295 + +#define Pi 3.141592653589793238462643 +#define Eu 2.718281828459045235360287 +#define ln10 2.3025850929940456840179915 + + +// *** vectors X[1..N] : +typedef realtype * rvector; +typedef int * ivector; +typedef word * wvector; +typedef byte * bvector; +typedef long * lvector; +typedef lword * lwvector; +typedef pstr * psvector; + +// *** matrices X[1..N][1..M] : +typedef rvector * rmatrix; +typedef ivector * imatrix; +typedef wvector * wmatrix; +typedef bvector * bmatrix; +typedef lvector * lmatrix; +typedef lwvector * lwmatrix; +typedef psvector * psmatrix; + +// *** matrices X[1..N][1..M][1..K] : +typedef rmatrix * rmatrix3; +typedef imatrix * imatrix3; +typedef wmatrix * wmatrix3; +typedef bmatrix * bmatrix3; +typedef lmatrix * lmatrix3; +typedef lwmatrix * lwmatrix3; +typedef psmatrix * psmatrix3; + + + +// ------------------------------------------------------------ + +// Initialization. Some C++ enviroments do not do call +// InitMatType() automatically, therefore it is always +// advisable to call InitMatType() explicitely from the top of +// main(). It is completely harmless and cheap (although +// unnecessary) to call InitMatType() multiple times. +extern Boolean InitMatType(); + +// ------------------------------------------------------------ + +/* +extern int mround ( realtype X ); +extern int ifloor ( realtype X ); +extern int Abs ( int x ); + +extern void ISwap ( int & x, int & y ); +extern void WSwap ( word & x, word & y ); +extern void BSwap ( byte & x, byte & y ); +extern void LSwap ( long & x, long & y ); +extern void RSwap ( realtype & x, realtype & y ); + +extern realtype RMax ( const realtype x1, const realtype x2 ); +extern long LMax ( const long x1, const long x2 ); +extern word WMax ( const word x1, const word x2 ); +extern int IMax ( const int x1, const int x2 ); +extern realtype RMin ( const realtype x1, const realtype x2 ); +extern long LMin ( const long x1, const long x2 ); +extern word WMin ( const word x1, const word x2 ); +extern int IMin ( const int x1, const int x2 ); +extern realtype fsign ( const realtype x1, const realtype x2 ); +*/ + +inline int mround ( realtype X ) { return (int)floor(X+0.5); } +inline int ifloor ( realtype X ) { return (int)floor(X); } +inline int Abs ( int x ) { return ( x >= 0 ? x : -x ); } + +inline void ISwap ( int & x, int & y ) +{ int b = x; x = y; y = b; } + +inline void WSwap ( word & x, word & y ) +{ word b = x; x = y; y = b; } + +inline void BSwap ( byte & x, byte & y ) +{ byte b = x; x = y; y = b; } + +inline void LSwap ( long & x, long & y ) +{ long b = x; x = y; y = b; } + +inline void RSwap ( realtype & x, realtype & y ) +{ realtype b = x; x = y; y = b; } + +inline realtype RMax ( const realtype x1, const realtype x2 ) +{ return ( x1 > x2 ? x1 : x2 ); } + +inline long LMax ( const long x1, const long x2 ) +{ return ( x1 > x2 ? x1 : x2 ); } + +inline word WMax ( const word x1, const word x2 ) +{ return ( x1 > x2 ? x1 : x2 ); } + +inline int IMax ( const int x1, const int x2 ) +{ return ( x1 > x2 ? x1 : x2 ); } + +inline realtype RMin ( const realtype x1, const realtype x2 ) +{ return ( x1 < x2 ? x1 : x2 ); } + +inline long LMin ( const long x1, const long x2 ) +{ return ( x1 < x2 ? x1 : x2 ); } + +inline word WMin ( const word x1, const word x2 ) +{ return ( x1 < x2 ? x1 : x2 ); } + +inline int IMin ( const int x1, const int x2 ) +{ return ( x1 < x2 ? x1 : x2 ); } + +inline realtype fsign ( const realtype x1, const realtype x2 ) { +realtype ax; + if (x1>=0.0) ax = x1; + else ax = -x1; + return ( x2 >= 0.0 ? ax : -ax ); +} + + +// ------------------------------------------------------------ + +// Allocated vectors are enumerated as [Shift..Shift+N-1] +// rather than [0..N-1] ! +// Get-functions return if memory was allocated; +// if allocation attemt fails, vector is assigned with NULL + +extern Boolean GetVectorMemory ( rvector & V, word N, word Shift=1 ); +extern Boolean GetVectorMemory ( ivector & I, word N, word Shift=1 ); +extern Boolean GetVectorMemory ( wvector & W, word N, word Shift=1 ); +extern Boolean GetVectorMemory ( bvector & B, word N, word Shift=1 ); +extern Boolean GetVectorMemory ( lvector & L, word N, word Shift=1 ); +extern Boolean GetVectorMemory ( lwvector & L, word N, word Shift=1 ); +extern Boolean GetVectorMemory ( psvector & P, word N, word Shift=1 ); + +// Shift at deallocation MUST be the same as that at allocation ! +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Free-functions do nothing if vector has value NULL (e.g. +// after unsuccessful allocation). + +extern void FreeVectorMemory ( rvector & V, word Shift=1 ); +extern void FreeVectorMemory ( ivector & I, word Shift=1 ); +extern void FreeVectorMemory ( wvector & W, word Shift=1 ); +extern void FreeVectorMemory ( bvector & B, word Shift=1 ); +extern void FreeVectorMemory ( lvector & L, word Shift=1 ); +extern void FreeVectorMemory ( lwvector & L, word Shift=1 ); +extern void FreeVectorMemory ( psvector & P, word Shift=1 ); + +// ------------------------------------------------------------- + +// Allocated matrices are enumerated as +// [ShiftN..ShiftN+N-1, ShiftM..ShiftM+M-1] +// rather than [0..N-1,0..M-1] ! +// Get-functions return if memory was allocated; +// if allocation attemt fails, matrix is assigned with NULL +// Free-functions do nothing if matrix has value NULL (e.g. +// after unsuccessful allocation). + +extern Boolean GetMatrixMemory + ( rmatrix & A, word N, word M, word ShiftN=1, word ShiftM=1 ); +extern Boolean GetMatrixMemory + ( imatrix & A, word N, word M, word ShiftN=1, word ShiftM=1 ); +extern Boolean GetMatrixMemory + ( wmatrix & W, word N, word M, word ShiftN=1, word ShiftM=1 ); +extern Boolean GetMatrixMemory + ( bmatrix & B, word N, word M, word ShiftN=1, word ShiftM=1 ); +extern Boolean GetMatrixMemory + ( lmatrix & L, word N, word M, word ShiftN=1, word ShiftM=1 ); +extern Boolean GetMatrixMemory + ( lwmatrix & L, word N, word M, word ShiftN=1, word ShiftM=1 ); +extern Boolean GetMatrixMemory + ( psmatrix & P, word N, word M, word ShiftN=1, word ShiftM=1 ); + +// ShiftN and ShiftM at deallocation MUST be the same as those at +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// allocation ! +// ~~~~~~~~~~~~~ + +extern void FreeMatrixMemory ( rmatrix & A, word N, + word ShiftN=1, word ShiftM=1 ); +extern void FreeMatrixMemory ( imatrix & A, word N, + word ShiftN=1, word ShiftM=1 ); +extern void FreeMatrixMemory ( wmatrix & W, word N, + word ShiftN=1, word ShiftM=1 ); +extern void FreeMatrixMemory ( bmatrix & B, word N, + word ShiftN=1, word ShiftM=1 ); +extern void FreeMatrixMemory ( lmatrix & L, word N, + word ShiftN=1, word ShiftM=1 ); +extern void FreeMatrixMemory ( lwmatrix & L, word N, + word ShiftN=1, word ShiftM=1 ); +extern void FreeMatrixMemory ( psmatrix & P, word N, + word ShiftN=1, word ShiftM=1 ); + + +// ------------------------------------------------------------- +// 3D matrices + +extern Boolean GetMatrix3Memory + ( rmatrix3 & A, word N, word M, word K, + word ShiftN=1, word ShiftM=1, word ShiftK=1 ); +extern Boolean GetMatrix3Memory + ( imatrix3 & A, word N, word M, word K, + word ShiftN=1, word ShiftM=1, word ShiftK=1 ); +extern Boolean GetMatrix3Memory + ( wmatrix3 & A, word N, word M, word K, + word ShiftN=1, word ShiftM=1, word ShiftK=1 ); +extern Boolean GetMatrix3Memory + ( bmatrix3 & A, word N, word M, word K, + word ShiftN=1, word ShiftM=1, word ShiftK=1 ); +extern Boolean GetMatrix3Memory + ( lmatrix3 & A, word N, word M, word K, + word ShiftN=1, word ShiftM=1, word ShiftK=1 ); +extern Boolean GetMatrix3Memory + ( lwmatrix3 & A, word N, word M, word K, + word ShiftN=1, word ShiftM=1, word ShiftK=1 ); +extern Boolean GetMatrix3Memory + ( psmatrix3 & A, word N, word M, word K, + word ShiftN=1, word ShiftM=1, word ShiftK=1 ); + +// +// ShiftN, ShiftM and ShiftK at deallocation MUST be +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// the same as those at allocation ! +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +extern void FreeMatrix3Memory + ( rmatrix3 & A, word N, word M, + word ShiftN=1, word ShiftM=1, word ShiftK=1 ); +extern void FreeMatrix3Memory + ( imatrix3 & A, word N, word M, + word ShiftN=1, word ShiftM=1, word ShiftK=1 ); +extern void FreeMatrix3Memory + ( wmatrix3 & A, word N, word M, + word ShiftN=1, word ShiftM=1, word ShiftK=1 ); +extern void FreeMatrix3Memory + ( bmatrix3 & A, word N, word M, + word ShiftN=1, word ShiftM=1, word ShiftK=1 ); +extern void FreeMatrix3Memory + ( lmatrix3 & A, word N, word M, + word ShiftN=1, word ShiftM=1, word ShiftK=1 ); +extern void FreeMatrix3Memory + ( lwmatrix3 & A, word N, word M, + word ShiftN=1, word ShiftM=1, word ShiftK=1 ); +extern void FreeMatrix3Memory + ( psmatrix3 & A, word N, word M, + word ShiftN=1, word ShiftM=1, word ShiftK=1 ); + +// ------------------------------------------------------------- + +extern realtype MachEps; +extern realtype floatMachEps; +extern realtype LnMaxReal; +extern realtype LnMinReal; + +extern realtype MachinEps (); +extern realtype floatMachinEps(); +extern realtype frac ( realtype R ); +extern long mod ( long x, long y ); +extern realtype Pow ( realtype X, int y ); +extern realtype Pow1 ( realtype X, realtype Y ); +extern realtype Exp ( realtype X ); // use to avoid catastrophies +extern Boolean Odd ( int i ); +extern long HexValL ( cpstr S ); +extern long OctValL ( cpstr S ); +extern long BinValL ( cpstr S ); +extern pstr BinValS ( long L, pstr S ); // S[sizeof(long)+1] at least + +extern pstr ParamStr ( pstr D, cpstr S, realtype V, int M=5, + cpstr S1=(pstr)"" ); +extern pstr ParamStr ( pstr D, cpstr S, realtype V, int M, + cpstr S1, realtype V2, int M2=5, + cpstr S2=(pstr)"" ); + + + +// ---------- Strings + +// CreateCopy(..) allocates Dest string and copies the contents of +// Source into it. If Dest is not NULL prior calling the function, +// it is attempted to deallocate first. + +extern pstr CreateCopy ( pstr & Dest, cpstr Source ); +extern pstr CreateCopy_n ( pstr & Dest, cpstr Source, int n ); + +extern pstr CreateConcat ( pstr & Dest, cpstr Source ); +extern pstr CreateConcat ( pstr & Dest, cpstr Source1, + cpstr Source2 ); +extern pstr CreateConcat ( pstr & Dest, cpstr Source1, + cpstr Source2, + cpstr Source3 ); +extern pstr CreateConcat ( pstr & Dest, cpstr Source1, + cpstr Source2, + cpstr Source3, + cpstr Source4 ); +extern pstr CreateConcat ( pstr & Dest, cpstr Source1, + cpstr Source2, + cpstr Source3, + cpstr Source4, + cpstr Source5 ); + +extern pstr CreateCopCat ( pstr & Dest, cpstr Source1, + cpstr Source2, + cpstr Source3, + cpstr Source4, + cpstr Source5 ); +extern pstr CreateCopCat ( pstr & Dest, cpstr Source1, + cpstr Source2, + cpstr Source3, + cpstr Source4 ); +extern pstr CreateCopCat ( pstr & Dest, cpstr Source1, + cpstr Source2, + cpstr Source3 ); +extern pstr CreateCopCat ( pstr & Dest, cpstr Source1, + cpstr Source2 ); + +extern pstr LastOccurence ( cpstr S , char c ); +extern pstr FirstOccurence ( cpstr S , char c ); +extern int indexOf ( cpstr S , char c ); +extern pstr FirstOccurence ( cpstr S, int Slen, + cpstr Q, int Qlen ); +extern int indexOf ( cpstr S, int Slen, + cpstr Q, int Qlen ); + +extern pstr LowerCase ( pstr s ); +extern pstr UpperCase ( pstr s ); + +// GetString(..) copies first M characters of string S into string +// L, appending the terminating null. If S contains less then M +// characters, L will be padded with spaces. +extern void GetString ( pstr L, cpstr S, int M ); + +// GetStrTer(..) copies at least n (or LMax if LMax5 +// (terminating null appended). +// The function returns d. +extern pstr strcpy_ncs ( pstr d, cpstr s, int n ); + +// strcpy_css(..) copies string s to string d cutting all +// spaces at the begining and at the end. Thus, " ab c de " +// will be copied like "ab c de" (terminating null appended). +// The function returns d. +extern pstr strcpy_css ( pstr d, cpstr s ); + +// strcpy_ncss(..) copies at most n characters from string s +// to string d cutting all spaces at the begining and at the end. +// Thus, " ab c de " will be copied like "ab" at n=3 (terminating +// null appended). +// The function returns d. +extern pstr strcpy_ncss ( pstr d, cpstr s, int n ); + +// strcpy_n0(..) copies at most n symbols from string s to d, +// but no more than strlen(s) (s must contain a terminating +// null). The terminating null IS appended to d. +// The function returns d. +extern pstr strcpy_n0 ( pstr d, cpstr s, int n ); + +// strlen_des returns the length of a string as if all extra +// spaces from the latter have been deleted. Extra spaces +// include all leading and tracing spaces and any sequential +// spaces when more than one. The string does not change. +extern int strlen_des ( cpstr s ); + +// strcpy_des copies string s into string d removing all extra +// spaces from the latter. Extra spaces include all leading and +// tracing spaces and any sequential spaces when more than one. +extern pstr strcpy_des ( pstr d, cpstr s ); + +// strcat_des appends string s to string d removing all extra +// spaces from the latter. Extra spaces include all leading and +// tracing spaces and any sequential spaces when more than one. +extern pstr strcat_des ( pstr d, cpstr s ); + +// PadSpaces(..) pads string S with spaces making its length +// equal to len. The terminating zero is added, so that S should +// reserve space of a minimum len+1 characters. +extern void PadSpaces ( pstr S, int len ); + + +#define SCUTKEY_BEGIN 0x00000001 +#define SCUTKEY_END 0x00000002 +#define SCUTKEY_BEGEND 0x00000003 + +// CutSpaces(..) cuts spaces at the begining or end of +// string S according to the value of CutKey. The function +// returns S. +extern pstr CutSpaces ( pstr S, int CutKey ); + +// DelSpaces(..) removes all spaces (or other symbols as +// specified by 'c') from the string. The string is then +// shrinked by the number of removed characters. Thus, +// " as ttt " becomes "asttt". +extern pstr DelSpaces ( pstr S, char c=' ' ); + +// EnforceSpaces(..) replaces all unprintable characters, +// except , , and some others, for spaces +extern pstr EnforceSpaces ( pstr S ); + +// ------------------------------------------------------------- + +/// This call will produce correct floats in universal binaries but +/// make them incompatible with old files. Without this call, float +/// read/write will result in error after 6th digit. +/// UniBin read/write of other types (realtype, shortreal, int etc) +/// is not affected by this call, and to the best of knowledge is +/// correct (no loss of precision). +extern void set_new_float_unibin(); +extern Boolean is_new_float_unibin(); +extern void set_old_float_unibin(); + +extern void __modify4(); + +extern void int2UniBin ( int I, intUniBin iUB ); +extern void short2UniBin ( short S, shortUniBin sUB ); +extern void long2UniBin ( long L, longUniBin lUB ); +extern void word2UniBin ( word W, wordUniBin wUB ); +extern void real2UniBin ( realtype R, realUniBin rUB ); +extern void float2UniBin ( realtype R, floatUniBin fUB ); +extern void shortreal2UniBin ( shortreal R, shortrealUniBin srUB ); +extern void UniBin2int ( intUniBin iUB, int & I ); +extern void UniBin2short ( shortUniBin sUB, short & S ); +extern void UniBin2long ( longUniBin lUB, long & L ); +extern void UniBin2word ( wordUniBin wUB, word & W ); +extern void UniBin2real ( realUniBin rUB, realtype & R ); +extern void UniBin2shortreal ( shortrealUniBin srUB, shortreal & R ); +extern void UniBin2float ( floatUniBin fUB, realtype & R ); + +extern void mem_write ( int I, pstr S, int & l ); +extern void mem_write ( short I, pstr S, int & l ); +extern void mem_write ( long I, pstr S, int & l ); +extern void mem_write ( word W, pstr S, int & l ); +extern void mem_write ( realtype R, pstr S, int & l ); +extern void mem_write ( shortreal R, pstr S, int & l ); +extern void mem_write ( pstr L, int len, pstr S, int & l ); +extern void mem_write ( pstr L, pstr S, int & l ); +extern void mem_write ( Boolean B, pstr S, int & l ); +extern void mem_write_byte ( byte B, pstr S, int & l ); + +extern void mem_read ( int & I, cpstr S, int & l ); +extern void mem_read ( short & I, cpstr S, int & l ); +extern void mem_read ( long & I, cpstr S, int & l ); +extern void mem_read ( word & W, cpstr S, int & l ); +extern void mem_read ( realtype & R, cpstr S, int & l ); +extern void mem_read ( shortreal & R, cpstr S, int & l ); +extern void mem_read ( pstr L, int len, cpstr S, int & l ); +extern void mem_read ( pstr & L, cpstr S, int & l ); +extern void mem_read ( Boolean & B, cpstr S, int & l ); +extern void mem_read_byte ( byte & B, cpstr S, int & l ); + +#endif + +/* =================================================== */ + diff --git a/mmdb/mmdb_align.cpp b/mmdb/mmdb_align.cpp new file mode 100755 index 0000000..4081ce7 --- /dev/null +++ b/mmdb/mmdb_align.cpp @@ -0,0 +1,1219 @@ +// $Id: mmdb_align.cpp,v 1.22 2012/01/26 17:52:20 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 19.04.11 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : MMDB_Align +// ~~~~~~~~~ +// **** Classes : CAlignment ( alignment of character strings ) +// ~~~~~~~~~~~~ CAlignment1 ( alignment of integer vectors ) +// +// (C) E.Krissinel' 2000-2011 +// +// ================================================================= +// + +#ifndef __STRING_H +#include +#endif + +#ifndef __MATH_H +#include +#endif + +#ifndef __MMDB_Align__ +#include "mmdb_align.h" +#endif + + +// ===================== CAligParams ====================== + +CAlignParams::CAlignParams() : CStream() { + InitAlignParams(); +} + +CAlignParams::CAlignParams ( RPCStream Object ) : CStream ( Object ) { + InitAlignParams(); +} + +void CAlignParams::InitAlignParams() { + gapWeight = -1.0; + spaceWeight = -1.0; + equalScore = 2.0; + nequalScore = -1.0; + method = ALIGN_GLOBAL; +} + +void CAlignParams::write ( RCFile f ) { + f.WriteReal ( &gapWeight ); + f.WriteReal ( &spaceWeight ); + f.WriteReal ( &equalScore ); + f.WriteReal ( &nequalScore ); + f.WriteInt ( &method ); +} + +void CAlignParams::read ( RCFile f ) { + f.ReadReal ( &gapWeight ); + f.ReadReal ( &spaceWeight ); + f.ReadReal ( &equalScore ); + f.ReadReal ( &nequalScore ); + f.ReadInt ( &method ); +} + +MakeStreamFunctions(CAlignParams) + + +// ===================== CAlignment ====================== + +CAlignment::CAlignment() : CStream() { + InitAlignment(); +} + +CAlignment::CAlignment ( RPCStream Object ) : CStream ( Object ) { + InitAlignment(); +} + +CAlignment::~CAlignment() { + FreeMemory(); +} + +void CAlignment::InitAlignment() { + Space = '-'; + SLen = 0; + TLen = 0; + VT = NULL; + ET = NULL; + FT = NULL; + AlgnS = NULL; + AlgnT = NULL; + AlignKey = ALIGN_GLOBAL; + VAchieved = 0.0; + SEq = 2.0; + SNEq = -1.0; + Wg = 0.0; + Ws = -1.0; +} + +void CAlignment::FreeMemory() { + FreeMatrixMemory ( VT,TLen+1,0,0 ); + FreeMatrixMemory ( ET,TLen+1,0,0 ); + FreeMatrixMemory ( FT,TLen+1,0,0 ); + if (AlgnS) { + delete[] AlgnS; + AlgnS = NULL; + } + if (AlgnT) { + delete[] AlgnT; + AlgnT = NULL; + } + TLen = 0; + SLen = 0; +} + +void CAlignment::SetAffineModel ( realtype WGap, realtype WSpace ) { + Wg = WGap; + Ws = WSpace; +} + +void CAlignment::SetScores ( realtype SEqual, realtype SNEqual ) { + SEq = SEqual; + SNEq = SNEqual; +} + +void CAlignment::Align ( cpstr S, cpstr T, int Method ) { +int i,j,i0,j0; + + FreeMemory(); + + AlignKey = Method; + + switch (Method) { + + default : + case ALIGN_GLOBAL : // global pairwise alignment of S and T + BuildGATable ( S,T, False,False ); + VAchieved = VT[TLen][SLen]; + Backtrace ( S,T,SLen,TLen,False ); + if ((AlgnS[0]!=Space) && (AlgnT[0]!=Space)) + VAchieved -= Wg; + break; + + case ALIGN_LOCAL : // local pairwise alignment of S and T + BuildLATable ( S,T ); + VAchieved = 0.0; + i0 = -1; + j0 = -1; + for (i=0;i<=TLen;i++) + for (j=0;j<=SLen;j++) + if (VT[i][j]>VAchieved) { + VAchieved = VT[i][j]; + i0 = i; + j0 = j; + } + Backtrace ( S,T,j0,i0,True ); + break; + + case ALIGN_GLOBLOC : // global alignment with non-penalized + // end gaps in T + BuildGATable ( S,T,False,True ); + VAchieved = -MaxReal; + i0 = -1; + j0 = -1; + for (i=0;i<=TLen;i++) + if (VT[i][SLen]>VAchieved) { + VAchieved = VT[i][SLen]; + i0 = i; + j0 = SLen; + } + Backtrace ( S,T,j0,i0,False ); + AdjustEnds ( S,T,j0,i0 ); + break; + + case ALIGN_FREEENDS : // global alignment with non-penalized + // end gaps in both S and T + BuildGATable ( S,T,True,True ); + VAchieved = -MaxReal; + i0 = -1; + j0 = -1; + for (i=0;i<=TLen;i++) + if (VT[i][SLen]>VAchieved) { + VAchieved = VT[i][SLen]; + i0 = i; + j0 = SLen; + } + for (j=0;j<=SLen;j++) + if (VT[TLen][j]>VAchieved) { + VAchieved = VT[TLen][j]; + i0 = TLen; + j0 = j; + } + Backtrace ( S,T,j0,i0,False ); + AdjustEnds ( S,T,j0,i0 ); + + } + +} + + +void CAlignment::BuildGATable ( cpstr S, cpstr T, + Boolean FreeSEnd, + Boolean FreeTEnd ) { +int i,j; +realtype V1; + + SLen = strlen ( S ); + TLen = strlen ( T ); + GetMatrixMemory ( VT,TLen+1,SLen+1,0,0 ); + GetMatrixMemory ( ET,TLen+1,SLen+1,0,0 ); + GetMatrixMemory ( FT,TLen+1,SLen+1,0,0 ); + + // Base conditions + if (FreeSEnd || FreeTEnd) VT[0][0] = RMax(0.0,Wg); + else VT[0][0] = Wg; + ET[0][0] = VT[0][0]; + FT[0][0] = VT[0][0]; + + if (FreeTEnd) + for (i=1;i<=TLen;i++) { + V1 = RMax ( 0.0,VT[i-1][0]+Ws ); + VT[i][0] = V1; + ET[i][0] = V1; + } + else + for (i=1;i<=TLen;i++) { + V1 = VT[i-1][0] + Ws; + VT[i][0] = V1; + ET[i][0] = V1; + } + + if (FreeSEnd) + for (j=1;j<=SLen;j++) { + V1 = RMax ( 0.0,VT[0][j-1]+Ws ); + VT[0][j] = V1; + FT[0][j] = V1; + } + else + for (j=1;j<=SLen;j++) { + V1 = VT[0][j-1] + Ws; + VT[0][j] = V1; + FT[0][j] = V1; + } + + // Recurrence + for (i=1;i<=TLen;i++) + for (j=1;j<=SLen;j++) { + V1 = VT[i-1][j-1] + Score(T[i-1],S[j-1]); + ET[i][j] = RMax ( ET[i][j-1]+Ws,VT[i][j-1]+Wg+Ws ); + FT[i][j] = RMax ( FT[i-1][j]+Ws,VT[i-1][j]+Wg+Ws ); + VT[i][j] = RMax ( RMax(V1,ET[i][j]),FT[i][j] ); + } + + FreeMatrixMemory ( ET,TLen+1,0,0 ); + FreeMatrixMemory ( FT,TLen+1,0,0 ); + +// PrintVT ( S,T ); + +} + + +void CAlignment::BuildLATable ( cpstr S, cpstr T ) { +int i,j; +realtype V1; + + SLen = strlen ( S ); + TLen = strlen ( T ); + GetMatrixMemory ( VT,TLen+1,SLen+1,0,0 ); + GetMatrixMemory ( ET,TLen+1,SLen+1,0,0 ); + GetMatrixMemory ( FT,TLen+1,SLen+1,0,0 ); + + // Base conditions + VT[0][0] = RMax ( 0.0,Wg ); + ET[0][0] = VT[0][0]; + FT[0][0] = VT[0][0]; + for (i=1;i<=TLen;i++) { + V1 = RMax ( 0.0,VT[i-1][0]+Ws ); + VT[i][0] = V1; + ET[i][0] = V1; + } + for (j=1;j<=SLen;j++) { + V1 = RMax ( 0.0,VT[0][j-1]+Ws ); + VT[0][j] = V1; + FT[0][j] = V1; + } + + // Recurrence + for (i=1;i<=TLen;i++) + for (j=1;j<=SLen;j++) { + V1 = VT[i-1][j-1] + Score(T[i-1],S[j-1]); + ET[i][j] = RMax ( ET[i][j-1]+Ws,VT[i][j-1]+Wg+Ws ); + FT[i][j] = RMax ( FT[i-1][j]+Ws,VT[i-1][j]+Wg+Ws ); + VT[i][j] = RMax ( RMax(V1,ET[i][j]),RMax(0.0,FT[i][j]) ); + } + + FreeMatrixMemory ( ET,TLen+1,0,0 ); + FreeMatrixMemory ( FT,TLen+1,0,0 ); + +// PrintVT ( S,T ); + +} + +void CAlignment::PrintVT ( cpstr S, cpstr T ) { +int i,j; + printf ( "\n " ); + for (j=0;j<=SLen;j++) + printf ( " %2i",j ); + printf ( " \n " ); + for (j=1;j<=SLen;j++) + printf ( " %c ",S[j-1] ); + printf ( " \n\n " ); + for (i=0;i<=TLen;i++) { + if (i>0) printf ( " %2i %c ",i,T[i-1] ); + else printf ( " %2i ",i ); + for (j=0;j<=SLen;j++) + printf ( " %2i",mround(VT[i][j]) ); + printf ( " \n " ); + } + printf ( " \n" ); +} + + +void CAlignment::Backtrace ( cpstr S, cpstr T, int J, int I, + Boolean StopAtZero ) { +int i,j,k, i1,j1, sk,tk; +char C; +realtype V,SV,TV; +Boolean Stop; + + // 1. Allocate memory + + if (AlgnS) delete[] AlgnS; + if (AlgnT) delete[] AlgnT; + + i = SLen+TLen+1; + AlgnS = new char[i]; + AlgnT = new char[i]; + memset ( AlgnS,Space,i ); + memset ( AlgnT,Space,i ); + + // 2. Initialize backtracing + i = I; // backtracing + j = J; // indices + k = 0; // alignment index + SV = 0.0; sk = -1; // alignment indices and leading elements + TV = 0.0; tk = -1; // for vertical and horizontal sections + + + // 3. Backtracing + Stop = False; + while ((!Stop) && (i>0) && (j>0)) { + + V = VT[i][j]; + + // find next leading element + if (VT[i][j-1]>VT[i-1][j]) { + i1 = i; j1 = j-1; + } else { + i1 = i-1; j1 = j; + } + if (VT[i-1][j-1]>=VT[i1][j1]) { + i1 = i-1; j1 = j-1; + } + +//printf ( " i=%i j=%i \n",i,j ); + + Stop = StopAtZero && (VT[i1][j1]<=0.0); // used at local alignment + + // treat horizontal section + if ((sk<0) || (V>SV)) { + sk = k; + SV = V; + } + if ((j1!=j) || Stop) { // end of horizontal section + AlgnS[sk] = S[j-1]; + sk = -1; + } + + // treat vertical section + if ((tk<0) || (V>TV)) { + tk = k; + TV = V; + } + if ((i1!=i) || Stop) { // end of vertical section + AlgnT[tk] = T[i-1]; + tk = -1; + } + + i = i1; + j = j1; + k++; + + } + + if (!StopAtZero) { + // 4. Finish the last horizontal section + sk = k; + while (j>0) AlgnS[k++] = S[--j]; + // 5. Finish the last vertical section + while (i>0) AlgnT[sk++] = T[--i]; + k = IMax ( k,sk ); + } + + // 6. Put the termination character + AlgnS[k] = char(0); + AlgnT[k] = char(0); + + // 7. Reverse the strings + i = 0; + j = k-1; + if (StopAtZero) { + // should work only for local alignment + while ((j>0) && ((AlgnS[j]==Space) || (AlgnT[j]==Space))) j--; + k = j+1; + AlgnS[k] = char(0); + AlgnT[k] = char(0); + } + while (j>i) { + C = AlgnS[i]; AlgnS[i] = AlgnS[j]; AlgnS[j] = C; + C = AlgnT[i]; AlgnT[i] = AlgnT[j]; AlgnT[j] = C; + i++; + j--; + } + + // 8. Collapse the alternating spaces + do { + k = 0; + i = 0; + while (AlgnS[k]) { + if ((AlgnS[k]==Space) && (AlgnT[k]==Space)) k++; + else if ((AlgnS[k]==Space) && (AlgnS[k+1]!=Space) && + (AlgnT[k]!=Space) && (AlgnT[k+1]==Space)) { + AlgnS[i] = AlgnS[k+1]; + AlgnT[i] = AlgnT[k]; + k++; + } else if ((AlgnS[k]!=Space) && (AlgnS[k+1]==Space) && + (AlgnT[k]==Space) && (AlgnT[k+1]!=Space)) { + AlgnS[i] = AlgnS[k]; + AlgnT[i] = AlgnT[k+1]; + k++; + } else if (i!=k) { + AlgnS[i] = AlgnS[k]; + AlgnT[i] = AlgnT[k]; + } + if (AlgnS[k]) { + k++; + i++; + } + } + if (i!=k) { // terminating character + AlgnS[i] = AlgnS[k]; + AlgnT[i] = AlgnT[k]; + } + } while (k>i); + +} + + +void CAlignment::AdjustEnds ( cpstr S, cpstr T, int J, int I ) { +int si,ti,m; + + if (JI) { + k = J-I; + strcat ( AlgnT,&(T[IMax(0,TLen-k)]) ); + k = strlen ( AlgnS ); + m = strlen ( AlgnT ); + while (kJ) { + k = I-J; + strcat ( AlgnS,&(S[IMax(0,SLen-k)]) ); + k = strlen ( AlgnT ); + m = strlen ( AlgnS ); + while (k0.0) && (a>0.0)) return s/a; + return 0.0; + +} + + +realtype CAlignment::GetSeqId() { +realtype s; +int i,n,ne,ns,nt; + + ne = 0; + ns = 0; + nt = 0; + n = IMin ( strlen(AlgnS),strlen(AlgnT) ); + + for (i=0;i0.0) return ne/s; + return 0.0; + +} + + +#define WrapPeriod 61 + +void CAlignment::OutputResults ( RCFile f, cpstr S, cpstr T ) { +int k,l,n; +char P[3]; + + P[1] = char(0); + if ((!AlgnS) || (!AlgnT)) { + f.LF(); + f.WriteLine ( pstr(" NO ALIGNMENT HAS BEEN DONE.") ); + f.shut(); + return; + } + f.LF(); + f.WriteLine ( pstr(" ======== INPUT DATA") ); + f.LF(); + f.WriteLine ( pstr(" String S:") ); + f.Write ( pstr(" ") ); + l = 1; + k = 0; + while (S[k]) { + P[0] = S[k++]; + f.Write ( P ); + l++; + if (l>=WrapPeriod) { + f.LF(); f.Write ( pstr(" ") ); l = 1; + } + } + f.LF(); + f.LF(); + f.WriteLine ( pstr(" String T:") ); + f.Write ( pstr(" ") ); + l = 1; + k = 0; + while (T[k]) { + P[0] = T[k++]; + f.Write ( P ); + l++; + if (l>=WrapPeriod) { + f.LF(); f.Write ( pstr(" ") ); l = 1; + } + } + f.LF(); + f.LF(); + f.WriteParameter ( pstr(" Score equal") ,SEq ,20,10 ); + f.WriteParameter ( pstr(" Score unequal"),SNEq,20,10 ); + f.LF(); + f.WriteParameter ( pstr(" Gap weight") ,Wg ,20,10 ); + f.WriteParameter ( pstr(" Space weight") ,Ws ,20,10 ); + f.LF(); + f.LF(); + f.Write ( pstr(" ======== RESULT OF ") ); + switch (AlignKey) { + default : + case ALIGN_GLOBAL : f.Write ( pstr("GLOBAL") ); break; + case ALIGN_LOCAL : f.Write ( pstr("LOCAL") ); break; + case ALIGN_GLOBLOC : f.Write ( pstr("GLOBAL/LOCAL") ); break; + case ALIGN_FREEENDS : f.Write ( pstr("FREE-ENDS") ); + } + f.WriteLine ( pstr(" ALIGNMENT") ); + f.LF(); + if (AlignKey==ALIGN_GLOBLOC) { + f.WriteLine ( pstr(" End gaps in T-string were not penalized") ); + f.LF(); + } + f.WriteParameter ( pstr(" Highest score achieved:"),VAchieved,26,10 ); + f.LF(); + f.WriteLine ( pstr(" Aligned S (upper string) and T (lower string):") ); + f.LF(); + k = 0; + n = 0; + l = 1; f.Write ( pstr(" ") ); + while (AlgnS[k]) { + P[0] = AlgnS[k++]; + f.Write ( P ); + l++; + if ((l>=WrapPeriod) || (!AlgnS[k])) { + f.LF(); f.Write ( pstr(" ") ); l = 1; + while (AlgnT[n] && (lVAchieved) { + VAchieved = VT[i][j]; + i0 = i; + j0 = j; + } + Backtrace ( S,T,j0,i0,True ); + break; + + case ALIGN_GLOBLOC : // global alignment with non-penalized + // end gaps in T + BuildGATable ( S,T,False,True ); + VAchieved = -MaxReal; + i0 = -1; + j0 = -1; + for (i=0;i<=TLen;i++) + if (VT[i][SLen]>VAchieved) { + VAchieved = VT[i][SLen]; + i0 = i; + j0 = SLen; + } + Backtrace ( S,T,j0,i0,False ); + AdjustEnds ( S,T,j0,i0 ); + break; + + case ALIGN_FREEENDS : // global alignment with non-penalized + // end gaps in both S and T + BuildGATable ( S,T,True,True ); + VAchieved = -MaxReal; + i0 = -1; + j0 = -1; + for (i=0;i<=TLen;i++) + if (VT[i][SLen]>VAchieved) { + VAchieved = VT[i][SLen]; + i0 = i; + j0 = SLen; + } + for (j=0;j<=SLen;j++) + if (VT[TLen][j]>VAchieved) { + VAchieved = VT[TLen][j]; + i0 = TLen; + j0 = j; + } + Backtrace ( S,T,j0,i0,False ); + AdjustEnds ( S,T,j0,i0 ); + } + +} + + +void CAlignment1::BuildGATable ( ivector S, ivector T, + Boolean FreeSEnd, + Boolean FreeTEnd ) { +int i,j; +realtype V1; + + GetMatrixMemory ( VT,TLen+1,SLen+1,0,0 ); + GetMatrixMemory ( ET,TLen+1,SLen+1,0,0 ); + GetMatrixMemory ( FT,TLen+1,SLen+1,0,0 ); + + // Base conditions + if (FreeSEnd || FreeTEnd) VT[0][0] = RMax(0.0,Wg); + else VT[0][0] = Wg; + ET[0][0] = VT[0][0]; + FT[0][0] = VT[0][0]; + + if (FreeTEnd) + for (i=1;i<=TLen;i++) { + V1 = RMax ( 0.0,VT[i-1][0]+Ws ); + VT[i][0] = V1; + ET[i][0] = V1; + } + else + for (i=1;i<=TLen;i++) { + V1 = VT[i-1][0] + Ws; + VT[i][0] = V1; + ET[i][0] = V1; + } + + if (FreeSEnd) + for (j=1;j<=SLen;j++) { + V1 = RMax ( 0.0,VT[0][j-1]+Ws ); + VT[0][j] = V1; + FT[0][j] = V1; + } + else + for (j=1;j<=SLen;j++) { + V1 = VT[0][j-1] + Ws; + VT[0][j] = V1; + FT[0][j] = V1; + } + + // Recurrence + for (i=1;i<=TLen;i++) + for (j=1;j<=SLen;j++) { + V1 = VT[i-1][j-1] + Score(T[i-1],S[j-1]); + ET[i][j] = RMax ( ET[i][j-1]+Ws,VT[i][j-1]+Wg+Ws ); + FT[i][j] = RMax ( FT[i-1][j]+Ws,VT[i-1][j]+Wg+Ws ); + VT[i][j] = RMax ( RMax(V1,ET[i][j]),FT[i][j] ); + } + + FreeMatrixMemory ( ET,TLen+1,0,0 ); + FreeMatrixMemory ( FT,TLen+1,0,0 ); + +// PrintVT ( S,T ); + +} + + +void CAlignment1::BuildLATable ( ivector S, ivector T ) { +int i,j; +realtype V1; + + GetMatrixMemory ( VT,TLen+1,SLen+1,0,0 ); + GetMatrixMemory ( ET,TLen+1,SLen+1,0,0 ); + GetMatrixMemory ( FT,TLen+1,SLen+1,0,0 ); + + // Base conditions + VT[0][0] = RMax ( 0.0,Wg ); + ET[0][0] = VT[0][0]; + FT[0][0] = VT[0][0]; + for (i=1;i<=TLen;i++) { + V1 = RMax ( 0.0,VT[i-1][0]+Ws ); + VT[i][0] = V1; + ET[i][0] = V1; + } + for (j=1;j<=SLen;j++) { + V1 = RMax ( 0.0,VT[0][j-1]+Ws ); + VT[0][j] = V1; + FT[0][j] = V1; + } + + // Recurrence + for (i=1;i<=TLen;i++) + for (j=1;j<=SLen;j++) { + V1 = VT[i-1][j-1] + Score(T[i-1],S[j-1]); + ET[i][j] = RMax ( ET[i][j-1]+Ws,VT[i][j-1]+Wg+Ws ); + FT[i][j] = RMax ( FT[i-1][j]+Ws,VT[i-1][j]+Wg+Ws ); + VT[i][j] = RMax ( RMax(V1,ET[i][j]),RMax(0.0,FT[i][j]) ); + } + + FreeMatrixMemory ( ET,TLen+1,0,0 ); + FreeMatrixMemory ( FT,TLen+1,0,0 ); + +// PrintVT ( S,T ); + +} + +void CAlignment1::PrintVT ( ivector S, ivector T ) { +int i,j; + printf ( "\n " ); + for (j=0;j<=SLen;j++) + printf ( " %2i",j ); + printf ( " \n " ); + for (j=1;j<=SLen;j++) + printf ( " %3i ",S[j-1] ); + printf ( " \n\n " ); + for (i=0;i<=TLen;i++) { + if (i>0) printf ( " %2i %3i ",i,T[i-1] ); + else printf ( " %2i ",i ); + for (j=0;j<=SLen;j++) + printf ( " %2i",mround(VT[i][j]) ); + printf ( " \n " ); + } + printf ( " \n" ); +} + + +void CAlignment1::Backtrace ( ivector S, ivector T, int J, int I, + Boolean StopAtZero ) { +int i,j,k, i1,j1, sk,tk; +int C; +realtype V,SV,TV; +Boolean Stop; + + // 1. Allocate memory + + FreeVectorMemory ( AlgnS,0 ); + FreeVectorMemory ( AlgnT,0 ); + AlgnLen = 0; + + k = SLen+TLen+1; + GetVectorMemory ( AlgnS,k,0 ); + GetVectorMemory ( AlgnT,k,0 ); + for (i=0;i0) && (j>0)) { + + V = VT[i][j]; + + // find next leading element + if (VT[i][j-1]>VT[i-1][j]) { + i1 = i; j1 = j-1; + } else { + i1 = i-1; j1 = j; + } + if (VT[i-1][j-1]>=VT[i1][j1]) { + i1 = i-1; j1 = j-1; + } + + Stop = StopAtZero && (VT[i1][j1]<=0.0); // used at local alignment + + // treat horizontal section + if ((sk<0) || (V>SV)) { + sk = k; + SV = V; + } + if ((j1!=j) || Stop) { // end of horizontal section + AlgnS[sk] = S[j-1]; + sk = -1; + } + + // treat vertical section + if ((tk<0) || (V>TV)) { + tk = k; + TV = V; + } + if ((i1!=i) || Stop) { // end of vertical section + AlgnT[tk] = T[i-1]; + tk = -1; + } + + i = i1; + j = j1; + k++; + + } + + if (!StopAtZero) { + // 4. Finish the last horizontal section + sk = k; + while (j>0) AlgnS[k++] = S[--j]; + // 5. Finish the last vertical section + while (i>0) AlgnT[sk++] = T[--i]; + k = IMax ( k,sk ); + } + + // 6. Put the termination character + AlgnLen = k; + + // 7. Reverse the strings + i = 0; + j = k-1; + if (StopAtZero) { + // should work only for local alignment + while ((j>0) && ((AlgnS[j]==Space) || (AlgnT[j]==Space))) j--; + AlgnLen = j+1; + } + while (j>i) { + C = AlgnS[i]; AlgnS[i] = AlgnS[j]; AlgnS[j] = C; + C = AlgnT[i]; AlgnT[i] = AlgnT[j]; AlgnT[j] = C; + i++; + j--; + } + + // 8. Filter out parasite spaces + k = 0; + i = 0; + while (ki); + + +} + + +void CAlignment1::AdjustEnds ( ivector S, ivector T, int J, int I ) { +int is,it; + is = J; + it = I; + while ((is0.0) && (a>0.0)) return s/a; + return 0.0; + +} + + +void CAlignment1::OutputResults ( RCFile f, ivector S, int lenS, + ivector T, int lenT ) { +int k,l,n; +char P[10]; + + if ((!AlgnS) || (!AlgnT)) { + f.LF(); + f.WriteLine ( pstr(" NO ALIGNMENT HAS BEEN DONE.") ); + f.shut(); + return; + } + f.LF(); + f.WriteLine ( pstr(" ======== INPUT DATA") ); + f.LF(); + f.WriteLine ( pstr(" String S:") ); + f.Write ( pstr(" ") ); + l = 1; + k = 0; + while (k=WrapPeriod) { + f.LF(); f.Write ( pstr(" ") ); l = 1; + } + } + f.LF(); + f.LF(); + f.WriteLine ( pstr(" String T:") ); + f.Write ( pstr(" ") ); + l = 1; + k = 0; + while (k=WrapPeriod) { + f.LF(); f.Write ( pstr(" ") ); l = 1; + } + } + f.LF(); + f.LF(); + f.WriteParameter ( pstr(" Score equal") ,SEq ,20,10 ); + f.WriteParameter ( pstr(" Score unequal"),SNEq,20,10 ); + f.LF(); + f.WriteParameter ( pstr(" Gap weight") ,Wg ,20,10 ); + f.WriteParameter ( pstr(" Space weight") ,Ws ,20,10 ); + f.LF(); + f.LF(); + f.Write ( pstr(" ======== RESULT OF ") ); + switch (AlignKey) { + default : + case ALIGN_GLOBAL : f.Write ( pstr("GLOBAL") ); break; + case ALIGN_LOCAL : f.Write ( pstr("LOCAL") ); break; + case ALIGN_GLOBLOC : f.Write ( pstr("GLOBAL/LOCAL") ); break; + case ALIGN_FREEENDS : f.Write ( pstr("FREE-ENDS") ); + } + f.WriteLine ( pstr(" ALIGNMENT") ); + f.LF(); + if (AlignKey==ALIGN_GLOBLOC) { + f.WriteLine ( pstr(" End gaps in T-string were not penalized") ); + f.LF(); + } + f.WriteParameter ( pstr(" Highest score achieved:"), + VAchieved,26,10 ); + f.LF(); + f.WriteLine ( pstr(" Aligned S (upper string) and T " + "(lower string):") ); + f.LF(); + k = 0; + n = 0; + l = 1; f.Write ( pstr(" ") ); + while (k=WrapPeriod) || (!AlgnS[k])) { + f.LF(); f.Write ( pstr(" ") ); l = 1; + while ((n +// ~~~~~~~~~ +// **** Classes : CAlignment ( alignment of character strings ) +// ~~~~~~~~~~~~ CAlignment1 ( alignment of integer vectors ) +// +// (C) E.Krissinel' 2000-2011 +// +// ================================================================= +// + +#ifndef __MMDB_Align__ +#define __MMDB_Align__ + +#ifndef __Stream__ +#include "stream_.h" +#endif + + +// ===================== CAlignParams ====================== + + +DefineClass(CAlignParams); +DefineStreamFunctions(CAlignParams); + +class CAlignParams : public CStream { + + public : + + realtype gapWeight,spaceWeight; + realtype equalScore,nequalScore; + int method; + + CAlignParams(); + CAlignParams ( RPCStream Object ); + + void write ( RCFile f ); + void read ( RCFile f ); + + protected : + void InitAlignParams(); + +}; + + +// ===================== CAlignment ====================== + +DefineClass(CAlignment); + +#define ALIGN_GLOBAL 0 +#define ALIGN_LOCAL 1 +#define ALIGN_GLOBLOC 2 +#define ALIGN_FREEENDS 3 + +class CAlignment : public CStream { + + public : + + CAlignment (); + CAlignment ( RPCStream Object ); + ~CAlignment (); + + void SetAffineModel ( realtype WGap, realtype WSpace ); + void SetScores ( realtype SEqual, realtype SNEqual ); + + void Align ( cpstr S, cpstr T, int Method=ALIGN_GLOBAL ); + + pstr GetAlignedS() { return AlgnS; } + pstr GetAlignedT() { return AlgnT; } + realtype GetScore () { return VAchieved; } + char GetSpace () { return Space; } + + realtype GetSimilarity(); // Score-weighted sequence id + realtype GetSeqId (); // Primitive sequence id + + virtual void OutputResults ( RCFile f, cpstr S, cpstr T ); + + void read ( RCFile f ); + void write ( RCFile f ); + + protected : + + char Space; + int AlignKey, SLen,TLen; + rmatrix VT,ET,FT; + pstr AlgnS,AlgnT; + realtype VAchieved; + realtype SEq,SNEq, Wg,Ws; + + virtual void InitAlignment(); + virtual void FreeMemory (); + virtual realtype Score ( char A, char B ); + + void BuildGATable ( cpstr S, cpstr T, + Boolean FreeSEnd, Boolean FreeTEnd ); + void BuildLATable ( cpstr S, cpstr T ); + void Backtrace ( cpstr S, cpstr T, int J, int I, + Boolean StopAtZero ); + void AdjustEnds ( cpstr S, cpstr T, int J, int I ); + void PrintVT ( cpstr S, cpstr T ); + +}; + + + +// ===================== CAlignment1 ====================== + +DefineClass(CAlignment1); + +class CAlignment1 : public CStream { + + public : + + CAlignment1 (); + CAlignment1 ( RPCStream Object ); + ~CAlignment1(); + + void SetAffineModel ( realtype WGap, realtype WSpace ); + void SetScores ( realtype SEqual, realtype SNEqual ); + + void Align ( ivector S, int SLength, + ivector T, int TLength, + int Method=ALIGN_GLOBAL ); + + ivector GetAlignedS () { return AlgnS; } + ivector GetAlignedT () { return AlgnT; } + int GetAlignLength() { return AlgnLen; } + realtype GetScore () { return VAchieved; } + + realtype GetSimilarity(); // Score-weighted sequence id + + virtual void OutputResults ( RCFile f, ivector S, int lenS, + ivector T, int lenT ); + + void read ( RCFile f ); + void write ( RCFile f ); + + protected : + + int Space; + int AlignKey, SLen,TLen, AlgnLen; + rmatrix VT,ET,FT; + ivector AlgnS,AlgnT; + realtype VAchieved; + realtype SEq,SNEq, Wg,Ws; + + virtual void InitAlignment1(); + virtual void FreeMemory (); + virtual realtype Score ( int A, int B ); + + void BuildGATable ( ivector S, ivector T, + Boolean FreeSEnds, Boolean FreeTEnds ); + void BuildLATable ( ivector S, ivector T ); + void Backtrace ( ivector S, ivector T, int J, int I, + Boolean StopAtZero ); + void AdjustEnds ( ivector S, ivector T, int J, int I ); + void PrintVT ( ivector S, ivector T ); + +}; + + +#endif diff --git a/mmdb/mmdb_atom.cpp b/mmdb/mmdb_atom.cpp new file mode 100755 index 0000000..b9c3285 --- /dev/null +++ b/mmdb/mmdb_atom.cpp @@ -0,0 +1,3495 @@ +// $Id: mmdb_atom.cpp,v 1.31 2012/01/26 17:52:20 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 23.04.13 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : MMDB_Atom +// ~~~~~~~~~ +// **** Project : MacroMolecular Data Base (MMDB) +// ~~~~~~~~~ +// **** Classes : CAtom ( atom class ) +// ~~~~~~~~~ CResidue ( residue class ) +// +// Copyright (C) E. Krissinel 2000-2013 +// +// ================================================================= +// + +#ifndef __STRING_H +#include +#endif + +#ifndef __STDLIB_H +#include +#endif + +#ifndef __MATH_H +#include +#endif + +#ifndef __MMDB_Chain__ +#include "mmdb_chain.h" +#endif + +#ifndef __MMDB_Model__ +#include "mmdb_model.h" +#endif + +#ifndef __MMDB_File__ +#include "mmdb_file.h" +#endif + +#ifndef __MMDB_Tables__ +#include "mmdb_tables.h" +#endif + +#ifndef __MMDB_CIFDefs__ +#include "mmdb_cifdefs.h" +#endif + +#ifndef IOTBX_PDB_HYBRID_36_C_H +#include "hybrid_36.h" +#endif + + +// ================================================================ + +#define ASET_ShortBinary 0x10000000 +#define ASET_ShortTer 0x20000000 +#define ASET_ShortHet 0x40000000 + +Boolean ignoreSegID = False; +Boolean ignoreElement = False; +Boolean ignoreCharge = False; +Boolean ignoreNonCoorPDBErrors = False; +Boolean ignoreUnmatch = False; + + +// ========================== CAtom ============================= + +CAtom::CAtom() : CUDData() { + InitAtom(); +} + +CAtom::CAtom ( PCResidue res ) : CUDData() { + InitAtom(); + if (res) + res->AddAtom ( this ); +} + +CAtom::CAtom ( RPCStream Object ) : CUDData(Object) { + InitAtom(); +} + +CAtom::~CAtom() { +int nA; +PPCAtom A; + FreeMemory(); + if (residue) { + A = NULL; + nA = 0; + if (residue->chain) { + if (residue->chain->model) { + A = residue->chain->model->GetAllAtoms(); + nA = residue->chain->model->GetNumberOfAllAtoms(); + } + } + residue->_ExcludeAtom ( index ); + if ((0index; + else AtomBondI[i].index = -1; + AtomBondI[i].order = Bond[i].order; + } + + } + +} + +void CAtom::GetBonds ( PSAtomBondI AtomBondI, int & nAtomBonds, + int maxlength ) { +// This GetBonds(..) does not dispose or allocate AtomBond. +// It is assumed that length of AtomBond is sufficient to +// accomodate all bonded atoms. +int i; + + nAtomBonds = IMin(maxlength,nBonds & 0x000000FF); + + for (i=0;iindex; + else AtomBondI[i].index = -1; + AtomBondI[i].order = Bond[i].order; + } + +} + + +int CAtom::AddBond ( PCAtom bond_atom, int bond_order, + int nAdd_bonds ) { +PSAtomBond B1; +int i,k,nb,nballoc; + + nb = nBonds & 0x000000FF; + k = -1; + for (i=0;(i=0) return -k; + + nballoc = (nBonds >> 8) & 0x000000FF; + if (nBonds>=nballoc) { + nballoc += nAdd_bonds; + B1 = new SAtomBond[nballoc]; + for (i=0;i99999) { + hy36encode ( 5,serNum,N ); + strcpy_n ( &(S[6]),N,5 ); + } else if (serNum>0) + PutInteger ( &(S[6]),serNum,5 ); + else if (index<=99999) + PutInteger ( &(S[6]),index,5 ); + else { + hy36encode ( 5,index,N ); + strcpy_n ( &(S[6]),N,5 ); + } + if (!Ter) { + if (altLoc[0]) S[16] = altLoc[0]; + strcpy_n ( &(S[12]),name ,4 ); + strcpy_n ( &(S[72]),segID ,4 ); + strcpy_nr ( &(S[76]),element,2 ); + if (WhatIsSet & ASET_Charge) { + if (charge>0) sprintf ( N,"%1i+",mround(charge) ); + else if (charge<0) sprintf ( N,"%1i-",mround(-charge) ); + else strcpy ( N," " ); + strcpy_n ( &(S[78]),N,2 ); + } else + strcpy_n ( &(S[78])," ",2 ); + } + strcpy_nr ( &(S[17]),residue->name,3 ); + strcpy_nr ( &(S[20]),residue->chain->chainID,2 ); + if (residue->seqNum>MinInt4) { + if ((-999<=residue->seqNum) && (residue->seqNum<=9999)) + PutIntIns ( &(S[22]),residue->seqNum,4,residue->insCode ); + else { + hy36encode ( 4,residue->seqNum,N ); + strcpy_n ( &(S[22]),N,4 ); + } + } +} + +void CAtom::PDBASCIIDump ( RCFile f ) { +// makes the ASCII PDB ATOM, HETATM, SIGATOM, ANISOU +// SIGUIJ and TER lines from the class' data +char S[100]; + if (Ter) { + if (WhatIsSet & ASET_Coordinates) { + StandardPDBOut ( pstr("TER"),S ); + f.WriteLine ( S ); + } + } else { + if (WhatIsSet & ASET_Coordinates) { + if (Het) StandardPDBOut ( pstr("HETATM"),S ); + else StandardPDBOut ( pstr("ATOM") ,S ); + PutRealF ( &(S[30]),x,8,3 ); + PutRealF ( &(S[38]),y,8,3 ); + PutRealF ( &(S[46]),z,8,3 ); + if (WhatIsSet & ASET_Occupancy) + PutRealF ( &(S[54]),occupancy ,6,2 ); + if (WhatIsSet & ASET_tempFactor) + PutRealF ( &(S[60]),tempFactor,6,2 ); + f.WriteLine ( S ); + } + if (WhatIsSet & ASET_CoordSigma) { + StandardPDBOut ( pstr("SIGATM"),S ); + PutRealF ( &(S[30]),sigX,8,3 ); + PutRealF ( &(S[38]),sigY,8,3 ); + PutRealF ( &(S[46]),sigZ,8,3 ); + if ((WhatIsSet & ASET_OccSigma) && + (WhatIsSet & ASET_Occupancy)) + PutRealF ( &(S[54]),sigOcc,6,2 ); + if ((WhatIsSet & ASET_tFacSigma) && + (WhatIsSet & ASET_tempFactor)) + PutRealF ( &(S[60]),sigTemp,6,2 ); + f.WriteLine ( S ); + } + if (WhatIsSet & ASET_Anis_tFac) { + StandardPDBOut ( pstr("ANISOU"),S ); + PutInteger ( &(S[28]),mround(u11*1.0e4),7 ); + PutInteger ( &(S[35]),mround(u22*1.0e4),7 ); + PutInteger ( &(S[42]),mround(u33*1.0e4),7 ); + PutInteger ( &(S[49]),mround(u12*1.0e4),7 ); + PutInteger ( &(S[56]),mround(u13*1.0e4),7 ); + PutInteger ( &(S[63]),mround(u23*1.0e4),7 ); + f.WriteLine ( S ); + if (WhatIsSet & ASET_Anis_tFSigma) { + StandardPDBOut ( pstr("SIGUIJ"),S ); + PutInteger ( &(S[28]),mround(su11*1.0e4),7 ); + PutInteger ( &(S[35]),mround(su22*1.0e4),7 ); + PutInteger ( &(S[42]),mround(su33*1.0e4),7 ); + PutInteger ( &(S[49]),mround(su12*1.0e4),7 ); + PutInteger ( &(S[56]),mround(su13*1.0e4),7 ); + PutInteger ( &(S[63]),mround(su23*1.0e4),7 ); + f.WriteLine ( S ); + } + } + } +} + +void CAtom::MakeCIF ( PCMMCIFData CIF ) { +PCMMCIFLoop Loop; +AtomName AtName; +Element el; +char N[10]; +int i,j,RC; +PCChain chain = NULL; +PCModel model = NULL; +//Boolean singleModel = True; + + if (residue) chain = residue->chain; + if (chain) model = PCModel(chain->model); +// if (model) { +// if (model->manager) +// singleModel = PCMMDBFile(model->manager)->nModels<=1; +// } + +/* + +loop_ +*0 _atom_site.group_PDB +*1 _atom_site.id +*2 _atom_site.type_symbol <- chem elem +-3 _atom_site.label_atom_id <- atom name +*4 _atom_site.label_alt_id <- alt code +=5 _atom_site.label_comp_id <- res name ??? +=6 _atom_site.label_asym_id <- chain id ??? +=7 _atom_site.label_entity_id < ??? +=8 _atom_site.label_seq_id <- poly seq id ++9 _atom_site.pdbx_PDB_ins_code <- ins code +-10 _atom_site.segment_id <- segment id +*11 _atom_site.Cartn_x +*12 _atom_site.Cartn_y +*13 _atom_site.Cartn_z +*14 _atom_site.occupancy +*15 _atom_site.B_iso_or_equiv +*16 _atom_site.Cartn_x_esd +*17 _atom_site.Cartn_y_esd +*18 _atom_site.Cartn_z_esd +*19 _atom_site.occupancy_esd +*20 _atom_site.B_iso_or_equiv_esd +*21 _atom_site.pdbx_formal_charge ++22 _atom_site.auth_seq_id <- seq id we want ++23 _atom_site.auth_comp_id <- res name we want ++24 _atom_site.auth_asym_id <- ch id we want ? +*25 _atom_site.auth_atom_id <- atom name we want ? ++26 _atom_site.pdbx_PDB_model_num <- model no + +'+' is read in CMMDBFile::CheckAtomPlace() +'=' new in residue +'-' new in atom + + +*/ + + RC = CIF->AddLoop ( CIFCAT_ATOM_SITE,Loop ); + if (RC!=CIFRC_Ok) { + // the category was (re)created, provide tags + + Loop->AddLoopTag ( CIFTAG_GROUP_PDB ); // ATOM, TER etc. + Loop->AddLoopTag ( CIFTAG_ID ); // serial number + + Loop->AddLoopTag ( CIFTAG_TYPE_SYMBOL ); // element symbol + Loop->AddLoopTag ( CIFTAG_LABEL_ATOM_ID ); // atom name + Loop->AddLoopTag ( CIFTAG_LABEL_ALT_ID ); // alt location + Loop->AddLoopTag ( CIFTAG_LABEL_COMP_ID ); // residue name + Loop->AddLoopTag ( CIFTAG_LABEL_ASYM_ID ); // chain ID + Loop->AddLoopTag ( CIFTAG_LABEL_ENTITY_ID ); // entity ID + Loop->AddLoopTag ( CIFTAG_LABEL_SEQ_ID ); // res seq number + Loop->AddLoopTag ( CIFTAG_PDBX_PDB_INS_CODE ); // insertion code + Loop->AddLoopTag ( CIFTAG_SEGMENT_ID ); // segment ID + + Loop->AddLoopTag ( CIFTAG_CARTN_X ); // x-coordinate + Loop->AddLoopTag ( CIFTAG_CARTN_Y ); // y-coordinate + Loop->AddLoopTag ( CIFTAG_CARTN_Z ); // z-coordinate + Loop->AddLoopTag ( CIFTAG_OCCUPANCY ); // occupancy + Loop->AddLoopTag ( CIFTAG_B_ISO_OR_EQUIV ); // temp factor + + Loop->AddLoopTag ( CIFTAG_CARTN_X_ESD ); // x-sigma + Loop->AddLoopTag ( CIFTAG_CARTN_Y_ESD ); // y-sigma + Loop->AddLoopTag ( CIFTAG_CARTN_Z_ESD ); // z-sigma + Loop->AddLoopTag ( CIFTAG_OCCUPANCY_ESD ); // occupancy-sigma + Loop->AddLoopTag ( CIFTAG_B_ISO_OR_EQUIV_ESD ); // t-factor-sigma + + Loop->AddLoopTag ( CIFTAG_PDBX_FORMAL_CHARGE ); // charge on atom + + Loop->AddLoopTag ( CIFTAG_AUTH_SEQ_ID ); // res seq number + Loop->AddLoopTag ( CIFTAG_AUTH_COMP_ID ); // residue name + Loop->AddLoopTag ( CIFTAG_AUTH_ASYM_ID ); // chain id + Loop->AddLoopTag ( CIFTAG_AUTH_ATOM_ID ); // atom name + + Loop->AddLoopTag ( CIFTAG_PDBX_PDB_MODEL_NUM ); // model number + + } + + if (Ter) { // ter record + + if (!(WhatIsSet & ASET_Coordinates)) + return; + + // (0) + Loop->AddString ( pstr("TER") ); + // (1) + if (serNum>0) Loop->AddInteger ( serNum ); + else Loop->AddInteger ( index ); + // (2,3,4) + Loop->AddNoData ( CIF_NODATA_QUESTION ); // no element symbol + Loop->AddNoData ( CIF_NODATA_QUESTION ); // no atom name + Loop->AddNoData ( CIF_NODATA_QUESTION ); // no alt code + if (residue) { + // (5) + Loop->AddString ( residue->label_comp_id ); + // (6) + Loop->AddString ( residue->label_asym_id ); + // (7) + if (residue->label_entity_id>0) + Loop->AddInteger ( residue->label_entity_id ); + else Loop->AddNoData ( CIF_NODATA_DOT ); + // (8) + if (residue->label_seq_id>MinInt4) + Loop->AddInteger ( residue->label_seq_id ); + else Loop->AddNoData ( CIF_NODATA_DOT ); + // (9) + Loop->AddString ( residue->insCode,True ); + } else { + // (5,6,7,8,9) + Loop->AddString ( NULL ); + Loop->AddString ( NULL ); + Loop->AddNoData ( CIF_NODATA_DOT ); + Loop->AddNoData ( CIF_NODATA_DOT ); + Loop->AddNoData ( CIF_NODATA_DOT ); + } + + // (10-21) + for (i=10;i<=21;i++) + Loop->AddNoData ( CIF_NODATA_QUESTION ); + + // (22,23) + if (residue) { + if (residue->seqNum>MinInt4) + Loop->AddInteger ( residue->seqNum ); + else Loop->AddNoData ( CIF_NODATA_DOT ); + Loop->AddString ( residue->name ); + } else { + Loop->AddNoData ( CIF_NODATA_DOT ); + Loop->AddString ( NULL ); + } + + // (24) + if (chain) Loop->AddString ( chain->chainID,True ); + else Loop->AddString ( NULL ); + + // (25) + Loop->AddNoData ( CIF_NODATA_QUESTION ); // no atom name + + } else if (WhatIsSet & (ASET_Coordinates | ASET_CoordSigma)) { + // normal atom record + + if (!WhatIsSet) return; + + // (0) + if (Het) Loop->AddString ( pstr("HETATM") ); + else Loop->AddString ( pstr("ATOM") ); + // (1) + if (serNum>0) Loop->AddInteger ( serNum ); + else Loop->AddInteger ( index ); + + + if (WhatIsSet & ASET_Coordinates) { + + // (2) + strcpy_css ( el,element ); + Loop->AddString ( el,True ); + // (3) + Loop->AddString ( label_atom_id ); // assigned atom name + // (4) + Loop->AddString ( altLoc,True ); // alt code + + if (residue) { + // (5) + Loop->AddString ( residue->label_comp_id ); + // (6) + Loop->AddString ( residue->label_asym_id ); + // (7) + if (residue->label_entity_id>0) + Loop->AddInteger ( residue->label_entity_id ); + else Loop->AddNoData ( CIF_NODATA_DOT ); + // (8) + if (residue->label_seq_id>MinInt4) + Loop->AddInteger ( residue->label_seq_id ); + else Loop->AddNoData ( CIF_NODATA_DOT ); + // (9) + Loop->AddString ( residue->insCode,True ); + } else { + // (5,6,7,8,9) + Loop->AddString ( NULL ); + Loop->AddString ( NULL ); + Loop->AddNoData ( CIF_NODATA_DOT ); + Loop->AddNoData ( CIF_NODATA_DOT ); + Loop->AddNoData ( CIF_NODATA_DOT ); + } + + // (10) + Loop->AddString ( segID ,True ); + // (11,12,13) + Loop->AddReal ( x ); + Loop->AddReal ( y ); + Loop->AddReal ( z ); + // (14) + if (WhatIsSet & ASET_Occupancy) + Loop->AddReal ( occupancy ); + else Loop->AddNoData ( CIF_NODATA_QUESTION ); + // (15) + if (WhatIsSet & ASET_tempFactor) + Loop->AddReal ( tempFactor ); + else Loop->AddNoData ( CIF_NODATA_QUESTION ); + + // (16,17,18) + if (WhatIsSet & ASET_CoordSigma) { + Loop->AddReal ( sigX ); + Loop->AddReal ( sigY ); + Loop->AddReal ( sigZ ); + } else { + Loop->AddNoData ( CIF_NODATA_QUESTION ); + Loop->AddNoData ( CIF_NODATA_QUESTION ); + Loop->AddNoData ( CIF_NODATA_QUESTION ); + } + // (19) + if ((WhatIsSet & ASET_OccSigma) && (WhatIsSet & ASET_Occupancy)) + Loop->AddReal ( sigOcc ); + else Loop->AddNoData ( CIF_NODATA_QUESTION ); + // (20) + if ((WhatIsSet & ASET_tFacSigma) && (WhatIsSet & ASET_tempFactor)) + Loop->AddReal ( sigTemp ); + else Loop->AddNoData ( CIF_NODATA_QUESTION ); + + } else + for (i=0;i<18;i++) + Loop->AddNoData ( CIF_NODATA_QUESTION ); + + // (21) + if (WhatIsSet & ASET_Charge) { + sprintf ( N,"%+2i",mround(charge) ); + Loop->AddString ( N,True ); + } else + Loop->AddNoData ( CIF_NODATA_QUESTION ); + + if (residue) { + // (22) + if (residue->seqNum>MinInt4) + Loop->AddInteger ( residue->seqNum ); + else Loop->AddNoData ( CIF_NODATA_DOT ); + // (23) + Loop->AddString ( residue->name ); + } else { + Loop->AddNoData ( CIF_NODATA_DOT ); + Loop->AddNoData ( CIF_NODATA_DOT ); + } + + // (24) + if (chain) Loop->AddString ( chain->chainID,True ); + else Loop->AddNoData ( CIF_NODATA_DOT ); + // (25) + strcpy_css ( AtName,name ); + Loop->AddString ( AtName ); // atom name + + } + + // (26) + if (!model) Loop->AddNoData ( CIF_NODATA_QUESTION ); + else if (model->serNum>0) Loop->AddInteger ( model->serNum ); + else Loop->AddNoData ( CIF_NODATA_QUESTION ); + + + if (WhatIsSet & ASET_Anis_tFac) { + + RC = CIF->AddLoop ( CIFCAT_ATOM_SITE_ANISOTROP,Loop ); + if (RC!=CIFRC_Ok) { + // the category was (re)created, provide tags + Loop->AddLoopTag ( CIFTAG_ID ); // serial number + Loop->AddLoopTag ( CIFTAG_U11 ); // component u11 + Loop->AddLoopTag ( CIFTAG_U22 ); // component u22 + Loop->AddLoopTag ( CIFTAG_U33 ); // component u33 + Loop->AddLoopTag ( CIFTAG_U12 ); // component u12 + Loop->AddLoopTag ( CIFTAG_U13 ); // component u13 + Loop->AddLoopTag ( CIFTAG_U23 ); // component u23 + Loop->AddLoopTag ( CIFTAG_U11_ESD ); // component u11 sigma + Loop->AddLoopTag ( CIFTAG_U22_ESD ); // component u22 sigma + Loop->AddLoopTag ( CIFTAG_U33_ESD ); // component u33 sigma + Loop->AddLoopTag ( CIFTAG_U12_ESD ); // component u12 sigma + Loop->AddLoopTag ( CIFTAG_U13_ESD ); // component u13 sigma + Loop->AddLoopTag ( CIFTAG_U23_ESD ); // component u23 sigma + for (i=1;iAddInteger ( i ); + for (j=0;j<12;j++) + Loop->AddString ( NULL ); + } + } + + if (serNum>0) Loop->AddInteger ( serNum ); + else Loop->AddInteger ( index ); + + Loop->AddReal ( u11 ); + Loop->AddReal ( u22 ); + Loop->AddReal ( u33 ); + Loop->AddReal ( u12 ); + Loop->AddReal ( u13 ); + Loop->AddReal ( u23 ); + if (WhatIsSet & ASET_Anis_tFSigma) { + Loop->AddReal ( su11 ); + Loop->AddReal ( su22 ); + Loop->AddReal ( su33 ); + Loop->AddReal ( su12 ); + Loop->AddReal ( su13 ); + Loop->AddReal ( su23 ); + } + + } + +} + +int CAtom::ConvertPDBATOM ( int ix, cpstr S ) { +// Gets data from the PDB ASCII ATOM record. +// This function DOES NOT check the "ATOM" keyword and +// does not decode the chain and residue parameters! These +// must be treated by calling process, see +// Chain::ConvertPDBASCII(). + + index = ix; + + if (WhatIsSet & ASET_Coordinates) + return Error_ATOM_AlreadySet; + + if (!(GetReal(x,&(S[30]),8) && + GetReal(y,&(S[38]),8) && + GetReal(z,&(S[46]),8))) + return Error_ATOM_Unrecognized; + + WhatIsSet |= ASET_Coordinates; + Het = False; + Ter = False; + + if (GetReal(occupancy ,&(S[54]),6)) WhatIsSet |= ASET_Occupancy; + if (GetReal(tempFactor,&(S[60]),6)) WhatIsSet |= ASET_tempFactor; + + if (WhatIsSet & (ASET_CoordSigma | ASET_Anis_tFac | + ASET_Anis_tFSigma)) + // something was already submitted. check complience + return CheckData ( S ); + else + // first data submission. just take the data + GetData ( S ); + + return 0; + +} + +void CAtom::SetAtomName ( int ix, + int sN, + const AtomName aName, + const AltLoc aLoc, + const SegID sID, + const Element eName ) { + index = ix; + serNum = sN; + strcpy ( name ,aName ); + strcpy ( label_atom_id,aName ); + strcpy_css ( altLoc ,pstr(aLoc) ); + strcpy_css ( segID ,pstr(sID) ); + if (!eName[0]) element[0] = char(0); + else if (!eName[1]) { + element[0] = ' '; + strcpy ( &(element[1]),eName ); + } else + strcpy ( element,eName ); + WhatIsSet = 0; +} + +int CAtom::ConvertPDBSIGATM ( int ix, cpstr S ) { +// Gets data from the PDB ASCII SIGATM record. +// This function DOES NOT check the "SIGATM" keyword and +// does not decode the chain and residue parameters! These +// must be treated by the calling process, see +// Chain::ConvertPDBASCII(). + + index = ix; + + if (WhatIsSet & ASET_CoordSigma) + return Error_ATOM_AlreadySet; + + if (!(GetReal(sigX,&(S[30]),8) && + GetReal(sigY,&(S[38]),8) && + GetReal(sigZ,&(S[46]),8))) + return Error_ATOM_Unrecognized; + + WhatIsSet |= ASET_CoordSigma; + + if (GetReal(sigOcc ,&(S[54]),6)) WhatIsSet |= ASET_OccSigma; + if (GetReal(sigTemp,&(S[60]),6)) WhatIsSet |= ASET_tFacSigma; + + if (WhatIsSet & (ASET_Coordinates | ASET_Anis_tFac | + ASET_Anis_tFSigma)) + // something was already submitted. check complience + return CheckData ( S ); + else + // first data submission. just take the data + GetData ( S ); + + return 0; + +} + +int CAtom::ConvertPDBANISOU ( int ix, cpstr S ) { +// Gets data from the PDB ASCII ANISOU record. +// This function DOES NOT check the "ANISOU" keyword and +// does not decode chain and residue parameters! These must +// be treated by the calling process, see +// Chain::ConvertPDBASCII(). + + index = ix; + + if (WhatIsSet & ASET_Anis_tFac) + return Error_ATOM_AlreadySet; + + if (!(GetReal(u11,&(S[28]),7) && + GetReal(u22,&(S[35]),7) && + GetReal(u33,&(S[42]),7) && + GetReal(u12,&(S[49]),7) && + GetReal(u13,&(S[56]),7) && + GetReal(u23,&(S[63]),7))) + return Error_ATOM_Unrecognized; + + u11 /= 1.0e4; + u22 /= 1.0e4; + u33 /= 1.0e4; + u12 /= 1.0e4; + u13 /= 1.0e4; + u23 /= 1.0e4; + + WhatIsSet |= ASET_Anis_tFac; + + if (WhatIsSet & (ASET_Coordinates | ASET_CoordSigma | + ASET_Anis_tFSigma)) + // something was already submitted. check complience + return CheckData ( S ); + else + // first data submission. just take the data + GetData ( S ); + + return 0; + +} + +int CAtom::ConvertPDBSIGUIJ ( int ix, cpstr S ) { +// Gets data from the PDB ASCII SIGUIJ record. +// This function DOES NOT check the "SIGUIJ" keyword and +// does not decode the chain and residue parameters! These +// must be treated by the calling process, see +// Chain::ConvertPDBASCII(). + + index = ix; + + if (WhatIsSet & ASET_Anis_tFSigma) + return Error_ATOM_AlreadySet; + + if (!(GetReal(su11,&(S[28]),7) && + GetReal(su22,&(S[35]),7) && + GetReal(su33,&(S[42]),7) && + GetReal(su12,&(S[49]),7) && + GetReal(su13,&(S[56]),7) && + GetReal(su23,&(S[63]),7))) + return Error_ATOM_Unrecognized; + + su11 /= 1.0e4; + su22 /= 1.0e4; + su33 /= 1.0e4; + su12 /= 1.0e4; + su13 /= 1.0e4; + su23 /= 1.0e4; + + WhatIsSet |= ASET_Anis_tFSigma; + + if (WhatIsSet & (ASET_Coordinates | ASET_CoordSigma | + ASET_Anis_tFac)) + // something was already submitted. check complience + return CheckData ( S ); + else + // first data submission. just take the data + GetData ( S ); + + return 0; + +} + +int CAtom::ConvertPDBTER ( int ix, cpstr S ) { +// Gets data from the PDB ASCII TER record. +// This function DOES NOT check the "TER" keyword and +// does not decode the chain and residue parameters! These +// must be treated by the calling process, see +// Chain::ConvertPDBASCII(). + + index = ix; + + if (((S[6]>='0') && (S[6]<='9')) || (S[6]==' ')) { + // Although against strict PDB format, 'TER' is + // actually allowed not to have a serial number. + // This negative value implies that the number is + // not set. + if (!(GetInteger(serNum,&(S[6]),5))) serNum = -1; + } else + hy36decode ( 5,&(S[6]),5,&serNum ); + +// if (!(GetInteger(serNum,&(S[6]),5))) serNum = -1; + + if (WhatIsSet & ASET_Coordinates) + return Error_ATOM_AlreadySet; + + WhatIsSet |= ASET_Coordinates; + Het = False; + Ter = True; + name[0] = char(0); + label_atom_id[0] = char(0); + element[0] = char(0); + + return 0; + +} + + +int CAtom::GetModelNum() { + if (residue) { + if (residue->chain) + if (residue->chain->model) + return residue->chain->model->GetSerNum(); + } + return 0; +} + +pstr CAtom::GetChainID() { + if (residue) { + if (residue->chain) return residue->chain->chainID; + } + return pstr(""); +} + +pstr CAtom::GetLabelAsymID() { + if (residue) return residue->label_asym_id; + else return pstr(""); +} + +pstr CAtom::GetResName() { + if (residue) return residue->name; + else return pstr(""); +} + +pstr CAtom::GetLabelCompID() { + if (residue) return residue->label_comp_id; + else return pstr(""); +} + +int CAtom::GetAASimilarity ( const ResName resName ) { + if (residue) return ::GetAASimilarity ( pstr(residue->name), + pstr(resName) ); + else return -3; +} + +int CAtom::GetAASimilarity ( PCAtom A ) { + if (residue) { + if (A->residue) + return ::GetAASimilarity ( pstr(residue->name), + pstr(A->residue->name) ); + else return -4; + } else + return -3; +} + +realtype CAtom::GetAAHydropathy() { + if (residue) return ::GetAAHydropathy ( pstr(residue->name) ); + else return MaxReal; +} + +realtype CAtom::GetOccupancy() { + if (WhatIsSet & ASET_Occupancy) return occupancy; + else return 0.0; +} + +int CAtom::GetSeqNum() { + if (residue) return residue->seqNum; + else return ATOM_NoSeqNum; +} + +int CAtom::GetLabelSeqID() { + if (residue) return residue->label_seq_id; + else return ATOM_NoSeqNum; +} + +int CAtom::GetLabelEntityID() { + if (residue) return residue->label_entity_id; + else return -1; +} + +pstr CAtom::GetInsCode() { + if (residue) return residue->insCode; + else return pstr(""); +} + +int CAtom::GetSSEType() { +// works only after SSE calculations + if (residue) return residue->SSE; + else return SSE_None; +} + +pstr CAtom::GetAtomCharge ( pstr chrg ) { + if (WhatIsSet & ASET_Charge) sprintf ( chrg,"%+2i",mround(charge) ); + else strcpy ( chrg," " ); + return chrg; +} + +PCResidue CAtom::GetResidue() { + return residue; +} + +PCChain CAtom::GetChain() { + if (residue) return residue->chain; + else return NULL; +} + +PCModel CAtom::GetModel() { + if (residue) { + if (residue->chain) return (PCModel)residue->chain->model; + } + return NULL; +} + +int CAtom::GetResidueNo() { + if (residue) { + if (residue->chain) + return residue->chain->GetResidueNo ( + residue->seqNum,residue->insCode ); + else return -2; + } else + return -1; +} + + +void * CAtom::GetCoordHierarchy() { + if (residue) return residue->GetCoordHierarchy(); + return NULL; +} + + +void CAtom::GetStat ( realtype v, + realtype & v_min, realtype & v_max, + realtype & v_m, realtype & v_m2 ) { + if (vv_max) v_max = v; + v_m += v; + v_m2 += v*v; +} + + + +void CAtom::GetChainCalphas ( PPCAtom & Calphas, int & nCalphas, + cpstr altLoc ) { +// GetChainCalphas(...) is a specialized function for quick +// access to C-alphas of chain which includes given atom. +// This function works faster than an equivalent implementation +// through MMDB's selection procedures. +// Parameters: +// Calphas - array to accept pointers on C-alpha atoms +// If Calphas!=NULL, then the function will +// delete and re-allocate it. When the array +// is no longer needed, the application MUST +// delete it: delete[] Calphas; Deleting +// Calphas does not delete atoms from MMDB. +// nCalphas - integer to accept number of C-alpha atoms +// and the length of Calphas array. +// altLoc - alternative location indicator. By default +// (""), maximum-occupancy locations are taken. +PCChain chain; +PPCResidue res; +PPCAtom atom; +int nResidues, nAtoms, i,j,k; + + if (Calphas) { + delete[] Calphas; + Calphas = NULL; + } + nCalphas = 0; + + if (residue) chain = residue->chain; + else chain = NULL; + + if (chain) { + + chain->GetResidueTable ( res,nResidues ); + + if (nResidues>0) { + + Calphas = new PCAtom[nResidues]; + + if ((!altLoc[0]) || (altLoc[0]==' ')) { // main conformation + + for (i=0;inAtoms; + atom = res[i]->atom; + for (j=0;jname," CA ")) { + Calphas[nCalphas++] = atom[j]; + break; + } + } + + } else { // specific conformation + + for (i=0;inAtoms; + atom = res[i]->atom; + k = 0; + for (j=0;jname," CA ")) { + k = 1; + if (!atom[j]->altLoc[0]) { + // take main conformation now as we do not know if + // the specific one is in the file + Calphas[nCalphas] = atom[j]; + k = 2; + } else if (atom[j]->altLoc[0]==altLoc[0]) { + // get specific conformation and quit + Calphas[nCalphas] = atom[j]; + k = 2; + break; + } + } else if (k) + break; + if (k==2) nCalphas++; + } + + } + + } + + } else if (residue) { // check just this atom's residue + + Calphas = new PCAtom[1]; // can't be more than 1 C-alpha! + + nAtoms = residue->nAtoms; + atom = residue->atom; + + if ((!altLoc[0]) || (altLoc[0]==' ')) { // main conformation + + for (j=0;jname," CA ")) { + Calphas[nCalphas++] = atom[j]; + break; + } + + } else { // specific conformation + + k = 0; + for (j=0;jname," CA ")) { + k = 1; + if (!atom[j]->altLoc[0]) { + Calphas[nCalphas] = atom[j]; + k = 2; + } else if (atom[j]->altLoc[0]==altLoc[0]) { + Calphas[nCalphas] = atom[j]; + k = 2; + break; + } + } else if (k) + break; + if (k==2) nCalphas++; + + } + + } + + if (Calphas && (!nCalphas)) { + delete[] Calphas; + Calphas = NULL; + } + +} + +Boolean CAtom::isMetal() { + return ::isMetal ( element ); +} + +Boolean CAtom::isSolvent() { + if (residue) return residue->isSolvent(); + return False; +} + +Boolean CAtom::isInSelection ( int selHnd ) { +PCMMDBFile manager = (PCMMDBFile)GetCoordHierarchy(); +PCMask Mask; + if (manager) { + Mask = manager->GetSelMask ( selHnd ); + if (Mask) return CheckMask ( Mask ); + } + return False; +} + +Boolean CAtom::isNTerminus() { + if (residue) return residue->isNTerminus(); + return False; +} + +Boolean CAtom::isCTerminus() { + if (residue) return residue->isCTerminus(); + return False; +} + +void CAtom::CalcAtomStatistics ( RSAtomStat AS ) { +// AS must be initialized. The function only accumulates +// the statistics. + + if (!Ter) { + + AS.nAtoms++; + + if (AS.WhatIsSet & WhatIsSet & ASET_Coordinates) { + GetStat ( x,AS.xmin,AS.xmax,AS.xm,AS.xm2 ); + GetStat ( y,AS.ymin,AS.ymax,AS.ym,AS.ym2 ); + GetStat ( z,AS.zmin,AS.zmax,AS.zm,AS.zm2 ); + } else + AS.WhatIsSet &= ~ASET_Coordinates; + + if (AS.WhatIsSet & WhatIsSet & ASET_Occupancy) + GetStat(occupancy,AS.occ_min,AS.occ_max,AS.occ_m,AS.occ_m2); + else AS.WhatIsSet &= ~ASET_Occupancy; + + if (AS.WhatIsSet & WhatIsSet & ASET_tempFactor) + GetStat ( tempFactor,AS.tFmin,AS.tFmax,AS.tFm,AS.tFm2 ); + else AS.WhatIsSet &= ~ASET_tempFactor; + + if (AS.WhatIsSet & WhatIsSet & ASET_Anis_tFac) { + GetStat ( u11,AS.u11_min,AS.u11_max,AS.u11_m,AS.u11_m2 ); + GetStat ( u22,AS.u22_min,AS.u22_max,AS.u22_m,AS.u22_m2 ); + GetStat ( u33,AS.u33_min,AS.u33_max,AS.u33_m,AS.u33_m2 ); + GetStat ( u12,AS.u12_min,AS.u12_max,AS.u12_m,AS.u12_m2 ); + GetStat ( u13,AS.u13_min,AS.u13_max,AS.u13_m,AS.u13_m2 ); + GetStat ( u23,AS.u23_min,AS.u23_max,AS.u23_m,AS.u23_m2 ); + } else + AS.WhatIsSet &= ~ASET_Anis_tFac; + + } + +} + + +realtype CAtom::GetDist2 ( PCAtom a ) { +realtype dx,dy,dz; + dx = a->x - x; + dy = a->y - y; + dz = a->z - z; + return dx*dx + dy*dy + dz*dz; +} + +realtype CAtom::GetDist2 ( PCAtom a, mat44 & tm ) { +realtype dx,dy,dz; + dx = tm[0][0]*a->x + tm[0][1]*a->y + tm[0][2]*a->z + tm[0][3] - x; + dy = tm[1][0]*a->x + tm[1][1]*a->y + tm[1][2]*a->z + tm[1][3] - y; + dz = tm[2][0]*a->x + tm[2][1]*a->y + tm[2][2]*a->z + tm[2][3] - z; + return dx*dx + dy*dy + dz*dz; +} + +realtype CAtom::GetDist2 ( PCAtom a, mat33 & r, vect3 & t ) { +realtype dx,dy,dz; + dx = r[0][0]*a->x + r[0][1]*a->y + r[0][2]*a->z + t[0] - x; + dy = r[1][0]*a->x + r[1][1]*a->y + r[1][2]*a->z + t[1] - y; + dz = r[2][0]*a->x + r[2][1]*a->y + r[2][2]*a->z + t[2] - z; + return dx*dx + dy*dy + dz*dz; +} + +realtype CAtom::GetDist2 ( realtype ax, realtype ay, realtype az ) { +realtype dx,dy,dz; + dx = ax - x; + dy = ay - y; + dz = az - z; + return dx*dx + dy*dy + dz*dz; +} + +realtype CAtom::GetCosine ( PCAtom a1, PCAtom a2 ) { +// Calculates cosing of angle a1-this-a2, i.e. that between +// bond [a1,this] and [this,a2]. +realtype dx1,dy1,dz1, dx2,dy2,dz2,r; + + dx1 = a1->x - x; + dy1 = a1->y - y; + dz1 = a1->z - z; + r = dx1*dx1 + dy1*dy1 + dz1*dz1; + + dx2 = a2->x - x; + dy2 = a2->y - y; + dz2 = a2->z - z; + r *= dx2*dx2 + dy2*dy2 + dz2*dz2; + + if (r>0.0) return (dx1*dx2 + dy1*dy2 + dz1*dz2)/sqrt(r); + else return 0.0; + +} + + +void CAtom::MakeTer() { + WhatIsSet |= ASET_Coordinates; + Het = False; + Ter = True; +} + + +void CAtom::SetAtomName ( const AtomName atomName ) { + strcpy ( name,atomName ); +} + + +void CAtom::SetElementName ( const Element elName ) { + strcpy ( element,elName ); + if (!element[0]) strcpy ( element," " ); + else if ((!element[1]) || (element[1]==' ')) { + element[2] = char(0); + element[1] = element[0]; + element[0] = ' '; + } +} + +void CAtom::SetCharge ( cpstr chrg ) { +pstr p; + charge = strtod ( chrg,&p ); + if (p!=chrg) { + WhatIsSet |= ASET_Charge; + if ((charge>0.0) && (*p=='-')) + charge = -charge; + } +} + +void CAtom::SetCharge ( realtype chrg ) { + if (chrgchain) { + if (residue->chain->model) + sprintf (AtomID,"/%i/",residue->chain->model->GetSerNum()); + else strcpy ( AtomID,"/-/" ); + strcat ( AtomID,residue->chain->chainID ); + } else + strcpy ( AtomID,"/-/-" ); + ParamStr ( AtomID,pstr("/"),residue->seqNum ); + if (residue->name[0]) { + strcat ( AtomID,"(" ); + strcat ( AtomID,residue->name ); + strcat ( AtomID,")" ); + } + if (residue->insCode[0]) { + strcat ( AtomID,"." ); + strcat ( AtomID,residue->insCode ); + } + strcat ( AtomID,"/" ); + } else + strcpy ( AtomID,"/-/-/-/" ); + strcpy_css ( S,name ); + if (!S[0]) strcpy ( S,"-" ); + strcat ( AtomID,S ); + strcpy_css ( S,element ); + if (S[0]) { + strcat ( AtomID,"[" ); + strcat ( AtomID,S ); + strcat ( AtomID,"]" ); + } + if (altLoc[0]) { + strcat ( AtomID,":" ); + strcat ( AtomID,altLoc ); + } + return AtomID; +} + +pstr CAtom::GetAtomIDfmt ( pstr AtomID ) { +int n; +char S[50]; + AtomID[0] = char(0); + if (residue) { + if (residue->chain) { + if (residue->chain->model) { + n = residue->chain->model->GetNumberOfModels(); + if (n<10) strcpy ( S,"/%1i/" ); + else if (n<100) strcpy ( S,"/%2i/" ); + else if (n<1000) strcpy ( S,"/%3i/" ); + else strcpy ( S,"/%i/" ); + sprintf ( AtomID,S,residue->chain->model->GetSerNum() ); + } else + strcpy ( AtomID,"/-/" ); + strcat ( AtomID,residue->chain->chainID ); + } else + strcpy ( AtomID,"/-/-" ); + if ((-999<=residue->seqNum) && (residue->seqNum<=9999)) + sprintf ( S,"/%4i",residue->seqNum ); + else sprintf ( S,"/%i" ,residue->seqNum ); + strcat ( AtomID,S ); + sprintf ( S,"(%3s).%1s/",residue->name,residue->insCode ); + strcat ( AtomID,S ); + } else + strcpy ( AtomID,"/-/-/----(---).-/" ); + sprintf ( S,"%4s[%2s]:%1s",name,element,altLoc ); + strcat ( AtomID,S ); + return AtomID; +} + + + +int CAtom::ConvertPDBHETATM ( int ix, cpstr S ) { +// Gets data from the PDB ASCII HETATM record. +// This function DOES NOT check the "HETATM" keyword and +// does not decode the chain and residue parameters! These +// must be treated by the calling process, see +// Chain::ConvertPDBASCII(). +int RC; + RC = ConvertPDBATOM ( ix,S ); + Het = True; + return RC; +} + +void CAtom::GetData ( cpstr S ) { +pstr p; + + if (((S[6]>='0') && (S[6]<='9')) || (S[6]==' ')) { + // Here we forgive cards with unreadable serial numbers + // as we always have index (ix) for the card. For the sake + // of strict PDB syntax we would have to return + // Error_UnrecognizedInteger here. + if (!(GetInteger(serNum,&(S[6]),5))) serNum = -1; + } else + hy36decode ( 5,&(S[6]),5,&serNum ); + +// if (!(GetInteger(serNum,&(S[6]),5))) serNum = index; + + altLoc[0] = S[16]; + if (altLoc[0]==' ') altLoc[0] = char(0); + else altLoc[1] = char(0); + GetString ( name ,&(S[12]),4 ); + strcpy_ncss ( segID ,&(S[72]),4 ); + GetString ( element,&(S[76]),2 ); + charge = strtod ( &(S[78]),&p ); + if ((charge!=0.0) && (p!=&(S[78]))) { + WhatIsSet |= ASET_Charge; + if ((charge>0.0) && (*p=='-')) + charge = -charge; + } + + RestoreElementName(); + strcpy ( label_atom_id,name ); + +} + +int CAtom::CheckData ( cpstr S ) { +int sN; +AltLoc aloc; +SegID sID; +Element elmnt; +pstr p; +realtype achrg; + + aloc[0] = S[16]; + if (aloc[0]==' ') aloc[0] = char(0); + else aloc[1] = char(0); + + strcpy_ncss ( sID ,&(S[72]),4 ); + GetString ( elmnt,&(S[76]),2 ); + + if (ignoreCharge) + achrg = charge; + else { + achrg = strtod ( &(S[78]),&p ); + if ((achrg!=0.0) && (p!=&(S[78]))) { + if ((achrg>0.0) && (*p=='-')) + achrg = -achrg; + } + } + +// if (!(GetInteger(sN,&(S[6]),5))) +// sN = index; + + if (hy36decode(5,&(S[6]),5,&sN)) + sN = index; + + if (ignoreSegID) { + if (segID[0]) strcpy ( sID,segID ); + else strcpy ( segID,sID ); + } + + if (ignoreElement) { + if (element[0]) strcpy ( elmnt,element ); + else strcpy ( element,elmnt ); + } + + if (ignoreUnmatch) return 0; + + // Here we forgive cards with unreadable serial numbers + // as we always have index (ix) for the card. For the sake + // of strict PDB syntax we would have to return + // Error_UnrecognizedInteger . + if ((sN!=serNum) || + (strcmp (altLoc ,aloc )) || + (strncmp(name ,&(S[12]),4)) || + (strcmp (segID ,sID )) || + (strcmp (element,elmnt )) || + (charge!=achrg)) { + /* +char name1[100]; +strncpy ( name1,&(S[12]),4 ); name1[4] = char(0); + printf ( "\n serNum %5i %5i\n" + " residue '%s' '%s'\n" + " altLoc '%s' '%s'\n" + " name '%s' '%s'\n" + " segId '%s' '%s'\n" + " element '%s' '%s'\n" + " charge '%s' '%s'\n", + sN,serNum, res->name,residue->name, + altLoc ,aloc, name,name1, + segID ,sID, + element,elmnt, + charge ,achrg ); + if (res!=residue) printf (" it's a residue\n" ); + */ + return Error_ATOM_Unmatch; + } + + return 0; + +} + + +int CAtom::GetCIF ( int ix, PCMMCIFLoop Loop, + PCMMCIFLoop LoopAnis ) { +char PDBGroup[30]; +int k; +int RC; + + index = ix; + + if (WhatIsSet & ASET_Coordinates) + return Error_ATOM_AlreadySet; + +/* + +loop_ +*0 _atom_site.group_PDB +*1 _atom_site.id +*2 _atom_site.type_symbol <- chem elem +-3 _atom_site.label_atom_id <- atom name +*4 _atom_site.label_alt_id <- alt code +=5 _atom_site.label_comp_id <- res name ??? +=6 _atom_site.label_asym_id <- chain id ??? +=7 _atom_site.label_entity_id < ??? +=8 _atom_site.label_seq_id <- poly seq id ++9 _atom_site.pdbx_PDB_ins_code <- ins code +-10 _atom_site.segment_id <- segment id +*11 _atom_site.Cartn_x +*12 _atom_site.Cartn_y +*13 _atom_site.Cartn_z +*14 _atom_site.occupancy +*15 _atom_site.B_iso_or_equiv +*16 _atom_site.Cartn_x_esd +*17 _atom_site.Cartn_y_esd +*18 _atom_site.Cartn_z_esd +*19 _atom_site.occupancy_esd +*20 _atom_site.B_iso_or_equiv_esd +*21 _atom_site.pdbx_formal_charge ++22 _atom_site.auth_seq_id <- seq id we want ++23 _atom_site.auth_comp_id <- res name we want ++24 _atom_site.auth_asym_id <- ch id we want ? +*25 _atom_site.auth_atom_id <- atom name we want ? ++26 _atom_site.pdbx_PDB_model_num <- model no + +'+' read in CMMDBFile::CheckAtomPlace() +'=' new in residue, read in CMMDBFile::CheckAtomPlace() +'-' new in atom + +*/ + + + // (0) + k = ix-1; + CIFGetString ( PDBGroup,Loop,CIFTAG_GROUP_PDB,k, + sizeof(PDBGroup),pstr("") ); + + Ter = !strcmp(PDBGroup,pstr("TER") ); + Het = !strcmp(PDBGroup,pstr("HETATM")); + + // (1) + RC = CIFGetInteger1 ( serNum,Loop,CIFTAG_ID,k ); + if (RC) { + if (Ter) serNum = -1; + else if (RC==Error_NoData) serNum = index; + else + return RC; + } + + if (Ter) { + Loop->DeleteRow ( k ); + WhatIsSet |= ASET_Coordinates; + return 0; + } + + // (25) + CIFGetString ( name,Loop,CIFTAG_AUTH_ATOM_ID,k, + sizeof(name) ,pstr("") ); + // (3) + CIFGetString ( label_atom_id,Loop,CIFTAG_LABEL_ATOM_ID,k, + sizeof(label_atom_id),pstr("") ); + // (4) + CIFGetString ( altLoc,Loop,CIFTAG_LABEL_ALT_ID ,k, + sizeof(altLoc),pstr("") ); + + // (11,12,13) + RC = CIFGetReal1 ( x,Loop,CIFTAG_CARTN_X,k ); + if (!RC) RC = CIFGetReal1 ( y,Loop,CIFTAG_CARTN_Y,k ); + if (!RC) RC = CIFGetReal1 ( z,Loop,CIFTAG_CARTN_Z,k ); + if (RC) return Error_ATOM_Unrecognized; + WhatIsSet |= ASET_Coordinates; + + // (14) + if (!CIFGetReal1(occupancy,Loop,CIFTAG_OCCUPANCY,k)) + WhatIsSet |= ASET_Occupancy; + // (15) + if (!CIFGetReal1(tempFactor,Loop,CIFTAG_B_ISO_OR_EQUIV,k)) + WhatIsSet |= ASET_tempFactor; + + // (10) + CIFGetString ( segID,Loop,CIFTAG_SEGMENT_ID,k, + sizeof(segID) ,pstr("") ); + // (21) + if (!CIFGetReal1(charge,Loop,CIFTAG_PDBX_FORMAL_CHARGE,k)) + WhatIsSet |= ASET_Charge; + // (2) + RC = CIFGetString ( element,Loop,CIFTAG_TYPE_SYMBOL,k, + sizeof(element),pstr(" ") ); + if (RC) + CIFGetString ( element,Loop,CIFTAG_ATOM_TYPE_SYMBOL,k, + sizeof(element),pstr(" ") ); + + RestoreElementName(); + MakePDBAtomName (); +// printf ( " '%s' '%s'\n",name,element ); + + // (16,17,18) + RC = CIFGetReal1 ( sigX,Loop,CIFTAG_CARTN_X_ESD,k ); + if (!RC) RC = CIFGetReal1 ( sigY,Loop,CIFTAG_CARTN_Y_ESD,k ); + if (!RC) RC = CIFGetReal1 ( sigZ,Loop,CIFTAG_CARTN_Z_ESD,k ); + if (RC==Error_UnrecognizedReal) + return RC; + if (!RC) WhatIsSet |= ASET_CoordSigma; + + // (19) + if (!CIFGetReal1(sigOcc,Loop,CIFTAG_OCCUPANCY_ESD,k)) + WhatIsSet |= ASET_OccSigma; + // (20) + if (!CIFGetReal1(sigTemp,Loop,CIFTAG_B_ISO_OR_EQUIV_ESD,k)) + WhatIsSet |= ASET_tFacSigma; + + Loop->DeleteRow ( k ); + + if (LoopAnis) { + + RC = CIFGetReal1 ( u11,LoopAnis,CIFTAG_U11,k ); + if (!RC) RC = CIFGetReal1 ( u22,LoopAnis,CIFTAG_U22,k ); + if (!RC) RC = CIFGetReal1 ( u33,LoopAnis,CIFTAG_U33,k ); + if (!RC) RC = CIFGetReal1 ( u13,LoopAnis,CIFTAG_U13,k ); + if (!RC) RC = CIFGetReal1 ( u12,LoopAnis,CIFTAG_U12,k ); + if (!RC) RC = CIFGetReal1 ( u23,LoopAnis,CIFTAG_U23,k ); + if (RC==Error_UnrecognizedReal) + return RC; + if (!RC) WhatIsSet |= ASET_Anis_tFac; + + RC = CIFGetReal1 ( su11,LoopAnis,CIFTAG_U11_ESD,k ); + if (!RC) RC = CIFGetReal1 ( su22,LoopAnis,CIFTAG_U22_ESD,k ); + if (!RC) RC = CIFGetReal1 ( su33,LoopAnis,CIFTAG_U33_ESD,k ); + if (!RC) RC = CIFGetReal1 ( su13,LoopAnis,CIFTAG_U13_ESD,k ); + if (!RC) RC = CIFGetReal1 ( su12,LoopAnis,CIFTAG_U12_ESD,k ); + if (!RC) RC = CIFGetReal1 ( su23,LoopAnis,CIFTAG_U23_ESD,k ); + if (RC==Error_UnrecognizedReal) + return RC; + if (!RC) WhatIsSet |= ASET_Anis_tFSigma; + + LoopAnis->DeleteRow ( k ); + + } + + return 0; + +} + +Boolean CAtom::RestoreElementName() { +// This function works only if element name is not given. + if (Ter) { + name[0] = char(0); + element[0] = char(0); + return False; + } + if ((!element[0]) || + ((element[0]==' ') && ((!element[1]) || (element[1]==' ')))) { + if ((name[0]>='A') && (name[0]<='Z')) { + element[0] = name[0]; + element[1] = name[1]; + } else { + element[0] = ' '; + element[1] = name[1]; + } + element[2] = char(0); + return False; + } else if (!element[1]) { + // not aligned element name, possibly coming from mmCIF + element[1] = element[0]; + element[0] = ' '; + element[2] = char(0); + return False; + } + return True; +} + +Boolean CAtom::MakePDBAtomName() { +int i,k; + if (Ter) { + name[0] = char(0); + element[0] = char(0); + return False; + } + UpperCase ( name ); + UpperCase ( element ); + if ((element[0]==' ') && (element[1]==' ')) { + // element name not given, make one from the atom name + if ((name[0]>='A') && (name[0]<='Z')) { + if (!name[1]) { + name[4] = char(0); + name[3] = ' '; + name[2] = ' '; + name[1] = name[0]; + name[0] = ' '; + } + /* the commented part looks like a wrong inheritance + from FORTRAN RWBrook. Commented on 04.03.2004, + to be removed. + else if ((name[0]=='C') && (name[1]=='A')) { + name[4] = char(0); + name[3] = name[2]; + name[2] = name[1]; + name[1] = name[0]; + name[0] = ' '; + } + */ + element[0] = name[0]; + element[1] = name[1]; + } else { + element[0] = ' '; + element[1] = name[1]; + } + element[2] = char(0); + return False; + } else if ((name[0]>='A') && (name[0]<='Z')) { + if (!element[1]) { + element[2] = char(0); + element[1] = element[0]; + element[0] = ' '; + k = strlen(name); + if (k<4) { + for (i=3;i>0;i--) + name[i] = name[i-1]; + name[0] = ' '; + k++; + while (k<4) + name[k++] = ' '; + name[k] = char(0); + } + } else if ((element[0]==' ') && (element[1]!=name[1])) { + for (i=3;i>0;i--) + name[i] = name[i-1]; + name[0] = ' '; + k = strlen(name); + while (k<4) + name[k++] = ' '; + name[k] = char(0); + } else { + k = strlen(name); + while (k<4) + name[k++] = ' '; + name[k] = char(0); + } + } + return True; +} + +void CAtom::SetCoordinates ( realtype xx, realtype yy, realtype zz, + realtype occ, realtype tFac ) { + x = xx; + y = yy; + z = zz; + occupancy = occ; + tempFactor = tFac; + WhatIsSet |= ASET_Coordinates | ASET_Occupancy | ASET_tempFactor; +} + +void CAtom::Transform ( mat33 & tm, vect3 & v ) { +realtype x1,y1,z1; + x1 = tm[0][0]*x + tm[0][1]*y + tm[0][2]*z + v[0]; + y1 = tm[1][0]*x + tm[1][1]*y + tm[1][2]*z + v[1]; + z1 = tm[2][0]*x + tm[2][1]*y + tm[2][2]*z + v[2]; + x = x1; + y = y1; + z = z1; +} + +void CAtom::Transform ( mat44 & tm ) { +realtype x1,y1,z1; + x1 = tm[0][0]*x + tm[0][1]*y + tm[0][2]*z + tm[0][3]; + y1 = tm[1][0]*x + tm[1][1]*y + tm[1][2]*z + tm[1][3]; + z1 = tm[2][0]*x + tm[2][1]*y + tm[2][2]*z + tm[2][3]; + x = x1; + y = y1; + z = z1; +} + +void CAtom::TransformCopy ( mat44 & tm, + realtype & xx, + realtype & yy, + realtype & zz ) { + xx = tm[0][0]*x + tm[0][1]*y + tm[0][2]*z + tm[0][3]; + yy = tm[1][0]*x + tm[1][1]*y + tm[1][2]*z + tm[1][3]; + zz = tm[2][0]*x + tm[2][1]*y + tm[2][2]*z + tm[2][3]; +} + +void CAtom::TransformSet ( mat44 & tm, + realtype xx, + realtype yy, + realtype zz ) { + x = tm[0][0]*xx + tm[0][1]*yy + tm[0][2]*zz + tm[0][3]; + y = tm[1][0]*xx + tm[1][1]*yy + tm[1][2]*zz + tm[1][3]; + z = tm[2][0]*xx + tm[2][1]*yy + tm[2][2]*zz + tm[2][3]; +} + + +// ------- user-defined data handlers + +int CAtom::PutUDData ( int UDDhandle, int iudd ) { + if (UDDhandle & UDRF_ATOM) + return CUDData::putUDData ( UDDhandle,iudd ); + else return UDDATA_WrongUDRType; +} + +int CAtom::PutUDData ( int UDDhandle, realtype rudd ) { + if (UDDhandle & UDRF_ATOM) + return CUDData::putUDData ( UDDhandle,rudd ); + else return UDDATA_WrongUDRType; +} + +int CAtom::PutUDData ( int UDDhandle, cpstr sudd ) { + if (UDDhandle & UDRF_ATOM) + return CUDData::putUDData ( UDDhandle,sudd ); + else return UDDATA_WrongUDRType; +} + +int CAtom::GetUDData ( int UDDhandle, int & iudd ) { + if (UDDhandle & UDRF_ATOM) + return CUDData::getUDData ( UDDhandle,iudd ); + else return UDDATA_WrongUDRType; +} + +int CAtom::GetUDData ( int UDDhandle, realtype & rudd ) { + if (UDDhandle & UDRF_ATOM) + return CUDData::getUDData ( UDDhandle,rudd ); + else return UDDATA_WrongUDRType; +} + +int CAtom::GetUDData ( int UDDhandle, pstr sudd, int maxLen ) { + if (UDDhandle & UDRF_ATOM) + return CUDData::getUDData ( UDDhandle,sudd,maxLen ); + else return UDDATA_WrongUDRType; +} + +int CAtom::GetUDData ( int UDDhandle, pstr & sudd ) { + if (UDDhandle & UDRF_ATOM) + return CUDData::getUDData ( UDDhandle,sudd ); + else return UDDATA_WrongUDRType; +} + + +void CAtom::Copy ( PCAtom atom ) { +// this does not make any references in residues and does +// not change indices!! it does change serial numbers, though. + + serNum = atom->serNum; + x = atom->x; + y = atom->y; + z = atom->z; + occupancy = atom->occupancy; + tempFactor = atom->tempFactor; + sigX = atom->sigX; + sigY = atom->sigY; + sigZ = atom->sigZ; + sigOcc = atom->sigOcc; + sigTemp = atom->sigTemp; + u11 = atom->u11; + u22 = atom->u22; + u33 = atom->u33; + u12 = atom->u12; + u13 = atom->u13; + u23 = atom->u23; + su11 = atom->su11; + su22 = atom->su22; + su33 = atom->su33; + su12 = atom->su12; + su13 = atom->su13; + su23 = atom->su23; + Het = atom->Het; + Ter = atom->Ter; + WhatIsSet = atom->WhatIsSet; + + strcpy ( name ,atom->name ); + strcpy ( label_atom_id,atom->label_atom_id ); + strcpy ( altLoc ,atom->altLoc ); + strcpy ( segID ,atom->segID ); + strcpy ( element ,atom->element ); + strcpy ( energyType ,atom->energyType ); + charge = atom->charge; + +} + +int CAtom::CheckID ( const AtomName aname, const Element elname, + const AltLoc aloc ) { +pstr p1,p2; + if (aname) { + if (aname[0]!='*') { + p1 = name; + while (*p1==' ') p1++; + p2 = pstr(aname); + while (*p2==' ') p2++; + while ((*p2) && (*p1) && (*p1!=' ') && (*p2!=' ')) { + if (*p1!=*p2) return 0; + p1++; + p2++; + } + if (*p1!=*p2) { + if (((*p1) && (*p1!=' ')) || + ((*p2) && (*p2!=' '))) return 0; + } + } + } + if (elname) { + if (elname[0]!='*') { + p1 = element; + while (*p1==' ') p1++; + p2 = pstr(elname); + while (*p2==' ') p2++; + while ((*p2) && (*p1) && (*p1!=' ') && (*p2!=' ')) { + if (*p1!=*p2) return 0; + p1++; + p2++; + } + if (*p1!=*p2) return 0; + } + } + if (aloc) { + if ((aloc[0]!='*') && (strcmp(aloc,altLoc))) return 0; + } + return 1; +} + +int CAtom::CheckIDS ( cpstr ID ) { +AtomName aname; +Element elname; +AltLoc aloc; +pstr p; + p = strrchr ( ID,'/' ); + if (p) p++; + else p = pstr(ID); + ParseAtomID ( p,aname,elname,aloc ); + return CheckID ( aname,elname,aloc ); +} + +void CAtom::SetShortBinary() { + WhatIsSet |= ASET_ShortBinary; +} + +void CAtom::write ( RCFile f ) { +int i,k; +byte Version=2; +byte nb; + + f.WriteWord ( &WhatIsSet ); + if (WhatIsSet & ASET_ShortBinary) { + if (Ter) WhatIsSet |= ASET_ShortTer; + if (Het) WhatIsSet |= ASET_ShortHet; + f.WriteInt ( &index ); + f.WriteTerLine ( name ,False ); + f.WriteTerLine ( altLoc ,False ); + f.WriteTerLine ( element,False ); + if (WhatIsSet & ASET_Coordinates) { + f.WriteFloat ( &x ); + f.WriteFloat ( &y ); + f.WriteFloat ( &z ); + } + return; + } + + f.WriteByte ( &Version ); + + CUDData::write ( f ); + + f.WriteInt ( &serNum ); + f.WriteInt ( &index ); + f.WriteTerLine ( name ,False ); + f.WriteTerLine ( label_atom_id,False ); + f.WriteTerLine ( altLoc ,False ); + f.WriteTerLine ( segID ,False ); + f.WriteTerLine ( element ,False ); + f.WriteTerLine ( energyType ,False ); + f.WriteFloat ( &charge ); + f.WriteBool ( &Het ); + f.WriteBool ( &Ter ); + + if (WhatIsSet & ASET_Coordinates) { + f.WriteFloat ( &x ); + f.WriteFloat ( &y ); + f.WriteFloat ( &z ); + if (WhatIsSet & ASET_Occupancy) + f.WriteFloat ( &occupancy ); + if (WhatIsSet & ASET_tempFactor) + f.WriteFloat ( &tempFactor ); + } + + if (WhatIsSet & ASET_CoordSigma) { + f.WriteFloat ( &sigX ); + f.WriteFloat ( &sigY ); + f.WriteFloat ( &sigZ ); + if ((WhatIsSet & ASET_Occupancy) && + (WhatIsSet & ASET_OccSigma)) + f.WriteFloat ( &sigOcc ); + if ((WhatIsSet & ASET_tempFactor) && + (WhatIsSet & ASET_tFacSigma)) + f.WriteFloat ( &sigTemp ); + } + + if (WhatIsSet & ASET_Anis_tFac) { + f.WriteFloat ( &u11 ); + f.WriteFloat ( &u22 ); + f.WriteFloat ( &u33 ); + f.WriteFloat ( &u12 ); + f.WriteFloat ( &u13 ); + f.WriteFloat ( &u23 ); + if (WhatIsSet & ASET_Anis_tFSigma) { + f.WriteFloat ( &su11 ); + f.WriteFloat ( &su22 ); + f.WriteFloat ( &su33 ); + f.WriteFloat ( &su12 ); + f.WriteFloat ( &su13 ); + f.WriteFloat ( &su23 ); + } + } + + nb = byte(nBonds & 0x000000FF); + f.WriteByte ( &nb ); + for (i=0;iindex) ); + f.WriteByte ( &(Bond[i].order) ); + } else { + k = -1; + f.WriteInt ( &k ); + } + +} + +void CAtom::read ( RCFile f ) { +int i,k; +byte nb,Version; + + FreeMemory(); + + f.ReadWord ( &WhatIsSet ); + if (WhatIsSet & ASET_ShortBinary) { + f.ReadInt ( &index ); + f.ReadTerLine ( name ,False ); + f.ReadTerLine ( altLoc ,False ); + f.ReadTerLine ( element,False ); + if (WhatIsSet & ASET_Coordinates) { + f.ReadFloat ( &x ); + f.ReadFloat ( &y ); + f.ReadFloat ( &z ); + } + serNum = index; + Ter = WhatIsSet & ASET_ShortTer; + Het = WhatIsSet & ASET_ShortHet; + name [4] = char(0); + altLoc [1] = char(0); + element[2] = char(0); + segID [0] = char(0); + charge = 0.0; + WhatIsSet &= ASET_All; + return; + } + + f.ReadByte ( &Version ); + + CUDData::read ( f ); + + f.ReadInt ( &serNum ); + f.ReadInt ( &index ); + f.ReadTerLine ( name ,False ); + if (Version>1) + f.ReadTerLine ( label_atom_id,False ); + f.ReadTerLine ( altLoc ,False ); + f.ReadTerLine ( segID ,False ); + f.ReadTerLine ( element ,False ); + f.ReadTerLine ( energyType,False ); + f.ReadFloat ( &charge ); + f.ReadBool ( &Het ); + f.ReadBool ( &Ter ); + + if (WhatIsSet & ASET_Coordinates) { + f.ReadFloat ( &x ); + f.ReadFloat ( &y ); + f.ReadFloat ( &z ); + if (WhatIsSet & ASET_Occupancy) f.ReadFloat ( &occupancy ); + else occupancy = 0.0; + if (WhatIsSet & ASET_tempFactor) f.ReadFloat ( &tempFactor ); + else tempFactor = 0.0; + } else { + x = 0.0; + y = 0.0; + z = 0.0; + occupancy = 0.0; + tempFactor = 0.0; + } + + if (WhatIsSet & ASET_CoordSigma) { + f.ReadFloat ( &sigX ); + f.ReadFloat ( &sigY ); + f.ReadFloat ( &sigZ ); + if ((WhatIsSet & ASET_Occupancy) && + (WhatIsSet & ASET_OccSigma)) + f.ReadFloat ( &sigOcc ); + else sigOcc = 0.0; + if ((WhatIsSet & ASET_tempFactor) && + (WhatIsSet & ASET_tFacSigma)) + f.ReadFloat ( &sigTemp ); + else sigTemp = 0.0; + } else { + sigX = 0.0; + sigY = 0.0; + sigZ = 0.0; + sigOcc = 0.0; + sigTemp = 0.0; + } + + if (WhatIsSet & ASET_Anis_tFac) { + f.ReadFloat ( &u11 ); + f.ReadFloat ( &u22 ); + f.ReadFloat ( &u33 ); + f.ReadFloat ( &u12 ); + f.ReadFloat ( &u13 ); + f.ReadFloat ( &u23 ); + if (WhatIsSet & ASET_Anis_tFSigma) { + f.ReadFloat ( &su11 ); + f.ReadFloat ( &su22 ); + f.ReadFloat ( &su33 ); + f.ReadFloat ( &su12 ); + f.ReadFloat ( &su13 ); + f.ReadFloat ( &su23 ); + } else { + su11 = 0.0; + su22 = 0.0; + su33 = 0.0; + su12 = 0.0; + su13 = 0.0; + su23 = 0.0; + } + } else { + u11 = 0.0; + u22 = 0.0; + u33 = 0.0; + u12 = 0.0; + u13 = 0.0; + u23 = 0.0; + su11 = 0.0; + su22 = 0.0; + su33 = 0.0; + su12 = 0.0; + su13 = 0.0; + su23 = 0.0; + } + + f.ReadByte ( &nb ); + if (nb>0) { + Bond = new SAtomBond[nb]; + for (i=0;i0) f.ReadByte ( &(Bond[i].order) ); + else Bond[i].order = 0; + // we place *index* of bonded atom temporary on the place + // of its pointer, and the pointer will be calculated + // after CResidue::read calls _setBonds(..). + memcpy ( &(Bond[i].atom),&k,4 ); + } + } + nBonds = nb; + nBonds = nBonds | (nBonds << 8); + +} + +void CAtom::_setBonds ( PPCAtom A ) { +int i,k,nb; + nb = nBonds & 0x000000FF; + for (i=0;i0) Bond[i].atom = A[k]; + else Bond[i].atom = NULL; + } +} + + +MakeFactoryFunctions(CAtom) + + + +// =========================== CResidue =========================== + + +void SAtomStat::Init() { + + nAtoms = 0; + + xmin = MaxReal; xmax = MinReal; xm = 0.0; xm2 = 0.0; + ymin = MaxReal; ymax = MinReal; ym = 0.0; ym2 = 0.0; + zmin = MaxReal; zmax = MinReal; zm = 0.0; zm2 = 0.0; + + occ_min = MaxReal; occ_max = MinReal; occ_m = 0.0; occ_m2 = 0.0; + tFmin = MaxReal; tFmax = MinReal; tFm = 0.0; tFm2 = 0.0; + + u11_min = MaxReal; u11_max = MinReal; u11_m = 0.0; u11_m2 = 0.0; + u22_min = MaxReal; u22_max = MinReal; u22_m = 0.0; u22_m2 = 0.0; + u33_min = MaxReal; u33_max = MinReal; u33_m = 0.0; u33_m2 = 0.0; + u12_min = MaxReal; u12_max = MinReal; u12_m = 0.0; u12_m2 = 0.0; + u13_min = MaxReal; u13_max = MinReal; u13_m = 0.0; u13_m2 = 0.0; + u23_min = MaxReal; u23_max = MinReal; u23_m = 0.0; u23_m2 = 0.0; + + WhatIsSet = ASET_All; + + finished = False; + +} + +void SAtomStat::Finish() { +realtype v; + + if (!finished) { + + finished = True; + + if (nAtoms>0) { + + v = nAtoms; + + xm /= v; xm2 /= v; + ym /= v; ym2 /= v; + zm /= v; zm2 /= v; + + occ_m /= v; occ_m2 /= v; + tFm /= v; tFm2 /= v; + + u11_m /= v; u11_m2 /= v; + u22_m /= v; u22_m2 /= v; + u33_m /= v; u33_m2 /= v; + u12_m /= v; u12_m2 /= v; + u13_m /= v; u13_m2 /= v; + u23_m /= v; u23_m2 /= v; + } + } + +} + +realtype SAtomStat::GetMaxSize() { +realtype r; + r = RMax(xmax-xmin,ymax-ymin); + r = RMax(r,zmax-zmin); + return RMax(r,0.0); +} + + +// ---------------------------------------------------------------- + + +CResidue::CResidue() : CUDData() { + InitResidue(); +} + +CResidue::CResidue ( PCChain Chain_Owner ) : CUDData() { + InitResidue(); + if (Chain_Owner) + Chain_Owner->AddResidue ( this ); +} + +CResidue::CResidue ( PCChain Chain_Owner, + const ResName resName, + int sqNum, + const InsCode ins ) : CUDData() { + InitResidue(); + seqNum = sqNum; + strcpy_css ( name,pstr(resName) ); + strcpy_css ( insCode,pstr(ins) ); + if (Chain_Owner) + Chain_Owner->AddResidue ( this ); +} + +CResidue::CResidue ( RPCStream Object ) : CUDData(Object) { + InitResidue(); +} + +CResidue::~CResidue() { + FreeMemory(); + if (chain) chain->_ExcludeResidue ( name,seqNum,insCode ); +} + + +void CResidue::InitResidue() { + strcpy ( name ,"---" ); // residue name + strcpy ( label_comp_id,"---" ); // assigned residue name + label_asym_id[0] = char(0); // assigned chain Id + seqNum = -MaxInt; // residue sequence number + label_seq_id = -MaxInt; // assigned residue sequence number + label_entity_id = 1; // assigned entity id + strcpy ( insCode,"" ); // residue insertion code + chain = NULL; // reference to chain + index = -1; // undefined index in chain + nAtoms = 0; // number of atoms in the residue + AtmLen = 0; // length of atom array + atom = NULL; // array of atoms + Exclude = True; + SSE = SSE_None; +} + +void CResidue::SetChain ( PCChain Chain_Owner ) { + chain = Chain_Owner; +} + + +int CResidue::GetResidueNo() { + if (chain) return chain->GetResidueNo ( seqNum,insCode ); + else return -1; +} + +void CResidue::SetChainID ( const ChainID chID ) { + if (chain) + chain->SetChainID ( chID ); +} + + +int CResidue::GetCenter ( realtype & x, realtype & y, + realtype & z ) { +int i,k; + x = 0.0; + y = 0.0; + z = 0.0; + k = 0; + for (i=0;iTer) { + x += atom[i]->x; + y += atom[i]->y; + z += atom[i]->z; + k++; + } + } + if (k>0) { + x /= k; + y /= k; + z /= k; + return 0; + } + return 1; +} + +void * CResidue::GetCoordHierarchy() { + if (chain) return chain->GetCoordHierarchy(); + return NULL; +} + +void CResidue::GetAltLocations ( int & nAltLocs, + PAltLoc & aLoc, + rvector & occupancy, + int & alflag ) { +int i,j,k, nal,nal1; +realtype occ1; +Boolean B; +PAltLoc aL; +rvector occ; +bvector alv; + + aLoc = NULL; + occupancy = NULL; + nAltLocs = 0; + alflag = ALF_NoAltCodes; + + if (nAtoms>0) { + + // temporary array for altcodes + aL = new AltLoc[nAtoms]; + // temporary array for occupancies + GetVectorMemory ( occ,nAtoms,0 ); + // temporary array for checking altcodes + GetVectorMemory ( alv,nAtoms,0 ); + for (i=0;iTer) { + // Find if the alternation code of ith atom is + // a new one. + B = False; + for (j=0;(jaltLoc,aL[j]); + if (!B) { + // that's a new altcode, get its occupancy + if (atom[i]->WhatIsSet & ASET_Occupancy) + occ[k] = atom[i]->occupancy; + else occ[k] = -1.0; + // store new altcode in temporary array + strcpy ( aL[k],atom[i]->altLoc ); + // check consistency of the altcode data if: + // a) the data was not found wrong so far + // b) this atom name has not been checked before + // c) altcode is not the "empty"-altcode + if ((!(alflag & ALF_Mess)) && (!alv[i]) && + (atom[i]->altLoc[0])) { + B = False; // will be set True if "empty"-altcode + // is found for current atom name + nal1 = 0; // counts the number of different altcodes + // for current atom name + occ1 = 0.0; // will count the sum of occupancies for + // current atom name + for (j=0;jTer) && + (!strcmp(atom[j]->name,atom[i]->name))) { + if (atom[j]->WhatIsSet & ASET_Occupancy) + occ1 += atom[j]->occupancy; + if (!atom[j]->altLoc[0]) B = True; + alv[j] = True; // mark it as "checked" + nal1++; + } + } + if (!(alflag & (ALF_EmptyAltLoc | ALF_NoEmptyAltLoc))) { + if (B) alflag |= ALF_EmptyAltLoc; + else alflag |= ALF_NoEmptyAltLoc; + } else if (((alflag & ALF_EmptyAltLoc) && (!B)) || + ((alflag & ALF_NoEmptyAltLoc) && (B))) + alflag |= ALF_Mess; + if ((occ[k]>=0) && (fabs(1.0-occ1)>0.01)) + alflag |= ALF_Occupancy; + if (nal==0) // first time just remember the number + nal = nal1; // of different altcodes + else if (nal!=nal1) // check if number of different altcodes + alflag |= ALF_Mess; // is not the same through the residue + } + k++; + } + } + } + if (k>0) { + aLoc = new AltLoc[k]; + GetVectorMemory ( occupancy,k,0 ); + for (i=0;iTer) { + B = False; + for (j=0;(jTer) + B = !strcmp(atom[i]->altLoc,atom[j]->altLoc); + } + if (!B) k++; + } + } + return k; +} + +void CResidue::SetResID ( const ResName resName, int sqNum, + const InsCode ins ) { + strcpy_css ( name,pstr(resName) ); + seqNum = sqNum; + strcpy_css ( insCode,pstr(ins) ); + strcpy (label_comp_id,name ); +} + +void CResidue::FreeMemory() { +// NOTE: individual atoms are disposed here as well! + DeleteAllAtoms(); + if (atom) delete[] atom; + atom = NULL; + nAtoms = 0; + AtmLen = 0; +} + +void CResidue::ExpandAtomArray ( int nAdd ) { +int i; +PPCAtom atom1; + AtmLen += abs(nAdd); + atom1 = new PCAtom[AtmLen]; + for (i=0;i=AtmLen) + ExpandAtomArray ( nAtoms+10-AtmLen ); + atom[nAtoms] = atm; + atom[nAtoms]->residue = this; + nAtoms++; + return 0; +} + +int CResidue::AddAtom ( PCAtom atm ) { +// AddAtom(..) adds atom to the residue. If residue is associated +// with a coordinate hierarchy, and atom 'atm' is not, the latter +// is checked in automatically. If atom 'atm' belongs to any +// coordinate hierarchy (even though that of the residue), it is +// *copied* rather than simply taken over, and is checked in. +// If residue is not associated with a coordinate hierarchy, all +// added atoms will be checked in automatically once the residue +// is checked in. +PCMMDBFile manager; +PCResidue res; +int i; + + for (i=0;i=AtmLen) + ExpandAtomArray ( nAtoms+10-AtmLen ); + + if (atm->GetCoordHierarchy()) { + atom[nAtoms] = newCAtom(); + atom[nAtoms]->Copy ( atm ); + } else { + res = atm->GetResidue(); + if (res) + for (i=0;inAtoms;i++) + if (res->atom[i]==atm) { + res->atom[i] = NULL; + break; + } + atom[nAtoms] = atm; + } + + atom[nAtoms]->residue = this; + manager = PCMMDBFile(GetCoordHierarchy()); + if (manager) + manager->CheckInAtom ( 0,atom[nAtoms] ); + + nAtoms++; + + return nAtoms; + +} + +int CResidue::InsertAtom ( PCAtom atm, int position ) { +// InsertAtom(..) inserts atom into the specified position of +// the residue. If residue is associated with a coordinate hierarchy, +// and atom 'atm' is not, the latter is checked in automatically. +// If atom 'atm' belongs to any coordinate hierarchy (even though +// that of the residue), it is *copied* rather than simply taken +// over, and is checked in. +// If residue is not associated with a coordinate hierarchy, all +// added atoms will be checked in automatically once the residue +// is checked in. +PCMMDBFile manager; +PCResidue res; +int i,pos; + + for (i=0;i=AtmLen) + ExpandAtomArray ( nAtoms+10-AtmLen ); + + pos = IMin(position,nAtoms); + for (i=nAtoms;i>pos;i--) + atom[i] = atom[i-1]; + + if (atm->GetCoordHierarchy()) { + atom[pos] = newCAtom(); + atom[pos]->Copy ( atm ); + } else { + res = atm->GetResidue(); + if (res) + for (i=0;inAtoms;i++) + if (res->atom[i]==atm) { + res->atom[i] = NULL; + break; + } + atom[pos] = atm; + } + + atom[pos]->residue = this; + manager = PCMMDBFile(GetCoordHierarchy()); + if (manager) + manager->CheckInAtom ( 0,atom[pos] ); + + nAtoms++; + + return nAtoms; + +} + +int CResidue::InsertAtom ( PCAtom atm, const AtomName aname ) { +// This version inserts before the atom with given name. If such +// name is not found, the atom is appended to the end. +int i; + i = 0; + while (iname)) break; + else i++; + return InsertAtom ( atm,i ); +} + + +void CResidue::CheckInAtoms() { +PCMMDBFile manager; +int i; + manager = PCMMDBFile(GetCoordHierarchy()); + if (manager) + for (i=0;iindex<0) + manager->CheckInAtom ( 0,atom[i] ); + } +} + + +int CResidue::_ExcludeAtom ( int kndex ) { +// deletes atom from the residue +int i,k; + + if (!Exclude) return 0; + + k = -1; + for (i=0;(iindex==kndex) k = i; + } + + if (k>=0) { + for (i=k+1;iPDBASCIIDump ( f ); +} + +void CResidue::MakeAtomCIF ( PCMMCIFData CIF ) { +int i; + for (i=0;iMakeCIF ( CIF ); +} + + +void CResidue::Copy ( PCResidue res ) { +// +// Modify CResidue::Copy and both CResidues::_copy methods +// simultaneously! +// +// This function will nake a copy of residue res in 'this' one. +// All atoms are copied, none is moved regardless to the association +// with coordinate hierarchy. If 'this' residue is associated with +// a coordinate hierarchy, all atoms are checked in. +PCMMDBFile manager; +int i; + + FreeMemory(); + + seqNum = res->seqNum; + label_seq_id = res->label_seq_id; + label_entity_id = res->label_entity_id; + index = res->index; + AtmLen = res->nAtoms; + SSE = res->SSE; + strcpy ( name ,res->name ); + strcpy ( label_comp_id,res->label_comp_id ); + strcpy ( label_asym_id,res->label_asym_id ); + strcpy ( insCode ,res->insCode ); + + if (AtmLen>0) { + atom = new PCAtom[AtmLen]; + nAtoms = 0; + for (i=0;inAtoms;i++) + if (res->atom[i]) { + atom[nAtoms] = newCAtom(); + atom[nAtoms]->Copy ( res->atom[i] ); + atom[nAtoms]->SetResidue ( this ); + nAtoms++; + } + for (i=nAtoms;iCheckInAtoms ( 0,atom,nAtoms ); + } + +} + + +void CResidue::_copy ( PCResidue res ) { +// Modify both CResidue::_copy and CResidue::Copy methods +// simultaneously! +// +// will work properly only if atomic arrays +// this->chain->model->GetAtom() and +// res->chain->model->GetAtom() are identical +// +int i; +PPCAtom A; + + FreeMemory(); + + seqNum = res->seqNum; + label_seq_id = res->label_seq_id; + label_entity_id = res->label_entity_id; + index = res->index; + nAtoms = res->nAtoms; + SSE = res->SSE; + strcpy ( name ,res->name ); + strcpy ( label_comp_id,res->label_comp_id ); + strcpy ( label_asym_id,res->label_asym_id ); + strcpy ( insCode ,res->insCode ); + + AtmLen = nAtoms; + A = NULL; + if (chain) { + if (chain->model) + A = chain->model->GetAllAtoms(); + } + if ((nAtoms>0) && (A)) { + atom = new PCAtom[nAtoms]; + for (i=0;iatom[i]->index-1]; + atom[i]->SetResidue ( this ); + } + } else { + nAtoms = 0; + AtmLen = 0; + } + +} + +void CResidue::_copy ( PCResidue res, PPCAtom atm, + int & atom_index ) { +// modify both CResidue::_copy and CResidue::Copy methods +// simultaneously! +// +// This function physically copies the atoms, creating new atom +// instances and putting them into array 'atm' sequentially from +// 'atom_index' position. 'atom_index' is modified (advanced). +// +int i; + + FreeMemory(); + + seqNum = res->seqNum; + label_seq_id = res->label_seq_id; + label_entity_id = res->label_entity_id; + index = res->index; + nAtoms = res->nAtoms; + SSE = res->SSE; + strcpy ( name ,res->name ); + strcpy ( label_comp_id,res->label_comp_id ); + strcpy ( label_asym_id,res->label_asym_id ); + strcpy ( insCode ,res->insCode ); + + AtmLen = nAtoms; + if (AtmLen>0) { + atom = new PCAtom[AtmLen]; + for (i=0;iatom[i]) { + if (!atm[atom_index]) atm[atom_index] = newCAtom(); + atm[atom_index]->Copy ( res->atom[i] ); + atm[atom_index]->residue = this; + atm[atom_index]->index = atom_index+1; + atom[i] = atm[atom_index]; + atom_index++; + } else + atom[i] = NULL; + } + +} + + +void CResidue::GetAtomStatistics ( RSAtomStat AS ) { + AS.Init(); + CalcAtomStatistics ( AS ); + AS.Finish(); +} + +void CResidue::CalcAtomStatistics ( RSAtomStat AS ) { +// AS must be initialized. The function only accumulates +// the statistics. +int i; + for (i=0;iCalcAtomStatistics ( AS ); +} + + +PCChain CResidue::GetChain() { + return chain; +} + +PCModel CResidue::GetModel() { + if (chain) return (PCModel)chain->model; + else return NULL; +} + + +int CResidue::GetModelNum() { + if (chain) { + if (chain->model) + return chain->model->GetSerNum(); + } + return 0; +} + +pstr CResidue::GetChainID() { + if (chain) return chain->chainID; + return pstr(""); +} + +pstr CResidue::GetLabelAsymID() { + return label_asym_id; +} + +pstr CResidue::GetResName() { + return name; +} + +pstr CResidue::GetLabelCompID() { + return label_comp_id; +} + +int CResidue::GetAASimilarity ( const ResName resName ) { + return ::GetAASimilarity ( pstr(name),pstr(resName) ); +} + +int CResidue::GetAASimilarity ( PCResidue res ) { + return ::GetAASimilarity ( name,res->name ); +} + +realtype CResidue::GetAAHydropathy() { + return ::GetAAHydropathy ( name ); +} + +void CResidue::SetResName ( const ResName resName ) { + strcpy ( name,resName ); +} + +int CResidue::GetSeqNum() { + return seqNum; +} + +int CResidue::GetLabelSeqID() { + return label_seq_id; +} + +int CResidue::GetLabelEntityID() { + return label_entity_id; +} + +pstr CResidue::GetInsCode() { + return insCode; +} + +Boolean CResidue::isAminoacid () { + return ::isAminoacid ( name ); +} + +Boolean CResidue::isNucleotide() { + return ::isNucleotide ( name ); +} + +int CResidue::isDNARNA() { + return ::isDNARNA ( name ); +} + +Boolean CResidue::isSugar() { + return ::isSugar ( name ); +} + +Boolean CResidue::isSolvent() { + return ::isSolvent ( name ); +} + +Boolean CResidue::isModRes() { +PCChain chn; +PCModRes modRes; +int nModRes,i; + chn = GetChain(); + if (chn) { + nModRes = chn->GetNofModResidues(); + for (i=0;iGetModResidue ( i ); + if (modRes) { + if ((!strcmp(modRes->resName,name)) && + (modRes->seqNum==seqNum) && + (!strcmp(modRes->insCode,insCode))) + return True; + } + } + + } + return False; +} + +Boolean CResidue::isInSelection ( int selHnd ) { +PCMMDBFile manager = (PCMMDBFile)GetCoordHierarchy(); +PCMask Mask; + if (manager) { + Mask = manager->GetSelMask ( selHnd ); + if (Mask) return CheckMask ( Mask ); + } + return False; +} + + +Boolean CResidue::isNTerminus() { +PPCResidue Res; +int i,j,nRes; + if (chain) { + chain->GetResidueTable ( Res,nRes ); + i = 0; + j = -1; + while ((i=0) + return (Res[j]->index==index); + } + return False; +} + +Boolean CResidue::isCTerminus() { +PPCResidue Res; +int i,j,nRes; + if (chain) { + chain->GetResidueTable ( Res,nRes ); + i = nRes-1; + j = -1; + while ((i>=0) && (j<0)) { + if (Res[i]) j = i; + i--; + } + if (j>=0) + return (Res[j]->index==index); + } + return False; +} + + +pstr CResidue::GetResidueID ( pstr ResidueID ) { + ResidueID[0] = char(0); + if (chain) { + if (chain->model) + sprintf ( ResidueID,"/%i/",chain->model->GetSerNum() ); + else strcpy ( ResidueID,"/-/" ); + strcat ( ResidueID,chain->chainID ); + } else + strcpy ( ResidueID,"/-/-" ); + ParamStr ( ResidueID,pstr("/"),seqNum ); + strcat ( ResidueID,"(" ); + strcat ( ResidueID,name ); + strcat ( ResidueID,")" ); + if (insCode[0]) { + strcat ( ResidueID,"." ); + strcat ( ResidueID,insCode ); + } + return ResidueID; +} + + +int CResidue::CheckID ( int * snum, + const InsCode inscode, + const ResName resname ) { + if (snum) { + if (*snum!=seqNum) return 0; + } + if (inscode) { + if ((inscode[0]!='*') && (strcmp(inscode,insCode))) return 0; + } + if (!resname) return 1; + if ((resname[0]!='*') && (strcmp(resname,name))) return 0; + return 1; +} + +int CResidue::CheckIDS ( cpstr CID ) { +ChainID chn; +InsCode inscode; +ResName resname; +AtomName atm; +Element elm; +AltLoc aloc; +pstr p1,p2; +int mdl,sn,rc; + + rc = ParseAtomPath ( CID,mdl,chn,sn,inscode,resname, + atm,elm,aloc,NULL ); + // rc = ParseResID ( CID,sn,inscode,resname ); + + if (rc>=0) { + p1 = NULL; + p2 = NULL; + if (inscode[0]!='*') p1 = inscode; + if (resname[0]!='*') p2 = resname; + if (!rc) return CheckID ( &sn ,p1,p2 ); + else return CheckID ( NULL,p1,p2 ); + } + return 0; + +} + + +// -------------------- Extracting atoms ------------------------- + +int CResidue::GetNumberOfAtoms() { + return nAtoms; +} + +int CResidue::GetNumberOfAtoms ( Boolean countTers ) { +int i,na; + na = 0; + for (i=0;iTer)) na++; + } + return na; +} + +PCAtom CResidue::GetAtom ( const AtomName aname, + const Element elname, + const AltLoc aloc ) { +int i; + for (i=0;iCheckID(aname,elname,aloc)) + return atom[i]; + } + return NULL; +} + +PCAtom CResidue::GetAtom ( int atomNo ) { + if ((0<=atomNo) && (atomNo0) { + atomTable = new PCAtom[nAtoms]; + j = 0; + for (i=0;iTer) + atomTable[j++] = atom[i]; + } + NumberOfAtoms = j; + } else { + atomTable = NULL; + NumberOfAtoms = 0; + } +} + +void CResidue::TrimAtomTable() { +int i,j; + j = 0; + for (i=0;imodel) { + A = chain->model->GetAllAtoms(); + nA = chain->model->GetNumberOfAllAtoms(); + } + } + + k = 0; + for (i=0;iCheckID(aname,elname,aloc)) { + k++; + kndex = atom[i]->index; + if ((0model) { + A = chain->model->GetAllAtoms(); + nA = chain->model->GetNumberOfAllAtoms(); + } + } + kndex = atom[atomNo]->index; + if ((0model) { + A = chain->model->GetAllAtoms(); + nA = chain->model->GetNumberOfAllAtoms(); + } + } + + k = 0; + for (i=0;iindex; + if ((0model) { + A = chain->model->GetAllAtoms(); + nA = chain->model->GetNumberOfAllAtoms(); + } + } + Exclude = False; + + n = 0; + for (i=0;iTer) { + occupancy = atom[i]->GetOccupancy(); + strcpy ( aname,atom[i]->name ); + strcpy ( aLoc ,atom[i]->altLoc ); + i1 = -1; + i2 = i; + k = 0; + for (j=i+1;jTer) && (!strcmp(atom[j]->name,aname))) { + k++; + occ = atom[j]->GetOccupancy(); + if (occ>occupancy) { + occupancy = occ; + i1 = j; + } + if (aLoc[0]) { + strcpy ( aL,atom[j]->altLoc ); + if (!aL[0]) { + aLoc[0] = char(0); + i2 = j; + } else if (strcmp(aL,aLoc)<0) { + strcpy ( aLoc,aL ); + i2 = j; + } + } + } + } + if (k>0) { + if (i1<0) { + if (atom[i]->WhatIsSet & ASET_Occupancy) i1 = i; + else i1 = i2; + } + for (j=i;jTer) && (!strcmp(atom[j]->name,aname))) { + n++; + kndex = atom[j]->index; + if ((0Ter) + atom[i]->Transform ( TMatrix ); + } +} + + + +// ----------------------------------------------------------------- + + +void CResidue::MaskAtoms ( PCMask Mask ) { +int i; + for (i=0;iSetMask ( Mask ); +} + +void CResidue::UnmaskAtoms ( PCMask Mask ) { +int i; + for (i=0;iRemoveMask ( Mask ); +} + + + +// ------- user-defined data handlers + +int CResidue::PutUDData ( int UDDhandle, int iudd ) { + if (UDDhandle & UDRF_RESIDUE) + return CUDData::putUDData ( UDDhandle,iudd ); + else return UDDATA_WrongUDRType; +} + +int CResidue::PutUDData ( int UDDhandle, realtype rudd ) { + if (UDDhandle & UDRF_RESIDUE) + return CUDData::putUDData ( UDDhandle,rudd ); + else return UDDATA_WrongUDRType; +} + +int CResidue::PutUDData ( int UDDhandle, cpstr sudd ) { + if (UDDhandle & UDRF_RESIDUE) + return CUDData::putUDData ( UDDhandle,sudd ); + else return UDDATA_WrongUDRType; +} + +int CResidue::GetUDData ( int UDDhandle, int & iudd ) { + if (UDDhandle & UDRF_RESIDUE) + return CUDData::getUDData ( UDDhandle,iudd ); + else return UDDATA_WrongUDRType; +} + +int CResidue::GetUDData ( int UDDhandle, realtype & rudd ) { + if (UDDhandle & UDRF_RESIDUE) + return CUDData::getUDData ( UDDhandle,rudd ); + else return UDDATA_WrongUDRType; +} + +int CResidue::GetUDData ( int UDDhandle, pstr sudd, int maxLen ) { + if (UDDhandle & UDRF_RESIDUE) + return CUDData::getUDData ( UDDhandle,sudd,maxLen ); + else return UDDATA_WrongUDRType; +} + +int CResidue::GetUDData ( int UDDhandle, pstr & sudd ) { + if (UDDhandle & UDRF_RESIDUE) + return CUDData::getUDData ( UDDhandle,sudd ); + else return UDDATA_WrongUDRType; +} + + +#define NOmaxdist2 12.25 + +Boolean CResidue::isMainchainHBond ( PCResidue res ) { +// Test if there is main chain Hbond between PCRes1 (donor) and +// PCRes2 (acceptor). +// As defined Kabsch & Sanders +// This probably needs the option of supporting alternative criteria +PCAtom NAtom,OAtom,CAtom; +realtype abx,aby,abz; +realtype acx,acy,acz; +realtype bcx,bcy,bcz; +realtype absq,acsq,bcsq; + + NAtom = GetAtom ( "N" ); + OAtom = res->GetAtom ( "O" ); + CAtom = res->GetAtom ( "C" ); + + if (NAtom && OAtom && CAtom) { + + abx = OAtom->x - NAtom->x; + aby = OAtom->y - NAtom->y; + abz = OAtom->z - NAtom->z; + absq = abx*abx + aby*aby + abz*abz; + + + if (absq<=NOmaxdist2) { + + acx = NAtom->x - CAtom->x; + acy = NAtom->y - CAtom->y; + acz = NAtom->z - CAtom->z; + + bcx = CAtom->x - OAtom->x; + bcy = CAtom->y - OAtom->y; + bcz = CAtom->z - OAtom->z; + + acsq = acx*acx + acy*acy + acz*acz; + bcsq = bcx*bcx + bcy*bcy + bcz*bcz; + + return (acos((bcsq+absq-acsq)/(2.0*sqrt(bcsq*absq)))>=Pi/2.0); + + } + + } + + return False; + +} + + +void CResidue::write ( RCFile f ) { +int i; +byte Version=2; + + CUDData::write ( f ); + + f.WriteByte ( &Version ); + f.WriteInt ( &seqNum ); + f.WriteInt ( &label_seq_id ); + f.WriteInt ( &label_entity_id ); + f.WriteInt ( &index ); + f.WriteInt ( &nAtoms ); + f.WriteByte ( &SSE ); + f.WriteTerLine ( name ,False ); + f.WriteTerLine ( label_comp_id,False ); + f.WriteTerLine ( label_asym_id,False ); + f.WriteTerLine ( insCode ,False ); + for (i=0;iindex) ); + +} + +void CResidue::read ( RCFile f ) { +// IMPORTANT: array Atom in CMMDBFile class should be +// read prior calling this function! +PPCAtom A; +int i,k; +byte Version; + + FreeMemory (); + + CUDData::read ( f ); + + f.ReadByte ( &Version ); + f.ReadInt ( &seqNum ); + if (Version>1) { + f.ReadInt ( &label_seq_id ); + f.ReadInt ( &label_entity_id ); + } + f.ReadInt ( &index ); + f.ReadInt ( &nAtoms ); + f.ReadByte ( &SSE ); + f.ReadTerLine ( name,False ); + if (Version>1) { + f.ReadTerLine ( label_comp_id,False ); + f.ReadTerLine ( label_asym_id,False ); + } + f.ReadTerLine ( insCode,False ); + AtmLen = nAtoms; + A = NULL; + if (chain) { + if (chain->model) + A = chain->model->GetAllAtoms(); + } + if ((nAtoms>0) && (A)) { + atom = new PCAtom[nAtoms]; + for (i=0;iSetResidue ( this ); + atom[i]->_setBonds ( A ); + } + } else { + for (i=0;i +// ~~~~~~~~~ +// **** Project : MacroMolecular Data Base (MMDB) +// ~~~~~~~~~ +// **** Classes : CAtom ( atom class ) +// ~~~~~~~~~ CResidue ( residue class ) +// **** Functions: BondAngle +// ~~~~~~~~~~ +// +// Copyright (C) E. Krissinel 2000-2013 +// +// ================================================================= +// + +#ifndef __MMDB_Atom__ +#define __MMDB_Atom__ + + +#ifndef __Stream__ +#include "stream_.h" +#endif + +#ifndef __MMDB_Defs__ +#include "mmdb_defs.h" +#endif + +#ifndef __MMDB_UDData__ +#include "mmdb_uddata.h" +#endif + +#ifndef __MMDB_Utils__ +#include "mmdb_utils.h" +#endif + + +// ====================== CAtom ========================== + + +// constants for the WhatIsSet field +#define ASET_Coordinates 0x00000001 +#define ASET_Occupancy 0x00000002 +#define ASET_tempFactor 0x00000004 +#define ASET_CoordSigma 0x00000010 +#define ASET_OccSigma 0x00000020 +#define ASET_tFacSigma 0x00000040 +#define ASET_Anis_tFac 0x00000100 +#define ASET_Anis_tFSigma 0x00001000 +#define ASET_Charge 0x00000080 +#define ASET_All 0x000FFFFF + + +#define ATOM_NoSeqNum MinInt4 + +extern Boolean ignoreSegID; +extern Boolean ignoreElement; +extern Boolean ignoreCharge; +extern Boolean ignoreNonCoorPDBErrors; +extern Boolean ignoreUnmatch; + + +DefineStructure(SAtomStat) + +struct SAtomStat { + + public : + int nAtoms; // number of atoms in statistics + + realtype xmin,ymin,zmin; // minimums of coordinates + realtype xmax,ymax,zmax; // maximums of coordinates + realtype xm ,ym ,zm; // mediums of coordinates + realtype xm2 ,ym2 ,zm2; // square mediums of coordinates + + realtype occ_min,occ_max; // minimum/maximum occupancy + realtype occ_m ,occ_m2; // medium and square medium occupancy + + realtype tFmin,tFmax; // minimum/maximum temperature factor + realtype tFm ,tFm2; // medium and sq. med. temp. factor + + realtype u11_min,u11_max; // minimums and + realtype u22_min,u22_max; // maximums of + realtype u33_min,u33_max; // anisotropic + realtype u12_min,u12_max; // temperature + realtype u13_min,u13_max; // factors + realtype u23_min,u23_max; + + realtype u11_m,u11_m2; // mediums and + realtype u22_m,u22_m2; // square mediums of + realtype u33_m,u33_m2; // anisotropic + realtype u12_m,u12_m2; // temperature + realtype u13_m,u13_m2; // factors + realtype u23_m,u23_m2; + + word WhatIsSet; // mask field + + void Init (); + void Finish(); + + realtype GetMaxSize(); + + private : + Boolean finished; + +}; + + +DefineStructure(SAtomBondI) + +struct SAtomBondI { + int index; //!< bonded atom index + byte order; //!< bond order +}; + + +DefineStructure(SAtomBond) + +struct SAtomBond { + PCAtom atom; //!< bonded atom pointer + byte order; //!< bond order +}; + + +DefineFactoryFunctions(CAtom) + +class CAtom : public CUDData { + + friend class CResidue; + friend class CModel; + friend class CMMDBFile; + friend class CMMDBCoorManager; + friend class CMMDBSelManager; + + public : + + int serNum; //!< serial number + AtomName name; //!< atom name (ALIGNED) + AtomName label_atom_id; //!< assigned atom name (not aligned) + AltLoc altLoc; //!< alternative location indicator ("" for none) + SegID segID; //!< segment identifier + Element element; //!< element symbol (ALIGNED TO RIGHT) + EnergyType energyType; //!< energy type (without spaces) + PCResidue residue; //!< reference to residue + realtype x,y,z; //!< orthogonal coordinates in angstroms + realtype occupancy; //!< occupancy + realtype tempFactor; //!< temperature factor + realtype charge; //!< charge on the atom + realtype sigX,sigY,sigZ; //!< standard deviations of the coords + realtype sigOcc; //!< standard deviation of occupancy + realtype sigTemp; //!< standard deviation of temp. factor + realtype u11,u22,u33; //!< anisotropic temperature + realtype u12,u13,u23; /// factors + realtype su11,su22,su33; //!< standard deviations of + realtype su12,su13,su23; /// anisotropic temperature factors + Boolean Het; //!< indicator of het atom + Boolean Ter; //!< chain terminator + + word WhatIsSet; //!< mask field + /// 0x0001 atomic coordinates + /// 0x0002 occupancy + /// 0x0004 temperature factor + /// 0x0010 coordinate standard deviations + /// 0x0020 deviation of occupancy + /// 0x0040 deviation of temperature factor + /// 0x0100 anisotropic temperature factors + /// 0x1000 anis. temp. fact-s st-d deviations + + CAtom (); + CAtom ( PCResidue res ); + CAtom ( RPCStream Object ); + ~CAtom(); + + void SetResidue ( PCResidue res ); + void PDBASCIIDump ( RCFile f ); + void MakeCIF ( PCMMCIFData CIF ); + + // AddBond(...) adds a bond to the atom, that is a pointer + // to the bonded atom and the bond order. nAdd_bonds allows + // one to minimize the memory reallocations, if number of + // bonds is known apriori: CAtom adds space for nAdd_bonds + // if currently allocated space is exchausted. + // Return: <=0 - error: bond_atom is already "bonded" + // >0 - Ok, returns current number of bonds + int AddBond ( PCAtom bond_atom, int bond_order, + int nAdd_bonds=1 ); + int GetNBonds(); + + // This GetBonds(..) returns pointer to the CAtom's + // internal Bond structure, IT MUST NOT BE DISPOSED. + void GetBonds ( RPSAtomBond AtomBond, int & nAtomBonds ); + void FreeBonds(); + + // This GetBonds(..) disposes AtomBondI, if it was not set + // to NULL, allocates AtomBondI[nAtomBonds] and returns its + // pointer. AtomBondI MUST BE DISPOSED BY APPLICATION. + void GetBonds ( RPSAtomBondI AtomBondI, int & nAtomBonds ); + + // This GetBonds(..) does not dispose or allocate AtomBondI. + // It is assumed that length of AtomBondI is sufficient to + // accomodate all bonded atoms. + void GetBonds ( PSAtomBondI AtomBondI, int & nAtomBonds, + int maxlength ); + + + // ConvertPDBxxxxxx() gets data from the PDB ASCII xxxxxx + // record (xxxxxx stands for ATOM, SIGATM, ANISOU, SIGUIJ, + // TER or HETATM). + // These functions DO NOT check the xxxxxx keyword and + // do not decode the chain and residue parameters! These + // must be treated by the calling process, see + // CMMDBFile::ReadPDBAtom(). + // The atom reference is updated in the corresponding + // residue. + int ConvertPDBATOM ( int ix, cpstr S ); + int ConvertPDBSIGATM ( int ix, cpstr S ); + int ConvertPDBANISOU ( int ix, cpstr S ); + int ConvertPDBSIGUIJ ( int ix, cpstr S ); + int ConvertPDBTER ( int ix, cpstr S ); + int ConvertPDBHETATM ( int ix, cpstr S ); + + int GetCIF ( int ix, PCMMCIFLoop Loop, + PCMMCIFLoop LoopAnis ); + + Boolean RestoreElementName(); + Boolean MakePDBAtomName(); + + void SetAtomName ( int ix, // index + int sN, // serial number + const AtomName aName, // atom name + const AltLoc aLoc, // alternative location + const SegID sID, // segment ID + const Element eName ); // element name + + // This only renames the atom + void SetAtomName ( const AtomName atomName ); + void SetElementName ( const Element elName ); + void SetCharge ( cpstr chrg ); + void SetCharge ( realtype chrg ); + + void SetAtomIndex ( int ix ); // don't use in your applications! + + void MakeTer(); // converts atom into 'ter' + + void SetCoordinates ( realtype xx, realtype yy, realtype zz, + realtype occ, realtype tFac ); + + int GetModelNum (); + pstr GetChainID (); + pstr GetLabelAsymID (); + pstr GetResName (); + pstr GetLabelCompID (); + int GetAASimilarity ( const ResName resName ); + int GetAASimilarity ( PCAtom A ); + realtype GetAAHydropathy(); + realtype GetOccupancy (); + int GetSeqNum (); + int GetLabelSeqID (); + int GetLabelEntityID (); + pstr GetInsCode (); + int GetSSEType (); // works only after SSE calculations + pstr GetAtomName () { return name; } + pstr GetElementName () { return element; } + pstr GetAtomCharge ( pstr chrg ); + + // GetChainCalphas(...) is a specialized function for quick + // access to C-alphas of chain which includes given atom. + // This function works faster than an equivalent implementation + // through MMDB's selection procedures. + // Parameters: + // Calphas - array to accept pointers on C-alpha atoms + // If Calphas!=NULL, then the function will + // delete and re-allocate it. When the array + // is no longer needed, the application MUST + // delete it: delete[] Calphas; Deleting + // Calphas does not delete atoms from MMDB. + // nCalphas - integer to accept number of C-alpha atoms + // and the length of Calphas array. + // altLoc - alternative location indicator. By default + // (""), maximum-occupancy locations are taken. + void GetChainCalphas ( PPCAtom & Calphas, int & nCalphas, + cpstr altLoc = "" ); + + Boolean isTer () { return Ter; } + Boolean isMetal (); + Boolean isSolvent (); // works only for atom in a residue! + Boolean isInSelection ( int selHnd ); + Boolean isNTerminus (); + Boolean isCTerminus (); + + void CalcAtomStatistics ( RSAtomStat AS ); + + realtype GetDist2 ( PCAtom a ); + realtype GetDist2 ( PCAtom a, mat44 & tm ); // tm applies to A + realtype GetDist2 ( PCAtom a, mat33 & r, vect3 & t );// tm applies to A + realtype GetDist2 ( realtype ax, realtype ay, realtype az ); + + // GetCosine(a1,a2) calculates cosine of angle a1-this-a2, + // i.e. that between vectors [a1,this] and [this,a2]. + realtype GetCosine ( PCAtom a1, PCAtom a2 ); + + PCResidue GetResidue (); + PCChain GetChain (); + PCModel GetModel (); + int GetResidueNo(); + void * GetCoordHierarchy(); // PCMMDBFile + + // GetAtomID(..) generates atom ID in the form + // /m/c/r(rn).i/n[e]:a + // where m - model number + // c - chain ID + // r - residue sequence number + // rn - residue name + // i - insertion code + // n - atom name + // e - chemical element specification + // a - alternate location indicator + // If any of the fields is undefined, it is replaced by + // hyphen '-'. + // No checks on the sufficiency of string buffer AtomID + // is made. + // GetAtomID returns AtomID. + pstr GetAtomID ( pstr AtomID ); + + pstr GetAtomIDfmt ( pstr AtomID ); + + // ------- checking atom ID + // CheckID(..) returns 1 if atom is identified, and 0 otherwise. + // Parameters: + // aname - atom name. It may or may not be aligned (as in + // a PDB file), only first word of the name will + // be taken ("CA", " CA" and " CA B" are all + // considered as "CA"). aname may be set to NULL + // or '*', then this parameter is ignored. + // elname - element code. It will work only if element code + // is supplied (which might not be the case if + // the atom was created in a tricky way). elname + // should be used to distinguih between, e.g. + // "Ca" and "C_alpha"). elname may be set to NULL, + // or '*', then this parameter is ignored. + // aloc - the alternate location code. aloc may be set to + // NULL or '*', then this parameter is ignored. + // IMPORTANT: comparison is case-sensitive. + // The atom is considered as identified, if all non-NULL + // parameters do match. If all parameters are set NULL, any atom + // is identified. + // DEFAULT values correspond to 'any element' and + // 'no alternate location code' + // NOTE that " " is not an empty item. + int CheckID ( const AtomName aname, const Element elname=NULL, + const AltLoc aloc=pstr("") ); + + // CheckIDS(..) works exactly like CheckID(..), but it takes + // the only parameter, the atom ID, which is of the form: + // {name} {[element]} {:altcode} + // Here {} means that the item may be omitted. Any item may be + // represented by a wildcard '*', which means 'any value'. Just + // absence of an item means 'empty', which makes sense only for + // alternate location code. Missing name or element therefore + // mean 'any name' or 'any element', correspondingly (same as a + // wildcard). There should be no spaces in ID except for leading + // spaces; any following space will terminate parsing. + // The followings are perfectly valid IDs: + // CA[C]:A (carbon C_alpha in location A) + // CA[*]:A (either C_alpha or Ca in location A) + // CA:A (same as above) + // CA (either C_alpha or Ca with no location indicator) + // CA[] (same as above) + // CA[C]: (C_alpha with no location indicator) + // [C] (any carbon with no location indicator) + // [C]:* (any carbon with any location indicator) + // *[C]:* (same as above) + // :A (any atom in location A) + // *[*]:A (same as above) + // *[*]:* (any atom) + // * (any atom with no alternate location indicator) + int CheckIDS ( cpstr ID ); + + + // ------- transform coordinates: x := m*x + v + void Transform ( mat33 & tm, vect3 & v ); + void Transform ( mat44 & tm ); + void TransformCopy ( mat44 & tm, + realtype & xx, realtype & yy, realtype & zz ); + void TransformSet ( mat44 & tm, + realtype xx, realtype yy, realtype zz ); + + + // ------- user-defined data handlers + int PutUDData ( int UDDhandle, int iudd ); + int PutUDData ( int UDDhandle, realtype rudd ); + int PutUDData ( int UDDhandle, cpstr sudd ); + + int GetUDData ( int UDDhandle, int & iudd ); + int GetUDData ( int UDDhandle, realtype & rudd ); + int GetUDData ( int UDDhandle, pstr sudd, int maxLen ); + int GetUDData ( int UDDhandle, pstr & sudd ); + + + int GetIndex() { return index; } + + virtual void Copy ( PCAtom atom ); // without references in + // residues + + void SetShortBinary(); // leaves only coordinates in binary files + void write ( RCFile f ); + void read ( RCFile f ); + + protected : + int index; // index in the file + int nBonds; // number of bonds in the lowest byte (!) + PSAtomBond Bond; // atom bonds + + void InitAtom (); + void FreeMemory (); + void StandardPDBOut ( cpstr Record, pstr S ); + void GetData ( cpstr S ); + int CheckData ( cpstr S ); + void GetStat ( realtype v, + realtype & v_min, realtype & v_max, + realtype & v_m, realtype & v_m2 ); + void _setBonds ( PPCAtom A ); // used only in CResidue + +}; + + +// ====================== CResidue ========================== + +#define ALF_NoAltCodes 0x00000000 +#define ALF_EmptyAltLoc 0x00000001 +#define ALF_NoEmptyAltLoc 0x00000002 +#define ALF_Mess 0x00000004 +#define ALF_Occupancy 0x00000008 + +#define SSE_None 0 +#define SSE_Strand 1 +#define SSE_Bulge 2 +#define SSE_3Turn 3 +#define SSE_4Turn 4 +#define SSE_5Turn 5 +#define SSE_Helix 6 + + +DefineFactoryFunctions(CResidue) + +class CResidue : public CUDData { + + friend class CAtom; + friend class CChain; + friend class CMMDBFile; + + public : + + ResName name; //!< residue name - all spaces cut + ResName label_comp_id; //!< assigned residue name + ChainID label_asym_id; //!< assigned chain Id + InsCode insCode; //!< residue insertion code + PCChain chain; //!< reference to chain + PPCAtom atom; //!< array of atoms + int seqNum; //!< residue sequence number + int label_seq_id; //!< assigned residue sequence number + int label_entity_id; //!< assigned entity id + int index; //!< index in the chain + int nAtoms; //!< number of atoms in the residue + byte SSE; //!< SSE type + + CResidue (); + CResidue ( PCChain Chain_Owner ); + CResidue ( PCChain Chain_Owner, const ResName resName, + int sqNum, const InsCode ins ); + CResidue ( RPCStream Object ); + ~CResidue(); + + void SetChain ( PCChain Chain_Owner ); + void SetResID ( const ResName resName, int sqNum, + const InsCode ins ); + void SetChainID ( const ChainID chID ); + + void PDBASCIIAtomDump ( RCFile f ); + void MakeAtomCIF ( PCMMCIFData CIF ); + + PCChain GetChain(); + PCModel GetModel(); + + int GetModelNum (); + pstr GetChainID (); + pstr GetLabelAsymID(); + pstr GetResName (); + pstr GetLabelCompID(); + int GetAASimilarity ( const ResName resName ); + int GetAASimilarity ( PCResidue res ); + realtype GetAAHydropathy(); + void SetResName ( const ResName resName ); + int GetSeqNum (); + int GetLabelSeqID (); + int GetLabelEntityID(); + pstr GetInsCode (); + int GetResidueNo (); + int GetCenter ( realtype & x, realtype & y, realtype & z ); + void * GetCoordHierarchy(); // PCMMDBFile + + void GetAtomStatistics ( RSAtomStat AS ); + void CalcAtomStatistics ( RSAtomStat AS ); + + pstr GetResidueID ( pstr ResidueID ); + + // GetAltLocations(..) returns the number of different + // alternative locations in nAltLocs, the locations themselves + // - in aLoc and the corresponding occupancies - in occupancy. + // aLoc and occupancy are allocated dynamically; it is + // responsibility of the application to deallocate aLoc prior + // calling GetAltLocations(..) if they were previously allocated. + // Either, the application is responsible for deallocating aLoc and + // occupancy after use. + // occupancy[i] may return -1.0 if occupancies were not read + // from coordinate file. + // alflag returns ALF_NoAltCodes if no alt codes was found, + // otherwise the output is decoded according to bits: + // ALF_EmptyAltLoc alternative locations include the + // "no alt loc indicator" ("" for + // CAtom::altLoc). + // This means that each atom that has alt locs + // different of "", also includes one marked as + // "". + // ALF_NoEmptyAltLoc alternative locations do not include the + // "no alt loc indicator" ("" for + // CAtom::altLoc). + // This means that each atom has either "" + // alt loc or at least two alt locs different + // of "". + // ALF_Mess incorrect residue: it mixes both + // ""-including and not-""-including schemes + // ALF_Occupancy warning that sum of occupancies for alt + // located atoms differ from 1.0 by more + // than 0.01. + void GetAltLocations ( int & nAltLocs, PAltLoc & aLoc, + rvector & occupancy, int & alflag ); + int GetNofAltLocations(); + + Boolean isAminoacid (); + Boolean isNucleotide (); + int isDNARNA (); // 0(neither),1(DNA),2(RNA) + Boolean isSugar (); + Boolean isSolvent (); + Boolean isModRes (); + Boolean isInSelection ( int selHnd ); + Boolean isNTerminus (); + Boolean isCTerminus (); + + // ------- checking residue ID + // CheckID(..) returns 1 if residue is identified, and 0 otherwise. + // Parameters: + // sname - pointer to sequence number; if NULL then ignored. + // inscode - insertion code; if NULL or '*' then ignored. + // resname - residue name; if NULL or '*' then ignored. + // IMPORTANT: comparison is case-sensitive. + // The residue is considered as identified, if all non-NULL + // parameters do match. If all parameters are set NULL, any + // residue is identified. + // DEFAULT values correspond to 'any residue name' and + // 'no insertion code' + // NOTE that " " is not an empty item. + int CheckID ( int * snum, const InsCode inscode=pstr(""), + const ResName resname=NULL ); + + // CheckIDS(..) works exactly like CheckID(..), but it takes + // the only parameter, the residue ID, which is of the form: + // {seqnum} {(name)} {.inscode} + // Here {} means that the item may be omitted. Any item may be + // represented by a wildcard '*', which means 'any value'. Just + // absence of a value means 'empty', which is meaningful only for + // the insertion code. Missing sequence number or residue name + // therefore mean 'any sequence number' or 'any residue name', + // correspondingly (same as a wildcard). There should be no + // spaces in ID except for leading spaces; any following space will + // terminate parsing. The followings are perfectly valid IDs: + // 27(ALA).A (residue 27A ALA) + // 27().A (residue 27A) + // 27(*).A (same as above) + // 27.A (same as above) + // 27 (residue 27) + // 27(). (same as above) + // (ALA) (any ALA without insertion code) + // (ALA). (same as above) + // (ALA).* (any ALA) + // *(ALA).* (any ALA) + // .A (any residue with insertion code A) + // *(*).A (same as above) + // *(*).* (any residue) + // * (any residue with no insertion code) + int CheckIDS ( cpstr ID ); + + + // -------------------- Extracting atoms ---------------------- + + int GetNumberOfAtoms (); + int GetNumberOfAtoms ( Boolean countTers ); + + PCAtom GetAtom ( const AtomName aname, const Element elname=NULL, + const AltLoc aloc=cpstr("") ); + PCAtom GetAtom ( int atomNo ); + + void GetAtomTable ( PPCAtom & atomTable, int & NumberOfAtoms ); + + // GetAtomTable1(..) returns atom table without TER atoms and + // without NULL atom pointers. NumberOfAtoms returns the actual + // number of atom pointers in atomTable. + // atomTable is allocated withing the function. If it was + // not set to NULL before calling the function, the latter will + // attempt to deallocate it first. + // The application is responsible for deleting atomTable, + // however it must not touch atom pointers, i.e. use simply + // "delete[] atomTable;". Never pass atomTable from GetAtomTable() + // into this function, unless you set it to NULL before doing that. + void GetAtomTable1 ( PPCAtom & atomTable, int & NumberOfAtoms ); + + + // --------------------- Deleting atoms ----------------------- + + int DeleteAtom ( const AtomName aname, const Element elname=NULL, + const AltLoc aloc=cpstr("") ); + int DeleteAtom ( int atomNo ); + int DeleteAllAtoms(); + + // DeleteAltLocs() leaves only alternative location with maximal + // occupancy, if those are equal or unspecified, the one with + // "least" alternative location indicator. + // The function returns the number of deleted atoms. The atom + // table remains untrimmed, so that nAtoms are wrong until that + // is done. Tables are trimmed by FinishStructEdit() or + // explicitely. + int DeleteAltLocs (); + + void TrimAtomTable (); + + // ---------------------- Adding atoms ------------------------ + + // AddAtom(..) adds atom to the residue. If residue is associated + // with a coordinate hierarchy, and atom 'atm' is not, the latter + // is checked in automatically. If atom 'atm' belongs to any + // coordinate hierarchy (even though that of the residue), it is + // *copied* rather than simply taken over, and is checked in. + // If residue is not associated with a coordinate hierarchy, all + // added atoms will be checked in automatically once the residue + // is checked in. + int AddAtom ( PCAtom atm ); + + // InsertAtom(..) inserts atom into the specified position of + // the residue. If residue is associated with a coordinate + // hierarchy, and atom 'atm' is not, the latter is checked in + // automatically. If atom 'atm' belongs to any coordinate + // hierarchy (even though that of the residue), it is *copied* + // rather than simply taken over, and is checked in. + // If residue is not associated with a coordinate hierarchy, all + // added atoms will be checked in automatically once the residue + // is checked in. + int InsertAtom ( PCAtom atm, int position ); + + // This version inserts before the atom with given name. If such + // name is not found, the atom is appended to the end. + int InsertAtom ( PCAtom atm, const AtomName aname ); + + // -------------------------------------------------------------- + + void ApplyTransform ( mat44 & TMatrix ); // transforms all + // coordinates by + // multiplying with + // matrix TMatrix + + void MaskAtoms ( PCMask Mask ); + void UnmaskAtoms ( PCMask Mask ); + + + // ------- user-defined data handlers + int PutUDData ( int UDDhandle, int iudd ); + int PutUDData ( int UDDhandle, realtype rudd ); + int PutUDData ( int UDDhandle, cpstr sudd ); + + int GetUDData ( int UDDhandle, int & iudd ); + int GetUDData ( int UDDhandle, realtype & rudd ); + int GetUDData ( int UDDhandle, pstr sudd, int maxLen ); + int GetUDData ( int UDDhandle, pstr & sudd ); + + + Boolean isMainchainHBond ( PCResidue res ); + + void Copy ( PCResidue res ); + + void write ( RCFile f ); + void read ( RCFile f ); + + protected : + + int AtmLen; // length of atom array + Boolean Exclude; // used internally + + void InitResidue (); + void FreeMemory (); + int _AddAtom ( PCAtom atm ); + int _ExcludeAtom ( int kndex ); // 1: residue gets empty, + // 0 otherwise + void _copy ( PCResidue res ); + void _copy ( PCResidue res, PPCAtom atm, int & atom_index ); + void ExpandAtomArray ( int nAdd ); + void CheckInAtoms (); + +}; + + +extern realtype BondAngle ( PCAtom A, PCAtom B, PCAtom C ); + + +#endif + diff --git a/mmdb/mmdb_bondmngr.cpp b/mmdb/mmdb_bondmngr.cpp new file mode 100755 index 0000000..69afa73 --- /dev/null +++ b/mmdb/mmdb_bondmngr.cpp @@ -0,0 +1,125 @@ +// $Id: mmdb_bondmngr.cpp,v 1.21 2012/01/26 17:52:20 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 29.01.10 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : mmdb_bondmngr +// ~~~~~~~~~ +// **** Project : MacroMolecular Data Base (MMDB) +// ~~~~~~~~~ +// **** Classes : CMMDBBondManager ( MMDB bonds maker ) +// ~~~~~~~~~ +// +// (C) E. Krissinel 2000-2010 +// +// ================================================================= +// + + +#ifndef __STRING_H +#include +#endif + +#ifndef __MMDB_BondMngr__ +#include "mmdb_bondmngr.h" +#endif + +#ifndef __MMDB_Graph__ +#include "mmdb_graph.h" +#endif + + +// ===================== CMMDBBondManager ===================== + +CMMDBBondManager::CMMDBBondManager() : CMMDBSelManager() { +} + +CMMDBBondManager::CMMDBBondManager ( RPCStream Object ) + : CMMDBSelManager(Object) { +} + +CMMDBBondManager::~CMMDBBondManager() {} + +void CMMDBBondManager::MakeBonds ( Boolean calc_only ) { +UNUSED_ARGUMENT(calc_only); +PCModel model; +PCChain chain; +PCResidue res; +CGraph graph; +PPCVertex V; +PPCEdge E; +int i, im,ic,ir, nV,nE, k1,k2; + + RemoveBonds(); + + for (im=0;imnChains;ic++) { + chain = model->Chain[ic]; + if (chain) + for (ir=0;irnResidues;ir++) { + res = chain->Residue[ir]; + if (res) { + graph.MakeGraph ( res,NULL ); + graph.GetVertices ( V,nV ); + graph.GetEdges ( E,nE ); + for (i=0;iGetVertex1()]->GetUserID(); + k2 = V[E[i]->GetVertex2()]->GetUserID(); + res->atom[k1]->AddBond ( res->atom[k2],E[i]->GetType() ); + res->atom[k2]->AddBond ( res->atom[k1],E[i]->GetType() ); + } + } + } + } + } + +} + +void CMMDBBondManager::RemoveBonds() { +int i; + for (i=0;iFreeBonds(); +} + +// ------------------- Stream functions ---------------------- + +void CMMDBBondManager::write ( RCFile f ) { +byte Version=1; + f.WriteByte ( &Version ); + CMMDBSelManager::write ( f ); +} + +void CMMDBBondManager::read ( RCFile f ) { +byte Version; + f.ReadByte ( &Version ); + CMMDBSelManager::read ( f ); +} + + +MakeStreamFunctions(CMMDBBondManager) diff --git a/mmdb/mmdb_bondmngr.h b/mmdb/mmdb_bondmngr.h new file mode 100755 index 0000000..0df4c96 --- /dev/null +++ b/mmdb/mmdb_bondmngr.h @@ -0,0 +1,73 @@ +// $Id: mmdb_bondmngr.h,v 1.20 2012/01/26 17:52:20 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 17.11.00 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : mmdb_bondmngr +// ~~~~~~~~~ +// Project : MacroMolecular Data Base (MMDB) +// ~~~~~~~~~ +// **** Classes : CMMDBBondManager ( MMDB bonds maker ) +// ~~~~~~~~~ +// +// (C) E. Krissinel 2000-2008 +// +// ================================================================= +// + +#ifndef __MMDB_BondMngr__ +#define __MMDB_BondMngr__ + +#ifndef __MMDB_SelMngr__ +#include "mmdb_selmngr.h" +#endif + + +// ======================= CMMDBBondManager ======================= + + +DefineClass(CMMDBBondManager); +DefineStreamFunctions(CMMDBBondManager); + +class CMMDBBondManager : public CMMDBSelManager { + + public : + + CMMDBBondManager (); + CMMDBBondManager ( RPCStream Object ); + ~CMMDBBondManager(); + + void MakeBonds ( Boolean calc_only ); + void RemoveBonds(); + + protected : + void write ( RCFile f ); + void read ( RCFile f ); + +}; + +#endif + diff --git a/mmdb/mmdb_chain.cpp b/mmdb/mmdb_chain.cpp new file mode 100755 index 0000000..137b5ce --- /dev/null +++ b/mmdb/mmdb_chain.cpp @@ -0,0 +1,2568 @@ +// $Id: mmdb_chain.cpp,v 1.25 2012/01/26 17:52:20 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 14.06.13 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : MMDB_Chain +// ~~~~~~~~~ +// **** Project : MacroMolecular Data Base (MMDB) +// ~~~~~~~~~ +// **** Classes : CChainContainer ( container for in-chain classes ) +// ~~~~~~~~~ CContainerChain ( chain containered class template) +// CDBReference ( DBREF records ) +// CSeqAdv ( SEQADV records ) +// CSeqRes ( SEQRES records ) +// CModRes ( MODRES records ) +// CHetRec ( HET records ) +// CChain ( MMDB chain class ) +// +// Copyright (C) E. Krissinel 2000-2013 +// +// ================================================================= +// + +#ifndef __STRING_H +#include +#endif + +#ifndef __STDLIB_H +#include +#endif + +#ifndef __MMDB_Chain__ +#include "mmdb_chain.h" +#endif + +#ifndef __MMDB_Model__ +#include "mmdb_model.h" +#endif + +#ifndef __MMDB_File__ +#include "mmdb_file.h" +#endif + +#ifndef __MMDB_CIFDefs__ +#include "mmdb_cifdefs.h" +#endif + +// ================== CProModel ====================== + +MakeStreamFunctions(CProModel) + +// ============== CChainContainer ==================== + +PCContainerClass CChainContainer::MakeContainerClass ( int ClassID ) { + switch (ClassID) { + default : + case ClassID_Template : return + CClassContainer::MakeContainerClass(ClassID); + case ClassID_DBReference : return new CDBReference ( Chain ); + case ClassID_SeqAdv : return new CSeqAdv ( Chain ); + case ClassID_ModRes : return new CModRes ( Chain ); + case ClassID_Het : return new CHetRec ( Chain ); + } +} + +void CChainContainer::SetChain ( PCChain Chain_Owner ) { +int i; + Chain = Chain_Owner; + for (i=0;iSetChain ( Chain ); +} + +cpstr CChainContainer::Get1stChainID() { +int i; + i = 0; + if (Container) { + while ((ichainID; + else return NULL; + } else + return NULL; +} + +void CChainContainer::MoveByChainID ( const ChainID chainID, + PCChainContainer ChainContainer ) { +int i; + for (i=0;ichainID,chainID)) { + ChainContainer->AddData ( Container[i] ); + Container[i] = NULL; + } + } +} + + +MakeStreamFunctions(CChainContainer) + + +// ================ CContainerChain =================== + +CContainerChain::CContainerChain () + : CContainerClass() { + Chain = NULL; + chainID[0] = char(0); +} + +CContainerChain::CContainerChain ( PCChain Chain_Owner) + : CContainerClass() { + Chain = Chain_Owner; + if (Chain) strcpy ( chainID,Chain->GetChainID() ); + else chainID[0] = char(0); +} + +void CContainerChain::SetChain ( PCChain Chain_Owner ) { + Chain = Chain_Owner; + if (Chain) strcpy ( chainID,Chain->GetChainID() ); + else strcpy ( chainID,"" ); +} + +MakeStreamFunctions(CContainerChain) + + +// ================ CDBReference =================== + +CDBReference::CDBReference() : CContainerChain() { + InitDBReference(); +} + +CDBReference::CDBReference( PCChain Chain_Owner ) + : CContainerChain(Chain_Owner) { + InitDBReference(); +} + +CDBReference::CDBReference ( PCChain Chain_Owner, cpstr S ) + : CContainerChain(Chain_Owner) { + InitDBReference(); + ConvertPDBASCII ( S ); +} + +CDBReference::CDBReference ( RPCStream Object ) + : CContainerChain(Object) { + InitDBReference(); +} + +CDBReference::~CDBReference() {} + +void CDBReference::InitDBReference() { + seqBeg = 0; + strcpy ( insBeg ,"-" ); + seqEnd = 0; + strcpy ( insEnd ,"-" ); + strcpy ( database ,"------" ); + strcpy ( dbAccession,"--------" ); + strcpy ( dbIdCode ,"------------" ); + dbseqBeg = 0; + strcpy ( dbinsBeg,"-" ); + dbseqEnd = 0; + strcpy ( dbinsEnd,"-" ); +} + +void CDBReference::PDBASCIIDump ( pstr S, int N ) { +UNUSED_ARGUMENT(N); +// makes the ASCII PDB DBREF line number N +// from the class' data + strcpy ( S,"DBREF" ); + PadSpaces ( S,80 ); + strcpy_n ( &(S[7]),Chain->GetEntryID(),4 ); + if (Chain->chainID[0]) S[12] = Chain->chainID[0]; + PutIntIns ( &(S[14]),seqBeg,4,insBeg ); + PutIntIns ( &(S[20]),seqEnd,4,insEnd ); + strcpy_n ( &(S[26]),database ,6 ); + strcpy_n ( &(S[33]),dbAccession,8 ); + strcpy_n ( &(S[42]),dbIdCode ,12 ); + PutIntIns ( &(S[55]),dbseqBeg,5,dbinsBeg ); + PutIntIns ( &(S[62]),dbseqEnd,5,dbinsEnd ); +} + +void CDBReference::MakeCIF ( PCMMCIFData CIF, int N ) { +UNUSED_ARGUMENT(N); +PCMMCIFLoop Loop1,Loop2; +int RC1,RC2; + + RC1 = CIF->AddLoop ( CIFCAT_STRUCT_REF_SEQ,Loop1 ); + RC2 = CIF->AddLoop ( CIFCAT_STRUCT_REF ,Loop2 ); + + if ((RC1!=CIFRC_Ok) || (RC2!=CIFRC_Ok)) { + // the category was (re)created, provide tags + Loop1->AddLoopTag ( CIFTAG_NDB_PDB_ID_CODE ); + Loop1->AddLoopTag ( CIFTAG_NDB_CHAIN_ID ); + Loop1->AddLoopTag ( CIFTAG_SEQ_ALIGN_BEG ); + Loop1->AddLoopTag ( CIFTAG_NDB_SEQ_ALIGN_BEG_INS_CODE ); + Loop1->AddLoopTag ( CIFTAG_SEQ_ALIGN_END ); + Loop1->AddLoopTag ( CIFTAG_NDB_SEQ_ALIGN_END_INS_CODE ); + Loop1->AddLoopTag ( CIFTAG_NDB_DB_ACCESSION ); + Loop1->AddLoopTag ( CIFTAG_DB_ALIGN_BEG ); + Loop1->AddLoopTag ( CIFTAG_NDB_DB_ALIGN_BEG_INS_CODE ); + Loop1->AddLoopTag ( CIFTAG_DB_ALIGN_END ); + Loop1->AddLoopTag ( CIFTAG_NDB_DB_ALIGN_END_INS_CODE ); + Loop2->AddLoopTag ( CIFTAG_DB_NAME ); + Loop2->AddLoopTag ( CIFTAG_DB_CODE ); + } + + Loop1->AddString ( Chain->GetEntryID(),True ); + Loop1->AddString ( Chain->chainID ,True ); + Loop1->AddInteger ( seqBeg ); + Loop1->AddString ( insBeg ,True ); + Loop1->AddInteger ( seqEnd ); + Loop1->AddString ( insEnd ,True ); + Loop1->AddString ( dbAccession ,True ); + Loop1->AddInteger ( dbseqBeg ); + Loop1->AddString ( dbinsBeg ,True ); + Loop1->AddInteger ( dbseqEnd ); + Loop1->AddString ( dbinsEnd ,True ); + + Loop2->AddString ( database,True ); + Loop2->AddString ( dbIdCode,True ); + +} + +void CDBReference::GetCIF ( PCMMCIFData CIF, int & Signal ) { +// GetCIF(..) must be always run without reference to Chain, +// see CModel::GetCIF(..). +PCMMCIFLoop Loop1,Loop2; +PCMMCIFStruct Struct2; +pstr F; +int RC,CIFMode,ref_id1,ref_id2; + + Loop1 = CIF->GetLoop ( CIFCAT_STRUCT_REF_SEQ ); + + if (!Loop1) { + Signal = -1; + return; + } + + if (Signal>=Loop1->GetLoopLength()) { + Signal = -1; + return; + } + + + // Determine the ChainID first and store it locally. It will + // be used by CModel for generating chains and placing the + // primary structure data BEFORE reading the coordinate section. + CIFMode = CIF_NDB; + F = Loop1->GetString ( CIFName(TAG_CHAIN_ID,CIFMode),Signal,RC ); + if ((RC) || (!F)) { + CIFMode = CIF_PDBX; + F = Loop1->GetString ( CIFName(TAG_CHAIN_ID,CIFMode),Signal,RC ); + } + if ((!RC) && F) { + strcpy_n0 ( chainID,F,sizeof(ChainID)-1 ); + Loop1->DeleteField ( CIFName(TAG_CHAIN_ID,CIFMode),Signal ); + } else + strcpy ( chainID,"" ); + + + if (CIFGetInteger(seqBeg,Loop1,CIFName(TAG_SEQ_ALIGN_BEG,CIFMode), + Signal)) return; + CIFGetString ( insBeg,Loop1,CIFName(TAG_SEQ_ALIGN_BEG_INS_CODE,CIFMode), + Signal,sizeof(InsCode),pstr(" ") ); + + if (CIFGetInteger(seqEnd,Loop1,CIFName(TAG_SEQ_ALIGN_END,CIFMode), + Signal)) return; + CIFGetString ( insEnd,Loop1,CIFName(TAG_SEQ_ALIGN_END_INS_CODE,CIFMode), + Signal,sizeof(InsCode),pstr(" ") ); + CIFGetString ( dbAccession,Loop1,CIFName(TAG_DB_ACCESSION,CIFMode), + Signal,sizeof(DBAcCode),pstr(" ") ); + + if (CIFGetInteger(dbseqBeg,Loop1,CIFName(TAG_DB_ALIGN_BEG,CIFMode), + Signal)) return; + CIFGetString ( dbinsBeg,Loop1,CIFName(TAG_DB_ALIGN_BEG_INS_CODE,CIFMode), + Signal,sizeof(InsCode),pstr(" ") ); + + if (CIFGetInteger(dbseqEnd,Loop1,CIFName(TAG_DB_ALIGN_END,CIFMode), + Signal)) return; + CIFGetString ( dbinsEnd,Loop1,CIFName(TAG_DB_ALIGN_END_INS_CODE,CIFMode), + Signal,sizeof(InsCode),pstr(" ") ); + + Loop2 = CIF->GetLoop ( CIFCAT_STRUCT_REF ); + if (Loop2) { + CIFGetString ( database,Loop2,CIFTAG_DB_NAME,Signal, + sizeof(DBName) ,pstr(" ") ); + CIFGetString ( dbIdCode,Loop2,CIFTAG_DB_CODE,Signal, + sizeof(DBIdCode),pstr(" ") ); + } else if (CIFMode==CIF_PDBX) { + Struct2 = CIF->GetStructure ( CIFCAT_STRUCT_REF ); + if (Struct2 && + (!CIFGetInteger(ref_id1,Loop1,CIFTAG_REF_ID,Signal)) && + (!CIFGetInteger(ref_id2,Struct2,CIFTAG_ID,False))) { + if (ref_id1==ref_id2) { + CIFGetString ( database,Struct2,CIFTAG_DB_NAME, + sizeof(DBName) ,pstr(" ") ,False ); + CIFGetString ( dbIdCode,Struct2,CIFTAG_DB_CODE, + sizeof(DBIdCode),pstr(" "),False ); + } + } + } + + Signal++; + +} + + +int CDBReference::ConvertPDBASCII ( cpstr S ) { +IDCode idCode; + if (Chain->chainID[0]) { + if (S[12]!=Chain->chainID[0]) + return Error_WrongChainID; + } else if (S[12]!=' ') { + Chain->chainID[0] = S[12]; + Chain->chainID[1] = char(0); + } else + Chain->chainID[0] = char(0); + strcpy ( idCode,Chain->GetEntryID() ); + if (idCode[0]) { + if (strncmp(&(S[7]),idCode,4) && (!ignoreNonCoorPDBErrors)) + return Error_WrongEntryID; + } else { + GetString ( idCode,&(S[7]),4 ); + Chain->SetEntryID ( idCode ); + } + GetIntIns ( seqBeg,insBeg,&(S[14]),4 ); + GetIntIns ( seqEnd,insEnd,&(S[20]),4 ); + strcpy_ncs ( database ,&(S[26]),6 ); + strcpy_ncs ( dbAccession ,&(S[33]),8 ); + strcpy_ncs ( dbIdCode ,&(S[42]),12 ); + GetIntIns ( dbseqBeg,dbinsBeg,&(S[55]),5 ); + GetIntIns ( dbseqEnd,dbinsEnd,&(S[62]),5 ); + return 0; +} + +void CDBReference::Copy ( PCContainerClass DBRef ) { + + CContainerChain::Copy ( DBRef ); + + seqBeg = PCDBReference(DBRef)->seqBeg; + seqEnd = PCDBReference(DBRef)->seqEnd; + dbseqBeg = PCDBReference(DBRef)->dbseqBeg; + dbseqEnd = PCDBReference(DBRef)->dbseqEnd; + strcpy ( insBeg ,PCDBReference(DBRef)->insBeg ); + strcpy ( insEnd ,PCDBReference(DBRef)->insEnd ); + strcpy ( database ,PCDBReference(DBRef)->database ); + strcpy ( dbAccession,PCDBReference(DBRef)->dbAccession ); + strcpy ( dbIdCode ,PCDBReference(DBRef)->dbIdCode ); + strcpy ( dbinsBeg ,PCDBReference(DBRef)->dbinsBeg ); + strcpy ( dbinsEnd ,PCDBReference(DBRef)->dbinsEnd ); + +} + +void CDBReference::write ( RCFile f ) { +byte Version=1; + f.WriteByte ( &Version ); + f.WriteInt ( &seqBeg ); + f.WriteInt ( &seqEnd ); + f.WriteInt ( &dbseqBeg ); + f.WriteInt ( &dbseqEnd ); + f.WriteTerLine ( insBeg ,False ); + f.WriteTerLine ( insEnd ,False ); + f.WriteTerLine ( database ,False ); + f.WriteTerLine ( dbAccession,False ); + f.WriteTerLine ( dbIdCode ,False ); + f.WriteTerLine ( dbinsBeg ,False ); + f.WriteTerLine ( dbinsEnd ,False ); +} + +void CDBReference::read ( RCFile f ) { +byte Version; + f.ReadByte ( &Version ); + f.ReadInt ( &seqBeg ); + f.ReadInt ( &seqEnd ); + f.ReadInt ( &dbseqBeg ); + f.ReadInt ( &dbseqEnd ); + f.ReadTerLine ( insBeg ,False ); + f.ReadTerLine ( insEnd ,False ); + f.ReadTerLine ( database ,False ); + f.ReadTerLine ( dbAccession,False ); + f.ReadTerLine ( dbIdCode ,False ); + f.ReadTerLine ( dbinsBeg ,False ); + f.ReadTerLine ( dbinsEnd ,False ); +} + +MakeStreamFunctions(CDBReference) + + + +// ================ CSeqAdv =================== + +CSeqAdv::CSeqAdv() : CContainerChain() { + InitSeqAdv(); +} + +CSeqAdv::CSeqAdv ( PCChain Chain_Owner ) + : CContainerChain(Chain_Owner) { + InitSeqAdv(); +} + +CSeqAdv::CSeqAdv ( PCChain Chain_Owner, cpstr S ) + : CContainerChain(Chain_Owner) { + InitSeqAdv(); + ConvertPDBASCII ( S ); +} + +CSeqAdv::CSeqAdv ( RPCStream Object ) : CContainerChain(Object) { + InitSeqAdv(); +} + +CSeqAdv::~CSeqAdv() { + if (conflict) delete[] conflict; +} + +void CSeqAdv::InitSeqAdv() { + strcpy ( resName ,"---" ); + seqNum = 0; + strcpy ( insCode ,"-" ); + strcpy ( database ,"------" ); + strcpy ( dbAccession,"---------" ); + strcpy ( dbRes ,"---" ); + dbSeq = 0; + conflict = NULL; + CreateCopy ( conflict,pstr(" ") ); +} + +void CSeqAdv::PDBASCIIDump ( pstr S, int N ) { +UNUSED_ARGUMENT(N); +// makes the ASCII PDB SEQADV line number N +// from the class' data + strcpy ( S,"SEQADV" ); + PadSpaces ( S,80 ); + strcpy_n ( &(S[7]) ,Chain->GetEntryID(),4 ); + strcpy_n ( &(S[12]),resName ,3 ); + if (Chain->chainID[0]) S[16] = Chain->chainID[0]; + PutIntIns ( &(S[18]),seqNum,4,insCode ); + strcpy_n ( &(S[24]),database ,4 ); + strcpy_n ( &(S[29]),dbAccession,9 ); + strcpy_n ( &(S[39]),dbRes ,3 ); + PutInteger ( &(S[43]),dbSeq ,5 ); + strcpy_n ( &(S[49]),conflict,IMin(strlen(conflict),21) ); +} + +int CSeqAdv::ConvertPDBASCII ( cpstr S ) { +IDCode idCode; + if (Chain->chainID[0]) { + if (S[16]!=Chain->chainID[0]) + return Error_WrongChainID; + } else if (S[16]!=' ') { + Chain->chainID[0] = S[16]; + Chain->chainID[1] = char(0); + } else + Chain->chainID[0] = char(0); + strcpy ( idCode,Chain->GetEntryID() ); + if (idCode[0]) { + if (strncmp(&(S[7]),idCode,4) && (!ignoreNonCoorPDBErrors)) + return Error_WrongEntryID; + } else { + GetString ( idCode,&(S[7]),4 ); + Chain->SetEntryID ( idCode ); + } + strcpy_ncs ( resName ,&(S[12]),3 ); + GetIntIns ( seqNum,insCode,&(S[18]),4 ); + strcpy_ncs ( database ,&(S[24]),4 ); + strcpy_ncs ( dbAccession ,&(S[29]),9 ); + strcpy_ncs ( dbRes ,&(S[39]),3 ); + GetInteger ( dbSeq,&(S[43]),5 ); + CreateCopy ( conflict,&(S[49]) ); + CutSpaces ( conflict,SCUTKEY_END ); + return 0; +} + + +void CSeqAdv::MakeCIF ( PCMMCIFData CIF, int N ) { +UNUSED_ARGUMENT(N); +PCMMCIFLoop Loop; +int RC; + + RC = CIF->AddLoop ( CIFCAT_STRUCT_REF_SEQ_DIF,Loop ); + + if (RC!=CIFRC_Ok) { + // the category was (re)created, provide tags + Loop->AddLoopTag ( CIFTAG_NDB_PDB_ID_CODE ); + Loop->AddLoopTag ( CIFTAG_MON_ID ); + Loop->AddLoopTag ( CIFTAG_NDB_PDB_CHAIN_ID ); + Loop->AddLoopTag ( CIFTAG_SEQ_NUM ); + Loop->AddLoopTag ( CIFTAG_NDB_PDB_INS_CODE ); + Loop->AddLoopTag ( CIFTAG_NDB_SEQ_DB_NAME ); + Loop->AddLoopTag ( CIFTAG_NDB_SEQ_DB_ACCESSION_CODE ); + Loop->AddLoopTag ( CIFTAG_DB_MON_ID ); + Loop->AddLoopTag ( CIFTAG_NDB_SEQ_DB_SEQ_NUM ); + Loop->AddLoopTag ( CIFTAG_DETAILS ); + } + + Loop->AddString ( Chain->GetEntryID(),True ); + Loop->AddString ( resName ,True ); + Loop->AddString ( Chain->chainID ,True ); + Loop->AddInteger ( seqNum ); + Loop->AddString ( insCode ,True ); + Loop->AddString ( database ,True ); + Loop->AddString ( dbAccession ,True ); + Loop->AddString ( dbRes ,True ); + Loop->AddInteger ( dbSeq ); + Loop->AddString ( conflict ,True ); + +} + +void CSeqAdv::GetCIF ( PCMMCIFData CIF, int & Signal ) { +// GetCIF(..) must be always run without reference to Chain, +// see CModel::GetCIF(..). +PCMMCIFLoop Loop; +pstr F; +int RC; + + Loop = CIF->GetLoop ( CIFCAT_STRUCT_REF_SEQ_DIF ); + if (!Loop) { + Signal = -1; + return; + } + + if (Signal>=Loop->GetLoopLength()) { + Signal = -1; + return; + } + + // Determine the ChainID first and store it locally. It will + // be used by CModel for generating chains and placing the + // primary structure data BEFORE reading the coordinate section. + + F = Loop->GetString ( CIFTAG_NDB_PDB_CHAIN_ID,Signal,RC ); + if ((!RC) && F) { + strcpy_n0 ( chainID,F,sizeof(ChainID)-1 ); + Loop->DeleteField ( CIFTAG_NDB_PDB_CHAIN_ID,Signal ); + } else + strcpy ( chainID,"" ); + + CIFGetString ( resName,Loop,CIFTAG_MON_ID,Signal,sizeof(ResName), + pstr("UNK") ); + + CIFGetIntegerD ( seqNum,Loop,CIFTAG_SEQ_NUM ); + + CIFGetString ( insCode,Loop,CIFTAG_NDB_PDB_INS_CODE, + Signal,sizeof(InsCode),pstr(" ") ); + + CIFGetString ( database,Loop,CIFTAG_NDB_SEQ_DB_NAME,Signal, + sizeof(DBName),pstr(" ") ); + + CIFGetString ( dbAccession,Loop,CIFTAG_NDB_SEQ_DB_ACCESSION_CODE, + Signal,sizeof(DBAcCode),pstr(" ") ); + + CIFGetString ( dbRes,Loop,CIFTAG_DB_MON_ID,Signal,sizeof(ResName), + pstr(" ") ); + + CIFGetIntegerD ( dbSeq,Loop,CIFTAG_NDB_SEQ_DB_SEQ_NUM ); +// if (CIFGetInteger1(dbSeq,Loop,CIFTAG_NDB_SEQ_DB_SEQ_NUM,Signal)) +// dbSeq = MinInt4; + + F = Loop->GetString ( CIFTAG_DETAILS,Signal,RC ); + if ((!RC) && F) { + CreateCopy ( conflict,F ); + Loop->DeleteField ( CIFTAG_DETAILS,Signal ); + } else + CreateCopy ( conflict,pstr(" ") ); + + Signal++; + +} + +void CSeqAdv::Copy ( PCContainerClass SeqAdv ) { + + CContainerClass::Copy ( SeqAdv ); + + seqNum = PCSeqAdv(SeqAdv)->seqNum; + dbSeq = PCSeqAdv(SeqAdv)->dbSeq; + strcpy ( resName ,PCSeqAdv(SeqAdv)->resName ); + strcpy ( insCode ,PCSeqAdv(SeqAdv)->insCode ); + strcpy ( database ,PCSeqAdv(SeqAdv)->database ); + strcpy ( dbAccession,PCSeqAdv(SeqAdv)->dbAccession ); + strcpy ( dbRes ,PCSeqAdv(SeqAdv)->dbRes ); + CreateCopy ( conflict,PCSeqAdv(SeqAdv)->conflict ); + +} + +void CSeqAdv::write ( RCFile f ) { +byte Version=1; + f.WriteByte ( &Version ); + f.WriteInt ( &seqNum ); + f.WriteInt ( &dbSeq ); + f.WriteTerLine ( resName ,False ); + f.WriteTerLine ( insCode ,False ); + f.WriteTerLine ( database ,False ); + f.WriteTerLine ( dbAccession,False ); + f.WriteTerLine ( dbRes ,False ); + f.CreateWrite ( conflict ); +} + +void CSeqAdv::read ( RCFile f ) { +byte Version; + f.ReadByte ( &Version ); + f.ReadInt ( &seqNum ); + f.ReadInt ( &dbSeq ); + f.ReadTerLine ( resName ,False ); + f.ReadTerLine ( insCode ,False ); + f.ReadTerLine ( database ,False ); + f.ReadTerLine ( dbAccession,False ); + f.ReadTerLine ( dbRes ,False ); + f.CreateRead ( conflict ); +} + +MakeStreamFunctions(CSeqAdv) + + + +// ================ CSeqRes =================== + +CSeqRes::CSeqRes() : CStream() { + InitSeqRes(); +} + +CSeqRes::CSeqRes ( RPCStream Object ) : CStream(Object) { + InitSeqRes(); +} + +CSeqRes::~CSeqRes() { + FreeMemory(); +} + +void CSeqRes::SetChain ( PCChain Chain_Owner ) { + Chain = Chain_Owner; + if (Chain) strcpy ( chainID,Chain->chainID ); + else strcpy ( chainID,"" ); +} + +void CSeqRes::InitSeqRes() { + Chain = NULL; + numRes = -1; + resName = NULL; + serNum = 0; + strcpy ( chainID,"" ); +} + +void CSeqRes::FreeMemory() { + if (resName) delete[] resName; + resName = NULL; + numRes = -1; + serNum = 0; +} + +void CSeqRes::PDBASCIIDump ( RCFile f ) { +// writes the ASCII PDB SEQRES lines into file f +char S[100]; +int i,k,sN; + if (numRes<0) return; + strcpy ( S,"SEQRES" ); + PadSpaces ( S,80 ); + if (Chain->chainID[0]) + S[11] = Chain->chainID[0]; + PutInteger ( &(S[13]),numRes,4 ); + if (resName) { + i = 0; + sN = 1; + while (ichainID[0]) { + if (S[11]!=Chain->chainID[0]) + return Error_WrongChainID; + } else if (S[11]!=' ') { + Chain->chainID[0] = S[11]; + Chain->chainID[1] = char(0); + } else + Chain->chainID[0] = char(0); + GetInteger ( sN,&(S[8]) ,2 ); + GetInteger ( nR,&(S[13]),4 ); + if (sN==0) { + FreeMemory(); + numRes = nR; + } else { + serNum++; + if (sN!=serNum) + return Error_SEQRES_serNum; + if (sN==1) { + FreeMemory(); + resName = new ResName[nR]; + for (i=0;i=nR) + return Error_SEQRES_extraRes; + k = 19; + while ((iAddLoop ( CIFCAT_NDB_POLY_SEQ_SCHEME,Loop ); + if (RC!=CIFRC_Ok) { + // the category was (re)created, provide tags + Loop->AddLoopTag ( CIFTAG_ID ); + Loop->AddLoopTag ( CIFTAG_MON_ID ); + } + + if (resName) + for (i=0;iAddString ( Chain->chainID,True ); + Loop->AddString ( resName[i] ,True ); + } + else + for (i=0;iAddString ( Chain->GetEntryID(),True ); + Loop->AddString ( pstr("UNK") ,True ); + } + +} + +int CSeqRes::GetCIF ( PCMMCIFData CIF ) { +// Tries to get sequence from the CIF structure. A sequence +// for first met chain is extracted and then removed from +// the CIF structure, so that sequential calls will extract +// all sequencies. Chain ID is stored locally in chainID; +// reference to parent chain is neither used nor checked. +// Returns 0 if sequence was extracted and 1 otherwise. +PCMMCIFLoop Loop; +ResName * rN; +ChainID chID; +pstr F,CHAIN_ID; +int RC,CIFMode,i,l; +Boolean isMon; + + FreeMemory(); + + CIFMode = CIF_NDB; + Loop = CIF->GetLoop ( CIFName(CAT_POLY_SEQ_SCHEME,CIFMode) ); + if (!Loop) { + CIFMode = CIF_PDBX; + Loop = CIF->GetLoop ( CIFName(CAT_POLY_SEQ_SCHEME,CIFMode) ); + if (!Loop) return 1; + } + + l = Loop->GetLoopLength(); + if (l<=0) return 1; + + rN = new ResName[l]; + chainID[0] = char(1); + numRes = 0; + isMon = False; + CHAIN_ID = CIFName(TAG_SEQ_CHAIN_ID,CIFMode); + for (i=0;iGetString ( CHAIN_ID,i,RC ); + if (!RC) { + if (F) strcpy ( chID,F ); + else chID[0] = char(0); + if (chainID[0]==char(1)) strcpy ( chainID,chID ); + if (!strcmp(chainID,chID)) { + CIFGetString ( rN[numRes],Loop,CIFTAG_MON_ID,i, + sizeof(ResName),pstr("UNK") ); + Loop->DeleteField ( CHAIN_ID,i ); + if (strcmp(rN[numRes],"UNK")) isMon = True; + numRes++; + } + } + } + + if (numRes==0) { + numRes = -1; + delete[] rN; + return 1; + } + + if (isMon) { + resName = new ResName[numRes]; + for (i=0;inumRes; + serNum = SeqRes->serNum; + + if (SeqRes->resName) { + resName = new ResName[numRes]; + for (i=0;iresName[i] ); + } + +} + +void CSeqRes::write ( RCFile f ) { +int i; +byte Version=1; + f.WriteByte ( &Version ); + f.WriteInt ( &numRes ); + f.WriteInt ( &serNum ); + if (resName) i = 1; + else i = 0; + f.WriteInt ( &i ); + if (resName) + for (i=0;iGetEntryID(),4 ); + strcpy_n ( &(S[12]),resName ,3 ); + if (Chain->chainID[0]) S[16] = Chain->chainID[0]; + PutIntIns ( &(S[18]),seqNum,4,insCode ); + strcpy_n ( &(S[24]),stdRes ,3 ); + strcpy_n ( &(S[29]),comment,IMin(strlen(comment),41) ); +} + +int CModRes::ConvertPDBASCII ( cpstr S ) { +IDCode idCode; + if (Chain->chainID[0]) { + if (S[16]!=Chain->chainID[0]) + return Error_WrongChainID; + } else if (S[16]!=' ') { + Chain->chainID[0] = S[16]; + Chain->chainID[1] = char(0); + } else + Chain->chainID[0] = char(0); + strcpy ( idCode,Chain->GetEntryID() ); + if (idCode[0]) { + if (strncmp(&(S[7]),idCode,4) && (!ignoreNonCoorPDBErrors)) + return Error_WrongEntryID; + } else { + GetString ( idCode,&(S[7]),4 ); + Chain->SetEntryID ( idCode ); + } + GetString ( resName ,&(S[12]),3 ); + GetIntIns ( seqNum,insCode,&(S[18]),4 ); + GetString ( stdRes ,&(S[24]),3 ); + CreateCopy ( comment ,&(S[29]) ); + CutSpaces ( comment,SCUTKEY_END ); + return 0; +} + +void CModRes::MakeCIF ( PCMMCIFData CIF, int N ) { +UNUSED_ARGUMENT(CIF); +UNUSED_ARGUMENT(N); +/* -- apparently wrong use of _struct_conn, to be revised +PCMMCIFLoop Loop; +int RC; + + RC = CIF->AddLoop ( CIFCAT_STRUCT_CONN,Loop ); + + if (RC!=CIFRC_Ok) { + // the category was (re)created, provide tags + Loop->AddLoopTag ( CIFTAG_CONN_TYPE_ID ); + Loop->AddLoopTag ( CIFTAG_NDB_PDB_ID ); + Loop->AddLoopTag ( CIFTAG_PTNR1_LABEL_COMP_ID ); + Loop->AddLoopTag ( CIFTAG_PTNR1_LABEL_ASYM_ID ); + Loop->AddLoopTag ( CIFTAG_PTNR1_LABEL_SEQ_ID ); + Loop->AddLoopTag ( CIFTAG_NDB_PTNR1_LABEL_INS_CODE ); + Loop->AddLoopTag ( CIFTAG_NDB_PTNR1_STANDARD_COMP_ID ); + Loop->AddLoopTag ( CIFTAG_DETAILS ); + } + + Loop->AddString ( pstr("MODRES") ); + Loop->AddString ( Chain->GetEntryID(),True ); + Loop->AddString ( resName ,True ); + Loop->AddString ( Chain->chainID ,True ); + Loop->AddInteger ( seqNum ); + Loop->AddString ( insCode ,True ); + Loop->AddString ( stdRes ,True ); + Loop->AddString ( comment ,True ); + +*/ + +} + +void CModRes::GetCIF ( PCMMCIFData CIF, int & Signal ) { +UNUSED_ARGUMENT(CIF); +// GetCIF(..) must be always run without reference to Chain, +// see CModel::GetCIF(..). + +/* -- apparently wrong use of _struct_conn, to be revised +PCMMCIFLoop Loop; +pstr F; +int l,RC; + + Loop = CIF->GetLoop ( CIFCAT_STRUCT_CONN ); + if (!Loop) { + Signal = -1; + return; + } + + l = Loop->GetLoopLength(); + while (SignalGetString ( CIFTAG_CONN_TYPE_ID,Signal,RC ); + if ((!RC) && F) { + if (!strcmp(F,"MODRES")) break; + } + Signal++; + } + if (Signal>=l) { + Signal = -1; + return; + } + + Loop->DeleteField ( CIFTAG_CONN_TYPE_ID,Signal ); + + // Determine the ChainID first and store it locally. It will + // be used by CModel for generating chains and placing the + // primary structure data BEFORE reading the coordinate section. + F = Loop->GetString ( CIFTAG_PTNR1_LABEL_ASYM_ID,Signal,RC ); + if ((!RC) && F) { + strcpy_n0 ( chainID,F,sizeof(ChainID)-1 ); + Loop->DeleteField ( CIFTAG_PTNR1_LABEL_ASYM_ID,Signal ); + } else + strcpy ( chainID,"" ); + + + CIFGetString ( resName,Loop,CIFTAG_PTNR1_LABEL_COMP_ID,Signal, + sizeof(ResName),pstr("UNK") ); + + if (CIFGetInteger(seqNum,Loop,CIFTAG_PTNR1_LABEL_SEQ_ID,Signal)) + return; + + CIFGetString ( insCode,Loop,CIFTAG_NDB_PTNR1_LABEL_INS_CODE, + Signal,sizeof(InsCode),pstr(" ") ); + + CIFGetString ( stdRes,Loop,CIFTAG_NDB_PTNR1_STANDARD_COMP_ID,Signal, + sizeof(ResName),pstr("UNK") ); + + F = Loop->GetString ( CIFTAG_DETAILS,Signal,RC ); + if ((!RC) && F) { + CreateCopy ( comment,F ); + Loop->DeleteField ( CIFTAG_DETAILS,Signal ); + } else + CreateCopy ( comment,pstr(" ") ); + + Signal++; + +*/ + + Signal = -1; + +} + +void CModRes::Copy ( PCContainerClass ModRes ) { + seqNum = PCModRes(ModRes)->seqNum; + strcpy ( resName,PCModRes(ModRes)->resName ); + strcpy ( insCode,PCModRes(ModRes)->insCode ); + strcpy ( stdRes ,PCModRes(ModRes)->stdRes ); + CreateCopy ( comment,PCModRes(ModRes)->comment ); +} + +void CModRes::write ( RCFile f ) { +byte Version=1; + f.WriteByte ( &Version ); + f.WriteInt ( &seqNum ); + f.WriteTerLine ( resName,False ); + f.WriteTerLine ( insCode,False ); + f.WriteTerLine ( stdRes ,False ); + f.CreateWrite ( comment ); +} + +void CModRes::read ( RCFile f ) { +byte Version; + f.ReadByte ( &Version ); + f.ReadInt ( &seqNum ); + f.ReadTerLine ( resName,False ); + f.ReadTerLine ( insCode,False ); + f.ReadTerLine ( stdRes ,False ); + f.CreateRead ( comment ); +} + +MakeStreamFunctions(CModRes) + + + +// ================ CHetRec ====================== + +CHetRec::CHetRec() : CContainerChain() { + InitHetRec(); +} + +CHetRec::CHetRec ( PCChain Chain_Owner ) + : CContainerChain(Chain_Owner) { + InitHetRec(); +} + +CHetRec::CHetRec ( PCChain Chain_Owner, cpstr S ) + : CContainerChain(Chain_Owner) { + InitHetRec(); + ConvertPDBASCII ( S ); +} + +CHetRec::CHetRec ( RPCStream Object ) : CContainerChain(Object) { + InitHetRec(); +} + +CHetRec::~CHetRec() { + if (comment) delete[] comment; +} + +void CHetRec::InitHetRec() { + strcpy ( hetID ,"---" ); + strcpy ( insCode,"-" ); + seqNum = 0; + numHetAtoms = 0; + comment = NULL; + CreateCopy ( comment,pstr(" ") ); +} + +void CHetRec::PDBASCIIDump ( pstr S, int N ) { +UNUSED_ARGUMENT(N); +// makes the ASCII PDB MODRES line number N +// from the class' data + strcpy ( S,"HET" ); + PadSpaces ( S,80 ); + strcpy_n ( &(S[7]) ,hetID,3 ); + if (Chain->chainID[0]) S[12] = Chain->chainID[0]; + PutIntIns ( &(S[13]),seqNum,4,insCode ); + PutInteger ( &(S[20]),numHetAtoms,5 ); + strcpy_n ( &(S[30]),comment,IMin(strlen(comment),40) ); +} + +int CHetRec::ConvertPDBASCII ( cpstr S ) { + if (Chain->chainID[0]) { + if (S[12]!=Chain->chainID[0]) + return Error_WrongChainID; + } else if (S[12]!=' ') { + Chain->chainID[0] = S[12]; + Chain->chainID[1] = char(0); + } else + Chain->chainID[0] = char(0); + GetString ( hetID ,&(S[7]) ,3 ); + GetIntIns ( seqNum,insCode,&(S[13]),4 ); + GetInteger ( numHetAtoms ,&(S[20]),5 ); + CreateCopy ( comment ,&(S[30]) ); + CutSpaces ( comment,SCUTKEY_END ); + return 0; +} + +void CHetRec::MakeCIF ( PCMMCIFData CIF, int N ) { +UNUSED_ARGUMENT(N); +PCMMCIFLoop Loop; +int RC; + + RC = CIF->AddLoop ( CIFCAT_NDB_NONSTANDARD_LIST,Loop ); + + if (RC!=CIFRC_Ok) { + // the category was (re)created, provide tags + Loop->AddLoopTag ( CIFTAG_ID ); + Loop->AddLoopTag ( CIFTAG_AUTH_ASYM_ID ); + Loop->AddLoopTag ( CIFTAG_AUTH_SEQ_ID ); + Loop->AddLoopTag ( CIFTAG_INS_CODE ); + Loop->AddLoopTag ( CIFTAG_NUMBER_ATOMS_NH ); + Loop->AddLoopTag ( CIFTAG_DETAILS ); + } + + Loop->AddString ( hetID ,True ); + Loop->AddString ( Chain->chainID,True ); + Loop->AddInteger ( seqNum ); + Loop->AddString ( insCode ,True ); + Loop->AddInteger ( numHetAtoms ); + Loop->AddString ( comment ,True ); + +} + +void CHetRec::GetCIF ( PCMMCIFData CIF, int & Signal ) { +// GetCIF(..) must be always run without reference to Chain, +// see CModel::GetCIF(..). +PCMMCIFLoop Loop; +pstr F; +int RC; + + Loop = CIF->GetLoop ( CIFCAT_NDB_NONSTANDARD_LIST ); + if (!Loop) { + Signal = -1; + return; + } + + if (Signal>=Loop->GetLoopLength()) { + Signal = -1; + return; + } + + // Determine the ChainID first and store it locally. It will + // be used by CModel for generating chains and placing the + // primary structure data BEFORE reading the coordinate section. + F = Loop->GetString ( CIFTAG_AUTH_ASYM_ID,Signal,RC ); + if ((!RC) && F) { + strcpy_n0 ( chainID,F,sizeof(ChainID)-1 ); + Loop->DeleteField ( CIFTAG_AUTH_ASYM_ID,Signal ); + } else + strcpy ( chainID,"" ); + + + CIFGetString ( hetID,Loop,CIFTAG_ID,Signal,sizeof(ResName), + pstr("UNK") ); + + if (CIFGetInteger(seqNum,Loop,CIFTAG_AUTH_SEQ_ID,Signal)) return; + + CIFGetString ( insCode,Loop,CIFTAG_INS_CODE,Signal,sizeof(InsCode), + pstr(" ") ); + + if (CIFGetInteger(numHetAtoms,Loop,CIFTAG_NUMBER_ATOMS_NH,Signal)) + return; + + F = Loop->GetString ( CIFTAG_DETAILS,Signal,RC ); + if ((!RC) && F) { + CreateCopy ( comment,F ); + Loop->DeleteField ( CIFTAG_DETAILS,Signal ); + } else + CreateCopy ( comment,pstr(" ") ); + + Signal++; + +} + +void CHetRec::Copy ( PCContainerClass Het ) { + seqNum = PCHetRec(Het)->seqNum; + numHetAtoms = PCHetRec(Het)->numHetAtoms; + strcpy ( hetID ,PCHetRec(Het)->hetID ); + strcpy ( insCode,PCHetRec(Het)->insCode ); + CreateCopy ( comment,PCHetRec(Het)->comment ); +} + +void CHetRec::write ( RCFile f ) { +byte Version=1; + f.WriteByte ( &Version ); + f.WriteInt ( &seqNum ); + f.WriteInt ( &numHetAtoms ); + f.WriteTerLine ( hetID ,False ); + f.WriteTerLine ( insCode,False ); + f.CreateWrite ( comment ); +} + +void CHetRec::read ( RCFile f ) { +byte Version; + f.ReadByte ( &Version ); + f.ReadInt ( &seqNum ); + f.ReadInt ( &numHetAtoms ); + f.ReadTerLine ( hetID ,False ); + f.ReadTerLine ( insCode,False ); + f.CreateRead ( comment ); +} + +MakeStreamFunctions(CHetRec) + + + +// ===================== CChain ======================= + +CChain::CChain() : CUDData() { + InitChain(); + SetChain ( pstr("") ); +} + +CChain::CChain ( PCProModel Model, const ChainID chID ) : CUDData() { + InitChain(); + SetChain ( chID ); + if (Model) Model->AddChain ( this ); +} + +CChain::CChain ( RPCStream Object ) : CUDData(Object) { + InitChain(); + SetChain ( pstr("") ); +} + +void CChain::InitChain() { + nResidues = 0; + ResLen = 0; + Residue = NULL; + model = NULL; + chainID[0] = char(0); + prevChainID[0] = char(0); + nWeights = 0; + Weight = 0.0; + Exclude = True; +} + +void CChain::SetChain ( const ChainID chID ) { + strcpy ( chainID,chID ); + if (chID[0]==' ') chainID[0] = char(0); + DBReference.SetChain ( this ); + SeqAdv .SetChain ( this ); + SeqRes .SetChain ( this ); + ModRes .SetChain ( this ); + Het .SetChain ( this ); +} + +void CChain::SetChainID ( const ChainID chID ) { + strcpy ( chainID,chID ); + if (chID[0]==' ') chainID[0] = char(0); +} + +CChain::~CChain() { + FreeMemory(); + if (model) model->_ExcludeChain ( chainID ); +} + +void CChain::FreeMemory() { + DeleteAllResidues(); + if (Residue) delete[] Residue; + ResLen = 0; + nResidues = 0; + Residue = NULL; + FreeAnnotations(); +} + +void CChain::FreeAnnotations() { + DBReference.FreeContainer(); + SeqAdv .FreeContainer(); + SeqRes .FreeMemory (); + ModRes .FreeContainer(); + Het .FreeContainer(); +} + +void CChain::SetModel ( PCProModel Model ) { + model = Model; +} + +PCMMDBManager CChain::GetCoordHierarchy() { + if (model) return model->GetCoordHierarchy(); + return NULL; +} + +void CChain::CheckInAtoms() { +int i; + if (GetCoordHierarchy()) + for (i=0;iCheckInAtoms(); +} + +int CChain::ConvertDBREF ( cpstr PDBString ) { +int RC; +PCContainerChain ContainerChain; + ContainerChain = new CDBReference(this); + RC = ContainerChain->ConvertPDBASCII ( PDBString ); + if (RC) { + delete ContainerChain; + return RC; + } + DBReference.AddData ( ContainerChain ); + return 0; +} + +int CChain::ConvertSEQADV ( cpstr PDBString ) { +int RC; +PCContainerChain ContainerChain; + ContainerChain = new CSeqAdv(this); + RC = ContainerChain->ConvertPDBASCII ( PDBString ); + if (RC) { + delete ContainerChain; + return RC; + } + SeqAdv.AddData ( ContainerChain ); + return 0; +} + +int CChain::ConvertSEQRES ( cpstr PDBString ) { + return SeqRes.ConvertPDBASCII ( PDBString ); +} + +int CChain::ConvertMODRES ( cpstr PDBString ) { +int RC; +PCContainerChain ContainerChain; + ContainerChain = new CModRes(this); + RC = ContainerChain->ConvertPDBASCII ( PDBString ); + if (RC) { + delete ContainerChain; + return RC; + } + ModRes.AddData ( ContainerChain ); + return 0; +} + +int CChain::ConvertHET ( cpstr PDBString ) { +int RC; +PCContainerChain ContainerChain; + ContainerChain = new CHetRec(this); + RC = ContainerChain->ConvertPDBASCII ( PDBString ); + if (RC) { + delete ContainerChain; + return RC; + } + Het.AddData ( ContainerChain ); + return 0; +} + + +void CChain::PDBASCIIDump ( RCFile f ) { +// this function was for test purposes and is not used +// for normal function of MMDB + DBReference.PDBASCIIDump ( f ); + SeqAdv .PDBASCIIDump ( f ); + SeqRes .PDBASCIIDump ( f ); + ModRes .PDBASCIIDump ( f ); + Het .PDBASCIIDump ( f ); +} + +void CChain::PDBASCIIAtomDump ( RCFile f ) { +int i; + for (i=0;iPDBASCIIAtomDump ( f ); +} + +void CChain::MakeAtomCIF ( PCMMCIFData CIF ) { +int i; + for (i=0;iMakeAtomCIF ( CIF ); +} + + +int CChain::GetNumberOfResidues() { + return nResidues; +} + +PCResidue CChain::GetResidue ( int resNo ) { + if ((0<=resNo) && (resNoseqNum) && + (!strcmp(insCode,Residue[i]->insCode))) { + if (!strcmp(resName,Residue[i]->name)) + return Residue[i]; // it is there; just return the pointer + else if (!Enforce) + return NULL; // duplicate seqNum and insCode! + } + } + } else { + for (i=0;iseqNum) && + (!Residue[i]->insCode[0])) { + if (!strcmp(resName,Residue[i]->name)) + return Residue[i]; // it is there; just return the pointer + else if (!Enforce) + return NULL; // duplicate seqNum and insCode! + } + } + } + + // expand the residue array, if necessary + if (nResidues>=ResLen) + ExpandResidueArray ( 100 ); + + // create new residue + Residue[nResidues] = newCResidue(); + Residue[nResidues]->SetChain ( this ); + Residue[nResidues]->SetResID ( resName,seqNum,insCode ); + Residue[nResidues]->index = nResidues; + nResidues++; + + return Residue[nResidues-1]; + +} + +void CChain::ExpandResidueArray ( int inc ) { +PPCResidue Residue1; +int i; + ResLen += inc; + Residue1 = new PCResidue[ResLen]; + for (i=0;iseqNum) && + (!strcmp(insCode,Residue[i]->insCode))) + return Residue[i]; + } + } else { + for (i=0;iseqNum) && (!Residue[i]->insCode[0])) + return Residue[i]; + } + } + return NULL; +} + +int CChain::GetResidueNo ( int seqNum, const InsCode insCode ) { +// GetResidueNo(..) returns the residue number in the chain's +// residues table. Residues are numbered as 0..nres-1 as they appear +// in the coordinate file. +// If residue is not found, the function returns -1. +int i; +Boolean isInsCode; + if (insCode) isInsCode = insCode[0]!=char(0); + else isInsCode = False; + if (isInsCode) { + for (i=0;iseqNum) && + (!strcmp(insCode,Residue[i]->insCode))) + return i; + } + } else { + for (i=0;iseqNum) && (!Residue[i]->insCode[0])) + return i; + } + } + return -1; +} + +void CChain::GetResidueTable ( PPCResidue & resTable, + int & NumberOfResidues ) { + resTable = Residue; + NumberOfResidues = nResidues; +} + +int CChain::_ExcludeResidue ( const ResName resName, int seqNum, + const InsCode insCode ) { +// ExcludeResidue(..) excludes (but does not dispose!) a residue +// from the chain. Returns 1 if the chain gets empty and 0 otherwise. +int i,k; + + if (!Exclude) return 0; + + // find the residue + k = -1; + for (i=0;(iseqNum) && + (!strcmp(insCode,Residue[i]->insCode)) && + (!strcmp(resName,Residue[i]->name))) + k = i; + + if (k>=0) { + for (i=k+1;iindex = i-1; + } + nResidues--; + Residue[nResidues] = NULL; + } + + if (nResidues<=0) return 1; + else return 0; + +} + + + +// ------------------ Deleting residues -------------------------- + +int CChain::DeleteResidue ( int resNo ) { + if ((0<=resNo) && (resNoseqNum) && + (!strcmp(insCode,Residue[i]->insCode))) { + Exclude = False; + delete Residue[i]; + Residue[i] = NULL; + Exclude = True; + return 1; + } + } + } else { + for (i=0;iseqNum) && (!Residue[i]->insCode[0])) { + Exclude = False; + delete Residue[i]; + Residue[i] = NULL; + Exclude = True; + return 1; + } + } + } + return 0; +} + + +int CChain::DeleteAllResidues() { +int i,k; + Exclude = False; + k = 0; + for (i=0;iisSolvent()) { + delete Residue[i]; + Residue[i] = NULL; + k++; + } + } + Exclude = True; + return k; +} + + +void CChain::TrimResidueTable() { +int i,j; + Exclude = False; + j = 0; + for (i=0;inAtoms>0) { + if (jindex = j; + Residue[i] = NULL; + } + j++; + } else { + delete Residue[i]; + Residue[i] = NULL; + } + } + nResidues = j; + Exclude = True; +} + +int CChain::AddResidue ( PCResidue res ) { +// modify both CModel::Copy methods simultaneously! +// +// Copy(PCModel,PPCAtom,int&) copies atoms into array 'atom' +// starting from position atom_index. 'atom' should be able to +// accept all new atoms - no checks on the length of 'atom' +// is being made. This function should not be used in applications. + return InsResidue ( res,nResidues ); +} + +/* +PCMMDBFile mmdbfile; +PCChain chain1; +int i; + + for (i=0;i=ResLen) + ExpandResidueArray ( 100 ); + + if (res->GetCoordHierarchy()) { + Residue[nResidues] = newCResidue(); + Residue[nResidues]->SetChain ( this ); + Residue[nResidues]->SetResID ( res->name,res->seqNum,res->insCode ); + if (mmdbfile) { + // get space for new atoms + mmdbfile->AddAtomArray ( res->GetNumberOfAtoms(True) ); + Residue[nResidues]->Copy ( res,mmdbfile->Atom,mmdbfile->nAtoms ); + } else { + for (i=0;inAtoms;i++) + Residue[nResidues]->AddAtom ( res->atom[i] ); + } + } else { + Residue[nResidues] = res; + chain1 = res->GetChain(); + if (chain1) + for (i=0;inResidues;i++) + if (chain1->Residue[i]==res) { + chain1->Residue[i] = NULL; + break; + } + Residue[nResidues]->SetChain ( this ); + if (mmdbfile) + Residue[nResidues]->CheckInAtoms(); + } + nResidues++; + + } + + return nResidues; + +} +*/ + +int CChain::InsResidue ( PCResidue res, int seqNum, + const InsCode insCode ) { + return InsResidue ( res,GetResidueNo(seqNum,insCode) ); +} + +int CChain::InsResidue ( PCResidue res, int pos ) { +// Inserts residue res onto position pos of the chain, +// pos=0..nResidues-1 . Residues pos..nResidues-1 are +// shifted up the chain. +// The function places new atoms on the top of atom +// index. It is advisable to call +// CMMDBFile::PDBCleanup ( PDBCLEAN_INDEX ) after all +// insertions are done. +PCMMDBFile mmdbfile; +PCChain chain1; +int i,pp; + + pp = IMax ( 0,IMin(nResidues,pos) ); + + for (i=0;i=ResLen) + ExpandResidueArray ( 100 ); + + // shift residues to the end of the chain as necessary + for (i=nResidues;i>pp;i--) + Residue[i] = Residue[i-1]; + + // insert the new residue + if (res->GetCoordHierarchy()) { + Residue[pp] = newCResidue(); + Residue[pp]->SetChain ( this ); + Residue[pp]->SetResID ( res->name,res->seqNum,res->insCode ); + if (mmdbfile) { + // get space for new atoms + mmdbfile->AddAtomArray ( res->GetNumberOfAtoms(True) ); + Residue[pp]->_copy ( res,mmdbfile->Atom,mmdbfile->nAtoms ); + } else { + for (i=0;inAtoms;i++) + Residue[pp]->AddAtom ( res->atom[i] ); + } + } else { + Residue[pp] = res; + chain1 = res->GetChain(); + if (chain1) + for (i=0;inResidues;i++) + if (chain1->Residue[i]==res) { + chain1->Residue[i] = NULL; + break; + } + Residue[pp]->SetChain ( this ); + if (mmdbfile) + Residue[pp]->CheckInAtoms(); + } + nResidues++; + + } + + return nResidues; + +} + + +// -------------------- Extracting atoms ----------------------- + +int CChain::GetNumberOfAtoms ( Boolean countTers ) { +int i,na; + na = 0; + for (i=0;iGetNumberOfAtoms ( countTers ); + return na; +} + +int CChain::GetNumberOfAtoms ( int seqNo, const InsCode insCode ) { +PCResidue res; + res = GetResidue ( seqNo,insCode ); + if (res) return res->nAtoms; + return 0; +} + +int CChain::GetNumberOfAtoms ( int resNo ) { + if ((0<=resNo) && (resNonAtoms; + } + return 0; +} + +PCAtom CChain::GetAtom ( int seqNo, + const InsCode insCode, + const AtomName aname, + const Element elmnt, + const AltLoc aloc ) { +PCResidue res; + res = GetResidue ( seqNo,insCode ); + if (res) return res->GetAtom ( aname,elmnt,aloc ); + return NULL; +} + +PCAtom CChain::GetAtom ( int seqNo, const InsCode insCode, + int atomNo ) { +PCResidue res; + res = GetResidue ( seqNo,insCode ); + if (res) { + if ((0<=atomNo) && (atomNonAtoms)) + return res->atom[atomNo]; + } + return NULL; +} + +PCAtom CChain::GetAtom ( int resNo, + const AtomName aname, + const Element elmnt, + const AltLoc aloc ) { + if ((0<=resNo) && (resNoGetAtom ( aname,elmnt,aloc ); + } + return NULL; +} + +PCAtom CChain::GetAtom ( int resNo, int atomNo ) { +PCResidue res; + if ((0<=resNo) && (resNonAtoms)) + return res->atom[atomNo]; + } + } + return NULL; +} + +void CChain::GetAtomTable ( int seqNo, const InsCode insCode, + PPCAtom & atomTable, int & NumberOfAtoms ) { +PCResidue res; + atomTable = NULL; + NumberOfAtoms = 0; + res = GetResidue ( seqNo,insCode ); + if (res) { + atomTable = res->atom; + NumberOfAtoms = res->nAtoms; + } +} + +void CChain::GetAtomTable ( int resNo, PPCAtom & atomTable, + int & NumberOfAtoms ) { +PCResidue res; + atomTable = NULL; + NumberOfAtoms = 0; + if ((0<=resNo) && (resNoatom; + NumberOfAtoms = res->nAtoms; + } + } +} + + +void CChain::GetAtomTable1 ( int seqNo, const InsCode insCode, + PPCAtom & atomTable, int & NumberOfAtoms ) { +PCResidue res; + res = GetResidue ( seqNo,insCode ); + if (res) + res->GetAtomTable1 ( atomTable,NumberOfAtoms ); + else { + if (atomTable) delete[] atomTable; + atomTable = NULL; + NumberOfAtoms = 0; + } +} + +void CChain::GetAtomTable1 ( int resNo, PPCAtom & atomTable, + int & NumberOfAtoms ) { +PCResidue res; + if ((0<=resNo) && (resNoGetAtomTable1 ( atomTable,NumberOfAtoms ); + else { + if (atomTable) delete[] atomTable; + atomTable = NULL; + NumberOfAtoms = 0; + } +} + +int CChain::DeleteAtom ( int seqNo, + const InsCode insCode, + const AtomName aname, + const Element elmnt, + const AltLoc aloc ) { +PCResidue res; + res = GetResidue ( seqNo,insCode ); + if (res) return res->DeleteAtom ( aname,elmnt,aloc ); + return 0; +} + +int CChain::DeleteAtom ( int seqNo, const InsCode insCode, + int atomNo ) { +PCResidue res; + res = GetResidue ( seqNo,insCode ); + if (res) return res->DeleteAtom ( atomNo ); + return 0; +} + +int CChain::DeleteAtom ( int resNo, + const AtomName aname, + const Element elmnt, + const AltLoc aloc ) { + if ((0<=resNo) && (resNoDeleteAtom ( aname,elmnt,aloc ); + } + return 0; +} + +int CChain::DeleteAtom ( int resNo, int atomNo ) { + if ((0<=resNo) && (resNoDeleteAtom ( atomNo ); + } + return 0; +} + + +int CChain::DeleteAllAtoms ( int seqNo, const InsCode insCode ) { +PCResidue res; + res = GetResidue ( seqNo,insCode ); + if (res) return res->DeleteAllAtoms(); + return 0; +} + +int CChain::DeleteAllAtoms ( int resNo ) { + if ((0<=resNo) && (resNoDeleteAllAtoms(); + } + return 0; +} + +int CChain::DeleteAllAtoms() { +int i,k; + k = 0; + for (i=0;iDeleteAllAtoms(); + return k; +} + +int CChain::DeleteAltLocs() { +// This function leaves only alternative location with maximal +// occupancy, if those are equal or unspecified, the one with +// "least" alternative location indicator. +// The function returns the number of deleted. All tables remain +// untrimmed, so that explicit trimming or calling FinishStructEdit() +// is required. +int i,n; + + n = 0; + for (i=0;iDeleteAltLocs(); + + return n; + +} + + +int CChain::AddAtom ( int seqNo, const InsCode insCode, + PCAtom atom ) { +PCResidue res; + res = GetResidue ( seqNo,insCode ); + if (res) return res->AddAtom ( atom ); + return 0; +} + +int CChain::AddAtom ( int resNo, PCAtom atom ) { + if ((0<=resNo) && (resNoAddAtom ( atom ); + } + return 0; +} + + +void CChain::Copy ( PCChain Chain ) { +// modify both CChain::_copy and CChain::Copy methods simultaneously! +int i; + + FreeMemory(); + + if (Chain) { + + CopyAnnotations ( Chain ); + + nResidues = Chain->nResidues; + ResLen = nResidues; + if (nResidues>0) { + Residue = new PCResidue[nResidues]; + for (i=0;iSetChain ( this ); + Residue[i]->Copy ( Chain->Residue[i] ); + } + } + + } + +} + +void CChain::CopyAnnotations ( PCChain Chain ) { + if (Chain) { + strcpy ( chainID ,Chain->chainID ); + strcpy ( prevChainID,Chain->prevChainID ); + DBReference.Copy ( &(Chain->DBReference) ); + SeqAdv .Copy ( &(Chain->SeqAdv) ); // SEQADV records + SeqRes .Copy ( &(Chain->SeqRes) ); // SEQRES data + ModRes .Copy ( &(Chain->ModRes) ); // MODRES records + Het .Copy ( &(Chain->Het) ); // HET records + } +} + + +void CChain::_copy ( PCChain Chain ) { +// modify both CChain::_copy and CChain::Copy methods simultaneously! +int i; + + FreeMemory(); + + strcpy ( chainID ,Chain->chainID ); + strcpy ( prevChainID,Chain->prevChainID ); + + DBReference.Copy ( &(Chain->DBReference) ); + SeqAdv .Copy ( &(Chain->SeqAdv) ); // SEQADV records + SeqRes .Copy ( &(Chain->SeqRes) ); // SEQRES data + ModRes .Copy ( &(Chain->ModRes) ); // MODRES records + Het .Copy ( &(Chain->Het) ); // HET records + + nResidues = Chain->nResidues; + ResLen = nResidues; + if (nResidues>0) { + Residue = new PCResidue[nResidues]; + for (i=0;iSetChain ( this ); + Residue[i]->_copy ( Chain->Residue[i] ); + } + } + +} + +void CChain::_copy ( PCChain Chain, PPCAtom atom, int & atom_index ) { +// modify both CChain::_copy and CChain::Copy methods simultaneously! +int i; + + FreeMemory(); + + strcpy ( chainID ,Chain->chainID ); + strcpy ( prevChainID,Chain->prevChainID ); + + DBReference.Copy ( &(Chain->DBReference) ); + SeqAdv .Copy ( &(Chain->SeqAdv) ); // SEQADV records + SeqRes .Copy ( &(Chain->SeqRes) ); // SEQRES data + ModRes .Copy ( &(Chain->ModRes) ); // MODRES records + Het .Copy ( &(Chain->Het) ); // HET records + + nResidues = Chain->nResidues; + ResLen = nResidues; + if (nResidues>0) { + Residue = new PCResidue[nResidues]; + for (i=0;iResidue[i]) { + Residue[i] = newCResidue(); + Residue[i]->SetChain ( this ); + Residue[i]->_copy ( Chain->Residue[i],atom,atom_index ); + } else + Residue[i] = NULL; + } + +} + +/* +void CChain::Duplicate ( PCChain Chain ) { +int i; + + FreeMemory(); + + strcpy ( chainID ,Chain->chainID ); + strcpy ( prevChainID,Chain->prevChainID ); + + DBReference.Copy ( &(Chain->DBReference) ); + SeqAdv .Copy ( &(Chain->SeqAdv) ); // SEQADV records + SeqRes .Copy ( &(Chain->SeqRes) ); // SEQRES data + ModRes .Copy ( &(Chain->ModRes) ); // MODRES records + Het .Copy ( &(Chain->Het) ); // HET records + + nResidues = Chain->nResidues; + ResLen = nResidues; + if (nResidues>0) { + Residue = new PCResidue[nResidues]; + for (i=0;iSetChain ( this ); + Residue[i]->Duplicate ( Chain->Residue[i] ); + } + } + +} +*/ + +cpstr CChain::GetEntryID() { + if (model) return model->GetEntryID(); + else return pstr(""); +} + +void CChain::SetEntryID ( const IDCode idCode ) { + if (model) model->SetEntryID ( idCode ); +} + +int CChain::GetModelNum() { + if (model) return model->GetSerNum(); + return 0; +} + +cpstr CChain::GetChainID ( pstr ChID ) { + ChID[0] = char(0); + if (model) + sprintf ( ChID,"/%i/",model->GetSerNum() ); + else strcpy ( ChID,"/-/" ); + strcat ( ChID,chainID ); + return ChID; +} + + +void CChain::GetAtomStatistics ( RSAtomStat AS ) { + AS.Init(); + CalcAtomStatistics ( AS ); + AS.Finish(); +} + +void CChain::CalcAtomStatistics ( RSAtomStat AS ) { +int i; + for (i=0;iCalcAtomStatistics ( AS ); +} + +void CChain::ApplyTransform ( mat44 & TMatrix ) { +// transforms all coordinates by multiplying with matrix TMatrix +int i; + for (i=0;iApplyTransform ( TMatrix ); +} + +Boolean CChain::isSolventChain() { +// returns True if chain contains only solvent molecules +Boolean B,P; +int i; + B = True; + P = False; + for (i=0;(iisSolvent(); + } + return (B && P); +} + +Boolean CChain::isInSelection ( int selHnd ) { +PCMMDBFile mmdbfile = (PCMMDBFile)GetCoordHierarchy(); +PCMask Mask; + if (mmdbfile) { + Mask = mmdbfile->GetSelMask ( selHnd ); + if (Mask) return CheckMask ( Mask ); + } + return False; +} + +Boolean CChain::isAminoacidChain() { +// returns True if chain contains at least one aminoacid residue +Boolean B,P; +int i; + B = False; + P = False; + for (i=0;(iisAminoacid(); + } + return (B && P); +} + +Boolean CChain::isNucleotideChain() { +// returns True if chain contains at least one nucleotide residue +Boolean B,P; +int i; + B = False; + P = False; + for (i=0;(iisNucleotide(); + } + return (B && P); +} + +int CChain::CheckID ( const ChainID chID ) { + if (chID) { + if (!strcmp(chID,chainID)) return 1; + } + return 0; +} + +int CChain::CheckIDS ( cpstr CID ) { +ChainID chn; +InsCode inscode; +ResName resname; +AtomName atm; +Element elm; +AltLoc aloc; +int mdl,sn,rc; + + rc = ParseAtomPath ( CID,mdl,chn,sn,inscode,resname, + atm,elm,aloc,NULL ); + if (rc>=0) { + if (!strcmp(chn,chainID)) return 1; + } + return 0; + +} + +int CChain::GetNumberOfDBRefs() { + return DBReference.Length(); +} + +PCDBReference CChain::GetDBRef ( int dbRefNo ) { + return (PCDBReference)DBReference.GetContainerClass ( dbRefNo ); +} + + +void CChain::MaskAtoms ( PCMask Mask ) { +int i; + for (i=0;iMaskAtoms ( Mask ); +} + +void CChain::MaskResidues ( PCMask Mask ) { +int i; + for (i=0;iSetMask ( Mask ); +} + +void CChain::UnmaskAtoms ( PCMask Mask ) { +int i; + for (i=0;iUnmaskAtoms ( Mask ); +} + +void CChain::UnmaskResidues ( PCMask Mask ) { +int i; + for (i=0;iRemoveMask ( Mask ); +} + + + + +// ------- user-defined data handlers + +int CChain::PutUDData ( int UDDhandle, int iudd ) { + if (UDDhandle & UDRF_CHAIN) + return CUDData::putUDData ( UDDhandle,iudd ); + else return UDDATA_WrongUDRType; +} + +int CChain::PutUDData ( int UDDhandle, realtype rudd ) { + if (UDDhandle & UDRF_CHAIN) + return CUDData::putUDData ( UDDhandle,rudd ); + else return UDDATA_WrongUDRType; +} + +int CChain::PutUDData ( int UDDhandle, cpstr sudd ) { + if (UDDhandle & UDRF_CHAIN) + return CUDData::putUDData ( UDDhandle,sudd ); + else return UDDATA_WrongUDRType; +} + +int CChain::GetUDData ( int UDDhandle, int & iudd ) { + if (UDDhandle & UDRF_CHAIN) + return CUDData::getUDData ( UDDhandle,iudd ); + else return UDDATA_WrongUDRType; +} + +int CChain::GetUDData ( int UDDhandle, realtype & rudd ) { + if (UDDhandle & UDRF_CHAIN) + return CUDData::getUDData ( UDDhandle,rudd ); + else return UDDATA_WrongUDRType; +} + +int CChain::GetUDData ( int UDDhandle, pstr sudd, int maxLen ) { + if (UDDhandle & UDRF_CHAIN) + return CUDData::getUDData ( UDDhandle,sudd,maxLen ); + else return UDDATA_WrongUDRType; +} + +int CChain::GetUDData ( int UDDhandle, pstr & sudd ) { + if (UDDhandle & UDRF_CHAIN) + return CUDData::getUDData ( UDDhandle,sudd ); + else return UDDATA_WrongUDRType; +} + + +// ------------------------------------------------------------------- + +DefineClass(CSortResidues) + +class CSortResidues : public CQuickSort { + public : + CSortResidues() : CQuickSort() {} + int Compare ( int i, int j ); + void Swap ( int i, int j ); + void Sort ( PPCResidue res, int nresidues ); +}; + +int CSortResidues::Compare ( int i, int j ) { +int diff; + diff = ((PPCResidue)data)[i]->seqNum - ((PPCResidue)data)[j]->seqNum; + if (diff==0) + diff = strcmp( (PPCResidue(data))[i]->insCode, + (PPCResidue(data))[j]->insCode ); + if (diff>0) return 1; + if (diff<0) return -1; + return 0; +} + +void CSortResidues::Swap ( int i, int j ) { +PCResidue res; + res = ((PPCResidue)data)[i]; + ((PPCResidue)data)[i] = ((PPCResidue)data)[j]; + ((PPCResidue)data)[j] = res; +} + +void CSortResidues::Sort ( PPCResidue res, int nresidues ) { + CQuickSort::Sort ( &(res[0]),nresidues ); +} + +void CChain::SortResidues() { +CSortResidues SR; + TrimResidueTable(); + SR.Sort ( Residue,nResidues ); +} + +int CChain::GetNofModResidues() { + return ModRes.Length(); +} + +PCModRes CChain::GetModResidue ( int modResNo ) { + return PCModRes(ModRes.GetContainerClass(modResNo)); +} + +void CChain::write ( RCFile f ) { +int i; +byte Version=1; + + f.WriteByte ( &Version ); + + CUDData::write ( f ); + + f.WriteTerLine ( chainID ,False ); + f.WriteTerLine ( prevChainID,False ); + + DBReference.write ( f ); // Database reference + SeqAdv .write ( f ); // SEQADV records + SeqRes .write ( f ); // SEQRES data + ModRes .write ( f ); // MODRES records + Het .write ( f ); // HET records + + f.WriteInt ( &nResidues ); + for (i=0;iwrite ( f ); + +} + +void CChain::read ( RCFile f ) { +// The Atom array in CMMDBFile must be already read +// prior to calling this function! +int i; +byte Version; + + FreeMemory(); + + f.ReadByte ( &Version ); + + CUDData::read ( f ); + + f.ReadTerLine ( chainID ,False ); + f.ReadTerLine ( prevChainID,False ); + + DBReference.read ( f ); // Database reference + SeqAdv .read ( f ); // SEQADV records + SeqRes .read ( f ); // SEQRES data + ModRes .read ( f ); // MODRES records + Het .read ( f ); // HET records + + SetChain ( chainID ); + + f.ReadInt ( &nResidues ); + ResLen = nResidues; + if (nResidues>0) { + Residue = new PCResidue[nResidues]; + for (i=0;iSetChain ( this ); + Residue[i]->read ( f ); + } + } + +} + + +MakeFactoryFunctions(CChain) + + + +// =================================================================== + + /* +void TestChain() { +// reads from 'in.chain', writes into +// 'out.chain' and 'abin.chain' +CFile f; +char S[81]; +PCChain Chain; + + Chain = newCChain(); + + f.assign ( "in.chain",True ); + if (f.reset()) { + while (!f.FileEnd()) { + f.ReadLine ( S,sizeof(S) ); + Chain->ConvertPDBString ( S ); + } + f.shut(); + } else { + printf ( " Can't open input file 'in.chain' \n" ); + delete Chain; + return; + } + + f.assign ( "out.chain",True ); + if (f.rewrite()) { + Chain->PDBASCIIDump ( f ); + f.shut(); + } else { + printf ( " Can't open output file 'out.chain' \n" ); + delete Chain; + return; + } + + + f.assign ( "mmdb.chain.bin",False ); + if (f.rewrite()) { + Chain->write ( f ); + f.shut(); + } else { + printf ( " Can't open binary chain file for writing.\n" ); + delete Chain; + return; + } + + delete Chain; + printf ( " Chain deleted.\n" ); + + Chain = newCChain(); + if (f.reset()) { + Chain->read ( f ); + f.shut(); + } else { + printf ( " Can't open binary chain file for reading.\n" ); + delete Chain; + return; + } + + f.assign ( "abin.chain",True ); + if (f.rewrite()) { + Chain->PDBASCIIDump ( f ); + f.shut(); + } else + printf ( " Can't open output file 'abin.chain' \n" ); + + delete Chain; + +} + */ diff --git a/mmdb/mmdb_chain.h b/mmdb/mmdb_chain.h new file mode 100755 index 0000000..bd095d8 --- /dev/null +++ b/mmdb/mmdb_chain.h @@ -0,0 +1,674 @@ +// $Id: mmdb_chain.h,v 1.22 2012/01/26 17:52:20 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 29.01.10 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : MMDB_Chain +// ~~~~~~~~~ +// **** Project : MacroMolecular Data Base (MMDB) +// ~~~~~~~~~ +// **** Classes : CProModel ( a virtue of CModel ) +// ~~~~~~~~~ CChainContainer ( container of in-chain classes ) +// CContainerChain ( chain containered class template) +// CDBReference ( DBREF records ) +// CSeqAdv ( SEQADV records ) +// CSeqRes ( SEQRES records ) +// CModRes ( MODRES records ) +// CHetRec ( HET records ) +// CChain ( chain class ) +// +// Copyright (C) E. Krissinel 2000-2010 +// +// ================================================================= +// + +#ifndef __MMDB_Chain__ +#define __MMDB_Chain__ + + +#ifndef __Stream__ +#include "stream_.h" +#endif + +#ifndef __MMDB_Defs__ +#include "mmdb_defs.h" +#endif + +#ifndef __MMDB_Utils__ +#include "mmdb_utils.h" +#endif + +#ifndef __MMDB_Atom__ +#include "mmdb_atom.h" +#endif + + +// ==================== CProModel ====================== + +// This class is a virtue needed only for defining certain +// functions of CModel, which are used by CChain and +// CResidue + +DefineClass(CProModel); +DefineStreamFunctions(CProModel); + +DefineClass(CMMDBManager); + +class CProModel : public CUDData { + + friend class CChain; + + public : + + CProModel () : CUDData () {} + CProModel ( RPCStream Object ) : CUDData ( Object ) {} + ~CProModel () {} + + virtual cpstr GetEntryID () { return ""; } + virtual void SetEntryID ( const IDCode ) {} + + virtual int AddChain ( PCChain ) { return 0; } + + // returns pointer to CMMDBFile + virtual PCMMDBManager GetCoordHierarchy() { return NULL; } + + // GetNumberOfModels() returns TOTAL number of models + virtual int GetNumberOfModels() { return 0; } + + // GetNumberOfAllAtoms() returns TOTAL number of atoms in + // all models + virtual int GetNumberOfAllAtoms() { return 0; } + + // returns pointer to the general Atom array + virtual PPCAtom GetAllAtoms() { return NULL; } + + virtual int GetSerNum () { return 0; } + + virtual void ExpandAtomArray ( int ) {} + virtual void AddAtomArray ( int ) {} + + protected : + + virtual int _ExcludeChain ( const ChainID ) { return 0; } + +}; + + + +// ==================== CChainContainer ====================== + +DefineClass(CChainContainer); +DefineStreamFunctions(CChainContainer); + +class CChainContainer : public CClassContainer { + + public : + + CChainContainer () : CClassContainer () {} + CChainContainer ( RPCStream Object ) + : CClassContainer ( Object ) {} + ~CChainContainer () {} + + PCContainerClass MakeContainerClass ( int ClassID ); + + void SetChain ( PCChain Chain_Owner ); // must be set before using + // the Container + + // special functions used in CModel::GetCIF(..) + cpstr Get1stChainID (); + void MoveByChainID ( const ChainID chainID, + PCChainContainer ChainContainer ); + + protected : + PCChain Chain; + +}; + + +// ================== CContainerChain ===================== + +DefineClass(CContainerChain); +DefineStreamFunctions(CContainerChain); + +class CContainerChain : public CContainerClass { + + friend class CChainContainer; + + public : + + CContainerChain (); + CContainerChain ( PCChain Chain_Owner ); + CContainerChain ( RPCStream Object ) : CContainerClass(Object){} + + void SetChain ( PCChain Chain_Owner ); + + protected : + PCChain Chain; + ChainID chainID; // just a copy of Chain->chainID + +}; + + +// ================== CDBReference ======================== + +DefineClass(CDBReference); +DefineStreamFunctions(CDBReference); + +class CDBReference : public CContainerChain { + + public : + + int seqBeg; // initial seq num of the PDB seq-ce segment + InsCode insBeg; // initial ins code of the PDB seq-ce segm-t + int seqEnd; // ending seq number of the PDB seq-ce segm-t + InsCode insEnd; // ending ins code of the PDB seq-ce segment + DBName database; // sequence database name + DBAcCode dbAccession; // sequence database accession code + DBIdCode dbIdCode; // sequence database identification code + int dbseqBeg; // initial seq number of the database segment + InsCode dbinsBeg; // ins code of initial residue of the segment + int dbseqEnd; // ending seq number of the database segment + InsCode dbinsEnd; // ins code of the ending residue of the seg-t + + CDBReference (); + CDBReference ( PCChain Chain_Owner ); + CDBReference ( PCChain Chain_Owner, cpstr S ); + CDBReference ( RPCStream Object ); + ~CDBReference(); + + void PDBASCIIDump ( pstr S, int N ); + void MakeCIF ( PCMMCIFData CIF, int N ); + int ConvertPDBASCII ( cpstr S ); + void GetCIF ( PCMMCIFData CIF, int & Signal ); + int GetClassID () { return ClassID_DBReference; } + + void Copy ( PCContainerClass DBRef ); + + void write ( RCFile f ); + void read ( RCFile f ); + + protected : + + void InitDBReference(); + +}; + + +// ==================== CSeqAdv =========================== + +DefineClass(CSeqAdv); +DefineStreamFunctions(CSeqAdv); + +class CSeqAdv : public CContainerChain { + + public : + + ResName resName; // residue name in conflict + int seqNum; // residue sequence number + InsCode insCode; // residue insertion code + DBName database; // sequence database name + DBAcCode dbAccession; // sequence database accession code + ResName dbRes; // sequence database residue name + int dbSeq; // sequence database sequence number + pstr conflict; // conflict comment + + CSeqAdv (); + CSeqAdv ( PCChain Chain_Owner ); + CSeqAdv ( PCChain Chain_Owner, cpstr S ); + CSeqAdv ( RPCStream Object ); + ~CSeqAdv(); + + void PDBASCIIDump ( pstr S, int N ); + int ConvertPDBASCII ( cpstr S ); + + void MakeCIF ( PCMMCIFData CIF, int N ); + void GetCIF ( PCMMCIFData CIF, int & Signal ); + + int GetClassID () { return ClassID_SeqAdv; } + + void Copy ( PCContainerClass SeqAdv ); + + void write ( RCFile f ); + void read ( RCFile f ); + + protected : + + void InitSeqAdv(); + +}; + + +// ================== CSeqRes ======================== + +DefineClass(CSeqRes); +DefineStreamFunctions(CSeqRes); + +class CSeqRes : public CStream { + + friend class CModel; + friend class CChain; + + public : + + int numRes; // number of residues in the chain + PResName resName; // residue names + + CSeqRes (); + CSeqRes ( RPCStream Object ); + ~CSeqRes(); + + void SetChain ( PCChain Chain_Owner ); + void PDBASCIIDump ( RCFile f ); + int ConvertPDBASCII ( cpstr S ); + + void MakeCIF ( PCMMCIFData CIF ); + int GetCIF ( PCMMCIFData CIF ); + + void Copy ( PCSeqRes SeqRes ); + + void write ( RCFile f ); + void read ( RCFile f ); + + protected : + PCChain Chain; + ChainID chainID; + int serNum; + + void InitSeqRes(); + void FreeMemory(); + +}; + + +// ================== CModRes ======================== + +DefineClass(CModRes); +DefineStreamFunctions(CModRes); + +class CModRes : public CContainerChain { + + public : + + ResName resName; // residue name used + int seqNum; // residue sequence number + InsCode insCode; // residue insertion code + ResName stdRes; // standard residue name + pstr comment; // description of the residue modification + + CModRes (); + CModRes ( PCChain Chain_Owner ); + CModRes ( PCChain Chain_Owner, cpstr S ); + CModRes ( RPCStream Object ); + ~CModRes(); + + void PDBASCIIDump ( pstr S, int N ); + void MakeCIF ( PCMMCIFData CIF, int N ); + int ConvertPDBASCII ( cpstr S ); + void GetCIF ( PCMMCIFData CIF, int & Signal ); + int GetClassID () { return ClassID_ModRes; } + + void Copy ( PCContainerClass ModRes ); + + void write ( RCFile f ); + void read ( RCFile f ); + + protected : + + void InitModRes(); + +}; + + +// ================== CHetRec =========================== + +DefineClass(CHetRec); +DefineStreamFunctions(CHetRec); + +class CHetRec : public CContainerChain { + + public : + + ResName hetID; // Het identifier (right-justified) + int seqNum; // sequence number + InsCode insCode; // insertion code + int numHetAtoms; // number of HETATM records for the + // group present in the entry + pstr comment; // text describing Het group + + CHetRec (); + CHetRec ( PCChain Chain_Owner ); + CHetRec ( PCChain Chain_Owner, cpstr S ); + CHetRec ( RPCStream Object ); + ~CHetRec(); + + void PDBASCIIDump ( pstr S, int N ); + void MakeCIF ( PCMMCIFData CIF, int N ); + int ConvertPDBASCII ( cpstr S ); + void GetCIF ( PCMMCIFData CIF, int & Signal ); + int GetClassID () { return ClassID_Het; } + + void Copy ( PCContainerClass Het ); + + void write ( RCFile f ); + void read ( RCFile f ); + + protected : + + void InitHetRec(); + +}; + + +// ================= CChain ======================= + +DefineFactoryFunctions(CChain); + +class CChain : public CUDData { + + friend class CDBReference; + friend class CSeqAdv; + friend class CSeqRes; + friend class CModRes; + friend class CHetRec; + friend class CResidue; + friend class CAtom; + friend class CModel; + friend class CMMDBFile; + friend class CMMDBSelManager; + friend class CMMDBBondManager; + friend class CMMDBCoorManager; + friend class CMMDBManager; + + public : + + CChainContainer DBReference; // database reference + CChainContainer SeqAdv; // SEQADV records + CSeqRes SeqRes; // Sequence residues, SEQRES records + CChainContainer ModRes; // modification descriptions + CChainContainer Het; // non-standard residues descriptions + + CChain (); // SetModel() MUST be used after this constructor! + CChain ( PCProModel Model, const ChainID chID ); + CChain ( RPCStream Object ); + ~CChain(); + + void FreeAnnotations(); + + void SetModel ( PCProModel Model ); + void SetChain ( const ChainID chID ); + + PCMMDBManager GetCoordHierarchy(); // PCMMDBFile + + // ConvertXXXXX(..) functions do not check for record name + // and assume that PDBString is at least 81 symbols long + // (including the terminating null). + int ConvertDBREF ( cpstr PDBString ); + int ConvertSEQADV ( cpstr PDBString ); + int ConvertSEQRES ( cpstr PDBString ); + int ConvertMODRES ( cpstr PDBString ); + int ConvertHET ( cpstr PDBString ); + + // This function should be used for testing purposes only. + // A full PDB ASCII dump for all models and chains involved + // is done by CMMDBFile class. + void PDBASCIIDump ( RCFile f ); + + void PDBASCIIAtomDump ( RCFile f ); + void MakeAtomCIF ( PCMMCIFData CIF ); + + + // ----------------- Extracting residues ------------------------- + + int GetNumberOfResidues(); // returns number of res-s in the chain + PCResidue GetResidue ( int resNo ); // returns resNo-th residue + // in the chain; + // 0<=resNo +// ~~~~~~~~~ +// **** Project : MacroMolecular Data Base (MMDB) +// ~~~~~~~~~ +// +// CIF Definitions +// +// (C) E. Krissinel 2000-2008 +// +// ================================================================= +// + +#ifndef __MMDB_CIFDefs__ +#include "mmdb_cifdefs.h" +#endif + + +// ------------------------------------------------------------------ + +pstr CIFName ( int NameID, int Mode ) { +// Gives CIF name according to CIF Mode. + + switch (Mode) { + + case CIF_NDB : + + switch (NameID) { + case CAT_POLY_SEQ_SCHEME : + return CIFCAT_NDB_POLY_SEQ_SCHEME; + case TAG_ID_CODE : + return CIFTAG_NDB_PDB_ID_CODE; + case TAG_CHAIN_ID : + return CIFTAG_NDB_CHAIN_ID; + case TAG_SEQ_ALIGN_BEG : + return CIFTAG_SEQ_ALIGN_BEG; + case TAG_SEQ_ALIGN_BEG_INS_CODE : + return CIFTAG_NDB_SEQ_ALIGN_BEG_INS_CODE; + case TAG_SEQ_ALIGN_END : + return CIFTAG_SEQ_ALIGN_END; + case TAG_SEQ_ALIGN_END_INS_CODE : + return CIFTAG_NDB_SEQ_ALIGN_END_INS_CODE; + case TAG_DB_ACCESSION : + return CIFTAG_NDB_DB_ACCESSION; + case TAG_DB_ALIGN_BEG : + return CIFTAG_DB_ALIGN_BEG; + case TAG_DB_ALIGN_BEG_INS_CODE : + return CIFTAG_NDB_DB_ALIGN_BEG_INS_CODE; + case TAG_DB_ALIGN_END : + return CIFTAG_DB_ALIGN_END; + case TAG_DB_ALIGN_END_INS_CODE : + return CIFTAG_NDB_DB_ALIGN_END_INS_CODE; + case TAG_SEQ_CHAIN_ID : + return CIFTAG_ID; + default : return pstr("ERROR_IN_CIF_NAME_1"); + } + + case CIF_PDBX : + + switch (NameID) { + case CAT_POLY_SEQ_SCHEME : + return CIFCAT_PDBX_POLY_SEQ_SCHEME; + case TAG_ID_CODE : + return CIFTAG_PDBX_PDB_ID_CODE; + case TAG_CHAIN_ID : + return CIFTAG_PDBX_STRAND_ID; + case TAG_SEQ_ALIGN_BEG : + return CIFTAG_SEQ_ALIGN_BEG; + case TAG_SEQ_ALIGN_BEG_INS_CODE : + return CIFTAG_PDBX_SEQ_ALIGN_BEG_INS_CODE; + case TAG_SEQ_ALIGN_END : + return CIFTAG_SEQ_ALIGN_END; + case TAG_SEQ_ALIGN_END_INS_CODE : + return CIFTAG_PDBX_SEQ_ALIGN_END_INS_CODE; + case TAG_DB_ACCESSION : + return CIFTAG_PDBX_DB_ACCESSION; + case TAG_DB_ALIGN_BEG : + return CIFTAG_DB_ALIGN_BEG; + case TAG_DB_ALIGN_BEG_INS_CODE : + return CIFTAG_PDBX_DB_ALIGN_BEG_INS_CODE; + case TAG_DB_ALIGN_END : + return CIFTAG_DB_ALIGN_END; + case TAG_DB_ALIGN_END_INS_CODE : + return CIFTAG_PDBX_DB_ALIGN_END_INS_CODE; + case TAG_SEQ_CHAIN_ID : + return CIFTAG_ASYM_ID; + default : return pstr("ERROR_IN_CIF_NAME_2"); + } + + default : return pstr("ERROR_IN_CIF_NAME_3"); + + } + +} + diff --git a/mmdb/mmdb_cifdefs.h b/mmdb/mmdb_cifdefs.h new file mode 100755 index 0000000..045ee77 --- /dev/null +++ b/mmdb/mmdb_cifdefs.h @@ -0,0 +1,327 @@ +// $Id: mmdb_cifdefs.h,v 1.21 2012/01/26 17:52:20 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 06.02.13 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : MMDBF_Defs +// ~~~~~~~~~ +// **** Project : MacroMolecular Data Base (MMDB) +// ~~~~~~~~~ +// +// CIF Definitions +// +// (C) E. Krissinel 2000-2013 +// +// ================================================================= +// + +#ifndef __MMDB_CIFDefs__ +#define __MMDB_CIFDefs__ + +#ifndef __MatType__ +#include "mattype_.h" +#endif + +// ------------------------------------------------------------------ + +// Mode IDs + +#define CIF_NDB 0 +#define CIF_PDBX 1 + + +// CIF IDs for mode-dependent CIF names + + +#define CAT_POLY_SEQ_SCHEME 1 + +#define TAG_CHAIN_ID 101 +#define TAG_DB_ACCESSION 102 +#define TAG_DB_ALIGN_BEG 103 +#define TAG_DB_ALIGN_BEG_INS_CODE 104 +#define TAG_DB_ALIGN_END 105 +#define TAG_DB_ALIGN_END_INS_CODE 106 +#define TAG_ID_CODE 107 +#define TAG_SEQ_CHAIN_ID 108 +#define TAG_SEQ_ALIGN_BEG 109 +#define TAG_SEQ_ALIGN_BEG_INS_CODE 110 +#define TAG_SEQ_ALIGN_END 111 +#define TAG_SEQ_ALIGN_END_INS_CODE 112 + +// CIFName(..) gives CIF name according to CIF Mode. +extern pstr CIFName ( int NameID, int Mode ); + +// ------------------------------------------------------------------ + + +#define CIFCAT_ATOM_SITE pstr("_atom_site") +#define CIFCAT_ATOM_SITE_ANISOTROP pstr("_atom_site_anisotrop") +#define CIFCAT_ATOM_SITES pstr("_atom_sites") +#define CIFCAT_AUDIT_AUTHOR pstr("_audit_author") +#define CIFCAT_CELL pstr("_cell") +#define CIFCAT_CHEM_COMP pstr("_chem_comp") +#define CIFCAT_CITATION pstr("_citation") +#define CIFCAT_DATABASE pstr("_database") +#define CIFCAT_DATABASE_PDB_CAVEAT pstr("_database_pdb_caveat") +#define CIFCAT_DATABASE_PDB_MATRIX pstr("_database_pdb_matrix") +#define CIFCAT_DATABASE_PDB_REV pstr("_database_pdb_rev") +#define CIFCAT_DATABASE_PDB_TVECT pstr("_database_pdb_tvect") +#define CIFCAT_ENTITY pstr("_entity") +#define CIFCAT_EXPTL pstr("_exptl") +#define CIFCAT_NDB_DATABASE_REMARK pstr("_ndb_database_remark") +#define CIFCAT_NDB_NONSTANDARD_LIST pstr("_ndb_nonstandard_list") +#define CIFCAT_NDB_POLY_SEQ_SCHEME pstr("_ndb_poly_seq_scheme") +#define CIFCAT_PDBX_POLY_SEQ_SCHEME pstr("_pdbx_poly_seq_scheme") +#define CIFCAT_SPRSDE pstr("_ndb_database_pdb_obs_spr") +#define CIFCAT_STRUCT pstr("_struct") +#define CIFCAT_STRUCT_ASYM pstr("_struct_asym") +#define CIFCAT_STRUCT_CONF pstr("_struct_conf") +#define CIFCAT_STRUCT_CONN pstr("_struct_conn") +#define CIFCAT_STRUCT_LINKR cpstr("_struct_linkr") +#define CIFCAT_STRUCT_KEYWORDS pstr("_struct_keywords") +#define CIFCAT_STRUCT_NCS_OPER pstr("_struct_ncs_oper") +#define CIFCAT_STRUCT_REF pstr("_struct_ref") +#define CIFCAT_STRUCT_REF_SEQ pstr("_struct_ref_seq") +#define CIFCAT_STRUCT_REF_SEQ_DIF pstr("_struct_ref_seq_dif") +#define CIFCAT_STRUCT_SHEET pstr("_struct_sheet") +#define CIFCAT_STRUCT_SHEET_RANGE pstr("_struct_sheet_range") +#define CIFCAT_STRUCT_SHEET_ORDER pstr("_struct_sheet_order") +#define CIFCAT_STRUCT_SHEET_HBOND pstr("_struct_sheet_hbond") +#define CIFCAT_SYMMETRY pstr("_symmetry") +#define CIFCAT_OBSLTE pstr("_ndb_database_pdb_obs_spr") + + +#define CIFTAG_ANGLE_ALPHA pstr("angle_alpha") +#define CIFTAG_ANGLE_BETA pstr("angle_beta") +#define CIFTAG_ANGLE_GAMMA pstr("angle_gamma") +#define CIFTAG_ASYM_ID pstr("asym_id") +#define CIFTAG_ATOM_TYPE_SYMBOL pstr("atom_type_symbol") +#define CIFTAG_AUTH_ASYM_ID pstr("auth_asym_id") +#define CIFTAG_AUTH_ATOM_ID pstr("auth_atom_id") +#define CIFTAG_AUTH_COMP_ID pstr("auth_comp_id") +#define CIFTAG_AUTH_SEQ_ID pstr("auth_seq_id") +#define CIFTAG_B_ISO_OR_EQUIV pstr("B_iso_or_equiv") +#define CIFTAG_B_ISO_OR_EQUIV_ESD pstr("B_iso_or_equiv_esd") +#define CIFTAG_BEG_LABEL_ASYM_ID pstr("beg_label_asym_id") +#define CIFTAG_BEG_LABEL_COMP_ID pstr("beg_label_comp_id") +#define CIFTAG_BEG_LABEL_SEQ_ID pstr("beg_label_seq_id") +#define CIFTAG_CARTN_X pstr("cartn_x") +#define CIFTAG_CARTN_X_ESD pstr("cartn_x_esd") +#define CIFTAG_CARTN_Y pstr("cartn_y") +#define CIFTAG_CARTN_Y_ESD pstr("cartn_y_esd") +#define CIFTAG_CARTN_Z pstr("cartn_z") +#define CIFTAG_CARTN_Z_ESD pstr("cartn_z_esd") +#define CIFTAG_PDBX_FORMAL_CHARGE pstr("pdbx_formal_charge") +#define CIFTAG_CODE pstr("code") +#define CIFTAG_CODE_NDB pstr("code_NDB") +#define CIFTAG_CODE_PDB pstr("code_PDB") +#define CIFTAG_CONF_TYPE_ID pstr("conf_type_id") +#define CIFTAG_CONN_TYPE_ID pstr("conn_type_id") +#define CIFTAG_DATE pstr("date") +#define CIFTAG_DATE_ORIGINAL pstr("date_original") +#define CIFTAG_DB_ALIGN_BEG pstr("db_align_beg") +#define CIFTAG_DB_ALIGN_END pstr("db_align_end") +#define CIFTAG_DB_CODE pstr("db_code") +#define CIFTAG_DB_MON_ID pstr("db_mon_id") +#define CIFTAG_DB_NAME pstr("db_name") +#define CIFTAG_DETAILS pstr("details") +#define CIFTAG_END_LABEL_ASYM_ID pstr("end_label_asym_id") +#define CIFTAG_END_LABEL_COMP_ID pstr("end_label_comp_id") +#define CIFTAG_END_LABEL_SEQ_ID pstr("end_label_seq_id") +#define CIFTAG_ENTITY_ID pstr("entity_id") +#define CIFTAG_ENTRY_ID pstr("entry_id") +#define CIFTAG_FORMULA pstr("formula") +#define CIFTAG_FRACT_TRANSF_MATRIX11 pstr("fract_transf_matrix[1][1]") +#define CIFTAG_FRACT_TRANSF_MATRIX12 pstr("fract_transf_matrix[1][2]") +#define CIFTAG_FRACT_TRANSF_MATRIX13 pstr("fract_transf_matrix[1][3]") +#define CIFTAG_FRACT_TRANSF_MATRIX21 pstr("fract_transf_matrix[2][1]") +#define CIFTAG_FRACT_TRANSF_MATRIX22 pstr("fract_transf_matrix[2][2]") +#define CIFTAG_FRACT_TRANSF_MATRIX23 pstr("fract_transf_matrix[2][3]") +#define CIFTAG_FRACT_TRANSF_MATRIX31 pstr("fract_transf_matrix[3][1]") +#define CIFTAG_FRACT_TRANSF_MATRIX32 pstr("fract_transf_matrix[3][2]") +#define CIFTAG_FRACT_TRANSF_MATRIX33 pstr("fract_transf_matrix[3][3]") +#define CIFTAG_FRACT_TRANSF_VECTOR1 pstr("fract_transf_vector[1]") +#define CIFTAG_FRACT_TRANSF_VECTOR2 pstr("fract_transf_vector[2]") +#define CIFTAG_FRACT_TRANSF_VECTOR3 pstr("fract_transf_vector[3]") +#define CIFTAG_GROUP_PDB pstr("group_PDB" ) +#define CIFTAG_ID pstr("id") +#define CIFTAG_INS_CODE pstr("ins_code") +#define CIFTAG_LABEL_ALT_ID pstr("label_alt_id") +#define CIFTAG_LABEL_ATOM_ID pstr("label_atom_id") +#define CIFTAG_LABEL_ASYM_ID pstr("label_asym_id") +#define CIFTAG_LABEL_COMP_ID pstr("label_comp_id") +#define CIFTAG_LABEL_ENTITY_ID pstr("label_entity_id") +#define CIFTAG_LABEL_SEQ_ID pstr("label_seq_id") +#define CIFTAG_LENGTH_A pstr("length_a") +#define CIFTAG_LENGTH_B pstr("length_b") +#define CIFTAG_LENGTH_C pstr("length_c") +#define CIFTAG_MATRIX11 pstr("matrix[1][1]") +#define CIFTAG_MATRIX12 pstr("matrix[1][2]") +#define CIFTAG_MATRIX13 pstr("matrix[1][3]") +#define CIFTAG_MATRIX21 pstr("matrix[2][1]") +#define CIFTAG_MATRIX22 pstr("matrix[2][2]") +#define CIFTAG_MATRIX23 pstr("matrix[2][3]") +#define CIFTAG_MATRIX31 pstr("matrix[3][1]") +#define CIFTAG_MATRIX32 pstr("matrix[3][2]") +#define CIFTAG_MATRIX33 pstr("matrix[3][3]") +#define CIFTAG_METHOD pstr("method") +#define CIFTAG_MOD_TYPE pstr("mod_type") +#define CIFTAG_MON_ID pstr("mon_id") +#define CIFTAG_NAME pstr("name") +#define CIFTAG_NDB_BEG_LABEL_INS_CODE_PDB pstr("ndb_beg_label_ins_code_pdb") +#define CIFTAG_NDB_CHAIN_ID pstr("ndb_chain_id") +#define CIFTAG_NDB_COMPONENT_NO pstr("ndb_component_no") +#define CIFTAG_NDB_DESCRIPTOR pstr("ndb_descriptor") +#define CIFTAG_NDB_DB_ACCESSION pstr("ndb_db_accession") +#define CIFTAG_NDB_DB_ALIGN_BEG_INS_CODE pstr("ndb_db_align_beg_ins_code") +#define CIFTAG_NDB_DB_ALIGN_END_INS_CODE pstr("ndb_db_align_end_ins_code") +#define CIFTAG_NDB_END_LABEL_INS_CODE_PDB pstr("ndb_end_label_ins_code_pdb") +//#define CIFTAG_NDB_INS_CODE pstr("ndb_ins_code") +#define CIFTAG_PDBX_PDB_INS_CODE pstr("pdbx_PDB_ins_code") +#define CIFTAG_NDB_HELIX_CLASS_PDB pstr("ndb_helix_class_pdb") +#define CIFTAG_NDB_KEYWORDS pstr("ndb_keywords") +#define CIFTAG_NDB_LABEL_ALT_ID pstr("ndb_label_alt_id") +#define CIFTAG_NDB_LABEL_ATOM_ID pstr("ndb_label_atom_id") +#define CIFTAG_NDB_LABEL_ASYM_ID pstr("ndb_label_asym_id") +#define CIFTAG_NDB_LABEL_COMP_ID pstr("ndb_label_comp_id") +#define CIFTAG_NDB_LABEL_INS_CODE pstr("ndb_label_ins_code") +#define CIFTAG_NDB_LABEL_SEQ_NUM pstr("ndb_label_seq_num") +#define CIFTAG_NDB_LENGTH pstr("ndb_length") +#define CIFTAG_NDB_MODEL pstr("ndb_model") +#define CIFTAG_NDB_PDB_CHAIN_ID pstr("ndb_pdb_chain_id") +#define CIFTAG_NDB_PDB_ID pstr("ndb_pdb_id") +#define CIFTAG_NDB_PDB_ID_CODE pstr("ndb_pdb_id_code") +#define CIFTAG_NDB_PDB_INS_CODE pstr("ndb_pdb_ins_code") +#define CIFTAG_NDB_PTNR1_LABEL_INS_CODE pstr("ndb_ptnr1_label_ins_code") +#define CIFTAG_NDB_PTNR1_STANDARD_COMP_ID pstr("ndb_ptnr1_standard_comp_id") +#define CIFTAG_NDB_RANGE_1_BEG_LABEL_COMP_ID pstr("ndb_range_1_beg_label_comp_id") +#define CIFTAG_NDB_RANGE_1_BEG_LABEL_ASYM_ID pstr("ndb_range_1_beg_label_asym_id") +#define CIFTAG_NDB_RANGE_1_BEG_LABEL_INS_CODE pstr("ndb_range_1_beg_label_ins_code") +#define CIFTAG_NDB_RANGE_1_END_LABEL_COMP_ID pstr("ndb_range_1_end_label_comp_id") +#define CIFTAG_NDB_RANGE_1_END_LABEL_ASYM_ID pstr("ndb_range_1_end_label_asym_id") +#define CIFTAG_NDB_RANGE_1_END_LABEL_INS_CODE pstr("ndb_range_1_end_label_ins_code") +#define CIFTAG_NDB_SEQ_ALIGN_BEG pstr("ndb_seq_align_beg") +#define CIFTAG_NDB_SEQ_ALIGN_BEG_INS_CODE pstr("ndb_seq_align_beg_ins_code") +#define CIFTAG_NDB_SEQ_ALIGN_END pstr("ndb_seq_align_end") +#define CIFTAG_NDB_SEQ_ALIGN_END_INS_CODE pstr("ndb_seq_align_end_ins_code") +#define CIFTAG_NDB_SEQ_DB_NAME pstr("ndb_seq_db_name") +#define CIFTAG_NDB_SEQ_DB_ACCESSION_CODE pstr("ndb_seq_db_accession_code") +#define CIFTAG_NDB_SEQ_DB_SEQ_NUM pstr("ndb_seq_db_seq_num") +#define CIFTAG_NDB_SYNONYMS pstr("ndb_synonyms") +#define CIFTAG_NUM pstr("num") +#define CIFTAG_NUMBER_ATOMS_NH pstr("number_atoms_nh") +#define CIFTAG_NUMBER_STRANDS pstr("number_strands") +#define CIFTAG_OCCUPANCY pstr("occupancy") +#define CIFTAG_OCCUPANCY_ESD pstr("occupancy_esd") +#define CIFTAG_ORIGX11 pstr("origx[1][1]") +#define CIFTAG_ORIGX12 pstr("origx[1][2]") +#define CIFTAG_ORIGX13 pstr("origx[1][3]") +#define CIFTAG_ORIGX21 pstr("origx[2][1]") +#define CIFTAG_ORIGX22 pstr("origx[2][2]") +#define CIFTAG_ORIGX23 pstr("origx[2][3]") +#define CIFTAG_ORIGX31 pstr("origx[3][1]") +#define CIFTAG_ORIGX32 pstr("origx[3][2]") +#define CIFTAG_ORIGX33 pstr("origx[3][3]") +#define CIFTAG_ORIGX_VECTOR1 pstr("origx_vector[1]") +#define CIFTAG_ORIGX_VECTOR2 pstr("origx_vector[2]") +#define CIFTAG_ORIGX_VECTOR3 pstr("origx_vector[3]") +#define CIFTAG_PDB_ID pstr("pdb_id") +#define CIFTAG_PDB_MON_ID pstr("pdb_mon_id") +#define CIFTAG_PDB_STRAND_ID pstr("pdb_strand_id") +#define CIFTAG_PDBX_DB_ACCESSION pstr("pdbx_db_accession") +#define CIFTAG_PDBX_DB_ALIGN_BEG_INS_CODE pstr("pdbx_db_align_beg_ins_code") +#define CIFTAG_PDBX_DB_ALIGN_END_INS_CODE pstr("pdbx_db_align_end_ins_code") +#define CIFTAG_PDBX_PDB_ID_CODE pstr("pdbx_PDB_id_code") +#define CIFTAG_PDBX_PDB_INS_CODE pstr("pdbx_PDB_ins_code") +#define CIFTAG_PDBX_PDB_MODEL_NUM pstr("pdbx_PDB_model_num") +#define CIFTAG_PDBX_STRAND_ID pstr("pdbx_strand_id") +#define CIFTAG_RANGE_1_BEG_LABEL_ATOM_ID pstr("range_1_beg_label_atom_id") +#define CIFTAG_RANGE_1_BEG_LABEL_SEQ_ID pstr("range_1_beg_label_seq_id") +#define CIFTAG_RANGE_1_END_LABEL_ATOM_ID pstr("range_1_end_label_atom_id") +#define CIFTAG_RANGE_1_END_LABEL_SEQ_ID pstr("range_1_end_label_seq_id") +#define CIFTAG_RANGE_ID_1 pstr("range_id_1") +#define CIFTAG_RANGE_ID_2 pstr("range_id_2") +#define CIFTAG_RCSB_RECORD_REVISED_1 pstr("rcsb_record_revised_1") +#define CIFTAG_RCSB_RECORD_REVISED_2 pstr("rcsb_record_revised_2") +#define CIFTAG_RCSB_RECORD_REVISED_3 pstr("rcsb_record_revised_3") +#define CIFTAG_RCSB_RECORD_REVISED_4 pstr("rcsb_record_revised_4") +#define CIFTAG_PDBX_SEQ_ALIGN_BEG_INS_CODE pstr("pdbx_seq_align_beg_ins_code") +#define CIFTAG_PDBX_SEQ_ALIGN_END_INS_CODE pstr("pdbx_seq_align_end_ins_code") +#define CIFTAG_PTNR1_LABEL_ASYM_ID pstr("ptnr1_label_asym_id") +#define CIFTAG_PTNR1_LABEL_COMP_ID pstr("ptnr1_label_comp_id") +#define CIFTAG_PTNR1_LABEL_SEQ_ID pstr("ptnr1_label_seq_id") +#define CIFTAG_REF_ID pstr("ref_id") +#define CIFTAG_REPLACES pstr("replaces") +#define CIFTAG_REPLACE_PDB_ID pstr("replace_pdb_id") +#define CIFTAG_SEGMENT_ID pstr("segment_id") +#define CIFTAG_SEQ_ALIGN_BEG pstr("seq_align_beg") +#define CIFTAG_SEQ_ALIGN_END pstr("seq_align_end") +#define CIFTAG_SEQ_NUM pstr("seq_num") +#define CIFTAG_SENSE pstr("sense") +#define CIFTAG_SHEET_ID pstr("sheet_id") +#define CIFTAG_SOURCE pstr("source") +#define CIFTAG_SPACE_GROUP_NAME_H_M pstr("space_group_name_H-M") +#define CIFTAG_TEXT pstr("text") +#define CIFTAG_TITLE pstr("title") +#define CIFTAG_TYPE pstr("type") +#define CIFTAG_TYPE_SYMBOL pstr("type_symbol") +#define CIFTAG_VECTOR1 pstr("vector[1]") +#define CIFTAG_VECTOR2 pstr("vector[2]") +#define CIFTAG_VECTOR3 pstr("vector[3]") +#define CIFTAG_U11 pstr("u[1][1]") +#define CIFTAG_U11_ESD pstr("u[1][1]_esd") +#define CIFTAG_U12 pstr("u[1][2]") +#define CIFTAG_U12_ESD pstr("u[1][2]_esd") +#define CIFTAG_U13 pstr("u[1][3]") +#define CIFTAG_U13_ESD pstr("u[1][3]_esd") +#define CIFTAG_U22 pstr("u[2][2]") +#define CIFTAG_U22_ESD pstr("u[2][2]_esd") +#define CIFTAG_U23 pstr("u[2][3]") +#define CIFTAG_U23_ESD pstr("u[2][3]_esd") +#define CIFTAG_U33 pstr("u[3][3]") +#define CIFTAG_U33_ESD pstr("u[3][3]_esd") +#define CIFTAG_Z_PDB pstr("z_pdb") + +#define CIFTAG_CONN_PTNR1_AUTH_ATOM_ID pstr("ptnr1_auth_atom_id") +#define CIFTAG_CONN_PDBX_PTNR1_AUTH_ALT_ID pstr("pdbx_ptnr1_auth_alt_id") +#define CIFTAG_CONN_PTNR1_AUTH_COMP_ID pstr("ptnr1_auth_comp_id") +#define CIFTAG_CONN_PTNR1_AUTH_ASYM_ID pstr("ptnr1_auth_asym_id") +#define CIFTAG_CONN_PTNR1_AUTH_SEQ_ID pstr("ptnr1_auth_seq_id") +#define CIFTAG_CONN_PDBX_PTNR1_PDB_INS_CODE pstr("pdbx_ptnr1_PDB_ins_code") +#define CIFTAG_CONN_DIST pstr("link_dist") +#define CIFTAG_CONN_PTNR2_AUTH_ATOM_ID pstr("ptnr2_auth_atom_id") +#define CIFTAG_CONN_PDBX_PTNR2_AUTH_ALT_ID pstr("pdbx_ptnr2_auth_alt_id") +#define CIFTAG_CONN_PTNR2_AUTH_COMP_ID pstr("ptnr2_auth_comp_id") +#define CIFTAG_CONN_PTNR2_AUTH_ASYM_ID pstr("ptnr2_auth_asym_id") +#define CIFTAG_CONN_PTNR2_AUTH_SEQ_ID pstr("ptnr2_auth_seq_id") +#define CIFTAG_CONN_PDBX_PTNR2_PDB_INS_CODE pstr("pdbx_ptnr2_PDB_ins_code") +#define CIFTAG_CONN_PTNR1_SYMMETRY pstr("ptnr1_symmetry") +#define CIFTAG_CONN_PTNR2_SYMMETRY pstr("ptnr2_symmetry") +#define CIFTAG_CONN_NAME pstr("link_name") + + +#endif + diff --git a/mmdb/mmdb_coormngr.cpp b/mmdb/mmdb_coormngr.cpp new file mode 100755 index 0000000..8ec1900 --- /dev/null +++ b/mmdb/mmdb_coormngr.cpp @@ -0,0 +1,4360 @@ +// $Id: mmdb_coormngr.cpp,v 1.28 2012/01/26 17:52:20 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 26.01.09 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : mmdb_coormngr +// ~~~~~~~~~ +// **** Project : MacroMolecular Data Base (MMDB) +// ~~~~~~~~~ +// **** Classes : CBrick ( space brick ) +// ~~~~~~~~~ CMBrick ( "multiple" space brick ) +// CMMDBCoorManager ( MMDB atom coordinate manager ) +// +// Copyright (C) E. Krissinel 2000-2009 +// +// ================================================================= +// + +#ifndef __MATH_H +#include +#endif + +#ifndef __STRING_H +#include +#endif + +#ifndef __LinAlg__ +#include "linalg_.h" +#endif + +#ifndef __MMDB_CoorMngr__ +#include "mmdb_coormngr.h" +#endif + +#ifndef __MMDB_Tables__ +#include "mmdb_tables.h" +#endif + + +// =========================== CBrick ============================== + +CBrick::CBrick() { + InitBrick(); +} + +CBrick::~CBrick() { + Clear(); +} + +void CBrick::InitBrick() { + Atom = NULL; + id = NULL; + nAtoms = 0; + nAllocAtoms = 0; +} + +void CBrick::Clear() { + if (Atom) delete[] Atom; + FreeVectorMemory ( id,0 ); + Atom = NULL; + nAtoms = 0; + nAllocAtoms = 0; +} + +void CBrick::AddAtom ( PCAtom A, int atomid ) { +int i; +PPCAtom Atom1; +ivector id1; + if (nAtoms>=nAllocAtoms) { + nAllocAtoms = nAtoms+10; + Atom1 = new PCAtom[nAllocAtoms]; + GetVectorMemory ( id1,nAllocAtoms,0 ); + for (i=0;i=nalloc) { + nalloc = natoms+10; + Atom1 = new PCAtom[nalloc]; + GetVectorMemory ( id1,nalloc,0 ); + for (i=0;inOpAlloc) { + ch1ID = new PChainID[Nops]; + ch2ID = new PChainID[Nops]; + GetVectorMemory ( nChains1,Nops,0 ); + for (i=0;i0) { + nOpAlloc = Nops; + chID1 = new PChainID[Nops]; + chID2 = new PChainID[Nops]; + GetVectorMemory ( nChains,Nops,0 ); + for (i=0;inChains[i]; + if (nChains[i]<=0) { + chID1[i] = NULL; + chID2[i] = NULL; + } else { + chID1[i] = new ChainID[nChains[i]]; + chID2[i] = new ChainID[nChains[i]]; + for (j=0;jchID1[i][j] ); + strcpy ( chID2[i][j],PCGenSym(GenSym)->chID2[i][j] ); + } + } + } + } +} + +void CGenSym::write ( RCFile f ) { +int i,j; +byte Version=1; + f.WriteByte ( &Version ); + CSymOps::write ( f ); + f.WriteInt ( &nOpAlloc ); + for (i=0;i0) { + chID1 = new PChainID[nOpAlloc]; + chID2 = new PChainID[nOpAlloc]; + GetVectorMemory ( nChains,nOpAlloc,0 ); + for (i=0;i0) { + chID1[i] = new ChainID[nChains[i]]; + chID2[i] = new ChainID[nChains[i]]; + for (j=0;j0) { + if (n_contacts=alloc_index) { + alloc_index = n_contacts+IMax(alloc_index/4+10,10); + if ((alloc_max>0) && (alloc_index>alloc_max)) + alloc_index = alloc_max; + cont1 = new SContact[alloc_index]; + for (i=0;i0) { + Atom = new PPCAtom[nStruct]; + id = new ivector[nStruct]; + GetVectorMemory ( nAtoms,nStruct,0 ); + GetVectorMemory ( nAlloc,nStruct,0 ); + for (i=0;i=nal) { + nal = nat+10; + A2 = new PCAtom[nal]; + GetVectorMemory ( id2,nal,0 ); + for (i=0;iGetSerNum(); + return 1; +} + + +PCModel CMMDBCoorManager::GetModel ( int modelNo ) { + if ((modelNo>=1) && (modelNo<=nModels)) + return Model[modelNo-1]; + else return NULL; +} + +PCModel CMMDBCoorManager::GetModel ( cpstr CID ) { +int modno,sn,rc; +ChainID chname; +InsCode ic; +ResName resname; +AtomName aname; +Element elname; +AltLoc aloc; + + CoorIDCode = CID_Ok; + rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, + aname,elname,aloc,&DefPath ); + if ((rc<0) || (rc & APATH_WC_ModelNo)) { + CoorIDCode = CID_WrongPath; + return NULL; + } + + if ((modno>=1) && (modno<=nModels)) + return Model[modno-1]; + else return NULL; + +} + +void CMMDBCoorManager::GetModelTable ( PPCModel & modelTable, + int & NumberOfModels ) { + NumberOfModels = nModels; + modelTable = Model; +} + +int CMMDBCoorManager::DeleteModel ( int modelNo ) { + if ((modelNo>=1) && (modelNo<=nModels)) { + if (Model[modelNo-1]) { + Exclude = False; + delete Model[modelNo-1]; + Model[modelNo-1] = NULL; + Exclude = True; + return 1; + } + } + return 0; +} + +int CMMDBCoorManager::DeleteModel ( cpstr CID ) { +int modno,sn,rc; +ChainID chname; +InsCode ic; +ResName resname; +AtomName aname; +Element elname; +AltLoc aloc; + + CoorIDCode = CID_Ok; + rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, + aname,elname,aloc,&DefPath ); + if ((rc<0) || (rc & APATH_WC_ModelNo)) { + CoorIDCode = CID_WrongPath; + return 0; + } + + if ((modno>=1) && (modno<=nModels)) { + if (Model[modno-1]) { + Exclude = False; + delete Model[modno-1]; + Model[modno-1] = NULL; + Exclude = True; + return 1; + } + } + + return 0; + +} + + +int CMMDBCoorManager::DeleteSolvent() { +int i,k; + Exclude = False; + k = 0; + for (i=0;iDeleteSolvent(); + Model[i]->TrimChainTable(); + if (Model[i]->nChains<=0) { + delete Model[i]; + Model[i] = NULL; + } + } + Exclude = True; + return k; +} + + +// ---------------- Adding/Inserting models --------------- + +int CMMDBCoorManager::AddModel ( PCModel model ) { +PPCModel model1; +int i,nnat,nat1; + + for (i=0;iGetNumberOfAtoms ( True ); + AddAtomArray ( nnat ); // get space for new atoms + + if (model->GetCoordHierarchy()) { + SwitchModel ( nModels+1 ); // get one more model at the end + nat1 = nAtoms; + Model[nModels-1]->_copy ( model,Atom,nat1 ); + Model[nModels-1]->serNum = nModels; + nAtoms = nat1; + } else { + model1 = new PCModel[nModels+1]; + for (i=0;iSetMMDBManager ( PCMMDBManager(this),nModels+1 ); + Model[nModels]->CheckInAtoms(); + nModels++; + } + + return nModels; + +} + +int CMMDBCoorManager::InsModel ( PCModel model, int modelNo ) { + AddModel ( model ); + RotateModels ( modelNo,nModels,1 ); + return nModels; +} + +void CMMDBCoorManager::RotateModels ( int modelNo1, int modelNo2, + int rotdir ) { +PCModel model; +PPCAtom A; +int m1,m2,i11,i12,i21,i22,nat,i,k; + + m1 = IMax ( 0,modelNo1-1 ); + m2 = IMin ( nModels,modelNo2) - 1; + if (m1>m2) ISwap ( m1,m2 ); + + if (m1!=m2) { + + if (Model[m1] && Model[m2]) { + Model[m1]->GetAIndexRange ( i11,i12 ); + Model[m2]->GetAIndexRange ( i21,i22 ); + if ((i11index = k+1; + k++; + } + for (i=0;iindex = k+1; + k++; + } + } else { + // rotate anticlockwise + nat = i22-i21+1; + A = new PCAtom[nat]; + k = 0; + for (i=i21;i<=i22;i++) + A[k++] = Atom[i]; + k = i22; + for (i=i21-1;i>=i11;i--) { + Atom[k] = Atom[i]; + if (Atom[k]) Atom[k]->index = k+1; + k--; + } + for (i=nat-1;i>=0;i--) { + Atom[k] = A[i]; + if (Atom[k]) Atom[k]->index = k+1; + k--; + } + } + delete[] A; + } + } + + if (rotdir<0) { + // rotate anticlockwise + model = Model[m1]; + for (i=m1;iserNum = i+1; + } + Model[m2] = model; + Model[m2]->serNum = m2+1; + } else { + // rotate clockwise + model = Model[m2]; + for (i=m2;i>m1;i--) { + Model[i] = Model[i-1]; + Model[i]->serNum = i+1; + } + Model[m1] = model; + Model[m1]->serNum = m1+1; + } + + } + +} + + +void CMMDBCoorManager::SwapModels ( int modelNo1, int modelNo2 ) { +PCModel model; +PPCAtom A; +int m1,m2,i11,i12,i21,i22,i,k,n; + + n = 0; // tp depress "uninitialized" warning + + m1 = IMax ( 0,modelNo1-1 ); + m2 = IMin ( nModels,modelNo2) - 1; + if (m1>m2) ISwap ( m1,m2 ); + + if (m1!=m2) { + + if (Model[m1]) + Model[m1]->GetAIndexRange ( i11,i12 ); + else { + n = m1; + while ((!Model[n]) && (nGetAIndexRange ( i11,i12 ); + i12 = i11-1; + } else + n = -1; + } + + if (n>=0) { + if (Model[m2]) + Model[m2]->GetAIndexRange ( i21,i22 ); + else { + n = m2; + while ((!Model[n]) && (m1GetAIndexRange ( i21,i22 ); + i22 = i21-1; + } else + n = -1; + } + } + + if (n>=0) { + + i11--; i12--; + i21--; i22--; + + A = new PCAtom[AtmLen]; + k = 0; + + for (i=0 ;iindex = i+1; + for (i=nAtoms;iserNum = m1+1; + Model[m2]->serNum = m2+1; + + } + +} + + + + +PCChain CMMDBCoorManager::GetChain ( int modelNo, const ChainID chainID ) { + if ((0GetChain ( chainID ); + } + return NULL; +} + +PCChain CMMDBCoorManager::GetChain ( int modelNo, int chainNo ) { + if ((0GetChain ( chainNo ); + } + return NULL; +} + +PCChain CMMDBCoorManager::GetChain ( cpstr CID ) { +int modno,sn,rc; +ChainID chname; +InsCode ic; +ResName resname; +AtomName aname; +Element elname; +AltLoc aloc; + + CoorIDCode = CID_Ok; + rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, + aname,elname,aloc,&DefPath ); + if ((rc<0) || (rc & (APATH_WC_ModelNo | APATH_WC_ChainID))) { + CoorIDCode = CID_WrongPath; + return NULL; + } + return GetChain ( modno,chname ); + +} + +void CMMDBCoorManager::GetChainTable ( int modelNo, + PPCChain & chainTable, + int & NumberOfChains ) { + chainTable = NULL; + NumberOfChains = 0; + if ((0Chain; + NumberOfChains = Model[modelNo-1]->nChains; + } + } +} + +void CMMDBCoorManager::GetChainTable ( cpstr CID, + PPCChain & chainTable, + int & NumberOfChains ) { +int modno,sn,rc; +ChainID chname; +InsCode ic; +ResName resname; +AtomName aname; +Element elname; +AltLoc aloc; + + chainTable = NULL; + NumberOfChains = 0; + CoorIDCode = CID_Ok; + + rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, + aname,elname,aloc,&DefPath ); + if ((rc<0) || (rc & APATH_WC_ModelNo)) { + CoorIDCode = CID_WrongPath; + return; + } + + if ((0Chain; + NumberOfChains = Model[modno-1]->nChains; + } + } +} + + +int CMMDBCoorManager::DeleteChain ( int modelNo, const ChainID chID ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->DeleteChain ( chID ); + } + return 0; +} + +int CMMDBCoorManager::DeleteChain ( int modelNo, int chainNo ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->DeleteChain ( chainNo ); + } + return 0; +} + +int CMMDBCoorManager::DeleteAllChains ( int modelNo ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->DeleteAllChains(); + } + return 0; +} + +int CMMDBCoorManager::DeleteAllChains() { +int i,k; + k = 0; + for (i=0;iDeleteAllChains(); + return k; +} + +int CMMDBCoorManager::AddChain ( int modelNo, PCChain chain ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->AddChain ( chain ); + } + return 0; +} + + +PCResidue CMMDBCoorManager::GetResidue ( int modelNo, + const ChainID chainID, + int seqNo, + const InsCode insCode ) { + if ((0GetResidue ( chainID,seqNo,insCode ); + } + return NULL; +} + +PCResidue CMMDBCoorManager::GetResidue ( int modelNo, int chainNo, + int seqNo, + const InsCode insCode ) { + if ((0GetResidue ( chainNo,seqNo,insCode ); + } + return NULL; +} + +PCResidue CMMDBCoorManager::GetResidue ( int modelNo, + const ChainID chainID, + int resNo ) { + if ((0GetResidue ( chainID,resNo ); + } + return NULL; +} + +PCResidue CMMDBCoorManager::GetResidue ( int modelNo, int chainNo, + int resNo ) { + if ((0GetResidue ( chainNo,resNo ); + } + return NULL; +} + +PCResidue CMMDBCoorManager::GetResidue ( cpstr CID ) { +int modno,sn,rc; +ChainID chname; +InsCode ic; +ResName resname; +AtomName aname; +Element elname; +AltLoc aloc; + + CoorIDCode = CID_Ok; + rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, + aname,elname,aloc,&DefPath ); + if ((rc<0) || (rc & (APATH_WC_ModelNo | APATH_WC_ChainID | + APATH_WC_SeqNum | APATH_WC_InsCode))) { + CoorIDCode = CID_WrongPath; + return NULL; + } + return GetResidue ( modno,chname,sn,ic ); + +} + + +int CMMDBCoorManager::GetResidueNo ( int modelNo, + const ChainID chainID, + int seqNo, + const InsCode insCode ) { + if ((0GetResidueNo ( chainID,seqNo,insCode ); + } + return -3; +} + +int CMMDBCoorManager::GetResidueNo ( int modelNo, int chainNo, + int seqNo, + const InsCode insCode ) { + if ((0GetResidueNo ( chainNo,seqNo,insCode ); + } + return -3; +} + +void CMMDBCoorManager::GetResidueTable ( PPCResidue & resTable, + int & NumberOfResidues ) { +// resTable has to be NULL or it will be reallocated. The +// application is responsible for deallocating the resTable (but not +// of its residues!). This does not apply to other GetResidueTable +// functions. +PPCChain chain; +PPCResidue res; +int i,j,k,n,nChains,nResidues; + + if (resTable) { + delete[] resTable; + resTable = NULL; + } + + NumberOfResidues = 0; + for (i=0;iGetChainTable ( chain,nChains ); + for (j=0;jnChains;j++) + if (chain[j]) { + chain[j]->GetResidueTable ( res,nResidues ); + NumberOfResidues += nResidues; + } + } + + if (NumberOfResidues>0) { + resTable = new PCResidue[NumberOfResidues]; + k = 0; + for (i=0;iGetChainTable ( chain,nChains ); + for (j=0;jnChains;j++) + if (chain[j]) { + chain[j]->GetResidueTable ( res,nResidues ); + for (n=0;nGetChain ( chainID ); + if (chain) { + resTable = chain->Residue; + NumberOfResidues = chain->nResidues; + } + } + } +} + +void CMMDBCoorManager::GetResidueTable ( int modelNo, int chainNo, + PPCResidue & resTable, + int & NumberOfResidues ) { +PCChain chain; + resTable = NULL; + NumberOfResidues = 0; + if ((0GetChain ( chainNo ); + if (chain) { + resTable = chain->Residue; + NumberOfResidues = chain->nResidues; + } + } + } +} + +void CMMDBCoorManager::GetResidueTable ( cpstr CID, + PPCResidue & resTable, + int & NumberOfResidues ) { +int modno,sn,rc; +ChainID chname; +InsCode ic; +ResName resname; +AtomName aname; +Element elname; +AltLoc aloc; +PCChain chain; + + resTable = NULL; + NumberOfResidues = 0; + CoorIDCode = CID_Ok; + + rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, + aname,elname,aloc,&DefPath ); + if ((rc<0) || (rc & (APATH_WC_ModelNo | APATH_WC_ChainID))) { + CoorIDCode = CID_WrongPath; + return; + } + + if ((0GetChain ( chname ); + if (chain) { + resTable = chain->Residue; + NumberOfResidues = chain->nResidues; + } + } + } + +} + + +int CMMDBCoorManager::DeleteResidue ( int modelNo, + const ChainID chainID, + int seqNo, + const InsCode insCode ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->DeleteResidue ( chainID,seqNo,insCode ); + } + return 0; +} + +int CMMDBCoorManager::DeleteResidue ( int modelNo, + const ChainID chainID, + int resNo ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->DeleteResidue ( chainID,resNo ); + } + return 0; +} + +int CMMDBCoorManager::DeleteResidue ( int modelNo, int chainNo, + int seqNo, + const InsCode insCode ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->DeleteResidue ( chainNo,seqNo,insCode ); + } + return 0; +} + +int CMMDBCoorManager::DeleteResidue ( int modelNo, int chainNo, + int resNo ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->DeleteResidue ( chainNo,resNo ); + } + return 0; +} + +int CMMDBCoorManager::DeleteAllResidues ( int modelNo, + const ChainID chainID ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->DeleteAllResidues ( chainID ); + } + return 0; +} + +int CMMDBCoorManager::DeleteAllResidues ( int modelNo, int chainNo ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->DeleteAllResidues ( chainNo ); + } + return 0; +} + +int CMMDBCoorManager::DeleteAllResidues ( int modelNo ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->DeleteAllResidues(); + } + return 0; +} + +int CMMDBCoorManager::DeleteAllResidues() { +int i,k; + k = 0; + for (i=0;iDeleteAllResidues(); + return k; +} + +int CMMDBCoorManager::AddResidue ( int modelNo, const ChainID chainID, + PCResidue res ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->AddResidue ( chainID,res ); + } + return 0; +} + +int CMMDBCoorManager::AddResidue ( int modelNo, int chainNo, + PCResidue res ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->AddResidue ( chainNo,res ); + } + return 0; +} + + + +int CMMDBCoorManager::GetNumberOfChains ( int modelNo ) { + if ((0nChains; + } + return 0; +} + +int CMMDBCoorManager::GetNumberOfChains ( cpstr CID ) { +int modno,sn,rc; +ChainID chname; +InsCode ic; +ResName resname; +AtomName aname; +Element elname; +AltLoc aloc; + + CoorIDCode = CID_Ok; + rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, + aname,elname,aloc,&DefPath ); + if ((rc<0) || (rc & APATH_WC_ModelNo)) { + CoorIDCode = CID_WrongPath; + return 0; + } + + if ((0nChains; + } + + return 0; + +} + +int CMMDBCoorManager::GetNumberOfResidues ( int modelNo, + const ChainID chainID ) { +PCChain chain; + if ((0GetChain ( chainID ); + if (chain) return chain->nResidues; + } + } + return 0; +} + +int CMMDBCoorManager::GetNumberOfResidues ( int modelNo, int chainNo ) { +PCChain chain; + if ((0nChains)) { + chain = Model[modelNo-1]->Chain[chainNo]; + if (chain) return chain->nResidues; + } + } + } + return 0; +} + +int CMMDBCoorManager::GetNumberOfResidues ( cpstr CID ) { +int modno,sn,rc; +ChainID chname; +InsCode ic; +ResName resname; +AtomName aname; +Element elname; +AltLoc aloc; +PCChain chain; + + CoorIDCode = CID_Ok; + rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, + aname,elname,aloc,&DefPath ); + if ((rc<0) || (rc & (APATH_WC_ModelNo | APATH_WC_ChainID))) { + CoorIDCode = CID_WrongPath; + return 0; + } + + if ((0GetChain ( chname ); + if (chain) return chain->nResidues; + } + } + + return 0; + +} + + +int CMMDBCoorManager::GetNumberOfAtoms ( int modelNo, + const ChainID chainID, + int seqNo, + const InsCode insCode ) { +PCChain chain; +PCResidue res; + if ((0GetChain ( chainID ); + if (chain) { + res = chain->GetResidue ( seqNo,insCode ); + if (res) return res->nAtoms; + } + } + } + return 0; +} + +int CMMDBCoorManager::GetNumberOfAtoms ( int modelNo, int chainNo, + int seqNo, + const InsCode insCode ) { +PCChain chain; +PCResidue res; + if ((0nChains)) { + chain = Model[modelNo-1]->Chain[chainNo]; + if (chain) { + res = chain->GetResidue ( seqNo,insCode ); + if (res) return res->nAtoms; + } + } + } + } + return 0; +} + +int CMMDBCoorManager::GetNumberOfAtoms ( int modelNo, + const ChainID chainID, + int resNo ) { +PCChain chain; +PCResidue res; + if ((0GetChain ( chainID ); + if (chain) { + if ((0<=resNo) && (resNonResidues)) { + res = chain->Residue[resNo]; + if (res) return res->nAtoms; + } + } + } + } + return 0; +} + +int CMMDBCoorManager::GetNumberOfAtoms ( int modelNo, int chainNo, + int resNo ) { +PCChain chain; +PCResidue res; + if ((0nChains)) { + chain = Model[modelNo-1]->Chain[chainNo]; + if (chain) { + if ((0<=resNo) && (resNonResidues)) { + res = chain->Residue[resNo]; + if (res) return res->nAtoms; + } + } + } + } + } + return 0; +} + +int CMMDBCoorManager::GetNumberOfAtoms ( cpstr CID ) { +// returns number of atoms in residues identified by CID +int modno,sn,rc; +ChainID chname; +InsCode ic; +ResName resname; +AtomName aname; +Element elname; +AltLoc aloc; +PCChain chain; +PCResidue res; + + CoorIDCode = CID_Ok; + rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, + aname,elname,aloc,&DefPath ); + if ((rc<0) || (rc & (APATH_WC_ModelNo | APATH_WC_ChainID | + APATH_WC_SeqNum | APATH_WC_InsCode))) { + CoorIDCode = CID_WrongPath; + return 0; + } + + if ((0GetChain ( chname ); + if (chain) { + res = chain->GetResidue ( sn,ic ); + if (res) return res->nAtoms; + } + } + } + + return 0; + +} + + +// -------------------- Extracting atoms ----------------------- + +PCAtom CMMDBCoorManager::GetAtom ( + int modelNo, // model serial number 1... + const ChainID chID, // chain ID + int seqNo, // residue sequence number + const InsCode insCode, // residue insertion code + const AtomName aname, // atom name + const Element elmnt, // chemical element code or '*' + const AltLoc aloc // alternate location indicator + ) { +PCModel mdl; +PCChain chn; +PCResidue res; +PCAtom atm; + + if ((1<=modelNo) && (modelNo<=nModels)) + mdl = Model[modelNo-1]; + else mdl = NULL; + if (!mdl) { + CoorIDCode = CID_NoModel; + return NULL; + } + + chn = mdl->GetChain ( chID ); + if (!chn) { + CoorIDCode = CID_NoChain; + return NULL; + } + + res = chn->GetResidue ( seqNo,insCode ); + if (!res) { + CoorIDCode = CID_NoResidue; + return NULL; + } + + atm = res->GetAtom ( aname,elmnt,aloc ); + if (!atm) CoorIDCode = CID_NoAtom; + else CoorIDCode = CID_Ok; + + return atm; + +} + +PCAtom CMMDBCoorManager::GetAtom ( + int modelNo, // model serial number 1... + const ChainID chID, // chain ID + int seqNo, // residue sequence number + const InsCode insCode, // residue insertion code + int atomNo // atom number 0.. + ) { +PCModel mdl; +PCChain chn; +PCResidue res; +PCAtom atm; + + if ((1<=modelNo) && (modelNo<=nModels)) + mdl = Model[modelNo-1]; + else mdl = NULL; + if (!mdl) { + CoorIDCode = CID_NoModel; + return NULL; + } + + chn = mdl->GetChain ( chID ); + if (!chn) { + CoorIDCode = CID_NoChain; + return NULL; + } + + res = chn->GetResidue ( seqNo,insCode ); + if (!res) { + CoorIDCode = CID_NoResidue; + return NULL; + } + + if ((0<=atomNo) && (atomNonAtoms)) + atm = res->atom[atomNo]; + else atm = NULL; + if (!atm) CoorIDCode = CID_NoAtom; + else CoorIDCode = CID_Ok; + + return atm; + +} + +PCAtom CMMDBCoorManager::GetAtom ( + int modelNo, // model serial number 1... + const ChainID chID, // chain ID + int resNo, // residue number 0.. + const AtomName aname, // atom name + const Element elmnt, // chemical element code or '*' + const AltLoc aloc // alternate location indicator + ) { +PCModel mdl; +PCChain chn; +PCResidue res; +PCAtom atm; + + if ((1<=modelNo) && (modelNo<=nModels)) + mdl = Model[modelNo-1]; + else mdl = NULL; + if (!mdl) { + CoorIDCode = CID_NoModel; + return NULL; + } + + chn = mdl->GetChain ( chID ); + if (!chn) { + CoorIDCode = CID_NoChain; + return NULL; + } + + if ((0<=resNo) && (resNonResidues)) + res = chn->Residue[resNo]; + else res = NULL; + if (!res) { + CoorIDCode = CID_NoResidue; + return NULL; + } + + atm = res->GetAtom ( aname,elmnt,aloc ); + if (!atm) CoorIDCode = CID_NoAtom; + else CoorIDCode = CID_Ok; + + return atm; + +} + +PCAtom CMMDBCoorManager::GetAtom ( + int modelNo, // model serial number 1... + const ChainID chID, // chain ID + int resNo, // residue number 0.. + int atomNo // atom number 0.. + ) { +PCModel mdl; +PCChain chn; +PCResidue res; +PCAtom atm; + + if ((1<=modelNo) && (modelNo<=nModels)) + mdl = Model[modelNo-1]; + else mdl = NULL; + if (!mdl) { + CoorIDCode = CID_NoModel; + return NULL; + } + + chn = mdl->GetChain ( chID ); + if (!chn) { + CoorIDCode = CID_NoChain; + return NULL; + } + + if ((0<=resNo) && (resNonResidues)) + res = chn->Residue[resNo]; + else res = NULL; + if (!res) { + CoorIDCode = CID_NoResidue; + return NULL; + } + + if ((0<=atomNo) && (atomNonAtoms)) + atm = res->atom[atomNo]; + else atm = NULL; + if (!atm) CoorIDCode = CID_NoAtom; + else CoorIDCode = CID_Ok; + + return atm; + +} + +PCAtom CMMDBCoorManager::GetAtom ( + int modelNo, // model serial number 1... + int chNo, // chain number 0.. + int seqNo, // residue sequence number + const InsCode insCode, // residue insertion code + const AtomName aname, // atom name + const Element elmnt, // chemical element code or '*' + const AltLoc aloc // alternate location indicator + ) { +PCModel mdl; +PCChain chn; +PCResidue res; +PCAtom atm; + + if ((1<=modelNo) && (modelNo<=nModels)) + mdl = Model[modelNo-1]; + else mdl = NULL; + if (!mdl) { + CoorIDCode = CID_NoModel; + return NULL; + } + + if ((0<=chNo) && (chNonChains)) + chn = mdl->Chain[chNo]; + else chn = NULL; + if (!chn) { + CoorIDCode = CID_NoChain; + return NULL; + } + + res = chn->GetResidue ( seqNo,insCode ); + if (!res) { + CoorIDCode = CID_NoResidue; + return NULL; + } + + atm = res->GetAtom ( aname,elmnt,aloc ); + if (!atm) CoorIDCode = CID_NoAtom; + else CoorIDCode = CID_Ok; + + return atm; + +} + +PCAtom CMMDBCoorManager::GetAtom ( + int modelNo, // model serial number 1... + int chNo, // chain number 0... + int seqNo, // residue sequence number + const InsCode insCode, // residue insertion code + int atomNo // atom number 0... + ) { +PCModel mdl; +PCChain chn; +PCResidue res; +PCAtom atm; + + if ((1<=modelNo) && (modelNo<=nModels)) + mdl = Model[modelNo-1]; + else mdl = NULL; + if (!mdl) { + CoorIDCode = CID_NoModel; + return NULL; + } + + if ((0<=chNo) && (chNonChains)) + chn = mdl->Chain[chNo]; + else chn = NULL; + if (!chn) { + CoorIDCode = CID_NoChain; + return NULL; + } + + res = chn->GetResidue ( seqNo,insCode ); + if (!res) { + CoorIDCode = CID_NoResidue; + return NULL; + } + + if ((0<=atomNo) && (atomNonAtoms)) + atm = res->atom[atomNo]; + else atm = NULL; + if (!atm) CoorIDCode = CID_NoAtom; + else CoorIDCode = CID_Ok; + + return atm; + +} + +PCAtom CMMDBCoorManager::GetAtom ( + int modelNo, // model serial number 1... + int chNo, // chain number 0... + int resNo, // residue number 0... + const AtomName aname, // atom name + const Element elmnt, // chemical element code or '*' + const AltLoc aloc // alternate location indicator + ) { +PCModel mdl; +PCChain chn; +PCResidue res; +PCAtom atm; + + if ((1<=modelNo) && (modelNo<=nModels)) + mdl = Model[modelNo-1]; + else mdl = NULL; + if (!mdl) { + CoorIDCode = CID_NoModel; + return NULL; + } + + if ((0<=chNo) && (chNonChains)) + chn = mdl->Chain[chNo]; + else chn = NULL; + if (!chn) { + CoorIDCode = CID_NoChain; + return NULL; + } + + if ((0<=resNo) && (resNonResidues)) + res = chn->Residue[resNo]; + else res = NULL; + if (!res) { + CoorIDCode = CID_NoResidue; + return NULL; + } + + atm = res->GetAtom ( aname,elmnt,aloc ); + if (!atm) CoorIDCode = CID_NoAtom; + else CoorIDCode = CID_Ok; + + return atm; + +} + +PCAtom CMMDBCoorManager::GetAtom ( + int modelNo, // model serial number 1... + int chNo, // chain number 0... + int resNo, // residue number 0... + int atomNo // atom number 0... + ) { +PCModel mdl; +PCChain chn; +PCResidue res; +PCAtom atm; + + if ((1<=modelNo) && (modelNo<=nModels)) + mdl = Model[modelNo-1]; + else mdl = NULL; + if (!mdl) { + CoorIDCode = CID_NoModel; + return NULL; + } + + if ((0<=chNo) && (chNonChains)) + chn = mdl->Chain[chNo]; + else chn = NULL; + if (!chn) { + CoorIDCode = CID_NoChain; + return NULL; + } + + if ((0<=resNo) && (resNonResidues)) + res = chn->Residue[resNo]; + else res = NULL; + if (!res) { + CoorIDCode = CID_NoResidue; + return NULL; + } + + if ((0<=atomNo) && (atomNonAtoms)) + atm = res->atom[atomNo]; + else atm = NULL; + if (!atm) CoorIDCode = CID_NoAtom; + else CoorIDCode = CID_Ok; + + return atm; + +} + + +PCAtom CMMDBCoorManager::GetAtom ( cpstr CID ) { +int modno,sn,rc; +ChainID chname; +InsCode ic; +ResName resname; +AtomName aname; +Element elname; +AltLoc aloc; + + CoorIDCode = CID_Ok; + rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, + aname,elname,aloc,&DefPath ); + if ((rc<0) || (rc & APATH_Incomplete)) { + CoorIDCode = CID_WrongPath; + return NULL; + } + + return GetAtom ( modno,chname,sn,ic,aname,elname,aloc ); + +} + + +void CMMDBCoorManager::GetAtomTable ( PPCAtom & atomTable, + int & NumberOfAtoms ) { + atomTable = Atom; + NumberOfAtoms = nAtoms; +} + +void CMMDBCoorManager::GetAtomTable ( int modelNo, + const ChainID chainID, + int seqNo, + const InsCode insCode, + PPCAtom & atomTable, + int & NumberOfAtoms ) { +PCResidue res; + atomTable = NULL; + NumberOfAtoms = 0; + if ((0GetResidue ( chainID,seqNo,insCode ); + if (res) { + atomTable = res->atom; + NumberOfAtoms = res->nAtoms; + } + } + } +} + +void CMMDBCoorManager::GetAtomTable ( int modelNo, + int chainNo, + int seqNo, + const InsCode insCode, + PPCAtom & atomTable, + int & NumberOfAtoms ) { +PCResidue res; + atomTable = NULL; + NumberOfAtoms = 0; + if ((0GetResidue ( chainNo,seqNo,insCode ); + if (res) { + atomTable = res->atom; + NumberOfAtoms = res->nAtoms; + } + } + } +} + +void CMMDBCoorManager::GetAtomTable ( int modelNo, + const ChainID chainID, + int resNo, + PPCAtom & atomTable, + int & NumberOfAtoms ) { +PCResidue res; + atomTable = NULL; + NumberOfAtoms = 0; + if ((0GetResidue ( chainID,resNo ); + if (res) { + atomTable = res->atom; + NumberOfAtoms = res->nAtoms; + } + } + } +} + +void CMMDBCoorManager::GetAtomTable ( int modelNo, int chainNo, + int resNo, PPCAtom & atomTable, + int & NumberOfAtoms ) { +PCResidue res; + atomTable = NULL; + NumberOfAtoms = 0; + if ((0GetResidue ( chainNo,resNo ); + if (res) { + atomTable = res->atom; + NumberOfAtoms = res->nAtoms; + } + } + } +} + +void CMMDBCoorManager::GetAtomTable ( cpstr CID, + PPCAtom & atomTable, + int & NumberOfAtoms ) { +int modno,sn,rc; +ChainID chname; +InsCode ic; +ResName resname; +AtomName aname; +Element elname; +AltLoc aloc; +PCResidue res; + + atomTable = NULL; + NumberOfAtoms = 0; + + CoorIDCode = CID_Ok; + rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, + aname,elname,aloc,&DefPath ); + if ((rc<0) || (rc & (APATH_WC_ModelNo | APATH_WC_ChainID | + APATH_WC_SeqNum | APATH_WC_InsCode))) { + CoorIDCode = CID_WrongPath; + return; + } + + res = GetResidue ( modno,chname,sn,ic ); + if (res) { + atomTable = res->atom; + NumberOfAtoms = res->nAtoms; + } + +} + + +void CMMDBCoorManager::GetAtomTable1 ( PPCAtom & atomTable, + int & NumberOfAtoms ) { +int i,j; + if (atomTable) delete[] atomTable; + if (nAtoms>0) { + atomTable = new PCAtom[nAtoms]; + j = 0; + for (i=0;iTer) + atomTable[j++] = Atom[i]; + } + NumberOfAtoms = j; + } else { + atomTable = NULL; + NumberOfAtoms = 0; + } +} + +void CMMDBCoorManager::GetAtomTable1 ( int modelNo, + const ChainID chainID, + int seqNo, + const InsCode insCode, + PPCAtom & atomTable, + int & NumberOfAtoms ) { +PCResidue res; + res = NULL; + if ((0GetResidue ( chainID,seqNo,insCode ); + } + if (res) + res->GetAtomTable1 ( atomTable,NumberOfAtoms ); + else { + if (atomTable) delete[] atomTable; + atomTable = NULL; + NumberOfAtoms = 0; + } +} + +void CMMDBCoorManager::GetAtomTable1 ( int modelNo, + int chainNo, + int seqNo, + const InsCode insCode, + PPCAtom & atomTable, + int & NumberOfAtoms ) { +PCResidue res; + res = NULL; + if ((0GetResidue ( chainNo,seqNo,insCode ); + } + if (res) + res->GetAtomTable1 ( atomTable,NumberOfAtoms ); + else { + if (atomTable) delete[] atomTable; + atomTable = NULL; + NumberOfAtoms = 0; + } +} + +void CMMDBCoorManager::GetAtomTable1 ( int modelNo, + const ChainID chainID, + int resNo, + PPCAtom & atomTable, + int & NumberOfAtoms ) { +PCResidue res; + res = NULL; + if ((0GetResidue ( chainID,resNo ); + } + if (res) + res->GetAtomTable1 ( atomTable,NumberOfAtoms ); + else { + if (atomTable) delete[] atomTable; + atomTable = NULL; + NumberOfAtoms = 0; + } +} + +void CMMDBCoorManager::GetAtomTable1 ( int modelNo, int chainNo, + int resNo, + PPCAtom & atomTable, + int & NumberOfAtoms ) { +PCResidue res; + res = NULL; + if ((0GetResidue ( chainNo,resNo ); + } + if (res) + res->GetAtomTable1 ( atomTable,NumberOfAtoms ); + else { + if (atomTable) delete[] atomTable; + atomTable = NULL; + NumberOfAtoms = 0; + } +} + +void CMMDBCoorManager::GetAtomTable1 ( cpstr CID, PPCAtom & atomTable, + int & NumberOfAtoms ) { +int modno,sn,rc; +ChainID chname; +InsCode ic; +ResName resname; +AtomName aname; +Element elname; +AltLoc aloc; +PCResidue res; + + atomTable = NULL; + NumberOfAtoms = 0; + + CoorIDCode = CID_Ok; + rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, + aname,elname,aloc,&DefPath ); + if ((rc<0) || (rc & (APATH_WC_ModelNo | APATH_WC_ChainID | + APATH_WC_SeqNum | APATH_WC_InsCode))) { + CoorIDCode = CID_WrongPath; + return; + } + + res = GetResidue ( modno,chname,sn,ic ); + if (res) + res->GetAtomTable1 ( atomTable,NumberOfAtoms ); + else { + if (atomTable) delete[] atomTable; + atomTable = NULL; + NumberOfAtoms = 0; + } + +} + + + +int CMMDBCoorManager::DeleteAtom ( int modelNo, + const ChainID chID, + int seqNo, + const InsCode insCode, + const AtomName aname, + const Element elmnt, + const AltLoc aloc ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->DeleteAtom ( chID,seqNo,insCode, + aname,elmnt,aloc ); + } + return 0; +} + +int CMMDBCoorManager::DeleteAtom ( int modelNo, + const ChainID chID, + int seqNo, + const InsCode insCode, + int atomNo ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->DeleteAtom ( chID,seqNo,insCode,atomNo ); + } + return 0; +} + +int CMMDBCoorManager::DeleteAtom ( int modelNo, + const ChainID chID, + int resNo, + const AtomName aname, + const Element elmnt, + const AltLoc aloc ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->DeleteAtom ( chID,resNo, + aname,elmnt,aloc ); + } + return 0; +} + +int CMMDBCoorManager::DeleteAtom ( int modelNo, + const ChainID chID, + int resNo, + int atomNo ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->DeleteAtom ( chID,resNo,atomNo ); + } + return 0; +} + +int CMMDBCoorManager::DeleteAtom ( int modelNo, int chNo, int seqNo, + const InsCode insCode, + const AtomName aname, + const Element elmnt, + const AltLoc aloc ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->DeleteAtom ( chNo,seqNo,insCode, + aname,elmnt,aloc ); + } + return 0; +} + +int CMMDBCoorManager::DeleteAtom ( int modelNo, int chNo, int seqNo, + const InsCode insCode, int atomNo ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->DeleteAtom ( chNo,seqNo,insCode,atomNo ); + } + return 0; +} + +int CMMDBCoorManager::DeleteAtom ( int modelNo, int chNo, int resNo, + const AtomName aname, + const Element elmnt, + const AltLoc aloc ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->DeleteAtom ( chNo,resNo, + aname,elmnt,aloc ); + } + return 0; +} + +int CMMDBCoorManager::DeleteAtom ( int modelNo, int chNo, int resNo, + int atomNo ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->DeleteAtom ( chNo,resNo,atomNo ); + } + return 0; +} + +int CMMDBCoorManager::DeleteAllAtoms ( int modelNo, + const ChainID chID, + int seqNo, + const InsCode insCode ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->DeleteAllAtoms ( chID,seqNo,insCode ); + } + return 0; +} + +int CMMDBCoorManager::DeleteAllAtoms ( int modelNo, const ChainID chID, + int resNo ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->DeleteAllAtoms ( chID,resNo ); + } + return 0; +} + +int CMMDBCoorManager::DeleteAllAtoms ( int modelNo, const ChainID chID ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->DeleteAllAtoms ( chID ); + } + return 0; +} + +int CMMDBCoorManager::DeleteAllAtoms ( int modelNo, int chNo, int seqNo, + const InsCode insCode ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->DeleteAllAtoms ( chNo,seqNo,insCode ); + } + return 0; +} + +int CMMDBCoorManager::DeleteAllAtoms ( int modelNo, int chNo, + int resNo ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->DeleteAllAtoms ( chNo,resNo ); + } + return 0; +} + +int CMMDBCoorManager::DeleteAllAtoms ( int modelNo, int chNo ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->DeleteAllAtoms ( chNo ); + } + return 0; +} + +int CMMDBCoorManager::DeleteAllAtoms ( int modelNo ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->DeleteAllAtoms(); + } + return 0; +} + +int CMMDBCoorManager::DeleteAllAtoms() { +int i,k; + k = 0; + for (i=0;iDeleteAllAtoms(); + return k; +} + + +/* +int CMMDBCoorManager::DeleteAltLocs() { +// This function leaves only alternative location with maximal +// occupancy, if those are equal or unspecified, the one with +// "least" alternative location indicator. +// The function returns the number of deleted atoms and optimizes +// the atom index. +ChainID chID; +ResName rName; +InsCode iCode; +AtomName aname; +AltLoc aLoc,aL; +realtype occupancy,occ; +int seqNum; +int i,j,k,i1,i2,n; + + k = 0; + n = 0; + i = 0; + while (iGetSeqNum (); + occupancy = Atom[i]->GetOccupancy(); + strcpy ( chID ,Atom[i]->GetChainID() ); + strcpy ( rName,Atom[i]->GetResName() ); + strcpy ( iCode,Atom[i]->GetInsCode() ); + strcpy ( aname,Atom[i]->name ); + strcpy ( aLoc ,Atom[i]->altLoc ); + j = i+1; + i1 = -1; + i2 = i; + while (jGetSeqNum()==seqNum) && + (!strcmp(Atom[j]->name,aname)) && + (!strcmp(Atom[j]->GetInsCode(),iCode)) && + (!strcmp(Atom[j]->GetResName(),rName)) && + (!strcmp(Atom[j]->GetChainID(),chID ))) { + occ = Atom[j]->GetOccupancy(); + if (occ>occupancy) { + occupancy = occ; + i1 = j; + } + if (aLoc[0]) { + strcpy ( aL,Atom[j]->altLoc ); + if (!aL[0]) { + aLoc[0] = char(0); + i2 = j; + } else if (strcmp(aL,aLoc)<0) { + strcpy ( aLoc,aL ); + i2 = j; + } + } + j++; + } else + break; + } else + j++; + if (i1<0) { + if (Atom[i]->WhatIsSet & ASET_Occupancy) i1 = i; + else i1 = i2; + } + while (iindex = k+1; + } + k++; + } + } + i++; + } + + } else + i++; + + } + + nAtoms = k; + return n; + +} +*/ + +int CMMDBCoorManager::DeleteAltLocs() { +// This function leaves only alternative location with maximal +// occupancy, if those are equal or unspecified, the one with +// "least" alternative location indicator. +// The function returns the number of deleted atoms. All tables +// remain untrimmed, so that explicit trimming or calling +// FinishStructEdit() at some point is required. +int i,n; + + n = 0; + for (i=0;iDeleteAltLocs(); + + return n; + +} + +int CMMDBCoorManager::AddAtom ( int modelNo, + const ChainID chID, + int seqNo, + const InsCode insCode, + PCAtom atom ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->AddAtom ( chID,seqNo,insCode,atom ); + } + return 0; +} + +int CMMDBCoorManager::AddAtom ( int modelNo, const ChainID chID, + int resNo, PCAtom atom ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->AddAtom ( chID,resNo,atom ); + } + return 0; +} + +int CMMDBCoorManager::AddAtom ( int modelNo, int chNo, + int seqNo, const InsCode insCode, + PCAtom atom ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->AddAtom ( chNo,seqNo,insCode,atom ); + } + return 0; +} + +int CMMDBCoorManager::AddAtom ( int modelNo, int chNo, + int resNo, PCAtom atom ) { + if ((modelNo>0) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->AddAtom ( chNo,resNo,atom ); + } + return 0; +} + + +void CMMDBCoorManager::RemoveBricks() { +int i,j,k; + if (Brick) { + for (i=0;ix-xbrick_0)/brick_size); + ny = (int)floor((A->y-ybrick_0)/brick_size); + nz = (int)floor((A->z-zbrick_0)/brick_size); + if ((ny<0) || (nz<0) || (nx>=nbrick_x) || + (ny>=nbrick_y) || (nz>=nbrick_z)) nx = -1; +} + +void CMMDBCoorManager::GetBrickCoor ( realtype x, realtype y, + realtype z, int & nx, + int & ny, int & nz ) { + nx = (int)floor((x-xbrick_0)/brick_size); + ny = (int)floor((y-ybrick_0)/brick_size); + nz = (int)floor((z-zbrick_0)/brick_size); + if ((ny<0) || (nz<0) || (nx>=nbrick_x) || + (ny>=nbrick_y) || (nz>=nbrick_z)) nx = -1; +} + +void CMMDBCoorManager::GetBrickDimension ( + int & nxmax, int & nymax, int & nzmax ) { + if (!Brick) { + nxmax = 0; nymax = 0; nzmax = 0; + } else { + nxmax = nbrick_x; + nymax = nbrick_y; + nzmax = nbrick_z; + } +} + +PCBrick CMMDBCoorManager::GetBrick ( int nx, int ny, int nz ) { + if (!Brick) return NULL; + if ((nx>=0) && (nx=0) && (ny=0) && (nz0) { + // find the range of coordinates + x1 = MaxReal; + x2 = -x1; + y1 = MaxReal; + y2 = -y1; + z1 = MaxReal; + z2 = -z1; + for (i=0;iTer) && (A[i]->WhatIsSet & ASET_Coordinates)) { + if (A[i]->xx; + if (A[i]->x>x2) x2 = A[i]->x; + if (A[i]->yy; + if (A[i]->y>y2) y2 = A[i]->y; + if (A[i]->zz; + if (A[i]->z>z2) z2 = A[i]->z; + } + } + if (x1Ter) && (A[i]->WhatIsSet & ASET_Coordinates)) { + GetBrickCoor ( A[i],nx,ny,nz ); + if (nx>=0) { + if (!Brick) { + Brick = new PPPCBrick[nbrick_x]; + for (j=0;jAddAtom ( A[i],i ); + } else + printf ( " error in " + "CMMDBCoorManager::MakeBricks!!!\n" ); + } + } + } + } + +} + + +void CMMDBCoorManager::RemoveMBricks() { +int i,j,k; + if (MBrick) { + for (i=0;ix-xmbrick_0)/mbrick_size); + ny = (int)floor((A->y-ymbrick_0)/mbrick_size); + nz = (int)floor((A->z-zmbrick_0)/mbrick_size); + if ((ny<0) || (nz<0) || (nx>=nmbrick_x) || + (ny>=nmbrick_y) || (nz>=nmbrick_z)) nx = -nx-1; +} + +void CMMDBCoorManager::GetMBrickCoor ( + realtype x, realtype y, realtype z, + int & nx, int & ny, int & nz ) { + nx = (int)floor((x-xmbrick_0)/mbrick_size); + ny = (int)floor((y-ymbrick_0)/mbrick_size); + nz = (int)floor((z-zmbrick_0)/mbrick_size); + if ((ny<0) || (nz<0) || (nx>=nmbrick_x) || + (ny>=nmbrick_y) || (nz>=nmbrick_z)) nx = -nx-1; +} + +void CMMDBCoorManager::GetMBrickDimension ( + int & nxmax, int & nymax, int & nzmax ) { + if (!Brick) { + nxmax = 0; nymax = 0; nzmax = 0; + } else { + nxmax = nmbrick_x; + nymax = nmbrick_y; + nzmax = nmbrick_z; + } +} + +PCMBrick CMMDBCoorManager::GetMBrick ( int nx, int ny, int nz ) { + if (!MBrick) return NULL; + if ((nx>=0) && (nx=0) && (ny=0) && (nzTer) && (A->WhatIsSet & ASET_Coordinates)) { + if (A->xx; + if (A->x>x2) x2 = A->x; + if (A->yy; + if (A->y>y2) y2 = A->y; + if (A->zz; + if (A->z>z2) z2 = A->z; + } + } + } + if (x1Ter) && (A->WhatIsSet & ASET_Coordinates)) { + GetMBrickCoor ( A,nx,ny,nz ); + if (nx>=0) { + if (!MBrick) { + MBrick = new PPPCMBrick[nmbrick_x]; + for (k=0;kAddAtom ( A,i,j ); + } else + printf ( " error in " + "CMMDBCoorManager::MakeMBricks!!!\n" ); + } + } + } + } + +} + + +int CMMDBCoorManager::GenerateSymMates ( PCGenSym GenSym ) { +// +// The function generates symmetry mates according to symmetry +// operations found in GenSym. Results of first symmetry operation +// (number 0) always replaces the existing set of atoms, others +// are added as additional sets. +// If GenSym is set to NULL, the function generates all +// symmetry mates for the unit cell taking the symmetry information +// from Cryst.SymOps. +// The newly generated chains are added to each model. These +// chains have many-character chain names, composed as 'x_n', +// where 'x' is the original name and 'n' is a unique number, which +// coincides with the symmetry operation (order) number; number '_0' +// (for the very first symmetry operatyion) is missing. Another +// side effect is the disorder in atoms' serial numbers. +// The hierarchy should therefore be cleaned after +// generating the symmetry mates. An appropriate way to do +// that is to issue the following call: +// +// PDBCleanup ( PDBCLEAN_TER | PDBCLEAN_ALTCODE_STRONG | +// PDBCLEAN_CHAIN_STRONG | PDBCLEAN_SERIAL ); +// +PPCMMDBCoorManager Mate; +int i,j,k,n,nMates,nMates1,nAtoms1; +PPCAtom Atom1; +PPCModel Model1; + + if (GenSym) nMates = GenSym->GetNofSymOps(); + else nMates = Cryst.GetNumberOfSymOps(); + if (nMates<=0) return GSM_NoSymOps; + + if (!Cryst.areMatrices()) return GSM_NoTransfMatrices; + if (!Cryst.isCellParameters()) return GSM_NoCell; + + nMates1 = nMates-1; + if (nMates1>0) { + + // Generate symmetry mates in parallel hierarchies + Mate = new PCMMDBCoorManager[nMates1]; + for (i=0;iCopy ( this ); + Mate[i]->ApplySymTransform ( i+1,GenSym ); + } + + // apply 1st symmetry operation: + if (GenSym) ApplySymTransform ( 0,GenSym ); + + // Gather all symmetry mates in 'this' hierarchy + nAtoms1 = nMates*nAtoms; // new number of atoms + Atom1 = new PCAtom[nAtoms1]; // new array of atoms + + if (nModels>0) Model1 = new PCModel[nModels]; // new array of + else Model1 = NULL; // models + + k = 0; // index of collected atoms + for (i=0;iSetMMDBManager ( PCMMDBManager(this),i+1 ); + for (j=0;jnChains;j++) + Model1[i]->MoveChain ( Model[i]->Chain[j],Atom,Atom1,k,0 ); + for (n=0;nnChains;j++) + Model1[i]->MoveChain ( Mate[n]->Model[i]->Chain[j], + Mate[n]->Atom,Atom1,k,n+1 ); + } else + Model1[i] = NULL; + + if (Model) delete[] Model; + Model = Model1; + + for (i=0;iTer) Atom[i]->Transform ( TMatrix ); + } +} + +void CMMDBCoorManager::ApplySymTransform ( int SymOpNo, + PCGenSym GenSym ) { +// This procedure applies the symmetry operation number SymOpNo +// (starting from 0 on) and renames chains as specified in +// GenSym. +// The chains don't have to be renamed. The number of chains +// to be renamed is obtained as GenSym->nChains[SymOpNo], their +// old names - as GenSym->chID1[SymOpNo][j], and their new names +// - as GenSym->chID2[SymOpNo][j], 0<=jnChains[SymOpNo]. +mat44 tmat; +int i,j,k,nChn; +PPCChain chain; + if (Cryst.GetTMatrix(tmat,SymOpNo,0,0,0,PCSymOps(GenSym)) + ==SYMOP_Ok) { + for (i=0;iTer) Atom[i]->Transform ( tmat ); + } + if (GenSym) + for (i=0;iGetChainTable ( chain,nChn ); + for (j=0;jnChains[SymOpNo];j++) + for (k=0;kchainID,GenSym->chID1[SymOpNo][j])) + chain[k]->SetChainID ( GenSym->chID2[SymOpNo][j] ); + } + } +} + + +void GetEulerRotMatrix ( mat33 & erm, + realtype alpha, + realtype beta, + realtype gamma ) { +// Calculates the Euler rotation matrix for rotation: +// 1) about z-axis by angle alpha (0..2*Pi) +// 2) about new y-axis by angle beta (0..Pi) +// 3) about new z-axis by angle gamma (0..2*Pi) +realtype ca,cb,cg, sa,sb,sg; + + ca = cos(alpha); + sa = sin(alpha); + cb = cos(beta); + sb = sin(beta); + cg = cos(gamma); + sg = sin(gamma); + + erm[0][0] = ca*cb*cg - sa*sg; + erm[0][1] = cb*cg*sa + ca*sg; + erm[0][2] = -cg*sb; + + erm[1][0] = -cg*sa - ca*cb*sg; + erm[1][1] = ca*cg - cb*sa*sg; + erm[1][2] = sb*sg; + + erm[2][0] = ca*sb; + erm[2][1] = sa*sb; + erm[2][2] = cb; + +} + + + +void GetEulerTMatrix ( mat44 & erm, + realtype alpha, + realtype beta, + realtype gamma, + realtype x0, + realtype y0, + realtype z0 ) { +// Calculates the Euler rotation-translation matrix for rotation: +// 1) about z-axis by angle alpha +// 2) about new y-axis by angle beta +// 3) about new z-axis by angle gamma +// Point (x0,y0,z0) is the center of rotation. +mat33 m; + + m[0][0] = 1.0; + GetEulerRotMatrix ( m,alpha,beta,gamma ); + + erm[0][0] = m[0][0]; erm[0][1] = m[0][1]; erm[0][2] = m[0][2]; + erm[1][0] = m[1][0]; erm[1][1] = m[1][1]; erm[1][2] = m[1][2]; + erm[2][0] = m[2][0]; erm[2][1] = m[2][1]; erm[2][2] = m[2][2]; + erm[3][0] = 0.0; erm[3][1] = 0.0; erm[3][2] = 0.0; + + erm[3][3] = 1.0; + + erm[0][3] = x0 - m[0][0]*x0 - m[0][1]*y0 - m[0][2]*z0; + erm[1][3] = y0 - m[1][0]*x0 - m[1][1]*y0 - m[1][2]*z0; + erm[2][3] = z0 - m[2][0]*x0 - m[2][1]*y0 - m[2][2]*z0; + +} + + +void EulerRotation ( PPCAtom A, + int nA, + realtype alpha, + realtype beta, + realtype gamma, + realtype x0, + realtype y0, + realtype z0 ) { +// Euler rotation: 1) about z-axis by angle alpha +// 2) about new y-axis by angle beta +// 3) about new z-axis by angle gamma +// Point (x0,y0,z0) is the center of rotation. +mat33 m; +realtype x,y,z; +int i; + + m[0][0] = 1.0; + GetEulerRotMatrix ( m,alpha,beta,gamma ); + + for (i=0;iTer) && (A[i]->WhatIsSet & ASET_Coordinates)) { + x = A[i]->x - x0; + y = A[i]->y - y0; + z = A[i]->z - z0; + A[i]->x = m[0][0]*x + m[0][1]*y + m[0][2]*z + x0; + A[i]->y = m[1][0]*x + m[1][1]*y + m[1][2]*z + y0; + A[i]->z = m[2][0]*x + m[2][1]*y + m[2][2]*z + z0; + } + } + +} + + +void GetVecRotMatrix ( mat33 & vrm, + realtype alpha, + realtype vx, + realtype vy, + realtype vz ) { +// Calculates the rotation matrix for rotation by angle alpha about +// arbitrary vector directed as (vx,vy,vz) = (vx2-vx1,vy2-vy1,vz2-vz1). +realtype ca,sa, rx,ry,rz, vl; + + ca = cos(alpha); + sa = sin(alpha); + + vl = sqrt ( vx*vx + vy*vy + vz*vz ); + if (vl<=0.0) return; + rx = vx/vl; + ry = vy/vl; + rz = vz/vl; + + vrm[0][0] = rx*rx*(1.0-ca) + ca; + vrm[0][1] = rx*ry*(1.0-ca) - rz*sa; + vrm[0][2] = rx*rz*(1.0-ca) + ry*sa; + + vrm[1][0] = ry*rx*(1.0-ca) + rz*sa; + vrm[1][1] = ry*ry*(1.0-ca) + ca; + vrm[1][2] = ry*rz*(1.0-ca) - rx*sa; + + vrm[2][0] = rz*rx*(1.0-ca) - ry*sa; + vrm[2][1] = rz*ry*(1.0-ca) + rx*sa; + vrm[2][2] = rz*rz*(1.0-ca) + ca; + +} + + +void GetRotParameters ( mat33 & vrm, + realtype & alpha, + realtype & vx, + realtype & vy, + realtype & vz ) { +// Given the rotation matrix vrm, GetRotParameters(..) +// returns the rotation angle alpha and the normalized +// rotation axis vector (vx,vy,vz). +// The rotation angle and vector are determined up to +// their sign (however correlated, so that being substituted +// into GetVecRotMatrix(..) they yield the same rotation +// matrix). +// The function does not check for vrm to be a valid +// rotation matrix. +realtype ca,sa,vl; + ca = (vrm[0][0]+vrm[1][1]+vrm[2][2]-1.0)/2.0; + if (ca<-1.0) ca = -1.0; // does not work if rotation + if (ca>1.0) ca = 1.0; // matrix is correct + sa = sqrt(1.0-ca*ca); + if (sa>0.0) { + alpha = acos(ca); + // coefficient of 2 is corrected by normalization below + vx = (vrm[2][1]-vrm[1][2])/sa; + vy = (vrm[0][2]-vrm[2][0])/sa; + vz = (vrm[1][0]-vrm[0][1])/sa; + // the following code is formally redundant if rotation + // matrix is correct, however it eliminates the round-offs + vl = sqrt(vx*vx+vy*vy+vz*vz); + vx /= vl; + vy /= vl; + vz /= vl; + } else { + // zero rotation, arbitrary axis would do + alpha = 0.0; + vx = 1.0; + vy = 0.0; + vz = 0.0; + } +} + + +void GetVecTMatrix ( mat44 & vrm, + realtype alpha, + realtype vx, + realtype vy, + realtype vz, + realtype x0, + realtype y0, + realtype z0 ) { +// Calculates the rotation-translation matrix for rotation by angle +// alpha about arbitrary vector directed as (vx,vy,vz) = +// (vx2-vx1,vy2-vy1,vz2-vz1). Point (x0,y0,z0) is the center of +// rotation -- actually a point belonging to the rotation axis. +mat33 m; + + GetVecRotMatrix ( m,alpha,vx,vy,vz ); + + vrm[0][0] = m[0][0]; vrm[0][1] = m[0][1]; vrm[0][2] = m[0][2]; + vrm[1][0] = m[1][0]; vrm[1][1] = m[1][1]; vrm[1][2] = m[1][2]; + vrm[2][0] = m[2][0]; vrm[2][1] = m[2][1]; vrm[2][2] = m[2][2]; + vrm[3][0] = 0.0; vrm[3][1] = 0.0; vrm[3][2] = 0.0; + + vrm[3][3] = 1.0; + + vrm[0][3] = x0 - m[0][0]*x0 - m[0][1]*y0 - m[0][2]*z0; + vrm[1][3] = y0 - m[1][0]*x0 - m[1][1]*y0 - m[1][2]*z0; + vrm[2][3] = z0 - m[2][0]*x0 - m[2][1]*y0 - m[2][2]*z0; + +} + + +void VectorRotation ( PPCAtom A, + int nA, + realtype alpha, + realtype vx, + realtype vy, + realtype vz, + realtype x0, + realtype y0, + realtype z0 ) { +// Vector rotation is rotation by angle alpha about arbitrary +// vector directed as (vx,vy,vz) = (vx2-vx1,vy2-vy1,vz2-vz1). +// Point (x0,y0,z0) is the center of rotation -- actually +// a point belonging to the rotation axis. +mat33 m; +realtype x,y,z; +int i; + + GetVecRotMatrix ( m, alpha,vx,vy,vz ); + + for (i=0;iTer) && (A[i]->WhatIsSet & ASET_Coordinates)) { + x = A[i]->x - x0; + y = A[i]->y - y0; + z = A[i]->z - z0; + A[i]->x = m[0][0]*x + m[0][1]*y + m[0][2]*z + x0; + A[i]->y = m[1][0]*x + m[1][1]*y + m[1][2]*z + y0; + A[i]->z = m[2][0]*x + m[2][1]*y + m[2][2]*z + z0; + } + } + +} + + +void GetMassCenter ( PPCAtom A, int nA, + realtype & xmc, realtype & ymc, + realtype & zmc ) { +realtype w,mass; +int i,k; + + xmc = 0.0; + ymc = 0.0; + zmc = 0.0; + mass = 0.0; + + for (i=0;iTer) && (A[i]->WhatIsSet & ASET_Coordinates)) { + k = getElementNo ( A[i]->element ); + if (k>=0) w = MolecWeight[k]; + else w = 1.0; + xmc += w*A[i]->x; + ymc += w*A[i]->y; + zmc += w*A[i]->z; + mass += w; + } + } + + if (mass>0.0) { + xmc /= mass; + ymc /= mass; + zmc /= mass; + } + +} + +int CMMDBCoorManager::BringToUnitCell() { +// brings all chains into 0th unit cell +PCChain chain; +PPCAtom atom; +realtype x0,y0,z0, x,y,z, xf,yf,zf, sx,sy,sz; +realtype dx,dy,dz, d,d0; +int nAtoms; +int i,j,k,n,m,nt, ic,jc,kc, is,js,ks; + + if (!Cryst.areMatrices()) return -1; + + is = 0; // this is only + js = 0; // to depress + ks = 0; // "uninitialized" worning + + Cryst.Frac2Orth ( 0.5,0.5,0.5, x0,y0,z0 ); + + nt = 0; + for (i=0;inChains;j++) { + chain = Model[i]->Chain[j]; + if (chain) { + + x = 0.0; + y = 0.0; + z = 0.0; + m = 0; + for (k=0;knResidues;k++) + if (chain->Residue[k]) { + chain->Residue[k]->GetAtomTable ( atom,nAtoms ); + for (n=0;nTer) { + x += atom[n]->x; + y += atom[n]->y; + z += atom[n]->z; + m++; + } + } + } + x /= m; + y /= m; + z /= m; + + Cryst.Orth2Frac ( x,y,z, xf,yf,zf ); + sx = frac ( xf ); + sy = frac ( yf ); + sz = frac ( zf ); + d0 = MaxReal; + for (ic=-3;ic<3;ic++) + for (jc=-3;jc<3;jc++) + for (kc=-3;kc<3;kc++) { + Cryst.Frac2Orth ( sx+ic,sy+jc,sz+kc, dx,dy,dz ); + dx -= x0; + dy -= y0; + dz -= z0; + d = dx*dx + dy*dy + dz*dz; + if (d1.0e-10) || (fabs(sy)>1.0e-10) + || (fabs(sz)>1.0e-10)) { + nt++; + for (k=0;knResidues;k++) + if (chain->Residue[k]) { + chain->Residue[k]->GetAtomTable ( atom,nAtoms ); + for (n=0;nTer) { + Cryst.Orth2Frac ( atom[n]->x,atom[n]->y, + atom[n]->z, + xf,yf,zf ); + Cryst.Frac2Orth ( xf-sx,yf-sy,zf-sz, + atom[n]->x,atom[n]->y, + atom[n]->z ); + } + } + } + } + + } + } + } + + return nt; // number of converted chains + +} + + +Boolean CMMDBCoorManager::Frac2Orth ( + realtype xfrac, realtype yfrac, realtype zfrac, + realtype & xorth, realtype & yorth, realtype & zorth ) { + return Cryst.Frac2Orth ( xfrac,yfrac,zfrac, xorth,yorth,zorth ); +} + +Boolean CMMDBCoorManager::Orth2Frac ( + realtype xorth, realtype yorth, realtype zorth, + realtype & xfrac, realtype & yfrac, realtype & zfrac ) { + return Cryst.Orth2Frac ( xorth,yorth,zorth, xfrac,yfrac,zfrac ); +} + + +Boolean CMMDBCoorManager::Frac2Orth ( mat44 & F, mat44 & T ) { + return Cryst.Frac2Orth ( F,T ); +} + +Boolean CMMDBCoorManager::Orth2Frac ( mat44 & T, mat44 & F ) { + return Cryst.Orth2Frac ( T,F ); +} + + + +// ------------------------ Contacts ------------------------------- + + +#define CA_CA_Dist2 16.0 + +void CMMDBCoorManager::FindSeqSection ( PCAtom atom, int seqDist, + int & seq1, int & seq2 ) { +PCAtom a; +PCResidue res; +PCChain chain; +realtype x0,y0,z0, x,y,z, dx,dy,dz, d2; +int i1; +Boolean B0,B; + + x = 0.0; + y = 0.0; + z = 0.0; + x0 = 0.0; + y0 = 0.0; + z0 = 0.0; + + res = atom->residue; + if ((!res) || (seqDist<=0)) { + seq1 = MaxInt4; + seq2 = MinInt4; + return; + } + + chain = res->chain; + if (!chain) { + seq1 = MaxInt4; + seq2 = MinInt4; + return; + } + + if (seqDist==1) { + seq1 = res->index; + seq2 = seq1; + return; + } + + a = res->GetAtom ( pstr("CA"),pstr("C"),NULL ); + if (a) { + x0 = a->x; + y0 = a->y; + z0 = a->z; + B0 = True; + } else + B0 = False; + if (B0) { + x = x0; + y = y0; + z = z0; + } + + B = B0; + seq2 = res->index; + i1 = IMin(chain->nResidues,seq2+seqDist)-1; + while (seq2Residue[seq2]) { + a = chain->Residue[seq2]->GetAtom ( pstr("CA"),pstr("C"),NULL ); + if (a && B) { + dx = x-a->x; + dy = y-a->y; + dz = z-a->z; + d2 = dx*dx + dy*dy + dz*dz; + if (d2>CA_CA_Dist2) { + seq2--; + break; + } + } + if (a) { + x = a->x; + y = a->y; + z = a->z; + B = True; + } else + B = False; + } + } + + if (B0) { + x = x0; + y = y0; + z = z0; + } + B = B0; + seq1 = res->index; + i1 = IMax(0,seq1-seqDist+1); + while (seq1>i1) { + seq1--; + if (chain->Residue[seq1]) { + a = chain->Residue[seq1]->GetAtom ( pstr("CA"),pstr("C"),NULL ); + if (a && B) { + dx = x-a->x; + dy = y-a->y; + dz = z-a->z; + d2 = dx*dx + dy*dy + dz*dz; + if (d2>CA_CA_Dist2) { + seq1++; + break; + } + } + if (a) { + x = a->x; + y = a->y; + z = a->z; + B = True; + } else + B = False; + } + } + +} + + +Boolean CMMDBCoorManager::isContact ( PCAtom a1, PCAtom a2, + int seq1, int seq2, + realtype dd, realtype d12, + realtype d22, realtype & d2 ) { +// seq1..seq2 is forbidden region for residue sequence numbers +PCResidue res1,res2; +PCChain chain1,chain2; +realtype dx,dy,dz; + + if (a2->Ter) return False; + + dx = fabs(a2->x-a1->x); + if (dx<=dd) { + dy = fabs(a2->y-a1->y); + if (dy<=dd) { + dz = fabs(a2->z-a1->z); + if (dz<=dd) { + d2 = dx*dx + dy*dy + dz*dz; + if ((d12<=d2) && (d2<=d22)) { + if (seq1<=seq2) { + res1 = a1->residue; + res2 = a2->residue; + if (res1 && res2) { + chain1 = res1->chain; + chain2 = res2->chain; + if (chain1 && chain2) { + if (!strcmp(chain1->chainID,chain2->chainID)) { + if ((seq1<=res2->index) && (res2->index<=seq2)) + return False; + } + } + } + } + return True; + } + } + } + } + + return False; + +} + +Boolean CMMDBCoorManager::isContact ( realtype x, realtype y, + realtype z, PCAtom a2, + realtype dd, realtype d12, + realtype d22, realtype & d2 ) { +realtype dx,dy,dz; + + if (a2->Ter) return False; + + dx = fabs(a2->x-x); + if (dx<=dd) { + dy = fabs(a2->y-y); + if (dy<=dd) { + dz = fabs(a2->z-z); + if (dz<=dd) { + d2 = dx*dx + dy*dy + dz*dz; + if ((d12<=d2) && (d2<=d22)) return True; + } + } + } + + return False; + +} + + +void CMMDBCoorManager::SeekContacts ( PPCAtom AIndex, + int ilen, + int atomNum, + realtype dist1, + realtype dist2, + int seqDist, + RPSContact contact, + int & ncontacts, + int maxlen, + long group ) { +PCContactIndex ContactIndex; +realtype d12,d22,d2; +int i,seq1,seq2; + + if (!AIndex) return; + if (dist2Ter) return; + + ContactIndex = new CContactIndex ( contact,maxlen,ncontacts,ilen ); + + FindSeqSection ( AIndex[atomNum],seqDist,seq1,seq2 ); + + d12 = dist1*dist1; + d22 = dist2*dist2; + + for (i=0;iAddContact ( atomNum,i,sqrt(d2),group ); + } + + ContactIndex->GetIndex ( contact,ncontacts ); + + delete ContactIndex; + +} + + +void CMMDBCoorManager::SeekContacts ( PCAtom A, + PPCAtom AIndex, + int ilen, + realtype dist1, + realtype dist2, + int seqDist, + RPSContact contact, + int & ncontacts, + int maxlen, + long group + ) { +PCContactIndex ContactIndex; +realtype d12,d22,d2; +int i,seq1,seq2; + + if (!AIndex) return; + if (dist2Ter) return; + + ContactIndex = new CContactIndex ( contact,maxlen,ncontacts,ilen ); + + FindSeqSection ( A,seqDist,seq1,seq2 ); + + d12 = dist1*dist1; + d22 = dist2*dist2; + + for (i=0;iAddContact ( -1,i,sqrt(d2),group ); + } + + ContactIndex->GetIndex ( contact,ncontacts ); + + delete ContactIndex; + +} + + +void CMMDBCoorManager::SeekContacts ( PPCAtom AIndex1, + int ilen1, + PPCAtom AIndex2, + int ilen2, + realtype dist1, + realtype dist2, + int seqDist, + RPSContact contact, + int & ncontacts, + int maxlen, + mat44 * TMatrix, + long group, + int bricking, + Boolean doSqrt + ) { +// It is Ok to have NULL pointers in AIndex1 and AIndex2 +PCContactIndex ContactIndex; +PPCAtom A1,A2; +rvector sx0,sy0,sz0; +rvector dx0,dy0,dz0; +realtype d12,d22,d2, eps; +int l1,l2, i,j, nx,ny,nz, dn; +int ix1,ix2, iy1,iy2, iz1,iz2, ix,iy,iz; +int seq1,seq2; +PCBrick B; +Boolean swap,UnitT; + + if ((dist2x; + sy0[i] = AIndex1[i]->y; + sz0[i] = AIndex1[i]->z; + } + // Save original AIndex2 coordinates and modify the index + GetVectorMemory ( dx0,ilen2,0 ); + GetVectorMemory ( dy0,ilen2,0 ); + GetVectorMemory ( dz0,ilen2,0 ); + for (i=0;ix; + dy0[i] = AIndex2[i]->y; + dz0[i] = AIndex2[i]->z; + AIndex2[i]->Transform ( *TMatrix ); + } + } + } + + // choose A2 as the largest atom set convenient for + // bricking (bricking on larger set is more efficient) + if (bricking & BRICK_ON_1) { + A1 = AIndex2; + A2 = AIndex1; + l1 = ilen2; + l2 = ilen1; + swap = True; + } else if (bricking & BRICK_ON_2) { + A1 = AIndex1; + A2 = AIndex2; + l1 = ilen1; + l2 = ilen2; + swap = False; + } else if (ilen1<=ilen2) { + A1 = AIndex1; + A2 = AIndex2; + l1 = ilen1; + l2 = ilen2; + swap = False; + } else { + A1 = AIndex2; + A2 = AIndex1; + l1 = ilen2; + l2 = ilen1; + swap = True; + } + + d12 = dist1*dist1; + d22 = dist2*dist2; + + if (((bricking & BRICK_READY)==0) || (!Brick)) + MakeBricks ( A2,l2,dist2*1.5 ); + + dn = mround(dist2/brick_size)+1; + + if (Brick) + for (i=0;iTer) { + if (UnitT) { + // No transformation -- AIndex1 and AIndex2 are unmodified. + // Calculate the forbidden sequence region + FindSeqSection ( A1[i],seqDist,seq1,seq2 ); + // And the brick location + GetBrickCoor ( A1[i],nx,ny,nz ); + } else { + // AIndex2 and AIndex1 are modified, but the sequence + // distance does not apply to physically different chains + // (meaning that transformation of A2 effectively makes + // a different chain). Use unmodified atom coordinates + // of 1st set for calculating the brick location. + if (swap) GetBrickCoor ( A1[i],nx,ny,nz ); // A1 is AIndex2 + else GetBrickCoor ( sx0[i],sy0[i],sz0[i],nx,ny,nz ); + } + if (nx>=0) { + ix1 = IMax ( 0,nx-dn ); + iy1 = IMax ( 0,ny-dn ); + iz1 = IMax ( 0,nz-dn ); + ix2 = IMin ( nbrick_x,nx+dn+1 ); + iy2 = IMin ( nbrick_y,ny+dn+1 ); + iz2 = IMin ( nbrick_z,nz+dn+1 ); + if (UnitT) { + // AIndex1 unmodified, use it + for (ix=ix1;ixnAtoms;j++) + if (B->Atom[j]!=A1[i]) { + if (isContact(A1[i],B->Atom[j],seq1,seq2, + dist2,d12,d22,d2)) { + if (doSqrt) d2 = sqrt(d2); + if (swap) ContactIndex->AddContact ( + B->id[j],i,d2,group ); + else ContactIndex->AddContact ( + i,B->id[j],d2,group ); + } + } + } + } else if (swap) { + // A1 stands for AIndex2, it is modified and we need to use + // the modified coordinates + for (ix=ix1;ixnAtoms;j++) + if (isContact(A1[i]->x,A1[i]->y,A1[i]->z, + B->Atom[j], dist2,d12,d22,d2)) { + if (doSqrt) d2 = sqrt(d2); + ContactIndex->AddContact ( B->id[j],i,d2,group ); + } + } + } else { + // A1 stands for AIndex1, it may be modified (if AIndex1 + // and AIndex2 overlap) -- use its unmodified coordinates + // instead. + for (ix=ix1;ixnAtoms;j++) + if (isContact(sx0[i],sy0[i],sz0[i], + B->Atom[j],dist2,d12,d22,d2)) { + if (doSqrt) d2 = sqrt(d2); + ContactIndex->AddContact ( i,B->id[j],d2,group ); + } + } + } + } + } + } + + + if (!UnitT) { + // restore original coordinates + for (i=0;ix = sx0[i]; + AIndex1[i]->y = sy0[i]; + AIndex1[i]->z = sz0[i]; + } + for (i=0;ix = dx0[i]; + AIndex2[i]->y = dy0[i]; + AIndex2[i]->z = dz0[i]; + } + FreeVectorMemory ( sx0,0 ); + FreeVectorMemory ( sy0,0 ); + FreeVectorMemory ( sz0,0 ); + FreeVectorMemory ( dx0,0 ); + FreeVectorMemory ( dy0,0 ); + FreeVectorMemory ( dz0,0 ); + } + + ContactIndex->GetIndex ( contact,ncontacts ); + + delete ContactIndex; + +} + + +void CMMDBCoorManager::SeekContacts ( PPCAtom AIndex1, + int ilen1, + PPCAtom AIndex2, + int ilen2, + realtype contDist, + PSContact contact, + int & ncontacts, + int bricking + ) { +// Simplified optimized for speed version: +// - no NULL pointers and Ters in AIndex1 and AIndex2 +// - no checks for identity atoms in AIndex1 and AIndex2 +// - contact must be pre-allocated with at least ilen1*ilen2 elements +// - contact returns square distances +// - ncontacts is always reset +PPCAtom A1,A2; +realtype contDist2, dx,dy,dz, d2; +int l1,l2, i,j, nx,ny,nz, dn; +int ix1,ix2, iy1,iy2, iz1,iz2, ix,iy,iz; +PCBrick B; +Boolean swap; + + // choose A2 as the largest atom set convenient for + // bricking (bricking on larger set is more efficient) + if (bricking & BRICK_ON_1) { + A1 = AIndex2; + A2 = AIndex1; + l1 = ilen2; + l2 = ilen1; + swap = True; + } else if (bricking & BRICK_ON_2) { + A1 = AIndex1; + A2 = AIndex2; + l1 = ilen1; + l2 = ilen2; + swap = False; + } else if (ilen1<=ilen2) { + A1 = AIndex1; + A2 = AIndex2; + l1 = ilen1; + l2 = ilen2; + swap = False; + } else { + A1 = AIndex2; + A2 = AIndex1; + l1 = ilen2; + l2 = ilen1; + swap = True; + } + + contDist2 = contDist*contDist; + + if (((bricking & BRICK_READY)==0) || (!Brick)) + MakeBricks ( A2,l2,contDist*1.5 ); + + ncontacts = 0; + + if (!Brick) return; + + dn = (int)floor(contDist/brick_size)+1; + + if (swap) { + + for (i=0;i=0) { + ix1 = IMax ( 0,nx-dn ); + iy1 = IMax ( 0,ny-dn ); + iz1 = IMax ( 0,nz-dn ); + ix2 = IMin ( nbrick_x,nx+dn+1 ); + iy2 = IMin ( nbrick_y,ny+dn+1 ); + iz2 = IMin ( nbrick_z,nz+dn+1 ); + for (ix=ix1;ixnAtoms;j++) { + dx = A1[i]->x - B->Atom[j]->x; + dy = A1[i]->y - B->Atom[j]->y; + dz = A1[i]->z - B->Atom[j]->z; + d2 = dx*dx + dy*dy + dz*dz; + if (d2<=contDist2) { + contact[ncontacts].id1 = B->id[j]; + contact[ncontacts].id2 = i; + contact[ncontacts].dist = d2; + ncontacts++; + } + } + } + } + } + + } else { + + for (i=0;i=0) { + ix1 = IMax ( 0,nx-dn ); + iy1 = IMax ( 0,ny-dn ); + iz1 = IMax ( 0,nz-dn ); + ix2 = IMin ( nbrick_x,nx+dn+1 ); + iy2 = IMin ( nbrick_y,ny+dn+1 ); + iz2 = IMin ( nbrick_z,nz+dn+1 ); + for (ix=ix1;ixnAtoms;j++) { + dx = A1[i]->x - B->Atom[j]->x; + dy = A1[i]->y - B->Atom[j]->y; + dz = A1[i]->z - B->Atom[j]->z; + d2 = dx*dx + dy*dy + dz*dz; + if (d2<=contDist2) { + contact[ncontacts].id1 = i; + contact[ncontacts].id2 = B->id[j]; + contact[ncontacts].dist = d2; + ncontacts++; + } + } + } + } + } + + } + +} + + +void CMMDBCoorManager::SeekContacts ( PPCAtom AIndex1, + int ilen1, + PPCAtom * AIndex2, + ivector ilen2, + int nStructures, + realtype dist1, + realtype dist2, + PPCMContact & contact, + int bricking + ) { +// It is Ok to have NULL pointers in AIndex1 and AIndex2 +PCMBrick B; +PCAtom A; +realtype d12,d22,d2; +int dn, i,j,k, nx,ny,nz, ix1,iy1,iz1, ix2,iy2,iz2; +int ix,iy,iz; + + if (dist2Ter) { + contact[i] = new CMContact(nStructures); + contact[i]->contactID = i; + // Calculate the brick location + GetMBrickCoor ( A,nx,ny,nz ); + if (nx>=0) { + ix1 = IMax ( 0,nx-dn ); + iy1 = IMax ( 0,ny-dn ); + iz1 = IMax ( 0,nz-dn ); + ix2 = IMin ( nmbrick_x,nx+dn+1 ); + iy2 = IMin ( nmbrick_y,ny+dn+1 ); + iz2 = IMin ( nmbrick_z,nz+dn+1 ); + for (ix=ix1;ixnAtoms[j];k++) + if (B->Atom[j][k]!=A) { + if (isContact(A,B->Atom[j][k], + MaxInt4,MinInt4, + dist2,d12,d22,d2)) + contact[i]->AddContact ( + B->Atom[j][k],j,B->id[j][k] ); + } + } + } + } + } + } + else + for (i=0;i + ((PSContact)data)[j].id1); + lt = (((PSContact)data)[i].id1 < + ((PSContact)data)[j].id1); + break; + case CNSORT_1DEC : gt = (((PSContact)data)[j].id1 > + ((PSContact)data)[i].id1); + lt = (((PSContact)data)[j].id1 < + ((PSContact)data)[i].id1); + break; + case CNSORT_2INC : gt = (((PSContact)data)[i].id2 > + ((PSContact)data)[j].id2); + lt = (((PSContact)data)[i].id2 < + ((PSContact)data)[j].id2); + break; + case CNSORT_2DEC : gt = (((PSContact)data)[j].id2 > + ((PSContact)data)[i].id2); + lt = (((PSContact)data)[j].id2 < + ((PSContact)data)[i].id2); + break; + case CNSORT_DINC : gt = (((PSContact)data)[i].dist > + ((PSContact)data)[j].dist); + lt = (((PSContact)data)[i].dist < + ((PSContact)data)[j].dist); + break; + case CNSORT_DDEC : gt = (((PSContact)data)[j].dist > + ((PSContact)data)[i].dist); + lt = (((PSContact)data)[j].dist < + ((PSContact)data)[i].dist); + break; + } + if (gt) return 1; + if (lt) return -1; + return 0; +} + +void CSortContacts::Swap ( int i, int j ) { + ((PSContact)data)[i].Swap ( ((PSContact)data)[j] ); +} + + +void CSortContacts::Sort ( PSContact contact, int ncontacts, + int sortmode ) { + mode = sortmode; + if (mode!=CNSORT_OFF) + CQuickSort::Sort ( &(contact[0]),ncontacts ); +} + + +void SortContacts ( PSContact contact, int ncontacts, + int sortmode ) { +CSortContacts SC; + if (sortmode!=CNSORT_OFF) + SC.Sort ( contact,ncontacts,sortmode ); +} + + +// ------------------- Stream functions ---------------------- + +void CMMDBCoorManager::write ( RCFile f ) { +byte Version=1; + f.WriteByte ( &Version ); + CMMDBFile::write ( f ); + f.WriteInt ( &CoorIDCode ); + f.WriteReal ( &brick_size ); + f.WriteReal ( &xbrick_0 ); + f.WriteReal ( &ybrick_0 ); + f.WriteReal ( &zbrick_0 ); + f.WriteInt ( &nbrick_x ); + f.WriteInt ( &nbrick_y ); + f.WriteInt ( &nbrick_z ); +} + +void CMMDBCoorManager::read ( RCFile f ) { +byte Version; + f.ReadByte ( &Version ); + CMMDBFile::read ( f ); + f.ReadInt ( &CoorIDCode ); + f.ReadReal ( &brick_size ); + f.ReadReal ( &xbrick_0 ); + f.ReadReal ( &ybrick_0 ); + f.ReadReal ( &zbrick_0 ); + f.ReadInt ( &nbrick_x ); + f.ReadInt ( &nbrick_y ); + f.ReadInt ( &nbrick_z ); +} + + +MakeStreamFunctions(CMMDBCoorManager); + + + + +// =================================================================== + +int SuperposeAtoms ( mat44 & T, PPCAtom A1, int nA, PPCAtom A2, + ivector C ) { +realtype xc1,yc1,zc1, xc2,yc2,zc2, det,B; +rmatrix A,U,V; +rvector W,RV1; +vect3 vc1,vc2; +int i,j,k,i1,i2,nat; + + + // 1. Set unit matrix as "default" return + + for (i=0;i<4;i++) { + for (j=0;j<4;j++) + T[i][j] = 0.0; + T[i][i] = 1.0; + } + + + // 2. Calculate mass centers + + xc1 = 0.0; + yc1 = 0.0; + zc1 = 0.0; + xc2 = 0.0; + yc2 = 0.0; + zc2 = 0.0; + + nat = 0; + if (C) { + + for (i1=0;i1Ter) { + i2 = C[i1]; + if (i2>=0) { + xc1 += A1[i1]->x; + yc1 += A1[i1]->y; + zc1 += A1[i1]->z; + xc2 += A2[i2]->x; + yc2 += A2[i2]->y; + zc2 += A2[i2]->z; + nat++; + } + } + + } else { + + for (i=0;iTer) && (!A2[i]->Ter)) { + xc1 += A1[i]->x; + yc1 += A1[i]->y; + zc1 += A1[i]->z; + xc2 += A2[i]->x; + yc2 += A2[i]->y; + zc2 += A2[i]->z; + nat++; + } + + } + + if (nat>1) { + xc1 /= nat; + yc1 /= nat; + zc1 /= nat; + xc2 /= nat; + yc2 /= nat; + zc2 /= nat; + } else if (nat>0) { + T[0][3] = xc2 - xc1; + T[1][3] = yc2 - yc1; + T[2][3] = zc2 - zc1; + return SPOSEAT_Ok; + } else + return SPOSEAT_NoAtoms; + + + // 3. Calculate the correlation matrix + + GetMatrixMemory ( A,3,3,1,1 ); + + for (i=1;i<=3;i++) + for (j=1;j<=3;j++) + A[i][j] = 0.0; + + if (C) { + + for (i1=0;i1Ter) { + i2 = C[i1]; + if (i2>=0) { + vc1[0] = A1[i1]->x - xc1; + vc1[1] = A1[i1]->y - yc1; + vc1[2] = A1[i1]->z - zc1; + vc2[0] = A2[i2]->x - xc2; + vc2[1] = A2[i2]->y - yc2; + vc2[2] = A2[i2]->z - zc2; + for (i=1;i<=3;i++) + for (j=1;j<=3;j++) + A[i][j] += vc1[j-1]*vc2[i-1]; + } + } + + } else { + + for (k=0;kTer) && (!A2[k]->Ter)) { + vc1[0] = A1[k]->x - xc1; + vc1[1] = A1[k]->y - yc1; + vc1[2] = A1[k]->z - zc1; + vc2[0] = A2[k]->x - xc2; + vc2[1] = A2[k]->y - yc2; + vc2[2] = A2[k]->z - zc2; + for (i=1;i<=3;i++) + for (j=1;j<=3;j++) + A[i][j] += vc1[j-1]*vc2[i-1]; + } + + } + + + // 4. Calculate transformation matrix (to be applied to A1) + + det = A[1][1]*A[2][2]*A[3][3] + + A[1][2]*A[2][3]*A[3][1] + + A[2][1]*A[3][2]*A[1][3] - + A[1][3]*A[2][2]*A[3][1] - + A[1][1]*A[2][3]*A[3][2] - + A[3][3]*A[1][2]*A[2][1]; + + // 4.1 SV-decompose the correlation matrix + + GetMatrixMemory ( U ,3,3,1,1 ); + GetMatrixMemory ( V ,3,3,1,1 ); + GetVectorMemory ( W ,3,1 ); + GetVectorMemory ( RV1,3,1 ); + + SVD ( 3,3,3,A,U,V,W,RV1,True,True,i ); + + if (i!=0) { + FreeVectorMemory ( RV1,1 ); + FreeVectorMemory ( W ,1 ); + FreeMatrixMemory ( V ,3,1,1 ); + FreeMatrixMemory ( U ,3,1,1 ); + FreeMatrixMemory ( A ,3,1,1 ); + return SPOSEAT_SVD_Fail; + } + + // 4.2 Check for parasite inversion and fix it if found + + if (det<=0.0) { + k = 0; + B = MaxReal; + for (j=1;j<=3;j++) + if (W[j]x - A[1]->x; + U[1] = A[0]->y - A[1]->y; + U[2] = A[0]->z - A[1]->z; + + W[0] = A[2]->x - A[1]->x; + W[1] = A[2]->y - A[1]->y; + W[2] = A[2]->z - A[1]->z; + + V[0] = A[3]->x - A[2]->x; + V[1] = A[3]->y - A[2]->y; + V[2] = A[3]->z - A[2]->z; + + a[0] = U[1]*W[2] - W[1]*U[2]; + a[1] = U[2]*W[0] - W[2]*U[0]; + a[2] = U[0]*W[1] - W[0]*U[1]; + + b[0] = V[1]*W[2] - W[1]*V[2]; + b[1] = V[2]*W[0] - W[2]*V[0]; + b[2] = V[0]*W[1] - W[0]*V[1]; + + c[0] = a[1]*b[2] - b[1]*a[2]; + c[1] = a[2]*b[0] - b[2]*a[0]; + c[2] = a[0]*b[1] - b[0]*a[1]; + + Wmag = sqrt(W[0]*W[0]+W[1]*W[1]+W[2]*W[2]); + + S = c[0]*W[0] + c[1]*W[1] + c[2]*W[2]; + T = a[0]*b[0] + a[1]*b[1] + a[2]*b[2]; + T *= Wmag; + + if ((S==0.0) && (T==0.0)) return NO_TORSION; + else return atan2(S,T); + +} + +realtype getPsi ( PPCAtom A ) { +vect3 v1,v2; +realtype l1,l2; + + v1[0] = A[0]->x - A[1]->x; + v1[1] = A[0]->y - A[1]->y; + v1[2] = A[0]->z - A[1]->z; + + v2[0] = A[2]->x - A[1]->x; + v2[1] = A[2]->y - A[1]->y; + v2[2] = A[2]->z - A[1]->z; + + l1 = v1[0]*v1[0] + v1[1]*v1[1] + v1[2]*v1[2]; + if (l1==0.0) l1 = 1.0; + l2 = v2[0]*v2[0] + v2[1]*v2[1] + v2[2]*v2[2]; + if (l2==0.0) l2 = 1.0; + + return acos((v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2])/sqrt(l1*l2)); + +} + diff --git a/mmdb/mmdb_coormngr.h b/mmdb/mmdb_coormngr.h new file mode 100755 index 0000000..3d95d35 --- /dev/null +++ b/mmdb/mmdb_coormngr.h @@ -0,0 +1,951 @@ +// $Id: mmdb_coormngr.h,v 1.29 2012/01/26 17:52:20 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 08.07.08 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : mmdb_coormngr +// ~~~~~~~~~ +// Project : MacroMolecular Data Base (MMDB) +// ~~~~~~~~~ +// **** Classes : CBrick ( space brick ) +// ~~~~~~~~~ CMMDBCoorManager ( MMDB atom coordinate manager ) +// +// (C) E. Krissinel 2000-2008 +// +// ================================================================= +// + +#ifndef __MMDB_CoorMngr__ +#define __MMDB_CoorMngr__ + +#ifndef __MMDB_File__ +#include "mmdb_file.h" +#endif + + + +// =========================== CBrick ============================== + +// bricking control +#define BRICK_ON_1 0x00000001 +#define BRICK_ON_2 0x00000002 +#define BRICK_READY 0x00000004 + + +DefineClass(CBrick); +typedef PPCBrick * PPPCBrick; + +class CBrick { + + public : + int nAtoms; // number of atoms hit into brick + PPCAtom Atom; // pointers to atoms + ivector id; // atom ids (in present realization, these are + // indices of atoms from the bricked array) + + CBrick (); + ~CBrick(); + + void Clear (); + void AddAtom ( PCAtom A, int atomid ); + + protected : + int nAllocAtoms; + void InitBrick(); + +}; + + +// =========================== CMBrick ============================= + +// Bricking multiple structures + +DefineClass(CMBrick); +typedef PPCMBrick * PPPCMBrick; + +class CMBrick { + + public : + ivector nAtoms; // number of atoms in the brick + PPCAtom * Atom; // pointers to atoms + imatrix id; // atom ids (in present realization, these are + // indices of atoms from the bricked array) + + CMBrick ( int nStructures ); + ~CMBrick(); + + void Clear (); + void AddAtom ( PCAtom A, int structNo, int atomid ); + + protected : + ivector nAllocAtoms; + int nStruct; + void InitMBrick ( int nStructures ); + +}; + + + +// ==================== CGenSym ======================== + +DefineClass(CGenSym); +DefineStreamFunctions(CGenSym); + +class CGenSym : public CSymOps { + + friend class CMMDBCoorManager; + + public : + + CGenSym (); + CGenSym ( RPCStream Object ); + ~CGenSym(); + + void FreeMemory(); + + int AddSymOp ( cpstr XYZOperation ); + // the number of just added operation may be obtained as + // Nop = CGenSym::GetNofSymOps()-1 . + + int AddRenChain ( int Nop, const ChainID ch1, const ChainID ch2 ); + + void Copy ( PCSymOps GenSym ); + + void write ( RCFile f ); + void read ( RCFile f ); + + protected : + + PChainID * chID1; // pairs of chains to rename from chID1[n][i] + PChainID * chID2; // to chID2[n][i] for each operation n1, all atoms belonging + // to residues closer than + // +/-(seqDist-1) around that of + // atom AIndex[atomNum], are + // neglected. If chain is broken + // (has a gap) on section + // [-(seqDist-1)..seqDist-1], the + // section of neglection is + // shortened to that gap. + RPSContact contact, // indices of contacting atoms + // [0..ncontacts-1]. contact[i].id1 + // is set to atomNum and + // contact[i].id2 is set to the + // index of 2nd contacting atom + // in vector AIndex + int & ncontacts, // number of contacts found. If + // ncontacts>0 on input, it is + // assumed that new contacts that + // newly found contacts should be + // appended to those already + // existing + int maxlen=0, // if <=0, then vector contact is + // allocated dynamically. If + // contact!=NULL, then it is + // appended with new contacts. + // The application is responsible + // for deallocation of contact + // after use. + // If maxlen>0 then vector contact + // is prohibited of dynamical + // allocation/deallocation. In this + // case, not more than maxlen + // contacts will be returned. + long group=0 // a contact group ID, which will be + // simply stored in contact[i].group + // fields. This ID may be useful + // if contacts are obtained in + // multiple calls of the function + ); + + void SeekContacts ( + PCAtom A, // 1st atom in contact + PPCAtom AIndex, // index of atoms [0..ilen-1] to + // check for contact with 1st atom + int ilen, // length of index + realtype dist1, // minimal contact distance + realtype dist2, // maximal contact distance + int seqDist, // the sequence distance to neglect. + // If seqDist==0, all atoms are + // checked for contact. If + // seqDist==1, the atoms belonging + // to the same residue as atom + // A, are neglected. If seqDist>1, + // all atoms belonging to residues + // closer than +/-(seqDist-1) around + // that of atom A, are neglected. If + // chain is broken (has a gap) on + // section + // [-(seqDist-1)..seqDist-1], the + // section of neglection is + // shortened to that gap. + RPSContact contact, // indices of contacting atoms + // [0..ncontacts-1]. contact[i].id1 + // is set to -1, and contact[i].id2 + // is set to the index of 2nd + // contacting atom in vector AIndex + int & ncontacts, // number of contacts found. If + // ncontacts>0 on input, it is + // assumed that new contacts that + // newly found contacts should be + // appended those already existing + int maxlen=0, // if <=0, then vector contact is + // allocated dynamically. If + // contact!=NULL, then it is + // appended with new contacts. + // The application is responsible + // for deallocation of contact + // after use. + // If maxlen>0 then vector contact + // is prohibited of dynamical + // allocation/deallocation. In this + // case, not more than maxlen + // contacts will be returned. + long group=0 // a contact group ID, which will be + // simply stored in contact[i].group + // fields. This ID may be useful + // if contacts are obtained in + // multiple calls of the function + ); + + void SeekContacts ( + PPCAtom AIndex1, // 1st atom index [0..ilen1-1] + int ilen1, // length of 1st index + PPCAtom AIndex2, // 2nd atom index [0..ilen2-1] to + // check for contact with 1st index + int ilen2, // length of 2nd index + realtype dist1, // minimal contact distance + realtype dist2, // maximal contact distance + int seqDist, // the sequence distance to + // neglect. + // If seqDist==0, all atoms are + // checked for contact. + // If seqDist==1, the atoms + // belonging to the same residue + // are neglected. + // If seqDist>1, all atoms + // belonging to residues closer than + // +/-(seqDist-1) to each other, + // are neglected. If chain is broken + // (has a gap) on section + // [-(seqDist-1)..seqDist-1], the + // section of neglection is + // shortened to that gap. + RPSContact contact, // indices of contacting atoms + // [0..ncontacts-1]. contact[i].id1 + // contains number of atom from 1st + // index, and contact[i].id2 + // contains number of atom from 2nd + // index, contacting with the former + // one + int & ncontacts, // number of contacts found. If + // ncontacts>0 on input, it is + // assumed that newly found + // contacts should be appended to + // those already existing + int maxlen=0, // if <=0, then vector contact is + // allocated dynamically. If + // contact!=NULL, then it is + // appended with new contacts. + // The application is responsible + // for deallocation of contact + // after use. + // If maxlen>0 then vector contact + // is prohibited of dynamical + // allocation/deallocation. In this + // case, not more than maxlen + // contacts will be returned. + mat44 * TMatrix=NULL, // transformation matrix for 2nd + // set of atoms (AIndex2) + long group=0, // a contact group ID, which will + // be stored in contact[i].group + // fields. This ID may be useful + // if contacts are obtained in + // multiple calls of the function + int bricking=0, // bricking control; may be a + // combination of BRICK_ON_1 or + // BRICK_ON_2 with BRICK_READY + Boolean doSqrt=True // if False, then SContact contains + // square distances + ); + + // Simplified optimized for speed version: + // - no NULL pointers and Ters in AIndex1 and AIndex2 + // - no checks for identity atoms in AIndex1 and AIndex2 + // - contact must be pre-allocated with at least ilen1*ilen2 + // elements + // - contact returns square distances + // - ncontacts is always reset + void SeekContacts ( + PPCAtom AIndex1, // 1st atom index [0..ilen1-1] + int ilen1, // length of 1st index + PPCAtom AIndex2, // 2nd atom index [0..ilen2-1] to + // check for contact with 1st index + int ilen2, // length of 2nd index + realtype contDist, // maximal contact distance + PSContact contact, // indices of contacting atoms + // [0..ncontacts-1]. contact[i].id1 + // contains number of atom from 1st + // index, and contact[i].id2 + // contains number of atom from 2nd + // index, contacting with the former + // one. Must be pre-allocated + int & ncontacts, // number of contacts found + int bricking=0 // bricking control; may be a + // combination of BRICK_ON_1 or + // BRICK_ON_2 with BRICK_READY + ); + + void SeekContacts ( + PPCAtom AIndex1, // 1st atom index [0..ilen1-1] + int ilen1, // length of 1st index + PPCAtom * AIndex2, // indexes of atoms to be checked + // for contact with each atom from + // Aindex1; dimension + // [0..nStructures-1][0..ilen2[i]-1] + ivector ilen2, // lengths of indexes AIndex2 + int nStructures, // number of indexes AIndex2 + realtype dist1, // minimal contact distance + realtype dist2, // maximal contact distance + PPCMContact & contact, // resulting contacts, one structure + // per each position in AIndex1. If + // AIndex1[i] is NULL, contact[i] is + // also NULL. "contact" is always + // allocated, no re-use or + // re-allocation is attempted. + int bricking=0 // bricking control; may be + // BRICK_READY if AIndex2 does not + // change + ); + + protected : + + // bricks + realtype brick_size, xbrick_0,ybrick_0,zbrick_0; + int nbrick_x,nbrick_y,nbrick_z; + PPPCBrick * Brick; + + realtype mbrick_size, xmbrick_0,ymbrick_0,zmbrick_0; + int nmbrick_x,nmbrick_y,nmbrick_z; + PPPCMBrick * MBrick; + + // --------------- Stream I/O ----------------------------- + void write ( RCFile f ); + void read ( RCFile f ); + + void InitMMDBCoorManager(); + + void ApplySymTransform ( int SymMatrixNo, PCGenSym GenSym=NULL ); + + void ResetManager (); + + void FindSeqSection ( PCAtom atom, int seqDist, + int & seq1, int & seq2 ); + Boolean isContact ( PCAtom a1, PCAtom a2, + int seq1, int seq2, + realtype dd, realtype d12, + realtype d22, realtype & d2 ); + Boolean isContact ( realtype x, realtype y, + realtype z, PCAtom a2, + realtype dd, realtype d12, + realtype d22, realtype & d2 ); + +}; + + + +// =================================================================== + + + +// GetEulerRotMatrix(..) calculates the Euler rotation matrix +// for rotation: +// 1) about z-axis by angle alpha +// 2) about new y-axis by angle beta +// 3) about new z-axis by angle gamma +extern void GetEulerRotMatrix ( mat33 & erm, realtype alpha, + realtype beta, realtype gamma ); + +// GetEulerTMatrix(..) calculates the Euler rotation-translation +// matrix for rotation: +// 1) about z-axis by angle alpha +// 2) about new y-axis by angle beta +// 3) about new z-axis by angle gamma +// Point (x0,y0,z0) is the center of rotation. +extern void GetEulerTMatrix ( mat44 & erm, realtype alpha, + realtype beta, realtype gamma, + realtype x0, realtype y0, realtype z0 ); + +// Euler rotation: 1) about z-axis by angle alpha +// 2) about new y-axis by angle beta +// 3) about new z-axis by angle gamma +// Point (x0,y0,z0) is the center of rotation. +extern void EulerRotation ( PPCAtom A, int nA, + realtype alpha, realtype beta, realtype gamma, + realtype x0, realtype y0, realtype z0 ); + +// GetVecRotMatrix(..) calculates the rotation matrix for +// rotation by angle alpha about arbitrary vector directed +// as (vx,vy,vz) = (vx2-vx1,vy2-vy1,vz2-vz1). +extern void GetVecRotMatrix ( mat33 & vrm, realtype alpha, + realtype vx, realtype vy, realtype vz ); + + +// Given the rotation matrix vrm, GetRotParameters(..) +// returns the rotation angle alpha and the normalized +// rotation axis vector (vx,vy,vz). +// The rotation angle and vector are determined up to +// their sign (however correlated, so that being substituted +// into GetVecRotMatrix(..) they yield the same rotation +// matrix). +// The function does not check for vrm to be a valid +// rotation matrix. +extern void GetRotParameters ( mat33 & vrm, realtype & alpha, + realtype & vx, realtype & vy, realtype & vz ); + + +// GetVecTMatrix(..) calculates the rotation-translation matrix +// for rotation by angle alpha about arbitrary vector directed as +// (vx,vy,vz) = (vx2-vx1,vy2-vy1,vz2-vz1). Point (x0,y0,z0) is +// the center of rotation -- actually a point belonging to the +// rotation axis. +extern void GetVecTMatrix ( mat44 & vrm, realtype alpha, + realtype vx, realtype vy, realtype vz, + realtype x0, realtype y0, realtype z0 ); + +// Vector rotation is rotation by angle alpha about arbitrary +// vector directed as (vx,vy,vz) = (vx2-vx1,vy2-vy1,vz2-vz1). +// Point (x0,y0,z0) is the center of rotation -- actually +// a point belonging to the rotation axis. +extern void VectorRotation ( PPCAtom A, int nA, realtype alpha, + realtype vx, realtype vy, realtype vz, + realtype x0, realtype y0, realtype z0 ); + +extern void GetMassCenter ( PPCAtom A, int nA, + realtype & xmc, realtype & ymc, realtype & zmc ); + + +#define SPOSEAT_Ok 0 +#define SPOSEAT_NoAtoms 1 +#define SPOSEAT_SVD_Fail 2 + +// Given two sets of atoms, A1 and A2, SuperposeAtoms(...) calculates +// the rotational-translational matrix T such that |T*A1 - A2| is +// minimal in least-square terms. +// If vector C is not given (default), all nA atoms of set A1 are +// considered as corresponding to nA first atoms of set A2, +// A1[i] <-> A2[i], 0<=i A2[C[i]] only for those i that C[i]>=0. +// The default option (C==NULL) is thus identical to C[i]==i, 0<=i +// ~~~~~~~~~ +// **** Project : MacroMolecular Data Base (MMDB) +// ~~~~~~~~~ +// **** Classes : CCrystContainer ( container for cryst. data ) +// ~~~~~~~~~ CNCSMatrix ( non-cryst. symm. matrix class ) +// CTVect ( translational vector class ) +// CMMDBCryst ( MMDB cryst. section class ) +// +// (C) E. Krissinel 2000-2013 +// +// ================================================================= +// + +#ifndef __STRING_H +#include +#endif + +#ifndef __STDLIB_H +#include +#endif + +#ifndef __MATH_H +#include +#endif + +#ifndef __MMDB_Cryst__ +#include "mmdb_cryst.h" +#endif + +#ifndef __MMDB_Defs__ +#include "mmdb_defs.h" +#endif + +#ifndef __MMDB_CIFDefs__ +#include "mmdb_cifdefs.h" +#endif + + +// ============== CCrystContainer ==================== + +PCContainerClass CCrystContainer::MakeContainerClass ( int ClassID ) { + switch (ClassID) { + default : + case ClassID_Template : + return CClassContainer::MakeContainerClass(ClassID); + case ClassID_NCSMatrix : return new CNCSMatrix(); + case ClassID_TVect : return new CTVect (); + } +} + +int CCrystContainer::AddMTRIXLine ( cpstr S ) { +int i,RC; + RC = Error_NCSM_WrongSerial; + for (i=0;iConvertPDBASCII(S); + if (RC==0) break; + if (RC!=Error_NCSM_WrongSerial) break; + } + return RC; +} + +MakeStreamFunctions(CCrystContainer) + + +// ================ CNCSMatrix =================== + +CNCSMatrix::CNCSMatrix() : CContainerClass() { + Init(); +} + +CNCSMatrix::CNCSMatrix ( cpstr S ) : CContainerClass() { + Init(); + ConvertPDBASCII ( S ); +} + +CNCSMatrix::CNCSMatrix ( RPCStream Object ) + : CContainerClass(Object) { + Init(); +} + +CNCSMatrix::~CNCSMatrix() {} + +void CNCSMatrix::Init() { +int i,j; + serNum = -1; + iGiven = -1; + for (i=0;i<3;i++) { + for (j=0;j<3;j++) + m[i][j] = 0.0; + m[i][i] = 1.0; + v[i] = 0.0; + } + WhatIsSet = 0; // nothing is set +} + +Boolean CNCSMatrix::PDBASCIIDump1 ( RCFile f ) { +// makes the ASCII PDB MATRIXn lines if all +// of them were set. +char S[100]; +int i,j; + + if ((WhatIsSet & NCSMSET_All)==NCSMSET_All) + for (i=0;i<3;i++) { + sprintf ( S,"MTRIX%1i %3i",i+1,serNum ); + PadSpaces ( S,80 ); + for (j=0;j<3;j++) + PutRealF ( &(S[10+j*10]),m[i][j],10,6 ); + PutRealF ( &(S[45]),v[i],10,5 ); + if (iGiven) S[59] = '1'; + f.WriteLine ( S ); + } + + return True; // container should use this virtual + +} + +int CNCSMatrix::ConvertPDBASCII ( cpstr S ) { +int sN,iG; +realtype m0,m1,m2,v0; + + if (!(GetInteger(sN,&(S[7]) ,3 ) && + GetReal (m0,&(S[10]),10) && + GetReal (m1,&(S[20]),10) && + GetReal (m2,&(S[30]),10) && + GetReal (v0,&(S[45]),10))) + return Error_NCSM_Unrecognized; + + if (S[59]=='1') iG = 1; + else iG = 0; + + if (WhatIsSet & NCSMSET_All) { + if (sN!=serNum) return Error_NCSM_WrongSerial; + if (iG!=iGiven) return Error_NCSM_UnmatchIG; + } + + if (!strncmp(S,"MTRIX1",6)) { + + if (WhatIsSet & NCSMSET_Matrix1) return Error_NCSM_AlreadySet; + serNum = sN; + iGiven = iG; + m[0][0] = m0; + m[0][1] = m1; + m[0][2] = m2; + v[0] = v0; + WhatIsSet |= NCSMSET_Matrix1; + + } else if (!strncmp(S,"MTRIX2",6)) { + + if (WhatIsSet & NCSMSET_Matrix2) return Error_NCSM_AlreadySet; + serNum = sN; + iGiven = iG; + m[1][0] = m0; + m[1][1] = m1; + m[1][2] = m2; + v[1] = v0; + WhatIsSet |= NCSMSET_Matrix2; + + } else if (!strncmp(S,"MTRIX3",6)) { + + if (WhatIsSet & NCSMSET_Matrix3) return Error_NCSM_AlreadySet; + serNum = sN; + iGiven = iG; + m[2][0] = m0; + m[2][1] = m1; + m[2][2] = m2; + v[2] = v0; + WhatIsSet |= NCSMSET_Matrix3; + + } else + return Error_WrongSection; + + return 0; + +} + +void CNCSMatrix::MakeCIF ( PCMMCIFData CIF, int N ) { +PCMMCIFLoop Loop; +int RC; + RC = CIF->AddLoop ( CIFCAT_STRUCT_NCS_OPER,Loop ); + if ((RC!=CIFRC_Ok) || (N==0)) { + // the category was (re)created, provide tags + Loop->AddLoopTag ( CIFTAG_ID ); + Loop->AddLoopTag ( CIFTAG_MATRIX11 ); + Loop->AddLoopTag ( CIFTAG_MATRIX12 ); + Loop->AddLoopTag ( CIFTAG_MATRIX13 ); + Loop->AddLoopTag ( CIFTAG_VECTOR1 ); + Loop->AddLoopTag ( CIFTAG_MATRIX21 ); + Loop->AddLoopTag ( CIFTAG_MATRIX22 ); + Loop->AddLoopTag ( CIFTAG_MATRIX23 ); + Loop->AddLoopTag ( CIFTAG_VECTOR2 ); + Loop->AddLoopTag ( CIFTAG_MATRIX31 ); + Loop->AddLoopTag ( CIFTAG_MATRIX32 ); + Loop->AddLoopTag ( CIFTAG_MATRIX33 ); + Loop->AddLoopTag ( CIFTAG_VECTOR3 ); + Loop->AddLoopTag ( CIFTAG_CODE ); + } + Loop->AddInteger ( serNum ); + if (WhatIsSet & NCSMSET_Matrix1) { + Loop->AddReal ( m[0][0] ); + Loop->AddReal ( m[0][1] ); + Loop->AddReal ( m[0][2] ); + Loop->AddReal ( v[0] ); + } else { + Loop->AddString ( NULL ); + Loop->AddString ( NULL ); + Loop->AddString ( NULL ); + Loop->AddString ( NULL ); + } + if (WhatIsSet & NCSMSET_Matrix2) { + Loop->AddReal ( m[1][0] ); + Loop->AddReal ( m[1][1] ); + Loop->AddReal ( m[1][2] ); + Loop->AddReal ( v[1] ); + } else { + Loop->AddString ( NULL ); + Loop->AddString ( NULL ); + Loop->AddString ( NULL ); + Loop->AddString ( NULL ); + } + if (WhatIsSet & NCSMSET_Matrix3) { + Loop->AddReal ( m[2][0] ); + Loop->AddReal ( m[2][1] ); + Loop->AddReal ( m[2][2] ); + Loop->AddReal ( v[2] ); + } else { + Loop->AddString ( NULL ); + Loop->AddString ( NULL ); + Loop->AddString ( NULL ); + Loop->AddString ( NULL ); + } + if (iGiven==1) Loop->AddString ( pstr("generated") ); + else Loop->AddNoData ( CIF_NODATA_DOT ); +} + +void CNCSMatrix::GetCIF ( PCMMCIFData CIF, int & Signal ) { +PCMMCIFLoop Loop; +char Code[100]; + + Loop = CIF->GetLoop ( CIFCAT_STRUCT_NCS_OPER ); + if (!Loop) { + Signal = -1; // signal to finish processing of this structure + return; + } + + if (Signal>=Loop->GetLoopLength()) { + Signal = -1; + return; + } + + WhatIsSet = 0; + if (CIFGetInteger(serNum,Loop,CIFTAG_ID,Signal)) return; + if (CIFGetString(Code,Loop,CIFTAG_CODE,Signal,sizeof(Code), + pstr(""))) + iGiven = MinInt4; + else if (!strcasecmp(Code,"generated")) + iGiven = 1; + else + iGiven = MinInt4; + + + if (CIFGetReal(m[0][0],Loop,CIFTAG_MATRIX11,Signal)) return; + if (CIFGetReal(m[0][1],Loop,CIFTAG_MATRIX12,Signal)) return; + if (CIFGetReal(m[0][2],Loop,CIFTAG_MATRIX13,Signal)) return; + if (CIFGetReal(v[0] ,Loop,CIFTAG_VECTOR1 ,Signal)) return; + WhatIsSet |= NCSMSET_Matrix1; + + if (CIFGetReal(m[1][0],Loop,CIFTAG_MATRIX21,Signal)) return; + if (CIFGetReal(m[1][1],Loop,CIFTAG_MATRIX22,Signal)) return; + if (CIFGetReal(m[1][2],Loop,CIFTAG_MATRIX23,Signal)) return; + if (CIFGetReal(v[1] ,Loop,CIFTAG_VECTOR2 ,Signal)) return; + WhatIsSet |= NCSMSET_Matrix2; + + if (CIFGetReal(m[2][0],Loop,CIFTAG_MATRIX31,Signal)) return; + if (CIFGetReal(m[2][1],Loop,CIFTAG_MATRIX32,Signal)) return; + if (CIFGetReal(m[2][2],Loop,CIFTAG_MATRIX33,Signal)) return; + if (CIFGetReal(v[2] ,Loop,CIFTAG_VECTOR3 ,Signal)) return; + WhatIsSet |= NCSMSET_Matrix3; + + Signal++; + +} + +void CNCSMatrix::SetNCSMatrix ( int serialNum, + mat33 & ncs_m, vect3 & ncs_v, + int i_Given ) { +int i,j; + serNum = serialNum; + for (i=0;i<3;i++) { + for (j=0;j<3;j++) + m[i][j] = ncs_m[i][j]; + v[i] = ncs_v[i]; + } + iGiven = i_Given; + WhatIsSet |= NCSMSET_All; +} + +void CNCSMatrix::Copy ( PCContainerClass NCSMatrix ) { +int i,j; + + serNum = PCNCSMatrix(NCSMatrix)->serNum; + iGiven = PCNCSMatrix(NCSMatrix)->iGiven; + + for (i=0;i<3;i++) { + for (j=0;j<3;j++) + m[i][j] = PCNCSMatrix(NCSMatrix)->m[i][j]; + v[i] = PCNCSMatrix(NCSMatrix)->v[i]; + } + + WhatIsSet = PCNCSMatrix(NCSMatrix)->WhatIsSet; + +} + +void CNCSMatrix::write ( RCFile f ) { +int i,j; +byte Version=1; + f.WriteByte ( &Version ); + f.WriteInt ( &serNum ); + f.WriteInt ( &iGiven ); + for (i=0;i<3;i++) { + for (j=0;j<3;j++) + f.WriteReal ( &(m[i][j]) ); + f.WriteReal ( &(v[i]) ); + } + f.WriteWord ( &WhatIsSet ); +} + +void CNCSMatrix::read ( RCFile f ) { +int i,j; +byte Version; + f.ReadByte ( &Version ); + f.ReadInt ( &serNum ); + f.ReadInt ( &iGiven ); + for (i=0;i<3;i++) { + for (j=0;j<3;j++) + f.ReadReal ( &(m[i][j]) ); + f.ReadReal ( &(v[i]) ); + } + f.ReadWord ( &WhatIsSet ); +} + +MakeStreamFunctions(CNCSMatrix) + + + +// ================ CTVect =================== + +CTVect::CTVect() : CContainerClass() { + Init(); +} + +CTVect::CTVect ( cpstr S ) : CContainerClass() { + Init(); + ConvertPDBASCII ( S ); +} + +CTVect::CTVect ( RPCStream Object ) : CContainerClass(Object) { + Init(); +} + +CTVect::~CTVect() { + if (comment) delete[] comment; +} + +void CTVect::Init() { + serNum = -1; + t[0] = 0.0; + t[1] = 0.0; + t[2] = 0.0; + comment = NULL; +} + +void CTVect::PDBASCIIDump ( pstr S, int N ) { +UNUSED_ARGUMENT(N); +// makes the ASCII PDB TVECT line number N + sprintf ( S,"TVECT %3i",serNum ); + PadSpaces ( S,80 ); + PutRealF ( &(S[10]),t[0],10,5 ); + PutRealF ( &(S[20]),t[1],10,5 ); + PutRealF ( &(S[30]),t[2],10,5 ); + if (comment) + strncpy ( &(S[40]),comment,IMin(30,strlen(comment)) ); +} + +int CTVect::ConvertPDBASCII ( cpstr S ) { + GetInteger ( serNum ,&(S[7]) ,3 ); + GetReal ( t[0] ,&(S[10]),10 ); + GetReal ( t[1] ,&(S[20]),10 ); + GetReal ( t[2] ,&(S[30]),10 ); + CreateCopy ( comment,&(S[40]) ); + return 0; + +} + +void CTVect::MakeCIF ( PCMMCIFData CIF, int N ) { +PCMMCIFLoop Loop; +int RC; + RC = CIF->AddLoop ( CIFCAT_DATABASE_PDB_TVECT,Loop ); + if ((RC!=CIFRC_Ok) || (N==0)) { + // the category was (re)created, provide tags + Loop->AddLoopTag ( CIFTAG_ID ); + Loop->AddLoopTag ( CIFTAG_VECTOR1 ); + Loop->AddLoopTag ( CIFTAG_VECTOR2 ); + Loop->AddLoopTag ( CIFTAG_VECTOR3 ); + Loop->AddLoopTag ( CIFTAG_DETAILS ); + } + Loop->AddInteger ( serNum ); + Loop->AddReal ( t[0] ); + Loop->AddReal ( t[1] ); + Loop->AddReal ( t[2] ); + Loop->AddString ( comment ); +} + +void CTVect::GetCIF ( PCMMCIFData CIF, int & Signal ) { +PCMMCIFLoop Loop; + + Loop = CIF->GetLoop ( CIFCAT_DATABASE_PDB_TVECT ); + if (!Loop) { + Signal = -1; // signal to finish processing of this structure + return; + } + + if (Signal>=Loop->GetLoopLength()) { + Signal = -1; + return; + } + + if (CIFGetInteger(serNum,Loop,CIFTAG_ID,Signal)) return; + if (CIFGetReal(t[0],Loop,CIFTAG_VECTOR1,Signal)) return; + if (CIFGetReal(t[1],Loop,CIFTAG_VECTOR2,Signal)) return; + if (CIFGetReal(t[2],Loop,CIFTAG_VECTOR3,Signal)) return; + Loop->GetString ( comment,CIFTAG_DETAILS,Signal,True ); + + Signal++; + +} + + +void CTVect::Copy ( PCContainerClass TVect ) { +int i; + serNum = PCTVect(TVect)->serNum; + for (i=0;i<3;i++) + t[i] = PCTVect(TVect)->t[i]; + CreateCopy ( comment,PCTVect(TVect)->comment ); +} + +void CTVect::write ( RCFile f ) { +int i; +byte Version=1; + f.WriteByte ( &Version ); + f.WriteInt ( &serNum ); + for (i=0;i<3;i++) + f.WriteReal ( &(t[i]) ); + f.CreateWrite ( comment ); +} + +void CTVect::read ( RCFile f ) { +int i; +byte Version; + f.ReadByte ( &Version ); + f.ReadInt ( &serNum ); + for (i=0;i<3;i++) + f.ReadReal ( &(t[i]) ); + f.CreateRead ( comment ); +} + +MakeStreamFunctions(CTVect) + + + +// ===================== CMMDBCryst ======================= + +CMMDBCryst::CMMDBCryst() : CStream() { + Init ( True ); +} + +CMMDBCryst::CMMDBCryst ( RPCStream Object ) : CStream(Object) { + Init ( True ); +} + +void CMMDBCryst::Init ( Boolean fullInit ) { +int i,j,k; + + WhatIsSet = 0; // nothing is set + a = 1.0; + b = 1.0; + c = 1.0; + alpha = 90.0; + beta = 90.0; + gamma = 90.0; + strcpy ( spaceGroup ,"" ); + strcpy ( spaceGroupFix,"" ); + Z = 1; + CellCheck = CCHK_NoCell; + for (i=0;i<3;i++) { + for (j=0;j<3;j++) { + o[i][j] = 0.0; + s[i][j] = 0.0; + for (k=0;k<6;k++) + RR[k][i][j] = 0.0; + } + o[i][i] = 1.0; + s[i][i] = 1.0; + t[i] = 0.0; + u[i] = 0.0; + for (k=0;k<6;k++) + RR[k][i][i] = 1.0; + } + for (i=0;i<4;i++) { + for (j=0;j<4;j++) { + RO [i][j] = 0.0; + RF [i][j] = 0.0; + ROU[i][j] = 0.0; + RFU[i][j] = 0.0; + } + RO [i][i] = 1.0; + RF [i][i] = 1.0; + ROU[i][i] = 1.0; + RFU[i][i] = 1.0; + } + Vol = 0.0; + VolChk = 0.0; + VolErr = 0.0; + as = 1.0; + bs = 1.0; + cs = 1.0; + alphas = 90.0; + betas = 90.0; + gammas = 90.0; + + for (k=0;k<6;k++) + AC[k] = 0.0; + + NCode = 0; + + if (fullInit) { + syminfo_lib = NULL; + ignoreScalei = False; // flag to ignore SCALEi cards + processSG = True; // flag to process space group at file read + fixSpaceGroup = True; // flag to fix space group at file read + } + +} + +CMMDBCryst::~CMMDBCryst() { + FreeMemory(); + if (syminfo_lib) delete[] syminfo_lib; +} + +void CMMDBCryst::FreeMemory() { + NCSMatrix.FreeContainer(); + TVect .FreeContainer(); + SymOps .FreeMemory (); +} + +void CMMDBCryst::Reset() { + FreeMemory(); + Init ( False ); +} + +cpstr rhombohedral[] = { + cpstr("R 3" ), + cpstr("R 3" ), + cpstr("R 3 2"), + cpstr("R 3 2") +}; + +cpstr short_mono[] = { + cpstr("P 2" ), + cpstr("P 21"), + cpstr("C 2" ), + cpstr("A 2" ), + cpstr("B 2" ), + cpstr("I 2" ) +}; + +cpstr special[] = { + cpstr("A1" ), + cpstr("Hall: P 1 (-x,-1/2*y+1/2*z,1/2*y+1/2*z)" ), + cpstr("C1211" ), + cpstr("Hall: C 2y (x+1/4,y+1/4,z)" ), + cpstr("C21" ), + cpstr("Hall: C 2y (x+1/4,y+1/4,z)" ), + cpstr("I1211" ), + cpstr("Hall: C 2y (x+1/4,y+1/4,-x+z-1/4)" ), + cpstr("I21" ), + cpstr("Hall: C 2y (x+1/4,y+1/4,-x+z-1/4)" ), + cpstr("P21212A"), + cpstr("Hall: P 2 2ab (x+1/4,y+1/4,z)" ), + cpstr("F422" ), + cpstr("Hall: I 4 2 (1/2*x+1/2*y,-1/2*x+1/2*y,z)" ), + cpstr("C4212" ), + cpstr("Hall: P 4 2 (1/2*x+1/2*y-1/4,-1/2*x+1/2*y-1/4,z)") +}; + + + +int CMMDBCryst::FixSpaceGroup() { +// This function attempts to clean up the Brookhaven mess in space +// group naming, by checking the space group symbol with cell +// parameters. Returns: +// +// 0 - space group symbol is correct, spaceGroupFix receives +// a copy of spaceGroup +// 1 - space group symbol does not agree with cell parameters, +// and fixed successfully. spaceGroupFix receives +// the appropriate space group symbol +// -1 - space group symbol does not agree with cell parameters, +// however fix is not possible. spaceGroupFix receives +// a copy of spaceGroup +// -2 - any checks are not possible because cell parameters +// are not found, spaceGroupFix receives a copy of +// spaceGroup +// +realtype eps,m1,m2; +SymGroup s; +int i,k; +char c; + + strcpy ( spaceGroupFix,spaceGroup ); + + if ((WhatIsSet & CSET_CellParams)!=CSET_CellParams) return -2; + + eps = 0.01; + + k = -1; + for (i=0;(i<4) && (k<0);i++) + if (!strcmp(spaceGroup,rhombohedral[i])) k = i; + + if (k>=0) { + c = 'N'; + if ((fabs(a-b)<=eps) && (fabs(alpha-90.0)<=eps) && + (fabs(beta-90.0)<=eps) && (fabs(gamma-120.0)<=eps)) + c = 'H'; + else { + m1 = (a+b+c)/3.0; + m2 = (alpha+beta+gamma)/3.0; + if ((fabs(a-m1)<=eps) && (fabs(b-m1)<=eps) && + (fabs(c-m1)<=eps) && + (fabs(alpha-m2)<=eps) && (fabs(beta-m2)<=eps) && + (fabs(gamma-m2)<=eps)) + c = 'R'; + } + if (c!=spaceGroup[0]) { + if (c!='N') { + spaceGroupFix[0] = c; + return 1; + } + return -1; + } + return 0; + } + + for (i=0;(i<6) && (k<0);i++) + if (!strcmp(spaceGroup,short_mono[i])) k = i; + + if (k>=0) { + if ((fabs(alpha-90.0)<=eps) && (fabs(gamma-90.0)<=eps)) { + if (spaceGroup[0]=='B') return -1; + sprintf ( spaceGroupFix,"%c 1 %s 1",spaceGroup[0], + &(spaceGroup[2]) ); + return 1; + } + if ((fabs(alpha-90.0)<=eps) && (fabs(beta-90.0)<=eps)) { + if (spaceGroup[0]=='C') return -1; + sprintf ( spaceGroupFix,"%c 1 1 %s",spaceGroup[0], + &(spaceGroup[2]) ); + return 1; + } + return -1; + } + + i = 0; + k = 0; + while (spaceGroup[i]) { + if (spaceGroup[i]!=' ') s[k++] = spaceGroup[i]; + i++; + } + s[k] = char(0); + + k = -1; + for (i=0;(i<16) && (k<0);i+=2) + if (!strcmp(s,special[i])) k = i; + + if (k>=0) { + strcpy ( spaceGroupFix,special[k+1] ); + return 1; + } + + return 0; + +} + +int CMMDBCryst::ConvertPDBString ( pstr PDBString ) { +// Interprets the ASCII PDB line and fills the corresponding fields. +// Returns zero if the line was converted, otherwise returns a +// non-negative value of Error_XXXX. +// PDBString must be not shorter than 81 characters. +int RC; +PCNCSMatrix ncsMatrix; +PCTVect tVect; + + // pad input line with spaces, if necessary + PadSpaces ( PDBString,80 ); + + if (!strncmp(PDBString,"CRYST",5)) { + // Here we check for "CRYST" and not for "CRYST1" keyword. + // As seems, people tend to not differentiating them. + if (GetReal(a,&(PDBString[6]) ,9) && + GetReal(b,&(PDBString[15]),9) && + GetReal(c,&(PDBString[24]),9)) + WhatIsSet |= CSET_CellParams1; + + if (GetReal(alpha,&(PDBString[33]),7) && + GetReal(beta ,&(PDBString[40]),7) && + GetReal(gamma,&(PDBString[47]),7)) + WhatIsSet |= CSET_CellParams2; + + GetString ( spaceGroup,&(PDBString[55]),11 ); + CutSpaces ( spaceGroup,SCUTKEY_BEGEND ); + if (fixSpaceGroup) FixSpaceGroup(); + else strcpy ( spaceGroupFix,spaceGroup ); + if (spaceGroupFix[0] && processSG) { + if (SymOps.SetGroup(spaceGroupFix,syminfo_lib)==SYMOP_Ok) + WhatIsSet |= CSET_SpaceGroup; + } + + if (GetInteger(Z,&(PDBString[66]),4)) + WhatIsSet |= CSET_ZValue; + + WhatIsSet &= 0xFBFF; + + if ((a*b*c*alpha*beta*gamma==0.0) || + ((a==1.0) && (b==1.0) && (c==1.0) && + (alpha==90.0) && (beta==90.0) && (gamma==90.0) && + (!strcmp(spaceGroup,"P 1")))) { + WhatIsSet &= ~(CSET_CellParams1 | CSET_CellParams2 | + CSET_SpaceGroup); + WhatIsSet |= CSET_DummyCell; + } + + } else if (!strncmp(PDBString,"ORIGX1",6)) { + + if (GetReal(o[0][0],&(PDBString[10]),10) && + GetReal(o[0][1],&(PDBString[20]),10) && + GetReal(o[0][2],&(PDBString[30]),10) && + GetReal(t[0] ,&(PDBString[45]),10)) + WhatIsSet |= CSET_OrigMatrix1; + + } else if (!strncmp(PDBString,"ORIGX2",6)) { + + if (GetReal(o[1][0],&(PDBString[10]),10) && + GetReal(o[1][1],&(PDBString[20]),10) && + GetReal(o[1][2],&(PDBString[30]),10) && + GetReal(t[1] ,&(PDBString[45]),10)) + WhatIsSet |= CSET_OrigMatrix2; + + } else if (!strncmp(PDBString,"ORIGX3",6)) { + + if (GetReal(o[2][0],&(PDBString[10]),10) && + GetReal(o[2][1],&(PDBString[20]),10) && + GetReal(o[2][2],&(PDBString[30]),10) && + GetReal(t[2] ,&(PDBString[45]),10)) + WhatIsSet |= CSET_OrigMatrix3; + + } else if (!strncmp(PDBString,"SCALE1",6)) { + + if (GetReal(s[0][0],&(PDBString[10]),10) && + GetReal(s[0][1],&(PDBString[20]),10) && + GetReal(s[0][2],&(PDBString[30]),10) && + GetReal(u[0] ,&(PDBString[45]),10)) + WhatIsSet |= CSET_ScaleMatrix1; + WhatIsSet &= 0xFBFF; + CellCheck |= CCHK_Unchecked; + + } else if (!strncmp(PDBString,"SCALE2",6)) { + + if (GetReal(s[1][0],&(PDBString[10]),10) && + GetReal(s[1][1],&(PDBString[20]),10) && + GetReal(s[1][2],&(PDBString[30]),10) && + GetReal(u[1] ,&(PDBString[45]),10)) + WhatIsSet |= CSET_ScaleMatrix2; + WhatIsSet &= 0xFBFF; + CellCheck |= CCHK_Unchecked; + + } else if (!strncmp(PDBString,"SCALE3",6)) { + + if (GetReal(s[2][0],&(PDBString[10]),10) && + GetReal(s[2][1],&(PDBString[20]),10) && + GetReal(s[2][2],&(PDBString[30]),10) && + GetReal(u[2] ,&(PDBString[45]),10)) + WhatIsSet |= CSET_ScaleMatrix3; + WhatIsSet &= 0xFBFF; + CellCheck |= CCHK_Unchecked; + + } else if (!strncmp(PDBString,"MTRIX",5)) { + + RC = NCSMatrix.AddMTRIXLine ( PDBString ); + if (RC==Error_NCSM_WrongSerial) { + ncsMatrix = new CNCSMatrix(); + RC = ncsMatrix->ConvertPDBASCII ( PDBString ); + if (RC==0) NCSMatrix.AddData ( ncsMatrix ); + else delete ncsMatrix; + } + return RC; + + } else if (!strncmp(PDBString,"TVECT ",6)) { + + tVect = new CTVect(); + RC = tVect->ConvertPDBASCII(PDBString); + if (RC==0) TVect.AddData ( tVect ); + else delete tVect; + return RC; + + } else + return Error_WrongSection; + + return 0; + +} + +void CMMDBCryst::PDBASCIIDump ( RCFile f ) { +int i,j; +char S[100]; + + if (WhatIsSet & (CSET_CrystCard | CSET_DummyCell)) { + strcpy ( S,"CRYST1" ); + PadSpaces ( S,80 ); + if (WhatIsSet & CSET_CellParams1) { + PutRealF ( &(S[6 ]),a,9,3 ); + PutRealF ( &(S[15]),b,9,3 ); + PutRealF ( &(S[24]),c,9,3 ); + } + if (WhatIsSet & CSET_CellParams2) { + PutRealF ( &(S[33]),alpha,7,2 ); + PutRealF ( &(S[40]),beta ,7,2 ); + PutRealF ( &(S[47]),gamma,7,2 ); + } + if ((WhatIsSet & CSET_SpaceGroup) || (spaceGroup[0])) + strncpy ( &(S[55]),spaceGroup,IMin(11,strlen(spaceGroup)) ); + if (WhatIsSet & CSET_ZValue) + PutInteger ( &(S[66]),Z,4 ); + f.WriteLine ( S ); + } + + if ((WhatIsSet & CSET_OrigMatrix)==CSET_OrigMatrix) + for (i=0;i<3;i++) { + sprintf ( S,"ORIGX%1i",i+1); + PadSpaces ( S,80 ); + for (j=0;j<3;j++) + PutRealF ( &(S[10+j*10]),o[i][j],10,6 ); + PutRealF ( &(S[45]),t[i],10,5 ); + f.WriteLine ( S ); + } + + if ((WhatIsSet & CSET_ScaleMatrix)==CSET_ScaleMatrix) + for (i=0;i<3;i++) { + sprintf ( S,"SCALE%1i",i+1); + PadSpaces ( S,80 ); + for (j=0;j<3;j++) + PutRealF ( &(S[10+j*10]),s[i][j],10,6 ); + PutRealF ( &(S[45]),u[i],10,5 ); + f.WriteLine ( S ); + } + + NCSMatrix.PDBASCIIDump ( f ); + TVect .PDBASCIIDump ( f ); + +} + + +int CMMDBCryst::GetCIF ( PCMMCIFData CIF ) { +PCMMCIFStruct Struct; +int RC; + + WhatIsSet = 0; + + Struct = CIF->GetStructure ( CIFCAT_CELL ); + + if (Struct) { + + RC = CIFGetReal ( a,Struct,CIFTAG_LENGTH_A ); + if (!RC) RC = CIFGetReal ( b,Struct,CIFTAG_LENGTH_B ); + if (!RC) RC = CIFGetReal ( c,Struct,CIFTAG_LENGTH_C ); + if (RC==Error_UnrecognizedReal) return RC; + if (!RC) WhatIsSet |= CSET_CellParams1; + + RC = CIFGetReal ( alpha,Struct,CIFTAG_ANGLE_ALPHA ); + if (!RC) RC = CIFGetReal ( beta,Struct,CIFTAG_ANGLE_BETA ); + if (!RC) RC = CIFGetReal ( gamma,Struct,CIFTAG_ANGLE_GAMMA ); + if (RC==Error_UnrecognizedReal) return RC; + if (!RC) WhatIsSet |= CSET_CellParams2; + + RC = CIFGetInteger ( Z,Struct,CIFTAG_Z_PDB ); + if (RC==Error_UnrecognizedReal) return RC; + if (!RC) WhatIsSet |= CSET_ZValue; + + } + + Struct = CIF->GetStructure ( CIFCAT_SYMMETRY ); + if (Struct) { + CIFGetString ( spaceGroup,Struct,CIFTAG_SPACE_GROUP_NAME_H_M, + sizeof(spaceGroup),pstr("") ); + CutSpaces ( spaceGroup,SCUTKEY_BEGEND ); + if (fixSpaceGroup) FixSpaceGroup(); + else strcpy ( spaceGroupFix,spaceGroup ); + /* + if (fixSpaceGroup) { + if (!strcasecmp(spaceGroup,"P 21")) + strcpy ( spaceGroup,"P 1 21 1" ); + else if (!strcasecmp(spaceGroup,"C 2")) + strcpy ( spaceGroup,"C 1 2 1" ); + } + */ + if (spaceGroupFix[0] && processSG) { + if (SymOps.SetGroup(spaceGroupFix,syminfo_lib)==SYMOP_Ok) + WhatIsSet |= CSET_SpaceGroup; + } + } + + if ((a*b*c*alpha*beta*gamma==0.0) || + ((a==1.0) && (b==1.0) && (c==1.0) && + (alpha==90.0) && (beta==90.0) && (gamma==90.0) && + (!strcmp(spaceGroup,"P 1")))) { + WhatIsSet &= ~(CSET_CellParams1 | CSET_CellParams2 | + CSET_SpaceGroup); + WhatIsSet |= CSET_DummyCell; + } + + Struct = CIF->GetStructure ( CIFCAT_DATABASE_PDB_MATRIX ); + if (Struct) { + RC = CIFGetReal ( o[0][0],Struct,CIFTAG_ORIGX11 ); + if (!RC) RC = CIFGetReal ( o[0][1],Struct,CIFTAG_ORIGX12 ); + if (!RC) RC = CIFGetReal ( o[0][2],Struct,CIFTAG_ORIGX13 ); + if (!RC) RC = CIFGetReal ( o[1][0],Struct,CIFTAG_ORIGX21 ); + if (!RC) RC = CIFGetReal ( o[1][1],Struct,CIFTAG_ORIGX22 ); + if (!RC) RC = CIFGetReal ( o[1][2],Struct,CIFTAG_ORIGX23 ); + if (!RC) RC = CIFGetReal ( o[2][0],Struct,CIFTAG_ORIGX31 ); + if (!RC) RC = CIFGetReal ( o[2][1],Struct,CIFTAG_ORIGX32 ); + if (!RC) RC = CIFGetReal ( o[2][2],Struct,CIFTAG_ORIGX33 ); + if (!RC) RC = CIFGetReal ( t[0] ,Struct,CIFTAG_ORIGX_VECTOR1 ); + if (!RC) RC = CIFGetReal ( t[1] ,Struct,CIFTAG_ORIGX_VECTOR2 ); + if (!RC) RC = CIFGetReal ( t[2] ,Struct,CIFTAG_ORIGX_VECTOR3 ); + if (RC) return RC; + WhatIsSet |= CSET_OrigMatrix; + } + + Struct = CIF->GetStructure ( CIFCAT_ATOM_SITES ); + if (Struct) { + RC = CIFGetReal ( s[0][0],Struct,CIFTAG_FRACT_TRANSF_MATRIX11 ); + if (!RC) + RC = CIFGetReal(s[0][1],Struct,CIFTAG_FRACT_TRANSF_MATRIX12); + if (!RC) + RC = CIFGetReal(s[0][2],Struct,CIFTAG_FRACT_TRANSF_MATRIX13); + if (!RC) + RC = CIFGetReal(s[1][0],Struct,CIFTAG_FRACT_TRANSF_MATRIX21); + if (!RC) + RC = CIFGetReal(s[1][1],Struct,CIFTAG_FRACT_TRANSF_MATRIX22); + if (!RC) + RC = CIFGetReal(s[1][2],Struct,CIFTAG_FRACT_TRANSF_MATRIX23); + if (!RC) + RC = CIFGetReal(s[2][0],Struct,CIFTAG_FRACT_TRANSF_MATRIX31); + if (!RC) + RC = CIFGetReal(s[2][1],Struct,CIFTAG_FRACT_TRANSF_MATRIX32); + if (!RC) + RC = CIFGetReal(s[2][2],Struct,CIFTAG_FRACT_TRANSF_MATRIX33); + if (!RC) + RC = CIFGetReal(u[0] ,Struct,CIFTAG_FRACT_TRANSF_VECTOR1 ); + if (!RC) + RC = CIFGetReal(u[1] ,Struct,CIFTAG_FRACT_TRANSF_VECTOR2 ); + if (!RC) + RC = CIFGetReal(u[2] ,Struct,CIFTAG_FRACT_TRANSF_VECTOR3 ); + if (RC) return RC; + WhatIsSet |= CSET_ScaleMatrix; + } + + RC = NCSMatrix.GetCIF(CIF,ClassID_NCSMatrix); + if (RC) return RC; + + RC = TVect.GetCIF(CIF,ClassID_TVect); + return RC; + +} + +void CMMDBCryst::MakeCIF ( PCMMCIFData CIF ) { +PCMMCIFStruct Struct; +char S[200]; + + if (WhatIsSet & (CSET_CellParams1 | CSET_DummyCell)) { + CIF->AddStructure ( CIFCAT_CELL,Struct ); + Struct->PutReal ( a,CIFTAG_LENGTH_A,8 ); + Struct->PutReal ( b,CIFTAG_LENGTH_B,8 ); + Struct->PutReal ( c,CIFTAG_LENGTH_C,8 ); + } + + if (WhatIsSet & (CSET_CellParams2 | CSET_DummyCell)) { + CIF->AddStructure ( CIFCAT_CELL,Struct ); + Struct->PutReal ( alpha,CIFTAG_ANGLE_ALPHA,8 ); + Struct->PutReal ( beta ,CIFTAG_ANGLE_BETA, 8 ); + Struct->PutReal ( gamma,CIFTAG_ANGLE_GAMMA,8 ); + } + + if ((WhatIsSet & (CSET_SpaceGroup | CSET_DummyCell)) || + (spaceGroup[0])) + CIF->PutString ( strcpy_cs(S,spaceGroup),CIFCAT_SYMMETRY, + CIFTAG_SPACE_GROUP_NAME_H_M ); + + if (WhatIsSet & (CSET_ZValue | CSET_DummyCell)) + CIF->PutInteger ( Z,CIFCAT_CELL,CIFTAG_Z_PDB ); + + + if ((WhatIsSet & CSET_OrigMatrix)==CSET_OrigMatrix) { + CIF->AddStructure ( CIFCAT_DATABASE_PDB_MATRIX,Struct ); + Struct->PutReal ( o[0][0],CIFTAG_ORIGX11 ,8 ); + Struct->PutReal ( o[0][1],CIFTAG_ORIGX12 ,8 ); + Struct->PutReal ( o[0][2],CIFTAG_ORIGX13 ,8 ); + Struct->PutReal ( o[1][0],CIFTAG_ORIGX21 ,8 ); + Struct->PutReal ( o[1][1],CIFTAG_ORIGX22 ,8 ); + Struct->PutReal ( o[1][2],CIFTAG_ORIGX23 ,8 ); + Struct->PutReal ( o[2][0],CIFTAG_ORIGX31 ,8 ); + Struct->PutReal ( o[2][1],CIFTAG_ORIGX32 ,8 ); + Struct->PutReal ( o[2][2],CIFTAG_ORIGX33 ,8 ); + Struct->PutReal ( t[0] ,CIFTAG_ORIGX_VECTOR1,8 ); + Struct->PutReal ( t[1] ,CIFTAG_ORIGX_VECTOR2,8 ); + Struct->PutReal ( t[2] ,CIFTAG_ORIGX_VECTOR3,8 ); + } + + if ((WhatIsSet & CSET_ScaleMatrix)==CSET_ScaleMatrix) { + CIF->AddStructure ( CIFCAT_ATOM_SITES,Struct ); + Struct->PutReal ( s[0][0],CIFTAG_FRACT_TRANSF_MATRIX11,8 ); + Struct->PutReal ( s[0][1],CIFTAG_FRACT_TRANSF_MATRIX12,8 ); + Struct->PutReal ( s[0][2],CIFTAG_FRACT_TRANSF_MATRIX13,8 ); + Struct->PutReal ( s[1][0],CIFTAG_FRACT_TRANSF_MATRIX21,8 ); + Struct->PutReal ( s[1][1],CIFTAG_FRACT_TRANSF_MATRIX22,8 ); + Struct->PutReal ( s[1][2],CIFTAG_FRACT_TRANSF_MATRIX23,8 ); + Struct->PutReal ( s[2][0],CIFTAG_FRACT_TRANSF_MATRIX31,8 ); + Struct->PutReal ( s[2][1],CIFTAG_FRACT_TRANSF_MATRIX32,8 ); + Struct->PutReal ( s[2][2],CIFTAG_FRACT_TRANSF_MATRIX33,8 ); + Struct->PutReal ( u[0] ,CIFTAG_FRACT_TRANSF_VECTOR1 ,8 ); + Struct->PutReal ( u[1] ,CIFTAG_FRACT_TRANSF_VECTOR2 ,8 ); + Struct->PutReal ( u[2] ,CIFTAG_FRACT_TRANSF_VECTOR3 ,8 ); + } + + NCSMatrix.MakeCIF ( CIF ); + TVect .MakeCIF ( CIF ); + +} + + + +cpstr OrthCode[6] = { + cpstr("A/X0, C*/Z0"), // (standard brookhaven) + cpstr("B/X0, A*/Z0"), + cpstr("C/X0, B*/Z0"), + cpstr("HEX A+B/X0, C*/Z0"), + cpstr("A*/X0, C/Z0 (rollett)"), + cpstr("A/X0, B*/Y0") +}; + +cpstr getOrthCodeName ( int NCode ) { + if ((NCode>0) && (NCode<=6)) return OrthCode[NCode-1]; + return cpstr("CUSTOM"); +} + +void CMMDBCryst::CalcCoordTransforms() { +realtype rChk1,rChk2,Fac; +int i,j,k; + + WhatIsSet &= ~CSET_Transforms; // clear the flag + + if ((WhatIsSet & CSET_CellParams)==CSET_CellParams) { + // The 'cryst1' card was supplied. Calculate + // standard orthogonalizations. + + CalcOrthMatrices(); + if (NCode<0) NCode = 0; + + for (i=0;i<3;i++) { + for (j=0;j<3;j++) + RO[i][j] = RR[NCode][i][j]; + RO[i][3] = 0.0; + RO[3][i] = 0.0; + } + RO[3][3] = 1.0; + Mat4Inverse ( RO,RF ); + + WhatIsSet |= CSET_Transforms; + + if (ignoreScalei) + CellCheck = CCHK_Ok; + else if ((WhatIsSet & CSET_ScaleMatrix)==CSET_ScaleMatrix) { + // All 'scalei' cards were supplied. Calculate + // rotation and translation matrices and check + // if they are in consistence with the cell. + + for (i=0;i<3;i++) { + for (j=0;j<3;j++) + RF[i][j] = s[i][j]; + RF[i][3] = u[i]; + RF[3][i] = 0.0; + } + RF[3][3] = 1.0; + Mat4Inverse ( RF,RO ); + + // Find orthogonalisation type + VolChk = RO[0][0]*(RO[1][1]*RO[2][2] - RO[1][2]*RO[2][1]) + + RO[0][1]*(RO[1][2]*RO[2][0] - RO[1][0]*RO[2][2]) + + RO[0][2]*(RO[1][0]*RO[2][1] - RO[1][1]*RO[2][0]); + + CellCheck = CCHK_Ok; + if (Vol>0.0) { + VolErr = fabs(VolChk-Vol)/Vol; + if (VolErr>0.02) CellCheck |= CCHK_Error; + else if (VolErr>0.1) CellCheck |= CCHK_Disagreement; + } else + CellCheck |= CCHK_NoCell; + + // try to find NCode + NCode = -1; + for (k=0;(k<6) && (NCode<0);k++) { + NCode = k; + for (i=0;i<3;i++) + for (j=0;j<3;j++) { + rChk1 = RO[i][j] + RR[k][i][j]; + rChk2 = RO[i][j] - RR[k][i][j]; + if (fabs(rChk1)>=0.1) { + if (fabs(rChk2/rChk1)>0.01) + NCode = -1; + } + } + } + + // Correct inaccuracy of SCALEi input due to FORMAT, + // replace RF,RO with RR[NCode][][] if possible. + + if (NCode>=0) { + for (i=0;i<3;i++) + for (j=0;j<3;j++) + RO[i][j] = RR[NCode][i][j]; + Mat4Inverse ( RO,RF ); + } else + CellCheck |= CCHK_NoOrthCode; + + if ((u[0]!=0.0) || (u[1]!=0.0) || (u[2]!=0.0)) + CellCheck |= CCHK_Translations; + + } + + // Generate ROU and RFU for AnisoU stuff + RFU[3][3] = 1.0; + for (i=0;i<3;i++) { + Fac = sqrt(RF[i][0]*RF[i][0] + RF[i][1]*RF[i][1] + + RF[i][2]*RF[i][2]); + RFU[i][0] = RF[i][0]/Fac; + RFU[i][1] = RF[i][1]/Fac; + RFU[i][2] = RF[i][2]/Fac; + RFU[i][3] = 0.0; + RFU[3][i] = 0.0; + } + RFU[3][3] = 1.0; + Mat4Inverse ( RFU,ROU ); + + } else + CellCheck |= CCHK_NoCell; + +} + + +void CMMDBCryst::RWBROOKReadPrintout() { +int i,j; + + if ((WhatIsSet & CSET_CellParams)==CSET_CellParams) { + printf ( " MATRICES DERIVED FROM CRYST1" + " CARD IN COORDINATE FILE\n\n\n" + " RF " + " RO\n\n" ); + for (i=0;i<4;i++) { + printf ( " " ); + for (j=0;j<4;j++) + printf ( "%8.3f",RF[i][j] ); + printf ( " " ); + for (j=0;j<4;j++) + printf ( "%8.3f",RO[i][j] ); + printf ( "\n" ); + } + printf ( "\n" ); + } else + printf ( "\n $WARNING: NO CRYST CARDS READ$\n" ); + + if ((WhatIsSet & CSET_ScaleMatrix)!=CSET_ScaleMatrix) + printf ( "\n $WARNING: NO SCALE CARDS READ$\n" ); + +} + + +void CMMDBCryst::CalcOrthMatrices() { +// Calculates matrices for standard orthogonalizations +// and the cell volume. +// The matrices are stored in array RR +realtype Conv,Alph,Bet,Gamm,Sum,V; +realtype sinA,cosA,sinB,cosB,sinG,cosG; +realtype sinAS,cosAS,sinBS,cosBS,sinGS,cosGS; +int i,j,k; + + if ((WhatIsSet & CSET_CellParams)!=CSET_CellParams) return; + + Conv = Pi/180.0; + + Alph = alpha*Conv; + Bet = beta *Conv; + Gamm = gamma*Conv; + + Sum = (Alph+Bet+Gamm)*0.5; + + V = sqrt(sin(Sum-Alph)*sin(Sum-Bet)*sin(Sum-Gamm)*sin(Sum)); + + Vol = 2.0*a*b*c*V; + + // Precaution measure for erratic use of the library + if ((fabs(Alph)<1.0e-6) || (fabs(Bet)<1.0e-6) || + (fabs(Gamm)<1.0e-6)) { + as = 0.0; + bs = 0.0; + cs = 0.0; + alphas = 0.0; + betas = 0.0; + gammas = 0.0; + for (k=0;k<6;k++) { + AC[k] = 0.0; + for (i=0;i<3;i++) { + for (j=0;j<3;j++) + RR[k][i][j] = 0.0; + RR[k][i][i] = 1.0; + } + } + return; + } + + sinA = sin(Alph); + cosA = cos(Alph); + sinB = sin(Bet); + cosB = cos(Bet); + sinG = sin(Gamm); + cosG = cos(Gamm); + + cosAS = (cosG*cosB-cosA) / (sinB*sinG); + sinAS = sqrt(1.0-cosAS*cosAS); + cosBS = (cosA*cosG-cosB) / (sinA*sinG); + sinBS = sqrt(1.0-cosBS*cosBS); + cosGS = (cosA*cosB-cosG) / (sinA*sinB); + sinGS = sqrt(1.0-cosGS*cosGS); + + as = b*c*sinA/Vol; + bs = c*a*sinB/Vol; + cs = a*b*sinG/Vol; + alphas = atan2(sinAS,cosAS)/Conv; + betas = atan2(sinBS,cosBS)/Conv; + gammas = atan2(sinGS,cosGS)/Conv; + +// ---- Set useful things for calculating dstar + + AC[0] = as*as; + AC[1] = bs*bs; + AC[2] = cs*cs; + AC[3] = 2.0*bs*cs*cosAS; + AC[4] = 2.0*cs*as*cosBS; + AC[5] = 2.0*as*bs*cosGS; + +// ---- Zero matrices + + for (k=0;k<6;k++) + for (i=0;i<3;i++) + for (j=0;j<3;j++) + RR[k][i][j] = 0.0; + +// ---- Calculate matrices + +// ---- XO along a Zo along c* + + RR[0][0][0] = a; + RR[0][0][1] = b*cosG; + RR[0][0][2] = c*cosB; + RR[0][1][1] = b*sinG; + RR[0][1][2] = -c*sinB*cosAS; + RR[0][2][2] = c*sinB*sinAS; + + // ---- XO along b Zo along a* + + RR[1][0][0] = a*cosG; + RR[1][0][1] = b; + RR[1][0][2] = c*cosA; + RR[1][1][0] = -a*sinG*cosBS; + RR[1][1][2] = c*sinA; + RR[1][2][0] = a*sinG*sinBS; + +// ---- XO along c Zo along b* + + RR[2][0][0] = a*cosB; + RR[2][0][1] = b*cosA; + RR[2][0][2] = c; + RR[2][1][0] = a*sinB; + RR[2][1][1] = -b*sinA*cosGS; + RR[2][2][1] = b*sinA*sinGS; + +// ---- trigonal only - XO along a+b YO alon a-b Zo along c* + + RR[3][0][0] = a/2.0; + RR[3][0][1] = a/2.0; + RR[3][1][0] = -a*sinG; + RR[3][1][1] = a*sinG; + RR[3][2][2] = c; + +// ---- XO along a*, ZO along c + + RR[4][0][0] = a*sinB*sinGS; + RR[4][1][0] = -a*sinB*cosGS; + RR[4][1][1] = b*sinA; + RR[4][2][0] = a*cosB; + RR[4][2][1] = b*cosA; + RR[4][2][2] = c; + +// ---- Grr*! to Gerard Bricogne - his setting for P1 in SKEW. +// XO along a, Y0 along b* + + RR[5][0][0] = a; + RR[5][0][1] = b*cosG; + RR[5][0][2] = c*cosB; + RR[5][1][1] = b*sinG*sinAS; + RR[5][2][1] = -b*sinG*cosAS; + RR[5][2][2] = c*sinB; + +} + + +Boolean CMMDBCryst::areMatrices() { +// returns True if the orthogonal-to-fractional and +// fractional-to-orthogonal matrices are defined + return (WhatIsSet & CSET_Transforms)!=0x0000; +} + + +Boolean CMMDBCryst::Frac2Orth ( + realtype x, realtype y, realtype z, + realtype & xx, realtype & yy, realtype & zz ) { + if (areMatrices()) { + xx = RO[0][0]*x + RO[0][1]*y + RO[0][2]*z + RO[0][3]; + yy = RO[1][0]*x + RO[1][1]*y + RO[1][2]*z + RO[1][3]; + zz = RO[2][0]*x + RO[2][1]*y + RO[2][2]*z + RO[2][3]; + return True; + } else { + xx = x; + yy = y; + zz = z; + return False; + } +} + +Boolean CMMDBCryst::Orth2Frac ( + realtype x, realtype y, realtype z, + realtype & xx, realtype & yy, realtype & zz ) { + if (areMatrices()) { + xx = RF[0][0]*x + RF[0][1]*y + RF[0][2]*z + RF[0][3]; + yy = RF[1][0]*x + RF[1][1]*y + RF[1][2]*z + RF[1][3]; + zz = RF[2][0]*x + RF[2][1]*y + RF[2][2]*z + RF[2][3]; + return True; + } else { + xx = x; + yy = y; + zz = z; + return False; + } +} + + +Boolean CMMDBCryst::Frac2Orth ( mat44 & F, mat44 & T ) { +mat44 A; + if (areMatrices()) { + Mat4Mult ( A,F,RF ); + Mat4Mult ( T,RO,A ); + return True; + } else { + Mat4Init ( T ); + return False; + } +} + + +Boolean CMMDBCryst::Orth2Frac ( mat44 & T, mat44 & F ) { +mat44 A; + if (areMatrices()) { + Mat4Mult ( A,T,RO ); + Mat4Mult ( F,RF,A ); + return True; + } else { + Mat4Init ( F ); + return False; + } +} + + +int CMMDBCryst::GetNumberOfSymOps() { + return SymOps.GetNofSymOps(); +} + +pstr CMMDBCryst::GetSymOp ( int Nop ) { + return SymOps.GetSymOp ( Nop ); +} + + +int CMMDBCryst::GetTMatrix ( mat44 & TMatrix, int Nop, + int cellshift_a, int cellshift_b, + int cellshift_c, PCSymOps symOpers ) { +// +// GetTMatrix(..) calculates and returns the coordinate transformation +// matrix, which converts orthogonal coordinates according to the +// symmetry operation Nop and places them into unit cell shifted by +// cellshift_a a's, cellshift_b b's and cellshift_c c's. +// +// Return 0 means everything's fine, +// 1 there's no symmetry operation Nop defined +// 2 fractionalizing/orthogonalizing matrices were not +// calculated +// 3 cell parameters were not set up. +// +mat44 fm; +int i,j,k; + + if (cellshift_a<=-MaxInt4) { + k = GetFractMatrix ( fm,Nop,0,0,0,symOpers ); + fm[0][3] = frac(fm[0][3]); + fm[1][3] = frac(fm[1][3]); + fm[2][3] = frac(fm[2][3]); + } else + k = GetFractMatrix ( fm,Nop,cellshift_a,cellshift_b,cellshift_c, + symOpers ); + + if (k) { + Mat4Init ( TMatrix ); + return k; + } + + // transformation back to orthogonal coordinates + for (i=0;i<3;i++) { + for (j=0;j<4;j++) { + TMatrix[i][j] = 0.0; + for (k=0;k<3;k++) + TMatrix[i][j] += RO[i][k]*fm[k][j]; + } + TMatrix[i][3] += RO[i][3]; + } + + TMatrix[3][0] = 0.0; + TMatrix[3][1] = 0.0; + TMatrix[3][2] = 0.0; + TMatrix[3][3] = 1.0; + + return 0; + +} + + +int CMMDBCryst::GetUCTMatrix ( mat44 & TMatrix, int Nop, + realtype x, realtype y, realtype z, + int cellshift_a, int cellshift_b, + int cellshift_c, PCSymOps symOpers ) { +// +// GetUCTMatrix(..) calculates and returns the coordinate +// transformation matrix, which converts orthogonal coordinates +// according to the symmetry operation Nop. Translation part of +// the matrix is being chosen such that point (x,y,z) has least +// distance to the center of primary (333) unit cell, and then +// it is shifted by cellshift_a a's, cellshift_b b's and +// cellshift_c c's. +// +// Return 0 means everything's fine, +// 1 there's no symmetry operation Nop defined +// 2 fractionalizing/orthogonalizing matrices were not +// calculated +// 3 cell parameters were not set up. +// +mat44 fm,tm; +vect3 ft; +realtype x0,y0,z0, dx,dy,dz, d,d0; +int i,j,k, ic,jc,kc; + + k = GetFractMatrix ( fm,Nop,0,0,0,symOpers ); + if (k) { + Mat4Init ( TMatrix ); + return k; + } + + fm[0][3] = frac(fm[0][3]) + cellshift_a; + fm[1][3] = frac(fm[1][3]) + cellshift_b; + fm[2][3] = frac(fm[2][3]) + cellshift_c; + + Frac2Orth ( cellshift_a+0.5,cellshift_b+0.5,cellshift_c+0.5, + x0,y0,z0 ); + + // transformation back to orthogonal coordinates + + for (i=0;i<3;i++) + for (j=0;j<3;j++) { + tm[i][j] = 0.0; + for (k=0;k<3;k++) + tm[i][j] += RO[i][k]*fm[k][j]; + } + tm[3][0] = 0.0; + tm[3][1] = 0.0; + tm[3][2] = 0.0; + tm[3][3] = 1.0; + + d0 = MaxReal; + for (ic=-3;ic<3;ic++) + for (jc=-3;jc<3;jc++) + for (kc=-3;kc<3;kc++) { + ft[0] = fm[0][3] + ic; + ft[1] = fm[1][3] + jc; + ft[2] = fm[2][3] + kc; + for (i=0;i<3;i++) { + tm[i][3] = 0.0; + for (k=0;k<3;k++) + tm[i][3] += RO[i][k]*ft[k]; + tm[i][3] += RO[i][3]; + } + dx = tm[0][0]*x + tm[0][1]*y + tm[0][2]*z + tm[0][3] - x0; + dy = tm[1][0]*x + tm[1][1]*y + tm[1][2]*z + tm[1][3] - y0; + dz = tm[2][0]*x + tm[2][1]*y + tm[2][2]*z + tm[2][3] - z0; + d = dx*dx + dy*dy + dz*dz; + if (dGetTMatrix ( tm,Nop ); + else k = SymOps.GetTMatrix ( tm,Nop ); + if (!k) { + if (!areMatrices()) k = 2; + if (!isCellParameters()) k = 3; + } else + k = 1; + + if (k) { + Mat4Init ( TMatrix ); + return k; + } + + // transformation to fractional coordinates + symmetry operation + for (i=0;i<3;i++) { + for (j=0;j<4;j++) { + TMatrix[i][j] = 0.0; + for (k=0;k<3;k++) + TMatrix[i][j] += tm[i][k]*RF[k][j]; + } + TMatrix[i][3] += tm[i][3]; // symmetry operation shift + } + + // cell shift + TMatrix[0][3] += cellshift_a; + TMatrix[1][3] += cellshift_b; + TMatrix[2][3] += cellshift_c; + + TMatrix[3][0] = 0.0; + TMatrix[3][1] = 0.0; + TMatrix[3][2] = 0.0; + TMatrix[3][3] = 1.0; + + return 0; + +} + +int CMMDBCryst::GetSymOpMatrix ( mat44 & TMatrix, int Nop ) { +// +// GetSymOpMatrix(..) returns the transformation matrix for +// Nop-th symmetry operator in the space group +// +// Return 0 means everything's fine, +// 1 there's no symmetry operation Nop defined +// 2 fractionalizing/orthogonalizing matrices were not +// calculated +// 3 cell parameters were not set up. +// + return SymOps.GetTMatrix ( TMatrix,Nop ); +} + + +Boolean CMMDBCryst::Cryst2Orth ( rvector U ) { +mat33 A,AT,Tmp,TmpMat; +realtype BB; +int i,j,k; + + if (areMatrices()) { + + Tmp[0][0] = U[0]; + Tmp[1][1] = U[1]; + Tmp[2][2] = U[2]; + Tmp[0][1] = U[3]; + Tmp[1][0] = U[3]; + Tmp[0][2] = U[4]; + Tmp[2][0] = U[4]; + Tmp[1][2] = U[5]; + Tmp[2][1] = U[5]; + + for (i=0;i<3;i++) + for (j=0;j<3;j++) { + A [j][i] = ROU[j][i]; + AT[i][j] = ROU[j][i]; + } + + // TmpMat = Tmp*AT + for (i=0;i<3;i++) + for (j=0;j<3;j++) { + BB = 0.0; + for (k=0;k<3;k++) + BB += Tmp[i][k]*AT[k][j]; + TmpMat[i][j] = BB; + } + + // Tmp = A*TmpMat + for (i=0;i<3;i++) + for (j=0;j<3;j++) { + BB = 0.0; + for (k=0;k<3;k++) + BB += A[i][k]*TmpMat[k][j]; + Tmp[i][j] = BB; + } + + U[0] = Tmp[0][0]; + U[1] = Tmp[1][1]; + U[2] = Tmp[2][2]; + U[3] = Tmp[0][1]; + U[4] = Tmp[0][2]; + U[5] = Tmp[1][2]; + + return True; + + } + + return False; + +} + + +Boolean CMMDBCryst::Orth2Cryst ( rvector U ) { +mat33 A,AT,Tmp,TmpMat; +realtype BB; +int i,j,k; + + if (areMatrices()) { + + Tmp[0][0] = U[0]; + Tmp[1][1] = U[1]; + Tmp[2][2] = U[2]; + Tmp[0][1] = U[3]; + Tmp[1][0] = U[3]; + Tmp[0][2] = U[4]; + Tmp[2][0] = U[4]; + Tmp[1][2] = U[5]; + Tmp[2][1] = U[5]; + + for (i=0;i<3;i++) + for (j=0;j<3;j++) { + A [j][i] = RFU[j][i]; + AT[i][j] = RFU[j][i]; + } + + // TmpMat = Tmp*AT + for (i=0;i<3;i++) + for (j=0;j<3;j++) { + BB = 0.0; + for (k=0;k<3;k++) + BB += Tmp[i][k]*AT[k][j]; + TmpMat[i][j] = BB; + } + + // Tmp = A*TmpMat + for (i=0;i<3;i++) + for (j=0;j<3;j++) { + BB = 0.0; + for (k=0;k<3;k++) + BB += A[i][k]*TmpMat[k][j]; + Tmp[i][j] = BB; + } + + U[0] = Tmp[0][0]; + U[1] = Tmp[1][1]; + U[2] = Tmp[2][2]; + U[3] = Tmp[0][1]; + U[4] = Tmp[0][2]; + U[5] = Tmp[1][2]; + + return True; + + } + + return False; + +} + + +void CMMDBCryst::SetCell ( realtype cell_a, + realtype cell_b, + realtype cell_c, + realtype cell_alpha, + realtype cell_beta, + realtype cell_gamma, + int OrthCode ) { +// this function should be used for changing the cell parameters +int i,j; + + if ((cell_a>0.0) && (cell_b>0.0) && (cell_c>0.0) && + (cell_alpha!=0.0) && (cell_beta!=0.0) && (cell_gamma!=0.0)) { + + if (OrthCode>0) NCode = OrthCode-1; + else NCode = 0; + + a = cell_a; + b = cell_b; + c = cell_c; + alpha = cell_alpha; + beta = cell_beta; + gamma = cell_gamma; + + WhatIsSet |= CSET_CellParams; + + // calculate matrices + + for (i=0;i<4;i++) { + for (j=0;j<4;j++) { + RO [i][j] = 0.0; + RF [i][j] = 0.0; + ROU[i][j] = 0.0; + RFU[i][j] = 0.0; + } + RO [i][i] = 1.0; + RF [i][i] = 1.0; + ROU[i][i] = 1.0; + RFU[i][i] = 1.0; + } + + CalcCoordTransforms(); + + if (!(CellCheck & CCHK_NoOrthCode)) { + for (i=0;i<3;i++) { + for (j=0;j<3;j++) + RO[i][j] = RR[NCode][i][j]; + RO[i][3] = 0.0; + RO[3][i] = 0.0; + } + RO[3][3] = 1.0; + Mat4Inverse ( RO,RF ); + } + + WhatIsSet |= CSET_Transforms; + + } else + + WhatIsSet &= ~(CSET_CellParams | CSET_Transforms); + +} + +void CMMDBCryst::SetSyminfoLib ( cpstr syminfoLib ) { + CreateCopy ( syminfo_lib,syminfoLib ); +} + +pstr CMMDBCryst::GetSyminfoLib() { + return syminfo_lib; +} + +int CMMDBCryst::SetSpaceGroup ( cpstr spGroup ) { +// This function does not attempt to fix the space group +int RC,l; + RC = SYMOP_UnknownSpaceGroup; + WhatIsSet &= ~CSET_SpaceGroup; + if (spGroup) { + if (spGroup[0]) { + l = IMin ( strlen(spGroup),sizeof(spaceGroup)-1 ); + strcpy_ncss ( spaceGroup,spGroup,l ); + strcpy ( spaceGroupFix,spaceGroup ); + if (spaceGroup[0]) { + RC = SymOps.SetGroup ( spaceGroup,syminfo_lib ); + // RC = SymOps.SetGroup ( spGroup,syminfo_lib ); + // strncpy ( spaceGroup,spGroup,l ); + // spaceGroup[l] = char(0); + if (RC==SYMOP_Ok) WhatIsSet |= CSET_SpaceGroup; + } + } + } + return RC; +} + + +void CMMDBCryst::PutCell ( realtype cell_a, + realtype cell_b, + realtype cell_c, + realtype cell_alpha, + realtype cell_beta, + realtype cell_gamma, + int OrthCode ) { +// this function should be used for setting the cell parameters +int i,j; + + if ((cell_a!=0.0) || (OrthCode>0)) { + a = cell_a; + b = cell_b; + c = cell_c; + alpha = cell_alpha; + beta = cell_beta; + gamma = cell_gamma; + WhatIsSet |= CSET_CellParams; + } + + if (OrthCode>0) { + + // calculate matrices + + NCode = OrthCode-1; + CalcOrthMatrices(); + + for (i=0;i<3;i++) { + for (j=0;j<3;j++) + RO[i][j] = RR[NCode][i][j]; + RO[i][3] = 0.0; + RO[3][i] = 0.0; + } + RO[3][3] = 1.0; + + Mat4Inverse ( RO,RF ); + + WhatIsSet |= CSET_Transforms; + + } else + WhatIsSet &= ~CSET_Transforms; + + for (i=0;i<3;i++) { + for (j=0;j<3;j++) + s[i][j] = RF[i][j]; + u[i] = RF[i][3]; + } + + WhatIsSet |= CSET_ScaleMatrix; + +} + + +Boolean CMMDBCryst::isScaleMatrix() { + return ((WhatIsSet & CSET_ScaleMatrix)==CSET_ScaleMatrix); +} + +Boolean CMMDBCryst::isCellParameters() { + return ((WhatIsSet & CSET_CellParams)==CSET_CellParams); +} + +Boolean CMMDBCryst::isNCSMatrix() { + return (NCSMatrix.Length()>0); +} + +int CMMDBCryst::GetNumberOfNCSMatrices() { + return NCSMatrix.Length(); +} + +int CMMDBCryst::GetNumberOfNCSMates() { +// Returns the number of NCS mates not given in the file (iGiven==0) +int i,l,iG; +PCNCSMatrix NCSM; + iG = 0; + l = NCSMatrix.Length(); + for (i=0;iiGiven) iG++; + } + } + return iG; +} + +Boolean CMMDBCryst::GetNCSMatrix ( int NCSMatrixNo, + mat33 & ncs_m, vect3 & ncs_v ) { +int i,j; +PCNCSMatrix NCSM; + NCSM = PCNCSMatrix(NCSMatrix.GetContainerClass(NCSMatrixNo)); + if (NCSM) { + for (i=0;i<3;i++) { + for (j=0;j<3;j++) + ncs_m[i][j] = NCSM->m[i][j]; + ncs_v[i] = NCSM->v[i]; + } + return True; + } + return False; +} + +Boolean CMMDBCryst::GetNCSMatrix ( int NCSMatrixNo, + mat44 & ncs_m, int & iGiven ) { +int i,j; +PCNCSMatrix NCSM; + NCSM = PCNCSMatrix(NCSMatrix.GetContainerClass(NCSMatrixNo)); + if (NCSM) { + for (i=0;i<3;i++) { + for (j=0;j<3;j++) + ncs_m[i][j] = NCSM->m[i][j]; + ncs_m[i][3] = NCSM->v[i]; + } + ncs_m[3][0] = 0.0; + ncs_m[3][1] = 0.0; + ncs_m[3][2] = 0.0; + ncs_m[3][3] = 1.0; + iGiven = NCSM->iGiven; + return True; + } else { + for (i=0;i<4;i++) { + for (j=0;j<4;j++) + ncs_m[i][j] = 0.0; + ncs_m[i][i] = 1.0; + } + return False; + } +} + +int CMMDBCryst::AddNCSMatrix ( mat33 & ncs_m, vect3 & ncs_v, + int iGiven ) { +PCNCSMatrix ncsMatrix; + ncsMatrix = new CNCSMatrix(); + ncsMatrix->SetNCSMatrix ( NCSMatrix.Length()+1,ncs_m,ncs_v, + iGiven ); + NCSMatrix.AddData ( ncsMatrix ); + return ncsMatrix->serNum; +} + +void CMMDBCryst::GetRCell ( realtype & cell_as, + realtype & cell_bs, + realtype & cell_cs, + realtype & cell_alphas, + realtype & cell_betas, + realtype & cell_gammas, + realtype & vols ) { + cell_as = as; + cell_bs = bs; + cell_cs = cs; + cell_alphas = alphas; + cell_betas = betas; + cell_gammas = gammas; + if (Vol!=0.0) vols = 1.0/Vol; + else vols = 0.0; +} + +void CMMDBCryst::GetCell ( realtype & cell_a, + realtype & cell_b, + realtype & cell_c, + realtype & cell_alpha, + realtype & cell_beta, + realtype & cell_gamma, + realtype & vol ) { + if (WhatIsSet & CSET_CellParams) { + cell_a = a; + cell_b = b; + cell_c = c; + cell_alpha = alpha; + cell_beta = beta; + cell_gamma = gamma; + vol = Vol; + } else { + cell_a = 0.0; + cell_b = 0.0; + cell_c = 0.0; + cell_alpha = 0.0; + cell_beta = 0.0; + cell_gamma = 0.0; + vol = 0.0; + } +} + +pstr CMMDBCryst::GetSpaceGroup() { + if (WhatIsSet & CSET_SpaceGroup) return spaceGroup; + else return NULL; +} + +pstr CMMDBCryst::GetSpaceGroupFix() { + if (WhatIsSet & CSET_SpaceGroup) return spaceGroupFix; + else return NULL; +} + + +void CMMDBCryst::Copy ( PCMMDBCryst Cryst ) { +int i,j,k; + + if (Cryst) { + + a = Cryst->a; + b = Cryst->b; + c = Cryst->c; + alpha = Cryst->alpha; + beta = Cryst->beta; + gamma = Cryst->gamma; + + for (i=0;i<4;i++) + for (j=0;j<4;j++) { + RO [i][j] = Cryst->RO [i][j]; + RF [i][j] = Cryst->RF [i][j]; + ROU[i][j] = Cryst->ROU[i][j]; + RFU[i][j] = Cryst->RFU[i][j]; + } + + for (i=0;i<3;i++) { + for (j=0;j<3;j++) { + o[i][j] = Cryst->o[i][j]; + s[i][j] = Cryst->s[i][j]; + for (k=0;k<6;k++) + RR[k][i][j] = Cryst->RR[k][i][j]; + } + t[i] = Cryst->t[i]; + u[i] = Cryst->u[i]; + } + + Vol = Cryst->Vol; + NCode = Cryst->NCode; + Z = Cryst->Z; + CellCheck = Cryst->CellCheck; + WhatIsSet = Cryst->WhatIsSet; + strcpy ( spaceGroup ,Cryst->spaceGroup ); + strcpy ( spaceGroupFix,Cryst->spaceGroupFix ); + + NCSMatrix.Copy ( &(Cryst->NCSMatrix) ); + TVect .Copy ( &(Cryst->TVect) ); + SymOps .Copy ( &(Cryst->SymOps) ); + + as = Cryst->as; + bs = Cryst->bs; + cs = Cryst->cs; + alphas = Cryst->alphas; + betas = Cryst->betas; + gammas = Cryst->betas; + VolChk = Cryst->VolChk; + VolErr = Cryst->VolErr; + + for (k=0;k<6;k++) + AC[k] = Cryst->AC[k]; + + } else { + + NCSMatrix.FreeContainer(); + TVect .FreeContainer(); + WhatIsSet = 0; + + } + +} + + +void CMMDBCryst::write ( RCFile f ) { +int i,j,k; +byte Version=3; + + f.WriteByte ( &Version ); + f.WriteWord ( &WhatIsSet ); + f.WriteReal ( &a ); + f.WriteReal ( &b ); + f.WriteReal ( &c ); + f.WriteReal ( &alpha ); + f.WriteReal ( &beta ); + f.WriteReal ( &gamma ); + f.WriteWord ( &CellCheck ); + f.WriteBool ( &ignoreScalei ); + for (i=0;i<4;i++) + for (j=0;j<4;j++) { + f.WriteReal ( &(RO [i][j]) ); + f.WriteReal ( &(RF [i][j]) ); + f.WriteReal ( &(ROU[i][j]) ); + f.WriteReal ( &(RFU[i][j]) ); + } + for (i=0;i<3;i++) { + for (j=0;j<3;j++) { + f.WriteReal ( &(o[i][j]) ); + f.WriteReal ( &(s[i][j]) ); + for (k=0;k<6;k++) + f.WriteReal ( &(RR[k][i][j]) ); + } + f.WriteReal ( &(t[i]) ); + f.WriteReal ( &(u[i]) ); + } + f.WriteReal ( &Vol ); + f.WriteReal ( &VolChk ); + f.WriteReal ( &VolErr ); + f.WriteInt ( &NCode ); + f.WriteInt ( &Z ); + f.WriteTerLine ( spaceGroup ,False ); + f.WriteTerLine ( spaceGroupFix,False ); + + for (i=0;i<6;i++) + f.WriteReal ( &(AC[6]) ); + f.WriteReal ( &as ); + f.WriteReal ( &bs ); + f.WriteReal ( &cs ); + f.WriteReal ( &alphas ); + f.WriteReal ( &betas ); + f.WriteReal ( &gammas ); + + NCSMatrix.write ( f ); + TVect .write ( f ); + SymOps .write ( f ); + +} + +void CMMDBCryst::read ( RCFile f ) { +int i,j,k; +byte Version; + + f.ReadByte ( &Version ); + f.ReadWord ( &WhatIsSet ); + f.ReadReal ( &a ); + f.ReadReal ( &b ); + f.ReadReal ( &c ); + f.ReadReal ( &alpha ); + f.ReadReal ( &beta ); + f.ReadReal ( &gamma ); + f.ReadWord ( &CellCheck ); + if (Version>2) + f.ReadBool ( &ignoreScalei ); + else ignoreScalei = False; + for (i=0;i<4;i++) + for (j=0;j<4;j++) { + f.ReadReal ( &(RO [i][j]) ); + f.ReadReal ( &(RF [i][j]) ); + f.ReadReal ( &(ROU[i][j]) ); + f.ReadReal ( &(RFU[i][j]) ); + } + for (i=0;i<3;i++) { + for (j=0;j<3;j++) { + f.ReadReal ( &(o[i][j]) ); + f.ReadReal ( &(s[i][j]) ); + for (k=0;k<6;k++) + f.ReadReal ( &(RR[k][i][j]) ); + } + f.ReadReal ( &(t[i]) ); + f.ReadReal ( &(u[i]) ); + } + f.ReadReal ( &Vol ); + f.ReadReal ( &VolChk ); + f.ReadReal ( &VolErr ); + f.ReadInt ( &NCode ); + f.ReadInt ( &Z ); + f.ReadTerLine ( spaceGroup,False ); + if (Version>1) + f.ReadTerLine ( spaceGroupFix,False ); + else strcpy ( spaceGroupFix,spaceGroup ); + + for (i=0;i<6;i++) + f.ReadReal ( &(AC[6]) ); + f.ReadReal ( &as ); + f.ReadReal ( &bs ); + f.ReadReal ( &cs ); + f.ReadReal ( &alphas ); + f.ReadReal ( &betas ); + f.ReadReal ( &gammas ); + + NCSMatrix.read ( f ); + TVect .read ( f ); + SymOps .read ( f ); + +} + + +MakeStreamFunctions(CMMDBCryst) + + +// =================================================================== + + +void TestCryst() { +// reads from 'in.cryst', writes into +// 'out.cryst' and 'abin.cryst' +CFile f; +char S[81]; +PCMMDBCryst Cryst; + + Cryst = new CMMDBCryst(); + + f.assign ( pstr("in.cryst"),True ); + if (f.reset()) { + while (!f.FileEnd()) { + f.ReadLine ( S,sizeof(S) ); + Cryst->ConvertPDBString ( S ); + } + f.shut(); + } else { + printf ( " Can't open input file 'in.chain' \n" ); + delete Cryst; + return; + } + + f.assign ( pstr("out.cryst"),True ); + if (f.rewrite()) { + Cryst->PDBASCIIDump ( f ); + f.shut(); + } else { + printf ( " Can't open output file 'out.cryst' \n" ); + delete Cryst; + return; + } + + + f.assign ( pstr("mmdb.cryst.bin"),False ); + if (f.rewrite()) { + Cryst->write ( f ); + f.shut(); + } else { + printf ( " Can't open binary cryst file for writing.\n" ); + delete Cryst; + return; + } + + delete Cryst; + printf ( " Cryst deleted.\n" ); + + Cryst = new CMMDBCryst(); + if (f.reset()) { + Cryst->read ( f ); + f.shut(); + } else { + printf ( " Can't open binary cryst file for reading.\n" ); + delete Cryst; + return; + } + + f.assign ( pstr("abin.cryst"),True ); + if (f.rewrite()) { + Cryst->PDBASCIIDump ( f ); + f.shut(); + } else + printf ( " Can't open output file 'abin.cryst' \n" ); + + delete Cryst; + +} diff --git a/mmdb/mmdb_cryst.h b/mmdb/mmdb_cryst.h new file mode 100755 index 0000000..f6ddc26 --- /dev/null +++ b/mmdb/mmdb_cryst.h @@ -0,0 +1,462 @@ +// $Id: mmdb_cryst.h,v 1.24 2012/01/26 17:52:20 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 06.02.13 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : MMDB_Cryst +// ~~~~~~~~~ +// **** Project : MacroMolecular Data Base (MMDB) +// ~~~~~~~~~ +// **** Classes : CCrystContainer ( container for cryst. data ) +// ~~~~~~~~~ CNCSMatrix ( non-cryst. symm. matrix class ) +// CTVect ( translation vector class ) +// CMMDBCryst ( MMDB cryst. section class ) +// +// (C) E. Krissinel 2000-2013 +// +// ================================================================= +// + +#ifndef __MMDB_Cryst__ +#define __MMDB_Cryst__ + + +#ifndef __Stream__ +#include "stream_.h" +#endif + +#ifndef __MMDB_SymOp__ +#include "mmdb_symop.h" +#endif + +#ifndef __MMDB_Defs__ +#include "mmdb_defs.h" +#endif + +#ifndef __MMDB_Utils__ +#include "mmdb_utils.h" +#endif + + +// ==================== CCrystContainer ====================== + +DefineClass(CCrystContainer) +DefineStreamFunctions(CCrystContainer) + +class CCrystContainer : public CClassContainer { + + public : + + CCrystContainer () : CClassContainer() {} + CCrystContainer ( RPCStream Object ) + : CClassContainer ( Object ) {} + ~CCrystContainer() {} + + PCContainerClass MakeContainerClass ( int ClassID ); + + int AddMTRIXLine ( cpstr S ); + +}; + + +// ================== CNCSMatrix ======================== + +#define NCSMSET_Matrix1 0x00000001 +#define NCSMSET_Matrix2 0x00000002 +#define NCSMSET_Matrix3 0x00000004 +#define NCSMSET_All 0x00000007 + +DefineClass(CNCSMatrix) +DefineStreamFunctions(CNCSMatrix) + +class CNCSMatrix : public CContainerClass { + + friend class CMMDBCryst; + + public : + + int serNum; // serial number + mat33 m; // non-crystallographic symmetry matrix + vect3 v; // translational part of ncs matrix + int iGiven; // iGiven flag (see PDB format) + + CNCSMatrix (); + CNCSMatrix ( cpstr S ); + CNCSMatrix ( RPCStream Object ); + ~CNCSMatrix(); + + Boolean PDBASCIIDump1 ( RCFile f ); + int ConvertPDBASCII ( cpstr S ); + void MakeCIF ( PCMMCIFData CIF, int N ); + void GetCIF ( PCMMCIFData CIF, int & Signal ); + + int GetClassID () { return ClassID_NCSMatrix; } + + void SetNCSMatrix ( int serialNum, + mat33 & ncs_m, vect3 & ncs_v, + int i_Given ); + + void Copy ( PCContainerClass NCSMatrix ); + + void write ( RCFile f ); + void read ( RCFile f ); + + protected : + word WhatIsSet; // mask field + // 0x0001 MTRIX1 was converted + // 0x0002 MTRIX2 was converted + // 0x0004 MTRIX3 was converted + + void Init(); + +}; + + +// ================== CTVect ======================== + +DefineClass(CTVect) +DefineStreamFunctions(CTVect) + +class CTVect : public CContainerClass { + + public : + + int serNum; // serial number + vect3 t; // translation vector + pstr comment; // comment + + CTVect (); + CTVect ( cpstr S ); + CTVect ( RPCStream Object ); + ~CTVect(); + + void PDBASCIIDump ( pstr S, int N ); + int ConvertPDBASCII ( cpstr S ); + void MakeCIF ( PCMMCIFData CIF, int N ); + void GetCIF ( PCMMCIFData CIF, int & Signal ); + int GetClassID () { return ClassID_TVect; } + + void Copy ( PCContainerClass TVect ); + + void write ( RCFile f ); + void read ( RCFile f ); + + protected : + + void Init(); + +}; + + +// ================= CMMDBCryst ======================= + +DefineClass(CMMDBCryst); +DefineStreamFunctions(CMMDBCryst); + +// constants for the CellCheck field +#define CCHK_Ok 0x00000000 +#define CCHK_NoCell 0x00000001 +#define CCHK_Error 0x00000002 +#define CCHK_Disagreement 0x00000004 +#define CCHK_NoOrthCode 0x00000008 +#define CCHK_Translations 0x00000010 +#define CCHK_Unchecked 0x00001000 + +// constants for the WhatIsSet field +#define CSET_CellParams1 0x00000001 +#define CSET_CellParams2 0x00000002 +#define CSET_CellParams 0x00000003 +#define CSET_SpaceGroup 0x00000004 +#define CSET_ZValue 0x00000008 +#define CSET_CrystCard 0x0000000F +#define CSET_OrigMatrix1 0x00000010 +#define CSET_OrigMatrix2 0x00000020 +#define CSET_OrigMatrix3 0x00000040 +#define CSET_OrigMatrix 0x00000070 +#define CSET_ScaleMatrix1 0x00000080 +#define CSET_ScaleMatrix2 0x00000100 +#define CSET_ScaleMatrix3 0x00000200 +#define CSET_ScaleMatrix 0x00000380 +#define CSET_Transforms 0x00000400 +#define CSET_DummyCell 0x00001000 + +extern cpstr OrthCode[6]; + +class CMMDBCryst : public CStream { + + friend class CChannel; + + public : + + realtype a,b,c; // cell parameters + realtype alpha,beta,gamma; // cell parameters + mat44 RO,RF; // orthogonal-fractional recalculation + // matrices + mat44 ROU,RFU; // ort-frac recalc matrices for + // anisotr. t-fac + mat633 RR; // standard orthogonalizations + realtype Vol; // cell volume + int NCode; // code of orthogonalization matrix + SymGroup spaceGroup; // group of space symmetry as read + // from file + SymGroup spaceGroupFix; // actually used space group + int Z; // Z-value + + mat33 o; // orthogonal transformation matrix + vect3 t; // translation orthogonal vector + mat33 s; // scale matrix + vect3 u; // translation part of the scale matrix + + word CellCheck; // 0x0000 - Ok + // 0x0001 - no cell stored + // 0x0002 - some error in cell volume + // 0x0004 - disagreement between + // cell and PDB + // 0x0008 - no orth code derived + // 0x0010 - translations also specified + // 0x1000 - the check was not done + word WhatIsSet; // indicator of the fields set + Boolean ignoreScalei; // flag to ignore SCALEi cards + Boolean processSG; // flag to process space group at file + // read + Boolean fixSpaceGroup; // flag to fix space group at file read + + CMMDBCryst (); + CMMDBCryst ( RPCStream Object ); + ~CMMDBCryst(); + + void FreeMemory(); + void Reset (); + + // ConvertPDBString(..) interprets an ASCII PDB line and fills + // the corresponding data fields. It returns zero if the line was + // successfully converted, otherwise returns a non-negative value + // of Error_XXXX. + // PDBString must be not shorter than 81 characters. + int ConvertPDBString ( pstr PDBString ); + + // RWBROOKReadPrintout() may be invoked after reading PDB file + // for simulating the old RWBROOK messages and warnings + void RWBROOKReadPrintout(); + + void SetCell ( realtype cell_a, + realtype cell_b, + realtype cell_c, + realtype cell_alpha, + realtype cell_beta, + realtype cell_gamma, + int OrthCode ); + void PutCell ( realtype cell_a, + realtype cell_b, + realtype cell_c, + realtype cell_alpha, + realtype cell_beta, + realtype cell_gamma, + int OrthCode ); + + void GetCell ( realtype & cell_a, + realtype & cell_b, + realtype & cell_c, + realtype & cell_alpha, + realtype & cell_beta, + realtype & cell_gamma, + realtype & vol ); + + void GetRCell ( realtype & cell_as, + realtype & cell_bs, + realtype & cell_cs, + realtype & cell_alphas, + realtype & cell_betas, + realtype & cell_gammas, + realtype & vols ); + + void SetSyminfoLib ( cpstr syminfoLib ); + pstr GetSyminfoLib (); + + int SetSpaceGroup ( cpstr spGroup ); + pstr GetSpaceGroup (); + pstr GetSpaceGroupFix(); + + // CalcCoordTransforms() should be called once after all data + // relevant to the crystallographic information, are read and + // converted. Field CellCheck will then have bits set if there + // are errors, e.g. bit CCHK_NoCell means that the coordinate + // transformations cannot be performed. + void CalcCoordTransforms(); + + // A PDB ASCII dump + void PDBASCIIDump ( RCFile f ); + + int GetCIF ( PCMMCIFData CIF ); + void MakeCIF ( PCMMCIFData CIF ); + + Boolean areMatrices(); // returns True if the orthogonal-to- + // fractional and fractional-to-orthogonal + // matrices are defined + + // Frac2Orth(..) and Orth2Frac(..) transform between fractional + // and orthogonal coordinates, if areMatrices() returns True. + // If the transformation matrices were not set, the functions just + // copy the coordinates. Returns True if the transformation was + // done; False return means that transformation matrices were not + // calculated + Boolean Frac2Orth ( + realtype x, realtype y, realtype z, + realtype & xx, realtype & yy, realtype & zz ); + Boolean Orth2Frac ( + realtype x, realtype y, realtype z, + realtype & xx, realtype & yy, realtype & zz ); + + // Below, F and T are transformation matrices in fractional and + // orthogonal coordinates, respectively. + Boolean Frac2Orth ( mat44 & F, mat44 & T ); + Boolean Orth2Frac ( mat44 & T, mat44 & F ); + + + // Cryst2Orth(..) and Orth2Cryst(..) transform between fractional + // and orthogonal anisotropic temperature factors, if areMatrices() + // returns True. If the transformation matrices were not set, the + // functions leave the factors unchanged. + // Vector U is composed as follows: + // U[0]=u11 U[1]=u22 U[2]=u33 + // U[3]=u12 U[4]=u13 U[5]=u23 + // Returns True if the transformation was done; False retuen + // means that transformation matrices were not calculated + Boolean Cryst2Orth ( rvector U ); + Boolean Orth2Cryst ( rvector U ); + + void CalcOrthMatrices(); // calculates RR, AC, cella's and Vol + + Boolean isNCSMatrix (); + Boolean isScaleMatrix (); + Boolean isCellParameters(); + + int GetNumberOfSymOps(); + pstr GetSymOp ( int Nop ); + + int GetNumberOfNCSMatrices(); + int GetNumberOfNCSMates (); // Returns the number of + // NCS mates not given in + // the file (iGiven==0) + + Boolean GetNCSMatrix ( int NCSMatrixNo, mat33 & ncs_m, + vect3 & ncs_v ); + Boolean GetNCSMatrix ( int NCSMatrixNo, mat44 & ncs_m, + int & iGiven ); // no=0..N-1 + int AddNCSMatrix ( mat33 & ncs_m, vect3 & ncs_v, int iGiven ); + + // GetTMatrix(..) calculates and returns the coordinate + // transformation matrix, which converts orthogonal coordinates + // according to the symmetry operation number Nop and places + // them into unit cell shifted by cellshift_a a's, cellshift_b + // b's and cellshift_c c's. + // + // Return 0 means everything's fine, + // 1 there's no symmetry operation Nop defined + // 2 fractionalizing/orthogonalizing matrices were not + // calculated + // 3 cell parameters were not set up. + int GetTMatrix ( mat44 & TMatrix, int Nop, + int cellshift_a, int cellshift_b, + int cellshift_c, PCSymOps symOpers=NULL ); + + // GetUCTMatrix(..) calculates and returns the coordinate + // transformation matrix, which converts orthogonal coordinates + // according to the symmetry operation Nop. Translation part + // of the matrix is being chosen such that point (x,y,z) has + // least distance to the center of primary (333) unit cell, + // and then it is shifted by cellshift_a a's, cellshift_b b's + // and cellshift_c c's. + // + // Return 0 means everything's fine, + // 1 there's no symmetry operation Nop defined + // 2 fractionalizing/orthogonalizing matrices were not + // calculated + // 3 cell parameters were not set up. + // + int GetUCTMatrix ( mat44 & TMatrix, int Nop, + realtype x, realtype y, realtype z, + int cellshift_a, int cellshift_b, + int cellshift_c, PCSymOps symOpers=NULL ); + + // GetFractMatrix(..) calculates and returns the coordinate + // transformation matrix, which converts fractional coordinates + // according to the symmetry operation number Nop and places them + // into unit cell shifted by cellshift_a a's, cellshift_b b's and + // cellshift_c c's. + // + // Return 0 means everything's fine, + // 1 there's no symmetry operation Nop defined + // 2 fractionalizing/orthogonalizing matrices were not + // calculated + // 3 cell parameters were not set up. + int GetFractMatrix ( mat44 & TMatrix, int Nop, + int cellshift_a, int cellshift_b, + int cellshift_c, PCSymOps symOpers=NULL ); + + // GetSymOpMatrix(..) returns the transformation matrix for + // Nop-th symmetry operator in the space group + // + // Return 0 means everything's fine, + // 1 there's no symmetry operation Nop defined + // 2 fractionalizing/orthogonalizing matrices were not + // calculated + // 3 cell parameters were not set up. + // + int GetSymOpMatrix ( mat44 & TMatrix, int Nop ); + + void Copy ( PCMMDBCryst Cryst ); + + void write ( RCFile f ); // writes header to PDB binary file + void read ( RCFile f ); // reads header from PDB binary file + + protected : + + CCrystContainer NCSMatrix; // non-cryst. symm. matrices + CCrystContainer TVect; // translation vectors + + realtype as,bs,cs; // calculated 'cell parameters' + realtype alphas,betas,gammas; // calculated 'cell parameters' + realtype AC[6]; + realtype VolChk,VolErr; + + pstr syminfo_lib; // path to syminfo.lib + CSymOps SymOps; // symmetry operations + + void Init ( Boolean fullInit ); + int FixSpaceGroup(); + +}; + +extern cpstr getOrthCodeName ( int NCode ); + +/* +extern void TestCryst(); // reads from 'in.cryst', writes into + // 'out.cryst' and 'abin.cryst' +*/ + +#endif + diff --git a/mmdb/mmdb_defs.h b/mmdb/mmdb_defs.h new file mode 100755 index 0000000..1d9908f --- /dev/null +++ b/mmdb/mmdb_defs.h @@ -0,0 +1,259 @@ +// $Id: mmdb_defs.h,v 1.27 2012/01/26 17:52:20 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 23.06.13 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : MMDBF_Defs +// ~~~~~~~~~ +// **** Project : MacroMolecular Data Base (MMDB) +// ~~~~~~~~~ +// +// Definition of types, constants and important classes. +// +// (C) E. Krissinel 2000-2013 +// +// ================================================================= +// + +#ifndef __MMDB_Defs__ +#define __MMDB_Defs__ + +#ifndef __MatType__ +#include "mattype_.h" +#endif + +#define MMDB_MAJOR_VERSION (1) +#define MMDB_MINOR_VERSION (25) +#define MMDB_MICRO_VERSION (5) + + +// ======================= types ================================= + +typedef char IDCode [16]; // ID code of the entry +typedef IDCode * PIDCode; // pointer to ID code +typedef PIDCode & RPIDCode; // ref-ce to pointer to ID code +typedef char Date [12]; // date DD-MMM-YYYY +typedef char RecName [7]; // name of PDB record + +typedef char ChainID [10]; // chain ID +typedef ChainID * PChainID; // pointer to chain ID +typedef char InsCode [10]; // insertion code +typedef char DBName [10]; // sequence database name +typedef char DBAcCode[20]; // seq. database accession code +typedef DBAcCode * PDBAcCode; // pointer to seq. db acc code +typedef char DBIdCode[20]; // seq. database ident-n code +typedef DBIdCode * PDBIdCode; // pointer to DBIdCode +typedef char ResName [20]; // residue name +typedef ResName * PResName; // pointer to residue name +typedef PResName * PPResName; // ptr to vector of residue names +typedef char HelixID [20]; // helix ID +typedef char StrandID[20]; // strand ID +typedef char SheetID [20]; // sheet ID +typedef char TurnID [20]; // turn ID +typedef char LinkRID [20]; // Refmac link ID + +typedef char SymGroup[100]; // group of space symmetry +typedef realtype vect3 [3]; // vector of 3 real numbers +typedef vect3 * pvect3; +typedef pvect3 & rpvect3; +typedef realtype vect4 [4]; // vector of 4 real numbers +typedef vect3 mat33 [3]; // matrix 3x3 of real numbers + +typedef vect4 mat44 [4]; // matrix 4x4 of real numbers +typedef mat44 * pmat44; +typedef mat44 & rmat44; +typedef pmat44 * ppmat44; +typedef pmat44 & rpmat44; +typedef mat33 mat633 [6]; // matrix 6x3x3 of real numbers + +typedef char AtomName[20]; // name of the atom +typedef AtomName * PAtomName; // pointer to atom name +typedef char AltLoc [20]; // alternate location indicator +typedef AltLoc * PAltLoc; // pointer to alt loc indicator +typedef char SegID [20]; // segment identifier +typedef char Element [10]; // chemical element name +typedef Element * PElement; // ptr to chemical element name +typedef char EnergyType[10]; // energy type name +typedef EnergyType * PEnergyType; // pointer to energy type name + +// do not forget update this when change the above typedefs: +#define MaxMMDBNameLength 40 +typedef char maxMMDBName[MaxMMDBNameLength]; + + +// ===================== constants =============================== + +// ANY_RES should be used in selection functions for specifying +// "any residue" to select +#define ANY_RES MinInt4 + +// PRNK_XXXXX are the print keys. PRNK_Silent supresses all print +// inside mmdb_xxxx unless specifically ordered or catastrophic. +// PRNK_SimRWBROOK instructs mmdb to issue, whenever possible and +// necessary, printouts and warnings of RWBROOK (fortran) package. +#define PRNK_Silent 0 +#define PRNK_SimRWBROOK 1 + +// Error_XXXX may be returned by XX::ConvertPDBString() and GetCIF(..) +// functions. +// Error_WrongSection is returned if the string passed into function +// does not belong to the corresponding PDB section. + +#define Error_NoError 0 +#define Error_Ok 0 +#define Error_WrongSection 1 + +#define Error_WrongChainID 2 +#define Error_WrongEntryID 3 + +// Error_SEQRES_serNum is returned by CSeqRes::ConvertPDBASCII() if +// serial numbers of SEQRES records do not increment by 1 +#define Error_SEQRES_serNum 4 + +// Error_SEQRES_numRes is returned by CSeqRes::ConvertPDBASCII() if +// SEQRES records show different number of residues +#define Error_SEQRES_numRes 5 + +// Error_SEQRES_extraRes is returned by CSeqRes::ConvertPDBASCII() if +// SEQRES contains more residues than specified +#define Error_SEQRES_extraRes 6 + +#define Error_NCSM_Unrecognized 7 +#define Error_NCSM_AlreadySet 8 +#define Error_NCSM_WrongSerial 9 +#define Error_NCSM_UnmatchIG 10 + +#define Error_ATOM_Unrecognized 11 +#define Error_ATOM_AlreadySet 12 +#define Error_ATOM_NoResidue 13 +#define Error_ATOM_Unmatch 14 + +#define Error_CantOpenFile 15 +#define Error_UnrecognizedInteger 16 +#define Error_WrongModelNo 17 +#define Error_DuplicatedModel 18 +#define Error_NoModel 19 +#define Error_ForeignFile 20 +#define Error_WrongEdition 21 + +// CIF specific +#define Error_NotACIFFile 22 +#define Error_NoData 23 +#define Error_UnrecognCIFItems 24 +#define Error_MissingCIFField 25 +#define Error_EmptyCIFLoop 26 +#define Error_UnexpEndOfCIF 27 +#define Error_MissgCIFLoopField 28 +#define Error_NotACIFStructure 29 +#define Error_NotACIFLoop 30 +#define Error_UnrecognizedReal 31 + +#define Error_NoSheetID 32 +#define Error_WrongSheetID 33 +#define Error_WrongStrandNo 34 + +// Error_WrongNumberOfStrands may be issued when reading +// sheet data from CIF +#define Error_WrongNumberOfStrands 35 + +// Error_WrongSheetOrder may be issued when reading +// sheet data from CIF +#define Error_WrongSheetOrder 36 + +// Error_HBondInconsistency may be issued when reading +// sheet data from CIF +#define Error_HBondInconsistency 37 + +// Error_EmptyResidueName is issued when PDB ATOM record +// does not have a residue name +#define Error_EmptyResidueName 38 + +// Error_DuplicateSeqNum is issued when PDB ATOM records +// show the sequence number and insertion code assigned +// to more than one residue name +#define Error_DuplicateSeqNum 39 + +// Error_NoLogicalName may be returned by file i/o functions +// if the specified environmental variable for file name +// is not found. +#define Error_NoLogicalName 40 + +// Error_EmptyFile may be returned at reading non-existing +// coordinate files +#define Error_EmptyFile 41 + + +// Error_CIF_EmptyRow is the event of encountering +// an empty row in _atom_site loop. It is handled +// internally and has no effect on API +#define Error_CIF_EmptyRow 99999 + +#define Error_GeneralError1 10000 + + +// ClassID_XXXX are used by container classes for proper +// creating containered classes when reading from binary file. + +enum ClassID { + ClassID_Template , + ClassID_String , + ClassID_ObsLine , + ClassID_TitleLine , + ClassID_CAVEAT , + ClassID_Compound , + ClassID_Source , + ClassID_ExpData , + ClassID_MdlType , + ClassID_Author , + ClassID_RevData , + ClassID_Supersede , + ClassID_Journal , + ClassID_Remark , + ClassID_DBReference, + ClassID_SeqAdv , + ClassID_ModRes , + ClassID_Het , + ClassID_NCSMatrix , + ClassID_TVect , + ClassID_Helix , + ClassID_Turn , + ClassID_Link , + ClassID_LinkR , + ClassID_CisPep +}; + + +// ===================== classes =============================== + +DefineClass(CAtom) +DefineClass(CResidue) +DefineClass(CChain) +DefineClass(CModel) +DefineClass(CMMDBManager) + + +#endif + diff --git a/mmdb/mmdb_ficif.cpp b/mmdb/mmdb_ficif.cpp new file mode 100755 index 0000000..d57c94a --- /dev/null +++ b/mmdb/mmdb_ficif.cpp @@ -0,0 +1,518 @@ +// $Id: mmdb_ficif.cpp,v 1.19 2012/01/26 17:52:20 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 24.04.03 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : MMDB_FICIF +// ~~~~~~~~~ +// **** Project : MacroMolecular Data Base (MMDB) +// ~~~~~~~~~ +// **** Classes : +// ~~~~~~~~~ +// +// (C) E. Krissinel 2000-2008 +// +// ================================================================= +// + +#ifndef __MMDB_MMCIF__ +#include "mmdb_mmcif.h" +#endif + +#ifndef __MMDB_FICIF__ +#include "mmdb_ficif.h" +#endif + + +// ================================================================== + +PCMMCIFData mmCIFData = NULL; + + +FORTRAN_SUBR ( MMDB_FCIF_INIT, mmdb_fcif_init,(),(),() ) { + InitMatType(); + mmCIFData = NULL; +} + +void MMDB_CCIF_Init() { + InitMatType(); + mmCIFData = NULL; +} + +FORTRAN_SUBR ( MMDB_FCIF_QUIT, mmdb_fcif_quit,(),(),() ) { + if (mmCIFData) delete mmCIFData; + mmCIFData = NULL; +} + +void MMDB_CCIF_Quit() { + if (mmCIFData) delete mmCIFData; + mmCIFData = NULL; +} + +pstr makeString ( pstr S, int SLen, pstr FS, int FSLen ) { + GetStrTer ( S,FS,FSLen,SLen,FSLen ); + CutSpaces ( S,SCUTKEY_END ); + return S; +} + +FORTRAN_SUBR ( MMDB_FCIF_CREATE, mmdb_fcif_create, + ( // lengths-at-end list + fpstr DataName, // file name + int DataName_len // fortran-hidden length of DataName + ), ( // lengths-in-structure list + fpstr DataName + ), ( // lengths-follow list + fpstr DataName, int DataName_len + ) ) { +char S[500]; + + if (mmCIFData) delete mmCIFData; + mmCIFData = new CMMCIFData ( makeString(S,sizeof(S), + FTN_STR(DataName),FTN_LEN(DataName)) ); + +} + +void MMDB_CCIF_Create ( pstr DataName ) { + if (mmCIFData) delete mmCIFData; + mmCIFData = new CMMCIFData ( DataName ); +} + + +FORTRAN_SUBR ( MMDB_FCIF_WRITE, mmdb_fcif_write, + ( // lengths-at-end list + fpstr FileName, // file name + int * iRet, // return code + int FileName_len // fortran-hidden length of FileName + ), ( // lengths-in-structure list + fpstr FileName, int *iRet + ), ( // lengths-follow list + fpstr FileName, int FileName_len, int * iRet + ) ) { +pstr S; + + if (!mmCIFData) + *iRet = -1000; + else { + S = new char[FTN_LEN(FileName)+10]; + if (mmCIFData->WriteMMCIFData(makeString(S,FTN_LEN(FileName)+5, + FTN_STR(FileName),FTN_LEN(FileName)))) + *iRet = 0; + else *iRet = 1; + delete[] S; + } + +} + + +int MMDB_CCIF_Write ( pstr FileName ) { + if (!mmCIFData) return -1000; + else if (mmCIFData->WriteMMCIFData(FileName)) return 0; + else return 1; +} + + +FORTRAN_SUBR ( MMDB_FCIF_PUTDATE, mmdb_fcif_putdate, + ( // lengths-at-end list + fpstr CatName, // category name + fpstr Tag, // tag + int * iRet, // return code + int CatName_len, // fortran-hidden length of CatName + int Tag_len // fortran-hidden length of Tag + ), ( // lengths-in-structure list + fpstr CatName, fpstr Tag, int * iRet + ), ( // lengths-follow list + fpstr CatName, int CatName_len, + fpstr Tag, int Tag_len, + int * iRet + ) ) { +char CN[200],TN[200]; + + if (!mmCIFData) + *iRet = -1000; + else *iRet = mmCIFData->PutDate ( makeString(CN,sizeof(CN), + FTN_STR(CatName),FTN_LEN(CatName)), + makeString(TN,sizeof(TN), + FTN_STR(Tag),FTN_LEN(Tag)) ); +} + +int MMDB_CCIF_PutDate ( pstr CatName, pstr Tag ) { + if (!mmCIFData) return -1000; + else return mmCIFData->PutDate ( CatName,Tag ); +} + + + +FORTRAN_SUBR ( MMDB_FCIF_PUTDOT, mmdb_fcif_putdot, + ( // lengths-at-end list + fpstr CatName, // category name + fpstr Tag, // tag + int * iRet, // return code + int CatName_len, // fortran-hidden length of CatName + int Tag_len // fortran-hidden length of Tag + ), ( // lengths-in-structure list + fpstr CatName, fpstr Tag, int * iRet + ), ( // lengths-follow list + fpstr CatName, int CatName_len, + fpstr Tag, int Tag_len, + int * iRet + ) ) { +char CN[200],TN[200]; + if (!mmCIFData) + *iRet = -1000; + else *iRet = mmCIFData->PutNoData ( CIF_NODATA_DOT, + makeString(CN,sizeof(CN), + FTN_STR(CatName),FTN_LEN(CatName)), + makeString(TN,sizeof(TN), + FTN_STR(Tag),FTN_LEN(Tag)) ); +} + + +int MMDB_CCIF_PutDot ( pstr CatName, pstr Tag ) { + if (!mmCIFData) return -1000; + else return mmCIFData->PutNoData ( CIF_NODATA_DOT, + CatName,Tag ); +} + + +FORTRAN_SUBR ( MMDB_FCIF_PUTQUESTION, mmdb_fcif_putquestion, + ( // lengths-at-end list + fpstr CatName, // category name + fpstr Tag, // tag + int * iRet, // return code + int CatName_len, // fortran-hidden length of CatName + int Tag_len // fortran-hidden length of Tag + ), ( // lengths-in-structure list + fpstr CatName, fpstr Tag, int * iRet + ), ( // lengths-follow list + fpstr CatName, int CatName_len, + fpstr Tag, int Tag_len, + int * iRet + ) ) { +char CN[200],TN[200]; + if (!mmCIFData) + *iRet = -1000; + else *iRet = mmCIFData->PutNoData ( CIF_NODATA_QUESTION, + makeString(CN,sizeof(CN), + FTN_STR(CatName),FTN_LEN(CatName)), + makeString(TN,sizeof(TN), + FTN_STR(Tag),FTN_LEN(Tag)) ); +} + + +int MMDB_CCIF_PutQuestion ( pstr CatName, pstr Tag ) { + if (!mmCIFData) return -1000; + else return mmCIFData->PutNoData ( CIF_NODATA_QUESTION, + CatName,Tag ); +} + + +FORTRAN_SUBR ( MMDB_FCIF_PUTSTRING, mmdb_fcif_putstring, + ( // lengths-at-end list + fpstr Data, // data string to store + fpstr CatName, // category name + fpstr Tag, // tag + int * iRet, // return code + int Data_len, // fortran-hidden length of Data + int CatName_len, // fortran-hidden length of CatName + int Tag_len // fortran-hidden length of Tag + ), ( // lengths-in-structure list + fpstr Data, fpstr CatName, fpstr Tag, int * iRet + ), ( // lengths-follow list + fpstr Data, int Data_len, + fpstr CatName, int CatName_len, + fpstr Tag, int Tag_len, + int * iRet + ) ) { +char CN[200],TN[200]; +pstr S; + + if (!mmCIFData) + *iRet = -1000; + else { + S = new char[FTN_LEN(Data)+10]; + *iRet = mmCIFData->PutString ( makeString(S,FTN_LEN(Data)+5, + FTN_STR(Data),FTN_LEN(Data)), + makeString(CN,sizeof(CN), + FTN_STR(CatName),FTN_LEN(CatName)), + makeString(TN,sizeof(TN), + FTN_STR(Tag),FTN_LEN(Tag)) ); + delete[] S; + } + +} + +int MMDB_CCIF_PutString ( pstr Data, pstr CatName, pstr Tag ) { + if (!mmCIFData) return -1000; + else return mmCIFData->PutString ( Data,CatName,Tag ); +} + + +FORTRAN_SUBR ( MMDB_FCIF_PUTREAL, mmdb_fcif_putreal, + ( // lengths-at-end list + apireal * V, // real value to store + fpstr CatName, // category name + fpstr Tag, // tag + int * iRet, // return code + int CatName_len, // fortran-hidden length of CatName + int Tag_len // fortran-hidden length of Tag + ), ( // lengths-in-structure list + apireal * V, fpstr CatName, fpstr Tag, int * iRet + ), ( // lengths-follow list + apireal * V, + fpstr CatName, int CatName_len, + fpstr Tag, int Tag_len, + int * iRet + ) ) { +char CN[200],TN[200]; + + if (!mmCIFData) *iRet = -1000; + else *iRet = mmCIFData->PutReal ( *V, + makeString(CN,sizeof(CN), + FTN_STR(CatName),FTN_LEN(CatName)), + makeString(TN,sizeof(TN), + FTN_STR(Tag),FTN_LEN(Tag)) ); + +} + + +int MMDB_CCIF_PutReal ( realtype V, pstr CatName, pstr Tag ) { + if (!mmCIFData) return -1000; + else return mmCIFData->PutReal ( V,CatName,Tag ); +} + + +FORTRAN_SUBR ( MMDB_FCIF_PUTINTEGER, mmdb_fcif_putinteger, + ( // lengths-at-end list + int * I, // integer value to store + fpstr CatName, // category name + fpstr Tag, // tag + int * iRet, // return code + int CatName_len, // fortran-hidden length of CatName + int Tag_len // fortran-hidden length of Tag + ), ( // lengths-in-structure list + int * I, fpstr CatName, fpstr Tag, int * iRet + ), ( // lengths-follow list + int * I, + fpstr CatName, int CatName_len, + fpstr Tag, int Tag_len, + int * iRet + ) ) { +char CN[200],TN[200]; + + if (!mmCIFData) *iRet = -1000; + else *iRet = mmCIFData->PutInteger ( *I, + makeString(CN,sizeof(CN), + FTN_STR(CatName),FTN_LEN(CatName)), + makeString(TN,sizeof(TN), + FTN_STR(Tag),FTN_LEN(Tag)) ); + +} + +int MMDB_CCIF_PutInteger ( int I, pstr CatName, pstr Tag ) { + if (!mmCIFData) return -1000; + else return mmCIFData->PutInteger ( I,CatName,Tag ); +} + + +FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPDOT, mmdb_fcif_putloopdot, + ( // lengths-at-end list + fpstr CatName, // category name + fpstr Tag, // tag + int * nrow, // row number + int * iRet, // return code + int CatName_len, // fortran-hidden length of CatName + int Tag_len // fortran-hidden length of Tag + ), ( // lengths-in-structure list + fpstr CatName, fpstr Tag, int * nrow, int * iRet + ), ( // lengths-follow list + fpstr CatName, int CatName_len, + fpstr Tag, int Tag_len, + int * nrow, int * iRet + ) ) { +char CN[200],TN[200]; + if (!mmCIFData) + *iRet = -1000; + else *iRet = mmCIFData->PutLoopNoData ( CIF_NODATA_DOT, + makeString(CN,sizeof(CN), + FTN_STR(CatName),FTN_LEN(CatName)), + makeString(TN,sizeof(TN), + FTN_STR(Tag),FTN_LEN(Tag)),*nrow ); +} + + +int MMDB_CCIF_PutLoopDot ( pstr CatName, pstr Tag, int nrow ) { + if (!mmCIFData) return -1000; + else return mmCIFData->PutLoopNoData ( CIF_NODATA_DOT, + CatName,Tag,nrow ); +} + + +FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPQUESTION, mmdb_fcif_putloopquestion, + ( // lengths-at-end list + fpstr CatName, // category name + fpstr Tag, // tag + int * nrow, // row number + int * iRet, // return code + int CatName_len, // fortran-hidden length of CatName + int Tag_len // fortran-hidden length of Tag + ), ( // lengths-in-structure list + fpstr CatName, fpstr Tag, int * nrow, int * iRet + ), ( // lengths-follow list + fpstr CatName, int CatName_len, + fpstr Tag, int Tag_len, + int * nrow, int * iRet + ) ) { +char CN[200],TN[200]; + if (!mmCIFData) + *iRet = -1000; + else *iRet = mmCIFData->PutLoopNoData ( CIF_NODATA_QUESTION, + makeString(CN,sizeof(CN), + FTN_STR(CatName),FTN_LEN(CatName)), + makeString(TN,sizeof(TN), + FTN_STR(Tag),FTN_LEN(Tag)),*nrow ); +} + +int MMDB_CCIF_PutLoopQuestion ( pstr CatName, pstr Tag, int nrow ) { + if (!mmCIFData) return -1000; + else return mmCIFData->PutLoopNoData ( CIF_NODATA_QUESTION, + CatName,Tag,nrow ); +} + + +FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPSTRING, mmdb_fcif_putloopstring, + ( // lengths-at-end list + fpstr Data, // data string to store + fpstr CatName, // category name + fpstr Tag, // tag + int * nrow, // row number + int * iRet, // return code + int Data_len, // fortran-hidden length of Data + int CatName_len, // fortran-hidden length of CatName + int Tag_len // fortran-hidden length of Tag + ), ( // lengths-in-structure list + fpstr Data, fpstr CatName, fpstr Tag, + int * nrow, int * iRet + ), ( // lengths-follow list + fpstr Data, int Data_len, + fpstr CatName, int CatName_len, + fpstr Tag, int Tag_len, + int * nrow, int * iRet + ) ) { +char CN[200],TN[200]; +pstr S; + + if (!mmCIFData) + *iRet = -1000; + else { + S = new char[FTN_LEN(Data)+10]; + *iRet = mmCIFData->PutLoopString ( makeString(S,FTN_LEN(Data)+5, + FTN_STR(Data),FTN_LEN(Data)), + makeString(CN,sizeof(CN), + FTN_STR(CatName),FTN_LEN(CatName)), + makeString(TN,sizeof(TN), + FTN_STR(Tag),FTN_LEN(Tag)),*nrow ); + delete[] S; + } + +} + + +int MMDB_CCIF_PutLoopString ( pstr Data, pstr CatName, pstr Tag, int nrow ) { + if (!mmCIFData) return -1000; + else return mmCIFData->PutLoopString ( Data,CatName,Tag,nrow ); +} + + +FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPREAL, mmdb_fcif_putloopreal, + ( // lengths-at-end list + apireal * V, // real value to store + fpstr CatName, // category name + fpstr Tag, // tag + int * nrow, // row number + int * iRet, // return code + int CatName_len, // fortran-hidden length of CatName + int Tag_len // fortran-hidden length of Tag + ), ( // lengths-in-structure list + apireal * V, fpstr CatName, fpstr Tag, + int * nrow, int * iRet + ), ( // lengths-follow list + apireal * V, + fpstr CatName, int CatName_len, + fpstr Tag, int Tag_len, + int * nrow, int * iRet + ) ) { +char CN[200],TN[200]; + + if (!mmCIFData) *iRet = -1000; + else *iRet = mmCIFData->PutLoopReal ( *V, + makeString(CN,sizeof(CN), + FTN_STR(CatName),FTN_LEN(CatName)), + makeString(TN,sizeof(TN), + FTN_STR(Tag),FTN_LEN(Tag)),*nrow ); + +} + + +int MMDB_CCIF_PutLoopReal ( realtype V, pstr CatName, pstr Tag, int nrow ) { + if (!mmCIFData) return -1000; + else return mmCIFData->PutLoopReal ( V,CatName,Tag,nrow ); +} + + +FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPINTEGER, mmdb_fcif_putloopinteger, + ( // lengths-at-end list + int * I, // integer value to store + fpstr CatName, // category name + fpstr Tag, // tag + int * nrow, // row number + int * iRet, // return code + int CatName_len, // fortran-hidden length of CatName + int Tag_len // fortran-hidden length of Tag + ), ( // lengths-in-structure list + int * I, fpstr CatName, fpstr Tag, + int * nrow, int * iRet + ), ( // lengths-follow list + int * I, + fpstr CatName, int CatName_len, + fpstr Tag, int Tag_len, + int * nrow, int * iRet + ) ) { +char CN[200],TN[200]; + + if (!mmCIFData) *iRet = -1000; + else *iRet = mmCIFData->PutLoopInteger ( *I, + makeString(CN,sizeof(CN), + FTN_STR(CatName),FTN_LEN(CatName)), + makeString(TN,sizeof(TN), + FTN_STR(Tag),FTN_LEN(Tag)),*nrow ); + +} + + +int MMDB_CCIF_PutLoopInteger ( int I, pstr CatName, pstr Tag, int nrow ) { + if (!mmCIFData) return -1000; + else return mmCIFData->PutLoopInteger ( I,CatName,Tag,nrow ); +} diff --git a/mmdb/mmdb_ficif.h b/mmdb/mmdb_ficif.h new file mode 100755 index 0000000..5a015f2 --- /dev/null +++ b/mmdb/mmdb_ficif.h @@ -0,0 +1,290 @@ +// $Id: mmdb_ficif.h,v 1.19 2012/01/26 17:52:20 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 15.12.02 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : MMDB_FICIF +// ~~~~~~~~~ +// **** Project : MacroMolecular Data Base (MMDB) +// ~~~~~~~~~ +// **** Classes : +// ~~~~~~~~~ +// +// (C) E. Krissinel 2000-2008 +// +// ================================================================= +// + +#ifndef __MMDB_FICIF__ +#define __MMDB_FICIF__ + + +#ifndef __Machine__ +#include "machine_.h" +#endif + + + + +// ==================== FORTRAN INTERFACE ======================== + +FORTRAN_SUBR ( MMDB_FCIF_INIT, mmdb_fcif_init,(),(),() ); + +FORTRAN_SUBR ( MMDB_FCIF_QUIT, mmdb_fcif_quit,(),(),() ); + +FORTRAN_SUBR ( MMDB_FCIF_CREATE, mmdb_fcif_create, + ( // lengths-at-end list + fpstr DataName, // file name + int DataName_len // fortran-hidden length of DataName + ), ( // lengths-in-structure list + fpstr DataName + ), ( // lengths-follow list + fpstr DataName, int DataName_len + ) ); + +FORTRAN_SUBR ( MMDB_FCIF_WRITE, mmdb_fcif_write, + ( // lengths-at-end list + fpstr FileName, // file name + int * iRet, // return code + int FileName_len // fortran-hidden length of FileName + ), ( // lengths-in-structure list + fpstr FileName, int *iRet + ), ( // lengths-follow list + fpstr FileName, int FileName_len, int * iRet + ) ); + +FORTRAN_SUBR ( MMDB_FCIF_PUTDATE, mmdb_fcif_putdate, + ( // lengths-at-end list + fpstr CatName, // category name + fpstr Tag, // tag + int * iRet, // return code + int CatName_len, // fortran-hidden length of CatName + int Tag_len // fortran-hidden length of Tag + ), ( // lengths-in-structure list + fpstr CatName, fpstr Tag, int * iRet + ), ( // lengths-follow list + fpstr CatName, int CatName_len, + fpstr Tag, int Tag_len, + int * iRet + ) ); + +FORTRAN_SUBR ( MMDB_FCIF_PUTDOT, mmdb_fcif_putdot, + ( // lengths-at-end list + fpstr CatName, // category name + fpstr Tag, // tag + int * iRet, // return code + int CatName_len, // fortran-hidden length of CatName + int Tag_len // fortran-hidden length of Tag + ), ( // lengths-in-structure list + fpstr CatName, fpstr Tag, int * iRet + ), ( // lengths-follow list + fpstr CatName, int CatName_len, + fpstr Tag, int Tag_len, + int * iRet + ) ); + +FORTRAN_SUBR ( MMDB_FCIF_PUTQUESTION, mmdb_fcif_putquestion, + ( // lengths-at-end list + fpstr CatName, // category name + fpstr Tag, // tag + int * iRet, // return code + int CatName_len, // fortran-hidden length of CatName + int Tag_len // fortran-hidden length of Tag + ), ( // lengths-in-structure list + fpstr CatName, fpstr Tag, int * iRet + ), ( // lengths-follow list + fpstr CatName, int CatName_len, + fpstr Tag, int Tag_len, + int * iRet + ) ); + +FORTRAN_SUBR ( MMDB_FCIF_PUTSTRING, mmdb_fcif_putstring, + ( // lengths-at-end list + fpstr Data, // data string to store + fpstr CatName, // category name + fpstr Tag, // tag + int * iRet, // return code + int Data_len, // fortran-hidden length of Data + int CatName_len, // fortran-hidden length of CatName + int Tag_len // fortran-hidden length of Tag + ), ( // lengths-in-structure list + fpstr Data, fpstr CatName, fpstr Tag, int * iRet + ), ( // lengths-follow list + fpstr Data, int Data_len, + fpstr CatName, int CatName_len, + fpstr Tag, int Tag_len, + int * iRet + ) ); + +FORTRAN_SUBR ( MMDB_FCIF_PUTREAL, mmdb_fcif_putreal, + ( // lengths-at-end list + apireal * V, // real value to store + fpstr CatName, // category name + fpstr Tag, // tag + int * iRet, // return code + int CatName_len, // fortran-hidden length of CatName + int Tag_len // fortran-hidden length of Tag + ), ( // lengths-in-structure list + apireal * V, fpstr CatName, fpstr Tag, int * iRet + ), ( // lengths-follow list + apireal * V, + fpstr CatName, int CatName_len, + fpstr Tag, int Tag_len, + int * iRet + ) ); + +FORTRAN_SUBR ( MMDB_FCIF_PUTINTEGER, mmdb_fcif_putinteger, + ( // lengths-at-end list + int * I, // integer value to store + fpstr CatName, // category name + fpstr Tag, // tag + int * iRet, // return code + int CatName_len, // fortran-hidden length of CatName + int Tag_len // fortran-hidden length of Tag + ), ( // lengths-in-structure list + int * I, fpstr CatName, fpstr Tag, int * iRet + ), ( // lengths-follow list + int * I, + fpstr CatName, int CatName_len, + fpstr Tag, int Tag_len, + int * iRet + ) ); + +FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPDOT, mmdb_fcif_putloopdot, + ( // lengths-at-end list + fpstr CatName, // category name + fpstr Tag, // tag + int * nrow, // row number + int * iRet, // return code + int CatName_len, // fortran-hidden length of CatName + int Tag_len // fortran-hidden length of Tag + ), ( // lengths-in-structure list + fpstr CatName, fpstr Tag, int * nrow, int * iRet + ), ( // lengths-follow list + fpstr CatName, int CatName_len, + fpstr Tag, int Tag_len, + int * nrow, int * iRet + ) ); + +FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPQUESTION, mmdb_fcif_putloopquestion, + ( // lengths-at-end list + fpstr CatName, // category name + fpstr Tag, // tag + int * nrow, // row number + int * iRet, // return code + int CatName_len, // fortran-hidden length of CatName + int Tag_len // fortran-hidden length of Tag + ), ( // lengths-in-structure list + fpstr CatName, fpstr Tag, int * nrow, int * iRet + ), ( // lengths-follow list + fpstr CatName, int CatName_len, + fpstr Tag, int Tag_len, + int * nrow, int * iRet + ) ); + +FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPSTRING, mmdb_fcif_putloopstring, + ( // lengths-at-end list + fpstr Data, // data string to store + fpstr CatName, // category name + fpstr Tag, // tag + int * nrow, // row number + int * iRet, // return code + int Data_len, // fortran-hidden length of Data + int CatName_len, // fortran-hidden length of CatName + int Tag_len // fortran-hidden length of Tag + ), ( // lengths-in-structure list + fpstr Data, fpstr CatName, fpstr Tag, + int * nrow, int * iRet + ), ( // lengths-follow list + fpstr Data, int Data_len, + fpstr CatName, int CatName_len, + fpstr Tag, int Tag_len, + int * nrow, int * iRet + ) ); + +FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPREAL, mmdb_fcif_putloopreal, + ( // lengths-at-end list + apireal * V, // real value to store + fpstr CatName, // category name + fpstr Tag, // tag + int * nrow, // row number + int * iRet, // return code + int CatName_len, // fortran-hidden length of CatName + int Tag_len // fortran-hidden length of Tag + ), ( // lengths-in-structure list + apireal * V, fpstr CatName, fpstr Tag, + int * nrow, int * iRet + ), ( // lengths-follow list + apireal * V, + fpstr CatName, int CatName_len, + fpstr Tag, int Tag_len, + int * nrow, int * iRet + ) ); + +FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPINTEGER, mmdb_fcif_putloopinteger, + ( // lengths-at-end list + int * I, // integer value to store + fpstr CatName, // category name + fpstr Tag, // tag + int * nrow, // row number + int * iRet, // return code + int CatName_len, // fortran-hidden length of CatName + int Tag_len // fortran-hidden length of Tag + ), ( // lengths-in-structure list + int * I, fpstr CatName, fpstr Tag, + int * nrow, int * iRet + ), ( // lengths-follow list + int * I, + fpstr CatName, int CatName_len, + fpstr Tag, int Tag_len, + int * nrow, int * iRet + ) ); + + + + +// ==================== C INTERFACE ======================== + +extern "C" void MMDB_CCIF_Init(); +extern "C" void MMDB_CCIF_Quit(); +extern "C" void MMDB_CCIF_Create ( pstr DataName ); +extern "C" int MMDB_CCIF_Write ( pstr FileName ); +extern "C" int MMDB_CCIF_PutDate ( pstr CatName, pstr Tag ); +extern "C" int MMDB_CCIF_PutDot ( pstr CatName, pstr Tag ); +extern "C" int MMDB_CCIF_PutQuestion ( pstr CatName, pstr Tag ); +extern "C" int MMDB_CCIF_PutString ( pstr Data, pstr CatName, pstr Tag ); +extern "C" int MMDB_CCIF_PutReal ( realtype V, pstr CatName, pstr Tag ); +extern "C" int MMDB_CCIF_PutInteger ( int I, pstr CatName, pstr Tag ); +extern "C" int MMDB_CCIF_PutLoopDot ( pstr CatName, pstr Tag, int nrow ); +extern "C" int MMDB_CCIF_PutLoopQuestion ( pstr CatName, pstr Tag, int nrow ); +extern "C" int MMDB_CCIF_PutLoopString ( pstr Data, pstr CatName, + pstr Tag, int nrow ); +extern "C" int MMDB_CCIF_PutLoopReal ( realtype V, pstr CatName, + pstr Tag, int nrow ); +extern "C" int MMDB_CCIF_PutLoopInteger ( int I, pstr CatName, + pstr Tag, int nrow ); + +#endif diff --git a/mmdb/mmdb_file.cpp b/mmdb/mmdb_file.cpp new file mode 100755 index 0000000..7eaa664 --- /dev/null +++ b/mmdb/mmdb_file.cpp @@ -0,0 +1,3060 @@ +// $Id: mmdb_file.cpp,v 1.34 2012/01/26 17:52:20 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 16.05.13 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : MMDB_File +// ~~~~~~~~~ +// **** Project : MacroMolecular Data Base (MMDB) +// ~~~~~~~~~ +// **** Classes : CMMDBFile ( macromolecular data file class ) +// ~~~~~~~~~ +// +// (C) E. Krissinel 2000-2013 +// +// ================================================================= +// + +#ifndef __STRING_H +#include "string.h" +#endif + +#ifndef __STDLIB_H +#include "stdlib.h" +#endif + +#ifndef __MMDB_File__ +#include "mmdb_file.h" +#endif + +#ifndef __MMDB_Atom__ +#include "mmdb_atom.h" +#endif + +#ifndef __MMDB_MMCIF__ +#include "mmdb_mmcif.h" +#endif + +#ifndef __MMDB_Defs__ +#include "mmdb_defs.h" +#endif + +#ifndef __MMDB_CIFDefs__ +#include "mmdb_cifdefs.h" +#endif + +#ifndef __MMDB_Tables__ +#include "mmdb_tables.h" +#endif + + +// ===================== CMMDBFile ======================= + +CMMDBFile::CMMDBFile() : CUDData() { + InitMMDBFile(); +} + +CMMDBFile::CMMDBFile ( RPCStream Object ) : CUDData(Object) { + InitMMDBFile(); +} + +CMMDBFile::~CMMDBFile() { + FreeFileMemory(); +} + +void CMMDBFile::InitMMDBFile() { + nModels = 0; + Model = NULL; + nAtoms = 0; + AtmLen = 0; + Atom = NULL; + CIF = NULL; + crModel = NULL; + crChain = NULL; + crRes = NULL; + lcount = 0; + strcpy ( S,"" ); +// Flags = 0x00000000; // no special effects + Flags = MMDBF_IgnoreElement; // done at request for default + FType = MMDB_FILE_Undefined; // undefined file operation + Exclude = True; + ignoreRemarks = False; // used temporarily + allowDuplChID = False; // used temporarily + enforceUniqueChID = False; // used temporarily + modelCnt = 0; // used only at reading files +} + + +void CMMDBFile::FreeCoordMemory() { + //int i; + +/* + // All atoms are kept in array Atom. Models, chains + // and residues have only references to Atom and + // they do not dispose Atoms when disposed themselves. + // It is important, however, to dispose Atom at + // still alive residues, because each atom wipes out + // reference to itself from the corresponding residue + // before it dies. + if (Atom) { + for (i=0;iConvertPDBString ( S ); + if ((RC!=Error_WrongSection) && ignoreNonCoorPDBErrors) + RC = 0; + if (RC) break; + } + fend = f.FileEnd(); + if (!fend) { + ReadPDBLine ( f,S,sizeof(S) ); + Title.TrimInput ( S ); + lcount++; + } + } while (!fend); + + if (RC!=Error_WrongSection) return RC; + + // temporary solution: the rest of file is stored + // in the form of strings + while (!f.FileEnd() && + strncmp(S,"CRYST" ,5) && + strncmp(S,"ORIGX" ,5) && + strncmp(S,"SCALE" ,5) && + strncmp(S,"MTRIX" ,5) && + strncmp(S,"TVECT" ,5) && + strncmp(S,"MODEL ",6) && + strncmp(S,"ATOM ",6) && + strncmp(S,"SIGATM",6) && + strncmp(S,"ANISOU",6) && + strncmp(S,"SIGUIJ",6) && + strncmp(S,"TER ",6) && + strncmp(S,"HETATM",6) && + strncmp(S,"ENDMDL",6)) { + if (!strncmp(S,"LINK ",6)) + crModel->ConvertPDBString ( S ); + else if (!strncmp(S,"LINKR ",6)) + crModel->ConvertPDBString ( S ); + else if (!strncmp(S,"CISPEP",6)) { + GetInteger ( modNum,&(S[43]),3 ); + if (modNum<=0) modNum = 1; + if (modNum!=1) SwitchModel ( modNum ); + crModel->ConvertPDBString ( S ); + if (modNum!=1) SwitchModel ( 1 ); + } else { + ContString = new CContString(S); + SA.AddData ( ContString ); + } + ReadPDBLine ( f,S,sizeof(S) ); + Title.TrimInput ( S ); + lcount++; + } + + // read crystallographic information section + do { + RC = Cryst.ConvertPDBString ( S ); + if ((RC!=Error_WrongSection) && ignoreNonCoorPDBErrors) + RC = 0; + if (RC) break; + fend = f.FileEnd(); + if (!fend) { + ReadPDBLine ( f,S,sizeof(S) ); + Title.TrimInput ( S ); + lcount++; + } + } while (!fend); + + if (!RC) { + RC = Cryst.ConvertPDBString ( S ); + if ((RC!=Error_WrongSection) && ignoreNonCoorPDBErrors) + RC = Error_WrongSection; + } + + Cryst.CalcCoordTransforms(); + if (Flags & MMDBF_SimRWBROOK) + Cryst.RWBROOKReadPrintout(); + + if (RC!=Error_WrongSection) return RC; + + // temporary solution: the rest of file is stored + // in the form of strings + while (!f.FileEnd() && + strncmp(S,"MODEL ",6) && + strncmp(S,"ATOM ",6) && + strncmp(S,"SIGATM",6) && + strncmp(S,"ANISOU",6) && + strncmp(S,"SIGUIJ",6) && + strncmp(S,"TER ",6) && + strncmp(S,"HETATM",6) && + strncmp(S,"ENDMDL",6)) { + ContString = new CContString(S); + SB.AddData ( ContString ); + ReadPDBLine ( f,S,sizeof(S) ); + Title.TrimInput ( S ); + lcount++; + } + + if (Flags & MMDBF_NoCoordRead) return 0; + + // read coordinate section + RC = 0; + do { + RC = ReadPDBAtom ( S ); + if (RC) break; + fend = f.FileEnd(); + if (!fend) { + ReadPDBLine ( f,S,sizeof(S) ); + Title.TrimInput ( S ); + lcount++; + } + } while (!fend); +// if (!RC) +// RC = ReadPDBAtom(S); +// commented on 28.05.2004, it appears that "CHAIN_ORDER" should not +// be enforced here +// cleanKey = PDBCLEAN_ATNAME | PDBCLEAN_CHAIN_ORDER; + cleanKey = 0x00000000; + if (Flags & MMDBF_EnforceAtomNames) + cleanKey = PDBCLEAN_ATNAME; + if (Flags & MMDBF_AutoSerials) + cleanKey |= PDBCLEAN_SERIAL; + + if (cleanKey) + PDBCleanup ( cleanKey ); + + if ((!f.FileEnd()) && (RC!=Error_WrongSection)) return RC; + + // temporary solution: the rest of file is stored + // in the form of strings + while (!f.FileEnd()) { + if (strncmp(S,"END ",6)) { // END is added automatically + ContString = new CContString(S); + SC.AddData ( ContString ); + } + ReadPDBLine ( f,S,sizeof(S) ); + Title.TrimInput ( S ); + lcount++; + } + lcount--; // last line was not read + + return 0; + +} + + +int CMMDBFile::ReadCIFASCII1 ( cpstr CIFLFName, byte gzipMode ) { +pstr FName; + FName = getenv ( CIFLFName ); + if (FName) return ReadCIFASCII ( FName,gzipMode ); + else return Error_NoLogicalName; +} + +int CMMDBFile::ReadCIFASCII ( cpstr CIFFileName, byte gzipMode ) { +CFile f; +int rc; + + // open the file as ASCII for reading + // opening it in pseudo-binary mode helps reading various + // line terminators for files coming from different platforms + f.assign ( CIFFileName,False,False,gzipMode ); + + if (f.reset(True)) { + rc = ReadCIFASCII ( f ); + f.shut(); + } else + rc = Error_CantOpenFile; + + return rc; + +} + +int CMMDBFile::ReadCIFASCII ( RCFile f ) { +int W; + + // remove previous data + ResetManager (); + FreeFileMemory(); + FType = MMDB_FILE_CIF; + + SetFlag ( 0 ); + + CIFErrorLocation[0] = char(0); // CIF reading phase + + lcount = 0; // line counter + S[0] = char(0); + + if (f.FileEnd()) + return Error_EmptyFile; + + if (!CIF) CIF = new CMMCIFData(); + CIF->SetStopOnWarning ( True ); + CIF->SetPrintWarnings ( (Flags & MMDBF_PrintCIFWarnings)!=0 ); + W = CIF->ReadMMCIFData ( f,S,lcount ); + + if (W) { + if (W==CIFRC_NoDataLine) return Error_NotACIFFile; + if (W & CIFW_UnrecognizedItems) return Error_UnrecognCIFItems; + if (W & CIFW_MissingField) return Error_MissingCIFField; + if (W & CIFW_EmptyLoop) return Error_EmptyCIFLoop; + if (W & CIFW_UnexpectedEOF) return Error_UnexpEndOfCIF; + if (W & CIFW_LoopFieldMissing) return Error_MissgCIFLoopField; + if (W & CIFW_NotAStructure) return Error_NotACIFStructure; + if (W & CIFW_NotALoop) return Error_NotACIFLoop; + return int(W); + } + + W = ReadFromCIF ( CIF ); + if (CIF) { + delete CIF; + CIF = NULL; + } + + return W; + +} + + +int CMMDBFile::ReadFromCIF ( PCMMCIFData CIFD ) { +PCMMCIFLoop Loop1,Loop2; +pstr F,FC; +word cleanKey; +int RC,i,l,j,n,retc; + + RC = Title.GetCIF ( CIFD ); + + if (RC) { + CIFD->Optimize(); + return RC; + } + + SwitchModel ( 1 ); + if (!crModel) return Error_GeneralError1; + RC = crModel->GetCIF ( CIFD ); + if (RC) { + CIFD->Optimize(); + return RC; + } + + RC = Cryst.GetCIF ( CIFD ); + if (RC) { + CIFD->Optimize(); + return RC; + } + Cryst.CalcCoordTransforms(); + if (Flags & MMDBF_SimRWBROOK) + Cryst.RWBROOKReadPrintout(); + + RC = ReadCIFAtom ( CIFD ); + + Loop1 = CIFD->GetLoop ( CIFCAT_ENTITY ); + Loop2 = CIFD->GetLoop ( CIFCAT_STRUCT_ASYM ); + if (Loop1 && Loop2) { + // make 'Het' atoms + l = Loop1->GetLoopLength(); + n = Loop2->GetLoopLength(); + for (i=0;iGetString ( CIFTAG_TYPE,i,retc ); + if (F && (!retc)) { + if (!strcasecmp(F,"non-polymer")) { + F = Loop1->GetString ( CIFTAG_ID,i,retc ); + if (F && (!retc)) + for (j=0;jGetString ( CIFTAG_ENTITY_ID,j,retc ); + if (FC && (!retc)) { + if (!strcasecmp(FC,F)) { + FC = Loop2->GetString ( CIFTAG_ID,j,retc ); + if (FC && (!retc)) + MakeHetAtoms ( FC,True ); + } + } + } + } + } + } + } + + if (!RC) { + // deleting these CIF loops here is a temporary solution + // taken in order to avoid mess at rewriting the CIF file. + CIFD->DeleteLoop ( CIFCAT_ATOM_SITE ); + CIFD->DeleteLoop ( CIFCAT_ATOM_SITE_ANISOTROP ); + CIFD->Optimize (); + } + + cleanKey = 0x00000000; + if (Flags & MMDBF_EnforceAtomNames) + cleanKey = PDBCLEAN_ATNAME; + if (Flags & MMDBF_AutoSerials) + cleanKey |= PDBCLEAN_SERIAL; + if (cleanKey) + PDBCleanup ( cleanKey ); + + return RC; + +} + +int CMMDBFile::ReadCoorFile1 ( cpstr LFName, byte gzipMode ) { +pstr FName; + FName = getenv ( LFName ); + if (FName) return ReadCoorFile ( FName,gzipMode ); + else return Error_NoLogicalName; +} + +int CMMDBFile::ReadCoorFile ( cpstr CFName, byte gzipMode ) { +// auto format recognition +int kin; +Boolean IBL; + + kin = isMMDBBIN ( CFName,gzipMode ); + if (kin==Error_EmptyFile) + return Error_EmptyFile; + if (kin<0) return Error_CantOpenFile; + + if (kin==0) return ReadMMDBF ( CFName,gzipMode ); + + IBL = ((Flags & MMDBF_IgnoreBlankLines)!=0); + if (isPDB(CFName,gzipMode,IBL)==0) + return ReadPDBASCII ( CFName,gzipMode ); + if (isCIF(CFName,gzipMode)==0) + return ReadCIFASCII ( CFName,gzipMode ); + + return Error_ForeignFile; + +} + + +int CMMDBFile::ReadCoorFile ( RCFile f ) { +// auto format recognition +int kin; +Boolean IBL; + + kin = isMMDBBIN ( f ); + f.reset ( True ); + if (kin==Error_EmptyFile) + return Error_EmptyFile; + if (kin<0) return Error_CantOpenFile; + + if (kin==0) return ReadMMDBF ( f ); + + IBL = ((Flags & MMDBF_IgnoreBlankLines)!=0); + kin = isPDB ( f,IBL ); + f.reset ( True ); + if (kin==0) + return ReadPDBASCII ( f ); + + kin = isCIF ( f ); + f.reset ( True ); + if (kin==0) + return ReadCIFASCII ( f ); + + return Error_ForeignFile; + +} + + +word CMMDBFile::PDBCleanup ( word CleanKey ) { +// cleans coordinate part to comply with PDB standards: +// +// CleanKey Action +// PDBCLEAN_ATNAME pads atom names with spaces to form 4-symbol names +// PDBCLEAN_TER inserts TER cards in the end of each chain +// PDBCLEAN_CHAIN generates 1-character chain ids instead of +// those many-character +// PDBCLEAN_CHAIN_STRONG generates 1-character chain ids starting +// from 'A' on for all ids, including single-char +// PDBCLEAN_ALTCODE generates 1-character alternative codes instead +// of those many-character +// PDBCLEAN_ALTCODE_STRONG generates 1-character alternative codes +// from 'A' on for all codes, including +// single-character ones +// PDBCLEAN_SERIAL puts serial numbers in due order +// PDBCLEAN_INDEX reorders the internal index of atoms such that +// it follows the actual order of atoms in +// the object hierarchy +// PDBCLEAN_SEQNUM renumbers all residues so that they go +// incrementally-by-one without insertion codes +// PDBCLEAN_CHAIN_ORDER puts chains in order of atom's serial numbers +// PDBCLEAN_SOLVENT moves solvent chains at the end of each model +// PDBCLEAN_ELEMENT calculates PDB element names where they are not +// found in the chemical element table +// PDBCLEAN_ELEMENT_STRONG calculates all chemical element names +// +// Return codes (as bits): +// 0 Ok +// PDBCLEAN_CHAIN too many chains for assigning them 1-letter codes +// PDBCLEAN_ATNAME element names were not available +// PDBCLEAN_ALTCODE too many alternative codes encountered. +// +word RC; +int i,j,k,nal,nch,nr, nch1,nch2; +char c; +AltLoc * altLoc; +ChainID * chain_ID; +char aLoc [257]; +char chnID[257]; +int model,modl; +PPCAtom Atom1; +PPCChain Chain1,Chain2; +PCModel crModel0; +PCChain crChain0; +PCResidue crRes0; +PCAtom atom; +pstr chID; +ChainID chainID; +Boolean NewChain,Done,Solvent; + + RC = 0; + if (nAtoms<=0) return RC; + + if (CleanKey & PDBCLEAN_ATNAME) + for (i=0;iMakePDBAtomName()) RC |= PDBCLEAN_ATNAME; + + k = -1; + + if (CleanKey & PDBCLEAN_TER) { + model = -1; + crModel0 = crModel; + for (i=0;iGetModelNum(); + chID = Atom[i]->GetChainID (); + if (model<0) { + model = modl; + SwitchModel ( model ); + if (chID) strcpy ( chainID,chID ); + else chainID[0] = char(0); + } else { + if (model!=modl) NewChain = True; + else if (chID) NewChain = strcmp(chID,chainID)!=0; + else NewChain = chainID[0]!=char(0); + if (NewChain) { + if (k>=0) { + if ((!Atom[k]->Ter) && (!Atom[k]->Het)) { + // insert 'Ter' before atom in position 'i' + PutAtom ( -(i+1),Atom[k]->serNum+1,pstr("TER"), + Atom[k]->GetResName(),Atom[k]->GetChainID(), + Atom[k]->GetSeqNum (),Atom[k]->GetInsCode(), + pstr(" "),pstr(" "),pstr(" ") ); + Atom[i]->MakeTer(); + } + } + model = modl; + SwitchModel ( model ); + if (chID) strcpy ( chainID,chID ); + else chainID[0] = char(0); + } + } + k = i; + } + + if (k>=0) { + if ((!Atom[k]->Ter) && (!Atom[k]->Het)) { // add last TER + i = nAtoms; + SwitchModel ( Atom[k]->GetModelNum() ); + PutAtom ( 0,nAtoms+1,pstr("TER"),Atom[k]->GetResName(), + Atom[k]->GetChainID(),Atom[k]->GetSeqNum(), + Atom[k]->GetInsCode(),pstr(" "),pstr(" "), + pstr(" ") ); + Atom[i]->MakeTer(); + } + } + + crModel = crModel0; + } + + + if (CleanKey & (PDBCLEAN_CHAIN | PDBCLEAN_CHAIN_STRONG)) { + chain_ID = new ChainID[256]; + for (i=0;inChains;j++) { + crChain0 = Model[i]->Chain[j]; + if (crChain0) { + if (!crChain0->chainID[0]) + strcpy ( crChain0->chainID," " ); + k = 0; + while ((kchainID))) + k++; + if (k>=nch) { + if (nch>=255) RC |= PDBCLEAN_CHAIN; + else { + strcpy ( chain_ID[nch],crChain0->chainID ); + if (!chain_ID[nch][1]) + chnID[nch] = chain_ID[nch][0]; + nch++; + } + } + } + } + c = 'A'; + if (CleanKey & PDBCLEAN_CHAIN_STRONG) { + // rename all chains through from A to Z + for (k=0;knChains;j++) { + crChain0 = Model[i]->Chain[j]; + if (crChain0) { + k = 0; + while ((kchainID))) + k++; + strcpy ( crChain0->prevChainID,crChain0->chainID ); + crChain0->chainID[0] = chnID[k]; + crChain0->chainID[1] = char(0); + } + } + } + delete[] chain_ID; + } + + + if (CleanKey & (PDBCLEAN_ALTCODE | PDBCLEAN_ALTCODE_STRONG)) { + altLoc = new AltLoc[256]; + for (i=0;i<256;i++) { + strcpy ( altLoc[i]," " ); + aLoc[i] = char(0); + } + aLoc[0] = ' '; + aLoc[256] = char(0); + nal = 1; + for (i=0;ialtLoc[0]) strcpy ( Atom[i]->altLoc," " ); + else { + k = 0; + while ((kaltLoc))) k++; + if (k>=nal) { + if (nal>=255) RC |= PDBCLEAN_ALTCODE; + else { + strcpy ( altLoc[nal],Atom[i]->altLoc ); + if (!altLoc[nal][1]) aLoc[nal] = altLoc[nal][0]; + nal++; + } + } + } + } + c = 'A'; + if (CleanKey & PDBCLEAN_ALTCODE_STRONG) + for (i=1;ialtLoc))) k++; + Atom[i]->altLoc[0] = aLoc[k]; + Atom[i]->altLoc[1] = char(0); + } + delete[] altLoc; + } + + + if (CleanKey & PDBCLEAN_SEQNUM) + for (i=0;inChains;j++) { + crChain0 = crModel0->Chain[j]; + if (crChain0) { + nr = 0; + for (k=0;knResidues;k++) { + crRes0 = crChain0->Residue[k]; + if (crRes0) { + nr++; + crRes0->seqNum = nr; + crRes0->insCode[0] = char(0); + } + } + } + } + } + + if (CleanKey & PDBCLEAN_SOLVENT) { + Atom1 = new PCAtom[nAtoms]; + k = 1; + for (i=0;inChains>k) k = Model[i]->nChains; + } + Chain1 = new PCChain[k]; + Chain2 = new PCChain[k]; + k = 0; + for (i=0;inChains;nch++) { + crChain0 = crModel0->Chain[nch]; + if (crChain0) { + Solvent = False; + for (nr=0;(nrnResidues) && (!Solvent);nr++) { + crRes0 = crChain0->Residue[nr]; + if (crRes0) + for (j=0;(jname ); + } + if (Solvent) Chain2[nch2++] = crChain0; + else Chain1[nch1++] = crChain0; + } + } + for (nch=0;nchnResidues;nr++) { + crRes0 = crChain0->Residue[nr]; + if (crRes0) + for (j=0;jnAtoms;j++) + if (crRes0->atom[j]) { + Atom1[k] = crRes0->atom[j]; + Atom1[k]->index = k+1; + k++; + } + } + crModel0->Chain[nch] = Chain1[nch]; + } + for (nch=0;nchnResidues;nr++) { + crRes0 = crChain0->Residue[nr]; + if (crRes0) + for (j=0;jnAtoms;j++) + if (crRes0->atom[j]) { + Atom1[k] = crRes0->atom[j]; + Atom1[k]->index = k+1; + k++; + } + } + crModel0->Chain[nch1++] = Chain2[nch]; + } + crModel0->nChains = nch1; + } + } + delete[] Chain1; + delete[] Chain2; + if (Atom) delete[] Atom; + Atom = Atom1; + AtmLen = nAtoms; + nAtoms = k; + } + + if (CleanKey & (PDBCLEAN_CHAIN_ORDER | PDBCLEAN_CHAIN_ORDER_IX)) { + for (i=0;inChains;j++) { + crChain0 = crModel0->Chain[j]; + if (crChain0) { + crChain0->nWeights = 0; + crChain0->Weight = 0.0; + if (kChain[k] = crModel0->Chain[j]; + crModel0->Chain[j] = NULL; + } + k++; + } + } + crModel0->nChains = k; + } + } + if (CleanKey & PDBCLEAN_CHAIN_ORDER) + for (i=0;iGetChain(); + crChain0->nWeights++; + crChain0->Weight += Atom[i]->serNum; + } + else + for (i=0;iGetChain(); + crChain0->nWeights++; + crChain0->Weight += Atom[i]->GetIndex(); + } + for (i=0;inChains;j++) { + crChain0 = crModel0->Chain[j]; + if (crChain0->nWeights) + crChain0->Weight /= crChain0->nWeights; + } + // bubble sorting + do { + Done = True; + for (j=1;jnChains;j++) + if (crModel0->Chain[j-1]->Weight > + crModel0->Chain[j]->Weight) { + crChain0 = crModel0->Chain[j-1]; + crModel0->Chain[j-1] = crModel0->Chain[j]; + crModel0->Chain[j] = crChain0; + Done = False; + } + } while (!Done); + } + } + } + + if (CleanKey & PDBCLEAN_INDEX) { + k = 0; + for (i=0;inChains;nch++) { + crChain0 = crModel0->Chain[nch]; + if (crChain0) { + for (nr=0;nrnResidues;nr++) { + crRes0 = crChain0->Residue[nr]; + if (crRes0) { + for (j=0;jnAtoms;j++) { + atom = crRes0->atom[j]; + if (atom) { + Atom[atom->index-1] = Atom[k]; + if (Atom[k]) + Atom[k]->index = atom->index; + Atom[k] = atom; + k++; + atom->index = k; + } + } + } + } + } + } + } + } + nAtoms = k; + } + + if (CleanKey & PDBCLEAN_SERIAL) { + k = 0; + for (i=0;iindex = k+1; + Atom[k]->serNum = Atom[k]->index; + k++; + } + nAtoms = k; + } + + if (CleanKey & PDBCLEAN_ELEMENT) { + for (i=0;iTer)) { + if (getElementNo(Atom[i]->element)==ELEMENT_UNKNOWN) { + strcpy ( Atom[i]->element," " ); + Atom[i]->MakePDBAtomName(); + } + } + } + + if (CleanKey & PDBCLEAN_ELEMENT_STRONG) { + for (i=0;iTer)) { + strcpy ( Atom[i]->element," " ); + Atom[i]->MakePDBAtomName(); + } + } + + return RC; + +} + +void CMMDBFile::MakeHetAtoms ( cpstr chainID, Boolean Make ) { +// Makes all atoms in chain 'chainID', in all models, as 'Het' atoms +// if Make is set True, and makes them 'ordinary' atoms otherwise. +// 'Ter' is automatically removed when converting to 'Het' atoms, +// and is automatically added when converting to 'ordinary' atoms. +int i,j,k,l,n; +PCModel crModel0; +PCChain crChain0; +PCResidue crRes0; + crModel0 = crModel; + for (i=0;inChains;j++) { + crChain0 = Model[i]->Chain[j]; + if (crChain0) { + if (!strcmp(crChain0->chainID,chainID)) { + n = 0; + for (k=0;knResidues;k++) { + crRes0 = crChain0->Residue[k]; + if (crRes0) + for (l=0;lnAtoms;l++) + if (crRes0->atom[l]) { + crRes0->atom[l]->Het = Make; + n = crRes0->atom[l]->index; + } + } + if (n>0) { + n--; + if (Atom[n]->Het && Atom[n]->Ter) RemoveAtom ( n+1 ); + else if ((!Atom[n]->Het) && (!Atom[n]->Ter)) { + SwitchModel ( Model[i]->GetSerNum() ); + if (nserNum+1,pstr("TER"), + Atom[n]->GetResName(),Atom[n]->GetChainID(), + Atom[n]->GetSeqNum (),Atom[n]->GetInsCode(), + pstr(" "),pstr(" "),pstr(" ") ); + else + PutAtom ( 0,nAtoms+1,pstr("TER"), + Atom[n]->GetResName(),Atom[n]->GetChainID(), + Atom[n]->GetSeqNum (),Atom[n]->GetInsCode(), + pstr(" "),pstr(" "),pstr(" ") ); + Atom[n+1]->MakeTer(); + } + } + } + } + } + crModel = crModel0; +} + + +void CMMDBFile::RemoveAtom ( int index ) { +// Removes atom at the specified index in the Atom array. +// This index is always accessible as Atom[index]->index. +// If this leaves a residue empty, the residue is removed. +// If this leaves an empty chain, the chain is removed as well; +// the same happens to the model. +PCResidue crRes0; +PCChain crChain0; +PCModel crModel0; +int i,j; + + if ((index>0) && (index<=nAtoms)) { + if (Atom[index-1]) { + crRes0 = Atom[index-1]->residue; + if (crRes0) { + if (crRes0->_ExcludeAtom(index)) { + // the residue appears empty after the exclusion + if (crRes) { + if ((crRes->seqNum==crRes0->seqNum) && + (!strcmp(crRes->insCode,crRes0->insCode))) + crRes = NULL; + } + crChain0 = crRes0->chain; + if (crChain0) { + if (crChain0->_ExcludeResidue(crRes0->name,crRes0->seqNum, + crRes0->insCode)) { + // the chain appears empty after the exclusion + if (crChain) { + if (!strcmp(crChain->chainID,crChain0->chainID)) + crChain = NULL; + } + crModel0 = PCModel(crChain0->model); + if (crModel0) { + if (crModel0->_ExcludeChain(crChain0->chainID)) { + // the model appears ampty after the exclusion + if (crModel) { + if (crModel->serNum==crModel0->serNum) + crModel = NULL; + } + i = crModel0->serNum-1; + delete Model[i]; + Model[i] = NULL; + } + } + delete crChain0; // it is already excluded from the hierarchy! + } + } + delete crRes0; // it is already excluded from the hierarchy! + } + } + delete Atom[index-1]; // it is already excluded from the hierarchy! + Atom[index-1] = NULL; + // now rearrange and re-index atoms. + j = 0; + for (i=0;iindex = j+1; + j++; + } + nAtoms = j; + } + } +} + + +int CMMDBFile::_ExcludeModel ( int serNum ) { +// _ExcludeModel(..) excludes (but does not dispose!) a model +// from the file. Returns 1 if the file gets empty and 0 otherwise. +int i,k; + + if (!Exclude) return 0; + + if ((0serNum = k+1; + k++; + } + + nModels = k; + + if (nModels<=0) return 1; + else return 0; + +} + + +int CMMDBFile::FinishStructEdit() { +// Makes a new atom index after insertion or deletion of atoms. +// This function may change atoms' positions in the index and +// correspondingly the CAtom::index field. +PCResidue res; +PCChain chain; +PCModel model; +PPCAtom Atom1; +int i,j,k,l,n,index,nAtoms1; + + // calculate new number of atoms + nAtoms1 = 0; + for (i=0;inChains;j++) { + chain = model->Chain[j]; + if (chain) { + for (k=0;knResidues;k++) { + res = chain->Residue[k]; + if (res) { + res->TrimAtomTable(); + nAtoms1 += res->nAtoms; + } + } + chain->TrimResidueTable(); + } + } + model->TrimChainTable(); + } + } + TrimModelTable(); + + // compile a new index and null the old one + + if (nAtoms1>0) Atom1 = new PCAtom[nAtoms1]; + else Atom1 = NULL; + + n = 0; + for (i=0;inChains;j++) { + chain = model->Chain[j]; + for (k=0;knResidues;k++) { + res = chain->Residue[k]; + for (l=0;lnAtoms;l++) { + Atom1[n] = res->atom[l]; + index = Atom1[n]->index; + if ((index>0) && (index<=AtmLen)) + Atom[index-1] = NULL; + Atom1[n]->index = n+1; + n++; + } + } + } + } + +// if (n!=nAtoms1) { +// printf ( " **** PROGRAM ERROR IN CMMDBFile::FinishStructEdit\n" ); +// exit ( 1 ); +// } + + + // check if there are dead atoms in the old index + for (i=0;iserNum = j+1; + j++; + } + nModels = j; +} + + +int CMMDBFile::GenerateNCSMates() { +// +// Generates NCS mates according to NCS matrices given +// in Cryst. This will result in generating many-character +// chain names, composed as 'x_n' where 'x' is the original +// name and 'n' is a unique number, which will coincide with +// the symmetry operation (order) number. Another side +// effect will be a disorder in atoms' serial numbers. +// The hierarchy should therefore be cleaned after +// generating the NCS mates. An appropriate way to do that +// is to issue the following call: +// +// PDBCleanup ( PDBCLEAN_TER | PDBCLEAN_ALTCODE_STRONG | +// PDBCLEAN_CHAIN_STRONG | PDBCLEAN_SERIAL ); +// +PPCChain chainTable,chain; +PCChain chn; +mat44 ncs_m; +ChainID chainID; +int i,j,k,nNCSOps,nChains,iGiven; + + nNCSOps = Cryst.GetNumberOfNCSMatrices(); + if (nNCSOps<=0) return 1; + + for (i=0;iGetChainTable ( chainTable,nChains ); + if (nChains>0) { + chain = new PCChain[nChains]; + for (j=0;jCopy ( chain[j] ); + sprintf ( chainID,"%s_%i", + chain[j]->GetChainID(),k+1 ); + chn->SetChainID ( chainID ); + chn->ApplyTransform ( ncs_m ); + Model[i]->AddChain ( chn ); + } + } + } + delete[] chain; + } + } + + return 0; + +} + + +void CMMDBFile::ApplyNCSTransform ( int NCSMatrixNo ) { +mat33 t; +vect3 v; +int i; + if (!Cryst.GetNCSMatrix(NCSMatrixNo,t,v)) return; + for (i=0;iTransform ( t,v ); +} + + +int CMMDBFile::PutPDBString ( cpstr PDBString ) { +int RC; +PCContString ContString; + + strcpy ( S,PDBString ); // maintain the buffer! + PadSpaces ( S,80 ); + lcount++; + + // belongs to title? + RC = Title.ConvertPDBString ( S ); + if (RC!=Error_WrongSection) return RC; + + // belongs to primary structure section? + SwitchModel ( 1 ); + RC = crModel->ConvertPDBString ( S ); + if (RC!=Error_WrongSection) return RC; + + // belongs to the crystallographic information section? + RC = Cryst.ConvertPDBString ( S ); + if (RC!=Error_WrongSection) { +// if (RC==0) Cryst.CalcCoordTransforms(); + return RC; + } + + // belongs to the coordinate section? + RC = ReadPDBAtom ( S ); + if (RC!=Error_WrongSection) return RC; + + // temporary solution: the rest of file is stored + // in the form of strings + if ((S[0]) && (S[0]!=' ') && (strncmp(S,"END ",6))) { + // END is added automatically + ContString = new CContString(S); + SC.AddData ( ContString ); + } + + return 0; + +} + + +int CMMDBFile::AddPDBASCII1 ( cpstr PDBLFName, byte gzipMode ) { +pstr FName; + FName = getenv ( PDBLFName ); + if (FName) return AddPDBASCII ( FName,gzipMode ); + else return Error_NoLogicalName; +} + +int CMMDBFile::AddPDBASCII ( cpstr PDBFileName, byte gzipMode ) { +int RC; +CFile f; + // open the file as ASCII for reading + // opening it in pseudo-binary mode helps reading various + // line terminators for files coming from different platforms + f.assign ( PDBFileName,False,False,gzipMode ); + if (f.reset(True)) { + lcount = 1; // line counter + RC = 0; + while ((!f.FileEnd()) && (!RC)) { + ReadPDBLine ( f,S,sizeof(S) ); + RC = PutPDBString ( S ); + } + f.shut(); + } else + RC = Error_CantOpenFile; + return RC; +} + + +void CMMDBFile::GetInputBuffer ( pstr Line, int & count ) { + if (FType==MMDB_FILE_PDB) { // PDB File + strcpy ( Line,S ); + count = lcount; + } else if (FType==MMDB_FILE_CIF) { + if (!CIFErrorLocation[0]) { // CIF reading phase + strcpy ( Line,S ); + count = lcount; + } else { + strcpy ( Line,CIFErrorLocation ); + count = -1; // CIF interpretation phase + } + } else { + Line[0] = char(0); + count = -2; + } +} + + +int CMMDBFile::CrystReady() { +// Returns flags: +// CRRDY_Complete if crystallographic information is complete +// CRRDY_NotPrecise if cryst. inf-n is not precise +// CRRDY_isTranslation if cryst. inf-n contains translation +// CRRDY_NoOrthCode no orthogonalization code +// Fatal: +// CRRDY_NoTransfMatrices if transform. matrices were not calculated +// CRRDY_Unchecked if cryst. inf-n was not checked +// CRRDY_Ambiguous if cryst. inf-n is ambiguous +// CRRDY_NoCell if cryst. inf-n is unusable +// CRRDY_NoSpaceGroup if space group is not set +int k; + + if (!(Cryst.WhatIsSet & CSET_Transforms)) + return CRRDY_NoTransfMatrices; + + if ((Cryst.WhatIsSet & CSET_CellParams)!=CSET_CellParams) + return CRRDY_NoCell; + + if (!(Cryst.WhatIsSet & CSET_SpaceGroup)) + return CRRDY_NoSpaceGroup; + + if (Cryst.CellCheck & CCHK_Unchecked) + return CRRDY_Unchecked; + + if (Cryst.CellCheck & CCHK_Disagreement) + return CRRDY_Ambiguous; + + k = 0x0000; + if (Cryst.CellCheck & CCHK_Error) k |= CRRDY_NotPrecise; + if (Cryst.CellCheck & CCHK_Translations) k |= CRRDY_isTranslation; + if (Cryst.CellCheck & CCHK_NoOrthCode) k |= CRRDY_NoOrthCode; + + return k; + +} + + +Boolean CMMDBFile::isCrystInfo() { + return (((Cryst.WhatIsSet & CSET_CellParams)==CSET_CellParams) && + (Cryst.WhatIsSet & CSET_SpaceGroup)); +} + +Boolean CMMDBFile::isCellInfo() { + return ((Cryst.WhatIsSet & CSET_CellParams)==CSET_CellParams); +} + +Boolean CMMDBFile::isSpaceGroup() { + return (Cryst.WhatIsSet & CSET_SpaceGroup); +} + +Boolean CMMDBFile::isTransfMatrix() { + return Cryst.areMatrices(); +} + +Boolean CMMDBFile::isScaleMatrix() { + return ((Cryst.WhatIsSet & CSET_ScaleMatrix)==CSET_ScaleMatrix); +} + +Boolean CMMDBFile::isNCSMatrix() { + return Cryst.isNCSMatrix(); +} + +int CMMDBFile::AddNCSMatrix ( mat33 & ncs_m, vect3 & ncs_v, + int iGiven ) { + return Cryst.AddNCSMatrix ( ncs_m,ncs_v,iGiven ); +} + +int CMMDBFile::GetNumberOfNCSMatrices() { + return Cryst.GetNumberOfNCSMatrices(); +} + +int CMMDBFile::GetNumberOfNCSMates() { +// Returns the number of NCS mates not given in the file (iGiven==0) + return Cryst.GetNumberOfNCSMates(); +} + +Boolean CMMDBFile::GetNCSMatrix ( int NCSMatrixNo, // 0..N-1 + mat44 & ncs_m, int & iGiven ) { + return Cryst.GetNCSMatrix ( NCSMatrixNo,ncs_m,iGiven ); +} + +int CMMDBFile::ReadPDBAtom ( cpstr L ) { +// If string L belongs to the coordinate section +// (records ATOM, SIGATM, ANISOU, SIGUIJ, TER, HETATM), +// the correspondent information is retrieved and +// stored in the dynamic Atom array. In parallel, the +// structures of Model/Chain/Residue are generated and +// referenced to the corresponding Atom. +// If processing of L was successful, the return is 0, +// otherwise it returns the corresponding Error_XXX +// code. +// If L does not belong to the coordinate section, +// Error_WrongSection is returned. +int RC,index,i; + + if (!strncmp(L,"ATOM ",6)) { + + index = nAtoms+1; // index for the next atom in Atom array + RC = CheckAtomPlace ( index,L ); + if (!RC) RC = Atom[index-1]->ConvertPDBATOM ( index,L ); + + } else if (!strncmp(L,"SIGATM",6)) { + + index = nAtoms; // keep index! + RC = CheckAtomPlace ( index,L ); + if (!RC) RC = Atom[index-1]->ConvertPDBSIGATM ( index,L ); + + } else if (!strncmp(L,"ANISOU",6)) { + + index = nAtoms; // keep index + RC = CheckAtomPlace ( index,L ); + if (!RC) RC = Atom[index-1]->ConvertPDBANISOU ( index,L ); + + } else if (!strncmp(L,"SIGUIJ",6)) { + + index = nAtoms; // keep index + RC = CheckAtomPlace ( index,L ); + if (!RC) RC = Atom[index-1]->ConvertPDBSIGUIJ ( index,L ); + + } else if (!strncmp(L,"TER ",6)) { + + index = nAtoms+1; // new place in Atom array + RC = CheckAtomPlace ( index,L ); + if (!RC) RC = Atom[index-1]->ConvertPDBTER ( index,L ); + + } else if (!strncmp(L,"HETATM",6)) { + + index = nAtoms+1; // new place in Atom array + RC = CheckAtomPlace ( index,L ); + if (!RC) RC = Atom[index-1]->ConvertPDBHETATM ( index,L ); + + } else if (!strncmp(L,"MODEL ",6)) { + + modelCnt++; + RC = SwitchModel ( L ); + for (i=0;(iserNum==Model[i]->serNum) + RC = Error_DuplicatedModel; + } +// if (!RC) { +// if (crModel->serNum!=modelCnt) +// RC = Error_DuplicatedModel; +// } + + } else if (!strncmp(L,"ENDMDL",6)) { + + crModel = NULL; + crChain = NULL; + crRes = NULL; + + RC = 0; + + } else + return Error_WrongSection; + + return RC; + +} + + +int CMMDBFile::ReadCIFAtom ( PCMMCIFData CIFD ) { +PCMMCIFLoop Loop,LoopAnis; +int RC,i,index,nATS; + + Loop = CIFD->GetLoop ( CIFCAT_ATOM_SITE ); + if (!Loop) return 0; // no atom coordinates in the file + + LoopAnis = CIFD->GetLoop ( CIFCAT_ATOM_SITE_ANISOTROP ); + nATS = Loop->GetLoopLength(); + + for (i=1;i<=nATS;i++) { + // nAtoms and i should always coincide at this point. This piece + // of code was however left in order to reach identity with + // ReadPDBAtom(..). + index = nAtoms+1; // index for the next atom in Atom array + RC = CheckAtomPlace ( index,Loop ); + if (!RC) RC = Atom[index-1]->GetCIF ( i,Loop,LoopAnis ); + if (RC && (RC!=Error_CIF_EmptyRow)) return RC; + } + if (Flags & MMDBF_AutoSerials) + PDBCleanup ( PDBCLEAN_SERIAL ); + + return 0; + +} + +int CMMDBFile::PutAtom ( int index, + int serNum, + const AtomName atomName, + const ResName resName, + const ChainID chainID, + int seqNum, + const InsCode insCode, + const AltLoc altLoc, + const SegID segID, + const Element element ) { + +// An atom with the specified properties is put into the +// structure. The current model is used; if no model is +// set (crModel==NULL), one is created. Coordinates and +// other parameters of the atom need to be set separately. +// +// If index is positive and there is already an atom at +// this position in the system, the new atom will REPLACE +// it. The corresponding residues are automatically +// updated. +// +// If index is null (=0), the new atom will be put on +// the top of the structure, i.e. it will be put into +// (index=nAtoms+1)-th position. +// +// If index is negative, then the new atom is INSERTED +// BEFORE the atom in the (-index)th position. For +// saving the computational efforts, this WILL NOT cause +// the recalculation of all atoms' serial numbers +// according to their actual positions. It will be needed +// however to put the things in order by calling +// CMMDBFile::OrderAtoms() at a certain point, especially +// before writing an output ASCII file. NOTE that this +// ordering is never done automatically. +// +// Limitation: if PutAtom implies creating new +// chains/residues, these are always created on the top +// of existing chains/residues. + + +int i,kndex,RC; + + kndex = index; + + if (kndex<0) { // the new atom is to be inserted + + kndex = -kndex; + if (kndex>AtmLen) + ExpandAtomArray ( kndex+1000-AtmLen ); + + if (Atom[kndex-1]!=NULL) { // the position is occupied + + // expand the array if necessary + if (nAtoms>=AtmLen) + ExpandAtomArray ( IMax(kndex,nAtoms)+1000-AtmLen ); + + // now shift all atoms from (kndex-1)th to the end of array. + // note that this does not affect residues as they keep only + // pointers on atoms + for (i=nAtoms;i>=kndex;i--) { + Atom[i] = Atom[i-1]; + Atom[i]->index = i+1; // this is Ok because residues keep + // POINTERS rather than indices! + } + Atom[kndex-1] = NULL; + nAtoms++; + + } + + } + + if (kndex==0) kndex = nAtoms+1; + + if (!crModel) SwitchModel ( 1 ); + + + RC = AllocateAtom ( kndex,chainID,chainID,resName,resName, + seqNum,seqNum,1,insCode,True ); + if (!RC) + Atom[kndex-1]->SetAtomName ( kndex,serNum,atomName,altLoc, + segID,element ); + return RC; + +} + + +int CMMDBFile::PutAtom ( int index, // same meaning as above + PCAtom A, // pointer to completed atom + // class + int serNum // 0 means that the serial + // number will be set equal + // to "index". Otherwise, + // the serial number is set + // to the specified value + ) { +int i,kndex,RC,sn; + + if (!A) return -1; + + kndex = index; + + if (kndex<0) { // the new atom is to be inserted + + kndex = -kndex; + + if (kndex>AtmLen) + ExpandAtomArray ( kndex+1000-AtmLen ); + + if (Atom[kndex-1]!=NULL) { // the position is occupied + + // expand the array if necessary + if (nAtoms>=AtmLen) + ExpandAtomArray ( IMax(kndex,nAtoms)+1000-AtmLen ); + // now shift all atoms from (kndex-1)th to the end of array. + // note that this does not affect residues as they keep only + // pointers on atoms + + for (i=nAtoms;i>=kndex;i--) { + Atom[i] = Atom[i-1]; + Atom[i]->index = i+1; // this is Ok because residues keep + // POINTERS rather than indices! + } + + Atom[kndex-1] = NULL; + nAtoms++; + + } + + } + + if (kndex==0) kndex = nAtoms+1; + + + RC = AllocateAtom ( kndex,A->GetChainID(),A->GetLabelAsymID(), + A->GetResName(),A->GetLabelCompID(), + A->GetSeqNum (),A->GetLabelSeqID (), + A->GetLabelEntityID(),A->GetInsCode(), + True ); + + if (serNum<=0) sn = kndex; + else sn = serNum; + if (!RC) { + Atom[kndex-1]->Copy ( A ); + Atom[kndex-1]->serNum = sn; + } + + return RC; + +} + +int CMMDBFile::CheckInAtom ( int index, // same meaning as above + PCAtom A // pointer to completed + // atom class + ) { +int i,kndex; + + if (!A) return -1; + + kndex = index; + + if (kndex<0) { // the new atom is to be inserted + + kndex = -kndex; + + if (kndex>AtmLen) + ExpandAtomArray ( kndex+1000-AtmLen ); + + if (Atom[kndex-1]!=NULL) { // the position is occupied + + // expand the array if necessary + if (nAtoms>=AtmLen) + ExpandAtomArray ( IMax(kndex,nAtoms)+1000-AtmLen ); + // now shift all atoms from (kndex-1)th to the end of array. + // note that this does not affect residues as they keep only + // pointers on atoms + + for (i=nAtoms;i>=kndex;i--) { + Atom[i] = Atom[i-1]; + if (Atom[i]) + Atom[i]->index = i+1; // this is Ok because residues keep + // POINTERS rather than indices! + } + + } + + nAtoms++; + + } else { + if (kndex==0) kndex = nAtoms + 1; // add atom on the very top + if (kndex>AtmLen) ExpandAtomArray ( kndex+1000-AtmLen ); + if (kndex>nAtoms) nAtoms = kndex; + if (Atom[kndex-1]) delete Atom[kndex-1]; + } + + Atom[kndex-1] = A; + A->index = kndex; + + return 0; + +} + +int CMMDBFile::CheckInAtoms ( int index, // same meaning as above + PPCAtom A, // array of atoms to check in + int natms // number of atoms to check in + ) { +PPCAtom A1; +int i,j,k,k1,kndex; + + if (!A) return -1; + + A1 = NULL; + kndex = index; + + if (kndex<0) { // the new atoms are to be inserted + + kndex = -kndex; + + if (nAtoms+natms>=AtmLen) + ExpandAtomArray ( IMax(kndex,nAtoms)+1000+natms-AtmLen ); + + if (kndexindex = k+1; + k++; + } + + if (j>0) { + // insert removed atoms into the gap + nAtoms += j; + k1 = k+j; + for (i=nAtoms-1;i>=k1;i--) { + Atom[i] = Atom[i-j]; + if (Atom[i]) + Atom[i]->index = i+1; // this is Ok because residues keep + // POINTERS rather than indices! + } + for (i=0;iindex = k+1; + k++; + } + } + + delete[] A1; + + } else { + + if (kndex==0) kndex = nAtoms + 1; // add atom on the very top + k = kndex + natms; + if (k>AtmLen) ExpandAtomArray ( k+1000-AtmLen ); + kndex--; + for (i=0;iindex = kndex+1; + kndex++; + } + nAtoms = IMax(nAtoms,kndex); + + } + + return 0; + +} + + +int CMMDBFile::SwitchModel ( cpstr L ) { +int nM; + + if (!GetInteger(nM,&(L[10]),4)) + return Error_UnrecognizedInteger; + + return SwitchModel ( nM ); + +} + +int CMMDBFile::SwitchModel ( int nM ) { +PPCModel Mdl; +int i; +Boolean Transfer; + + if (nM<=0) + return Error_WrongModelNo; + + if (nM>nModels) { + if ((nModels==1) && Model[0]) Transfer = (nAtoms<=0); + else Transfer = False; + Mdl = new PCModel[nM]; + for (i=0;iSetMMDBManager ( PCMMDBManager(this),nM ); + + crModel = Model[nM-1]; + crChain = NULL; // new model - new chain + crRes = NULL; // new chain - new residue + + return 0; + +} + +int CMMDBFile::CheckAtomPlace ( int index, cpstr L ) { +// This function gets the residue/chain information stored +// in PDB string L (the records should start with the +// keywords ATOM, SIGATM, ANISOU, SIGUIJ, TER, HETATM) and +// sets the pointers crChain and crRes to the respective. +// chain and residue. If there is no chain/residue to place +// the atom in, these will be created. +// The function prepares place for the atom in the index-th +// cell of the Atom array, expanding it as necessary. If the +// corresponding element in the Atom array was not initialized, +// a CAtom class is created with reference to the current +// residue. +// This function DOES NOT check the PDB string L for +// atom keywords. +ResName resName; +int seqNum; +ChainID chainID; +InsCode insCode; + + // get the residue sequence number/ insert code + if (!GetIntIns(seqNum,insCode,&(L[22]),4)) { + if (strncmp(L,"TER ",6)) + return Error_UnrecognizedInteger; + else { // we allow for empty TER card here + seqNum = 0; + insCode[0] = char(1); // unprintable symbol! used as + // flag that TER card does not + // have serial number + insCode[1] = char(0); + } + } + + // get chain ID + if (L[20]!=' ') { + chainID[0] = L[20]; + chainID[1] = L[21]; + chainID[2] = char(0); + } else if (L[21]!=' ') { + chainID[0] = L[21]; + chainID[1] = char(0); + } else + chainID[0] = char(0); + + // get residue name + strcpy_ncss ( resName,&(L[17]),3 ); + if ((!resName[0]) && (!strncmp(L,"TER ",6))) { + insCode[0] = char(1); + insCode[1] = char(0); + } + + return AllocateAtom ( index ,chainID,chainID,resName,resName, + seqNum,seqNum,1,insCode,False ); + +} + +int CMMDBFile::CheckAtomPlace ( int index, PCMMCIFLoop Loop ) { +// Version of CheckAtomPlace(..) for reading from CIF file. +ResName resName,label_comp_id; +int seqNum ,label_seq_id,label_entity_id,RC,k,nM; +ChainID chainID,label_asym_id; +InsCode insCode; +pstr F; + + // Get the residue sequence number/insert code. They are + // removed from the file after reading. + k = index-1; +// if (!CIFGetInteger1(seqNum,Loop,CIFTAG_LABEL_SEQ_ID,k)) + if (!CIFGetInteger1(seqNum,Loop,CIFTAG_AUTH_SEQ_ID,k)) + CIFGetString ( insCode,Loop,CIFTAG_NDB_HELIX_CLASS_PDB,k, + sizeof(InsCode),pstr("") ); + else { + F = Loop->GetString ( CIFTAG_GROUP_PDB,k,RC ); + if ((!F) || (RC)) return Error_CIF_EmptyRow; + if (strcmp(F,"TER")) { + seqNum = MinInt4; // only at reading CIF we allow this + CIFGetString ( insCode,Loop,CIFTAG_NDB_HELIX_CLASS_PDB,k, + sizeof(InsCode),pstr("") ); + } else { // we allow for empty TER card here + seqNum = 0; + insCode[0] = char(1); // unprintable symbol! used as + // flag that TER card does not + // have serial number + insCode[1] = char(0); + } + } + + CIFGetInteger1 ( label_seq_id ,Loop,CIFTAG_LABEL_SEQ_ID ,k ); + CIFGetInteger1 ( label_entity_id,Loop,CIFTAG_LABEL_ENTITY_ID,k ); + + // get chain/residue ID + CIFGetString ( chainID,Loop,CIFTAG_AUTH_ASYM_ID,k, + sizeof(ChainID),pstr("") ); + CIFGetString ( resName,Loop,CIFTAG_AUTH_COMP_ID,k, + sizeof(ResName),pstr("") ); + + CIFGetString ( label_asym_id,Loop,CIFTAG_LABEL_ASYM_ID,k, + sizeof(ChainID),pstr("") ); + CIFGetString ( label_comp_id,Loop,CIFTAG_LABEL_COMP_ID,k, + sizeof(ResName),pstr("") ); + + if (!resName[0]) strcpy ( resName,label_comp_id ); + + if (!CIFGetInteger1(nM,Loop,CIFTAG_PDBX_PDB_MODEL_NUM,k)) { + if (crModel) { + if (nM!=crModel->serNum) SwitchModel ( nM ); + } else + SwitchModel ( nM ); + } + + return AllocateAtom ( index ,chainID,label_asym_id,resName, + label_comp_id,seqNum,label_seq_id, + label_entity_id,insCode,False ); + +} + + +int CMMDBFile::AllocateAtom ( int index, + const ChainID chainID, + const ChainID label_asym_id, + const ResName resName, + const ResName label_comp_id, + int seqNum, + int label_seq_id, + int label_entity_id, + const InsCode insCode, + Boolean Replace ) { + + if ((!resName[0]) && (insCode[0]!=char(1))) + return Error_EmptyResidueName; + + // check if there is a pointer to model + if (!crModel) { + // the model pointer was not set. Check if there are + // models already defined + if (!Model) + SwitchModel ( 1 ); // creates a model + else return Error_NoModel; + } + + if (crChain && (insCode[0]!=char(1))) { + // If crChain is not NULL, the model pointer was not + // changed and we may try to keep using crChain as + // pointer to the being-read chain. However, we must + // check that the record still belongs to the same chain. + // All this does not work if insCode[0] is set to 1 + // which indicates a special case of 'TER' card without + // parameters. + if (enforceUniqueChID) { + // enforcing unique chain IDs should be used only in case + // of multi-chain complexes where 1-letter chain IDs are + // not enough to accomodate all chains. Then chains are + // dynamically renamed like A0,A1,A2,.. etc. Therefore, we + // check only first symbol here. + if (chainID[0]!=crChain->chainID[0]) + crChain = NULL; // the chain has to be changed + } else if (strcmp(chainID,crChain->chainID)) + crChain = NULL; // the chain has to be changed + } + if (!crChain) { + // either the model or chain was changed -- get a new chain + if (allowDuplChID) + crChain = crModel->CreateChain ( chainID ); + else crChain = crModel->GetChainCreate ( chainID, + enforceUniqueChID ); + crRes = NULL; // new chain - new residue + } + + if (crRes && (insCode[0]!=char(1))) { + // If crRes is not NULL, neither the model nor chain were + // changed. Check if this record still belongs to the + // same residue. + // All this does not work if insCode[0] is set to 1 + // which indicates a special case of 'TER' card without + // parameters. + if ((seqNum!=crRes->seqNum) || + strcmp(insCode,crRes->insCode) || + strcmp(resName,crRes->name)) + crRes = NULL; // the residue has to be changed + } + if (!crRes) { + // either the chain or residue was changed -- get a new residue + crRes = crChain->GetResidueCreate ( resName,seqNum,insCode, + Flags & MMDBF_IgnoreDuplSeqNum ); + if (!crRes) return Error_DuplicateSeqNum; + } + + strcpy ( crRes->label_asym_id,label_asym_id ); + strcpy ( crRes->label_comp_id,label_comp_id ); + crRes->label_seq_id = label_seq_id; + crRes->label_entity_id = label_entity_id; + + // now check if there is place in the Atom array + if (index>AtmLen) + // there is no place, expand Atom by 1000 atom places at once + ExpandAtomArray ( index+1000-AtmLen ); + nAtoms = IMax(nAtoms,index); + + // delete the to-be-replaced atom if there is any + if (Replace && Atom[index-1]) { + delete Atom[index-1]; + Atom[index-1] = NULL; + } + if (!Atom[index-1]) { + Atom[index-1] = newCAtom(); + crRes->_AddAtom ( Atom[index-1] ); + Atom[index-1]->index = index; + } + + return 0; + +} + +void CMMDBFile::ExpandAtomArray ( int inc ) { +// Expands the Atom array by adding more inc positions. +// The length of Atom array is increased unconditionally. +PPCAtom Atom1; +int i; + AtmLen += inc; + Atom1 = new PCAtom[AtmLen]; + for (i=0;iAtmLen) { + AtmLen = nAtoms+inc; + Atom1 = new PCAtom[AtmLen]; + for (i=0;iPDBASCIIDumpPS ( f ); + + // output cispep records + for (i=0;iPDBASCIIDumpCP ( f ); + + SA .PDBASCIIDump ( f ); + Footnote.PDBASCIIDump ( f ); + Cryst .PDBASCIIDump ( f ); + SB .PDBASCIIDump ( f ); + + for (i=0;iPDBASCIIDump ( f ); + + SC.PDBASCIIDump ( f ); + + f.WriteLine ( pstr("END") ); + +} + + +int CMMDBFile::WriteCIFASCII1 ( cpstr CIFLFName, byte gzipMode ) { +pstr FName; + FName = getenv ( CIFLFName ); + if (FName) return WriteCIFASCII ( FName,gzipMode ); + else return Error_NoLogicalName; +} + +int CMMDBFile::WriteCIFASCII ( cpstr CIFFileName, byte gzipMode ) { +int i; + + if (!CIF) CIF = new CMMCIFData(); + CIF->SetStopOnWarning ( True ); + CIF->SetPrintWarnings ( (Flags & MMDBF_PrintCIFWarnings)!=0 ); + FType = MMDB_FILE_CIF; + + Title.MakeCIF ( CIF ); + + i = 0; + while (iMakePSCIF ( CIF ); + + Cryst.MakeCIF ( CIF ); + + for (i=0;iMakeAtomCIF ( CIF ); + + CIF->Optimize(); + CIF->WriteMMCIFData ( CIFFileName,gzipMode ); + + return 0; + +} + + +PCAtom CMMDBFile::GetAtomI ( int index ) { + if (index>nAtoms) return NULL; + if (index<1) return NULL; + if (!Atom) return NULL; + return Atom[index-1]; +} + + +#define MMDBFLabel "**** This is MMDB binary file ****" +#define Edition 1 + +int CMMDBFile::ReadMMDBF1 ( cpstr MMDBLFName, byte gzipMode ) { +pstr FName; + FName = getenv ( MMDBLFName ); + if (FName) return ReadCoorFile ( FName,gzipMode ); + else return Error_NoLogicalName; +} + +int CMMDBFile::ReadMMDBF ( cpstr MMDBFileName, byte gzipMode ) { +CFile f; +int rc; + + f.assign ( MMDBFileName,False,True,gzipMode ); + FType = MMDB_FILE_Binary; + if (f.reset(True)) { + rc = ReadMMDBF ( f ); + f.shut(); + } else + rc = Error_CantOpenFile; + + return rc; + +} + +int CMMDBFile::ReadMMDBF ( RCFile f ) { +char Label[100]; +byte Version; + + FType = MMDB_FILE_Binary; + f.ReadFile ( Label,sizeof(MMDBFLabel) ); + if (strncmp(Label,MMDBFLabel,sizeof(MMDBFLabel))) + return Error_ForeignFile; + + f.ReadByte ( &Version ); + if (Version>Edition) + return Error_WrongEdition; + + read ( f ); + + return 0; + +} + + +int CMMDBFile::WriteMMDBF1 ( cpstr MMDBLFName, byte gzipMode ) { +pstr FName; + FName = getenv ( MMDBLFName ); + if (FName) return WriteMMDBF ( FName,gzipMode ); + else return Error_NoLogicalName; +} + +int CMMDBFile::WriteMMDBF ( cpstr MMDBFileName, byte gzipMode ) { +char Label[100]; +byte Version=Edition; +CFile f; + + f.assign ( MMDBFileName,False,True,gzipMode ); + FType = MMDB_FILE_Binary; + if (f.rewrite()) { + strcpy ( Label,MMDBFLabel ); + f.WriteFile ( Label,sizeof(MMDBFLabel) ); + f.WriteByte ( &Version ); + write ( f ); + f.shut(); + } else + return Error_CantOpenFile; + + return 0; + +} + + +pstr CMMDBFile::GetEntryID() { + return Title.idCode; +} + +void CMMDBFile::SetEntryID ( const IDCode idCode ) { + strcpy ( Title.idCode,idCode ); +} + +void CMMDBFile::SetSyminfoLib ( cpstr syminfo_lib ) { + Cryst.SetSyminfoLib ( syminfo_lib ); +} + +pstr CMMDBFile::GetSyminfoLib() { + return Cryst.GetSyminfoLib(); +} + +int CMMDBFile::SetSpaceGroup ( cpstr spGroup ) { + return Cryst.SetSpaceGroup ( spGroup ); +} + +pstr CMMDBFile::GetSpaceGroup() { + return Cryst.GetSpaceGroup(); +} + +pstr CMMDBFile::GetSpaceGroupFix() { + return Cryst.GetSpaceGroupFix(); +} + +void CMMDBFile::GetAtomStatistics ( RSAtomStat AS ) { +int i; + AS.Init(); + for (i=0;iCalcAtomStatistics ( AS ); + AS.Finish(); +} + +void CMMDBFile::SetIgnoreSCALEi ( Boolean ignoreScalei ) { + Cryst.ignoreScalei = ignoreScalei; +} + +void CMMDBFile::SetCell ( realtype cell_a, + realtype cell_b, + realtype cell_c, + realtype cell_alpha, + realtype cell_beta, + realtype cell_gamma, + int OrthCode ) { + Cryst.SetCell ( cell_a,cell_b,cell_c,cell_alpha,cell_beta, + cell_gamma,OrthCode ); +} + +void CMMDBFile::PutCell ( realtype cell_a, + realtype cell_b, + realtype cell_c, + realtype cell_alpha, + realtype cell_beta, + realtype cell_gamma, + int OrthCode ) { + Cryst.PutCell ( cell_a,cell_b,cell_c,cell_alpha,cell_beta, + cell_gamma,OrthCode ); +} + +int CMMDBFile::GetCell ( realtype & cell_a, + realtype & cell_b, + realtype & cell_c, + realtype & cell_alpha, + realtype & cell_beta, + realtype & cell_gamma, + realtype & vol, + int & OrthCode ) { + if (Cryst.WhatIsSet & CSET_CellParams) { + Cryst.GetCell ( cell_a,cell_b,cell_c,cell_alpha,cell_beta, + cell_gamma,vol ); + OrthCode = Cryst.NCode + 1; + return 1; + } else { + cell_a = 0.0; cell_b = 0.0; cell_c = 0.0; + cell_alpha = 0.0; cell_beta = 0.0; cell_gamma = 0.0; + vol = 0.0; OrthCode = 0; + return 0; + } +} + +int CMMDBFile::GetRCell ( realtype & cell_as, + realtype & cell_bs, + realtype & cell_cs, + realtype & cell_alphas, + realtype & cell_betas, + realtype & cell_gammas, + realtype & vols, + int & OrthCode ) { + if (Cryst.WhatIsSet & CSET_CellParams) { + Cryst.GetRCell ( cell_as,cell_bs,cell_cs,cell_alphas,cell_betas, + cell_gammas,vols ); + OrthCode = Cryst.NCode + 1; + return 1; + } else { + cell_as = 0.0; cell_bs = 0.0; cell_cs = 0.0; + cell_alphas = 0.0; cell_betas = 0.0; cell_gammas = 0.0; + vols = 0.0; OrthCode = 0; + return 0; + } +} + +int CMMDBFile::GetNumberOfSymOps() { + if (Cryst.WhatIsSet & CSET_SpaceGroup) + return Cryst.GetNumberOfSymOps(); + else return 0; +} + +pstr CMMDBFile::GetSymOp ( int Nop ) { + return Cryst.GetSymOp ( Nop ); +} + + +void CMMDBFile::GetROMatrix ( mat44 & RO ) { + Mat4Copy ( Cryst.RO,RO ); +} + +int CMMDBFile::GetTMatrix ( mat44 & TMatrix, int Nop, + int cellshift_a, int cellshift_b, + int cellshift_c ) { +// GetTMatrix(..) calculates and returns the coordinate transformation +// matrix, which converts orthogonal coordinates according to +// the symmetry operation number Nop and places them into unit cell +// shifted by cellshift_a a's, cellshift_b b's and cellshift_c c's. +// +// Return 0 means everything's fine, +// 1 there's no symmetry operation Nop defined +// 2 fractionalizing/orthogonalizing matrices were not +// calculated +// 3 cell parameters were not set up. + return Cryst.GetTMatrix ( TMatrix,Nop,cellshift_a,cellshift_b, + cellshift_c,NULL ); +} + + +int CMMDBFile::GetUCTMatrix ( mat44 & TMatrix, int Nop, + realtype x, realtype y, realtype z, + int cellshift_a, int cellshift_b, + int cellshift_c ) { +// GetUCTMatrix(..) calculates and returns the coordinate +// transformation matrix, which converts orthogonal coordinates +// according to the symmetry operation number Nop. Translation +// part of the resulting matrix is being chosen such that point +// (x,y,z) has least distance to the center of primary (333) +// unit cell, and then it is shifted by cellshift_a a's, +// cellshift_b b's and cellshift_c c's. +// +// Return 0 means everything's fine, +// 1 there's no symmetry operation Nop defined +// 2 fractionalizing/orthogonalizing matrices were not +// calculated +// 3 cell parameters were not set up. + return Cryst.GetUCTMatrix ( TMatrix,Nop,x,y,z, + cellshift_a,cellshift_b,cellshift_c, + NULL ); +} + + +int CMMDBFile::GetFractMatrix ( mat44 & TMatrix, int Nop, + int cellshift_a, int cellshift_b, + int cellshift_c ) { +// GetFractMatrix(..) calculates and returns the coordinate +// transformation matrix, which converts fractional coordinates +// according to the symmetry operation number Nop and places them +// into unit cell shifted by cellshift_a a's, cellshift_b b's and +// cellshift_c c's. +// +// Return 0 means everything's fine, +// 1 there's no symmetry operation Nop defined +// 2 fractionalizing/orthogonalizing matrices were not +// calculated +// 3 cell parameters were not set up. + return Cryst.GetFractMatrix ( TMatrix,Nop,cellshift_a,cellshift_b, + cellshift_c,NULL ); +} + +int CMMDBFile::GetSymOpMatrix ( mat44 & TMatrix, int Nop ) { +// +// GetSymOpMatrix(..) returns the transformation matrix for +// Nop-th symmetry operator in the space group +// +// Return 0 means everything's fine, +// 1 there's no symmetry operation Nop defined +// 2 fractionalizing/orthogonalizing matrices were not +// calculated +// 3 cell parameters were not set up. +// + return Cryst.GetSymOpMatrix ( TMatrix,Nop ); +} + +// ------------- User-Defined Data ------------------------ + +int CMMDBFile::RegisterUDInteger ( int udr_type, cpstr UDDataID ) { + return UDRegister.RegisterUDInteger ( udr_type,UDDataID ); +} + +int CMMDBFile::RegisterUDReal ( int udr_type, cpstr UDDataID ) { + return UDRegister.RegisterUDReal ( udr_type,UDDataID ); +} + +int CMMDBFile::RegisterUDString ( int udr_type, cpstr UDDataID ) { + return UDRegister.RegisterUDString ( udr_type,UDDataID ); +} + +int CMMDBFile::GetUDDHandle ( int udr_type, cpstr UDDataID ) { + return UDRegister.GetUDDHandle ( udr_type,UDDataID ); +} + + + +// ---------------------------------------------------------- + +int CMMDBFile::DeleteAllModels() { +int i,k; + Exclude = False; + k = 0; + for (i=0;i=1) && (modelNo<=nModels)) { + if (Model[modelNo-1]) + return Model[modelNo-1]->GetNewChainID ( chID,length ); + } + return False; +} + +// ------------------------------------------------------------- + +PCMask CMMDBFile::GetSelMask ( int selHnd ) { +UNUSED_ARGUMENT(selHnd); + return NULL; +} + +// ------------------------------------------------------------- + +int CMMDBFile::GetNofExpDataRecs() { + return Title.ExpData.Length(); +} + +pstr CMMDBFile::GetExpDataRec ( int recNo ) { +PCExpData expData; + expData = PCExpData(Title.ExpData.GetContainerClass(recNo)); + if (expData) return expData->Line; + return NULL; +} + + +// ------------------------------------------------------------- + +int CMMDBFile::GetNofMdlTypeRecs() { + return Title.MdlType.Length(); +} + +pstr CMMDBFile::GetMdlTypeRec ( int recNo ) { +PCMdlType mdlType; + mdlType = PCMdlType(Title.MdlType.GetContainerClass(recNo)); + if (mdlType) return mdlType->Line; + return NULL; +} + + +// ------------------- Stream functions ---------------------- + +void CMMDBFile::Copy ( PCMMDBFile MMDBFile ) { +int i; + + Title.Copy ( &MMDBFile->Title ); + Cryst.Copy ( &MMDBFile->Cryst ); + + // It is important to copy atoms _before_ models, + // residues and chains! + Flags = MMDBFile->Flags; + nAtoms = MMDBFile->nAtoms; + AtmLen = nAtoms; + if (nAtoms>0) { + Atom = new PCAtom[AtmLen]; + for (i=0;iAtom[i]) { + Atom[i] = newCAtom(); + Atom[i]->Copy ( MMDBFile->Atom[i] ); + Atom[i]->index = i+1; + // the internal atom references are installed + // by residue classes when they are copied in + // model->chain below + } else + Atom[i] = NULL; + } + + nModels = MMDBFile->nModels; + if (nModels>0) { + Model = new PCModel[nModels]; + for (i=0;iModel[i]) { + Model[i] = newCModel(); + Model[i]->SetMMDBManager ( PCMMDBManager(this),i+1 ); + Model[i]->_copy ( MMDBFile->Model[i] ); + } else + Model[i] = NULL; + } + } + + SA .Copy ( &MMDBFile->SA ); + Footnote.Copy ( &MMDBFile->Footnote ); + SB .Copy ( &MMDBFile->SB ); + SC .Copy ( &MMDBFile->SC ); + + if (MMDBFile->CIF) { + CIF = new CMMCIFData; + CIF->Copy ( MMDBFile->CIF ); + } + +} + + + +// ------- user-defined data handlers + +int CMMDBFile::PutUDData ( int UDDhandle, int iudd ) { + if (UDDhandle & UDRF_HIERARCHY) + return CUDData::putUDData ( UDDhandle,iudd ); + else return UDDATA_WrongUDRType; +} + +int CMMDBFile::PutUDData ( int UDDhandle, realtype rudd ) { + if (UDDhandle & UDRF_HIERARCHY) + return CUDData::putUDData ( UDDhandle,rudd ); + else return UDDATA_WrongUDRType; +} + +int CMMDBFile::PutUDData ( int UDDhandle, cpstr sudd ) { + if (UDDhandle & UDRF_HIERARCHY) + return CUDData::putUDData ( UDDhandle,sudd ); + else return UDDATA_WrongUDRType; +} + +int CMMDBFile::GetUDData ( int UDDhandle, int & iudd ) { + if (UDDhandle & UDRF_HIERARCHY) + return CUDData::getUDData ( UDDhandle,iudd ); + else return UDDATA_WrongUDRType; +} + +int CMMDBFile::GetUDData ( int UDDhandle, realtype & rudd ) { + if (UDDhandle & UDRF_HIERARCHY) + return CUDData::getUDData ( UDDhandle,rudd ); + else return UDDATA_WrongUDRType; +} + +int CMMDBFile::GetUDData ( int UDDhandle, pstr sudd, int maxLen ) { + if (UDDhandle & UDRF_HIERARCHY) + return CUDData::getUDData ( UDDhandle,sudd,maxLen ); + else return UDDATA_WrongUDRType; +} + +int CMMDBFile::GetUDData ( int UDDhandle, pstr & sudd ) { + if (UDDhandle & UDRF_HIERARCHY) + return CUDData::getUDData ( UDDhandle,sudd ); + else return UDDATA_WrongUDRType; +} + + +pstr CMMDBFile::GetStructureTitle ( pstr & L ) { + return Title.GetStructureTitle ( L ); +} + +void CMMDBFile::SetShortBinary() { +// leaves only coordinates in binary files +int i; + for (i=0;iSetShortBinary(); +} + + +void CMMDBFile::write ( RCFile f ) { +int i,k; +byte Version=1; + + f.WriteByte ( &Version ); + + CUDData::write ( f ); + + Title .write ( f ); + Cryst .write ( f ); + UDRegister.write ( f ); + DefPath .write ( f ); + + f.WriteWord ( &Flags ); + f.WriteInt ( &nAtoms ); + for (i=0;iwrite ( f ); + } + + f.WriteInt ( &nModels ); + for (i=0;iwrite ( f ); + } + + SA .write ( f ); + Footnote.write ( f ); + SB .write ( f ); + SC .write ( f ); + + StreamWrite ( f,CIF ); + +} + +void CMMDBFile::read ( RCFile f ) { +int i,k; +byte Version; + + ResetManager (); + FreeFileMemory(); + + f.ReadByte ( &Version ); + + CUDData::read ( f ); + + Title .read ( f ); + Cryst .read ( f ); + UDRegister.read ( f ); + DefPath .read ( f ); + + // It is important to read atoms before models, + // residues and chains! + f.ReadWord ( &Flags ); + f.ReadInt ( &nAtoms ); + AtmLen = nAtoms; + if (nAtoms>0) { + Atom = new PCAtom[AtmLen]; + for (i=0;iread ( f ); + // the internal atom references are installed + // by residue classes when they are read in + // model->chain below + } else + Atom[i] = NULL; + } + } + + f.ReadInt ( &nModels ); + if (nModels>0) { + Model = new PCModel[nModels]; + for (i=0;iSetMMDBManager ( PCMMDBManager(this),0 ); + Model[i]->read ( f ); + } else + Model[i] = NULL; + } + } + + SA .read ( f ); + Footnote.read ( f ); + SB .read ( f ); + SC .read ( f ); + + StreamRead ( f,CIF ); + +} + + +MakeStreamFunctions(CMMDBFile) + + +int isMMDBBIN ( cpstr FName, byte gzipMode ) { +CFile f; +int rc; + + f.assign ( FName,False,True,gzipMode ); + if (f.reset(True)) { + rc = isMMDBBIN ( f ); + f.shut(); + } else + rc = -1; + + return rc; + +} + +int isMMDBBIN ( RCFile f ) { +char Label[100]; +byte Version; + + if (f.FileEnd()) + return Error_EmptyFile; + + f.ReadFile ( Label,sizeof(MMDBFLabel) ); + if (strncmp(Label,MMDBFLabel,sizeof(MMDBFLabel))) + return 1; + + f.ReadByte ( &Version ); + + if (Version>Edition) return 2; + else return 0; + +} + + +int isPDB ( cpstr FName, byte gzipMode, Boolean IgnoreBlankLines ) { +CFile f; +int rc; + + f.assign ( FName,False,False,gzipMode ); + if (f.reset(True)) { + // opening it in pseudo-binary mode helps reading various + // line terminators for files coming from different platforms + rc = isPDB ( f,IgnoreBlankLines ); + f.shut(); + } else + rc = -1; + + return rc; + +} + +int isPDB ( RCFile f, Boolean IgnoreBlankLines ) { +char S[256]; +int i; +Boolean Done; + + if (f.FileEnd()) + return Error_EmptyFile; + + do { + Done = True; + f.ReadLine ( S,sizeof(S)-1 ); + if (IgnoreBlankLines) { + i = 0; + while (S[i] && (S[i]==' ')) i++; + if (!S[i]) Done = False; + } + } while ((!f.FileEnd()) && (!Done)); + + PadSpaces ( S,80 ); + if (!strncasecmp(S,"HEADER",6)) return 0; + if (!strncasecmp(S,"OBSLTE",6)) return 0; + if (!strncasecmp(S,"TITLE ",6)) return 0; + if (!strncasecmp(S,"CAVEAT",6)) return 0; + if (!strncasecmp(S,"COMPND",6)) return 0; + if (!strncasecmp(S,"SOURCE",6)) return 0; + if (!strncasecmp(S,"KEYWDS",6)) return 0; + if (!strncasecmp(S,"EXPDTA",6)) return 0; + if (!strncasecmp(S,"AUTHOR",6)) return 0; + if (!strncasecmp(S,"REVDAT",6)) return 0; + if (!strncasecmp(S,"SPRSDE",6)) return 0; + if (!strncasecmp(S,"JRNL ",6)) return 0; + if (!strncasecmp(S,"REMARK",6)) return 0; + if (!strncasecmp(S,"DBREF ",6)) return 0; + if (!strncasecmp(S,"SEQADV",6)) return 0; + if (!strncasecmp(S,"SEQRES",6)) return 0; + if (!strncasecmp(S,"MODRES",6)) return 0; + if (!strncasecmp(S,"HET ",6)) return 0; + if (!strncasecmp(S,"HETNAM",6)) return 0; + if (!strncasecmp(S,"HETSYN",6)) return 0; + if (!strncasecmp(S,"FORMUL",6)) return 0; + if (!strncasecmp(S,"HELIX ",6)) return 0; + if (!strncasecmp(S,"SHEET ",6)) return 0; + if (!strncasecmp(S,"TURN ",6)) return 0; + if (!strncasecmp(S,"SSBOND",6)) return 0; + if (!strncasecmp(S,"LINK ",6)) return 0; + if (!strncasecmp(S,"HYDBND",6)) return 0; + if (!strncasecmp(S,"SLTBRG",6)) return 0; + if (!strncasecmp(S,"CISPEP",6)) return 0; + if (!strncasecmp(S,"SITE ",6)) return 0; + if (!strncasecmp(S,"CRYST1",6)) return 0; + if (!strncasecmp(S,"CRYST ",6)) return 0; + if (!strncasecmp(S,"ORIGX1",6)) return 0; + if (!strncasecmp(S,"ORIGX2",6)) return 0; + if (!strncasecmp(S,"ORIGX3",6)) return 0; + if (!strncasecmp(S,"SCALE1",6)) return 0; + if (!strncasecmp(S,"SCALE2",6)) return 0; + if (!strncasecmp(S,"SCALE3",6)) return 0; + if (!strncasecmp(S,"MTRIX1",6)) return 0; + if (!strncasecmp(S,"MTRIX2",6)) return 0; + if (!strncasecmp(S,"MTRIX3",6)) return 0; + if (!strncasecmp(S,"TVECT ",6)) return 0; + if (!strncasecmp(S,"MODEL ",6)) return 0; + if (!strncasecmp(S,"ATOM ",6)) return 0; + if (!strncasecmp(S,"SIGATM",6)) return 0; + if (!strncasecmp(S,"ANISOU",6)) return 0; + if (!strncasecmp(S,"SIGUIJ",6)) return 0; + if (!strncasecmp(S,"TER ",6)) return 0; + if (!strncasecmp(S,"HETATM",6)) return 0; + if (!strncasecmp(S,"ENDMDL",6)) return 0; + if (!strncasecmp(S,"CONECT",6)) return 0; + if (!strncasecmp(S,"MASTER",6)) return 0; + if (!strncasecmp(S,"END ",6)) return 0; + if (!strncasecmp(S,"USER ",6)) return 0; + + return 1; + +} diff --git a/mmdb/mmdb_file.h b/mmdb/mmdb_file.h new file mode 100755 index 0000000..6489fbd --- /dev/null +++ b/mmdb/mmdb_file.h @@ -0,0 +1,650 @@ +// $Id: mmdb_file.h,v 1.30 2012/01/26 17:52:20 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 16.05.13 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : MMDB_File +// ~~~~~~~~~ +// Project : MacroMolecular Data Base (MMDB) +// ~~~~~~~~~ +// **** Classes : CMMDBFile +// ~~~~~~~~~ +// +// (C) E. Krissinel 2000-2013 +// +// ================================================================= +// + +#ifndef __MMDB_File__ +#define __MMDB_File__ + + +#ifndef __File__ +#include "file_.h" +#endif + +#ifndef __mmdb_uddata__ +#include "mmdb_uddata.h" +#endif + +#ifndef __MMDB_Defs__ +#include "mmdb_defs.h" +#endif + +#ifndef __MMDB_Title__ +#include "mmdb_title.h" +#endif + +#ifndef __MMDB_Cryst__ +#include "mmdb_cryst.h" +#endif + +#ifndef __MMDB_Chain__ +#include "mmdb_chain.h" +#endif + +#ifndef __MMDB_Model__ +#include "mmdb_model.h" +#endif + + +// ======================= CMMDBFile =========================== + + +// special effect flags + +#define MMDBF_AutoSerials 0x00000001 +#define MMDBF_NoCoordRead 0x00000002 +#define MMDBF_SimRWBROOK 0x00000004 +#define MMDBF_PrintCIFWarnings 0x00000008 +#define MMDBF_EnforceSpaces 0x00000010 +#define MMDBF_IgnoreDuplSeqNum 0x00000020 +#define MMDBF_IgnoreSegID 0x00000040 +#define MMDBF_IgnoreElement 0x00000080 +#define MMDBF_IgnoreCharge 0x00000100 +#define MMDBF_IgnoreNonCoorPDBErrors 0x00000200 +#define MMDBF_IgnoreUnmatch 0x00000400 +#define MMDBF_IgnoreBlankLines 0x00000800 +#define MMDBF_IgnoreHash 0x00001000 +#define MMDBF_IgnoreRemarks 0x00002000 +#define MMDBF_AllowDuplChainID 0x00004000 +#define MMDBF_FixSpaceGroup 0x00008000 +#define MMDBF_EnforceAtomNames 0x00010000 +#define MMDBF_EnforceUniqueChainID 0x00020000 +#define MMDBF_DoNotProcessSpaceGroup 0x00040000 + +// MMDBF_EnforceUniqueChainID will make MMDB to rename chains on +// reading a file such as to maintain chains uniquesness. This +// is supposed to work only with 1-letter chain IDs and only +// if chain names are interchanged in the file. For example, +// if file contains a sequence of chains named +// +// A,B, A,B, A,B, A,B, A,B +// +// and this flag is set on, the resulting chain names in +// MMDB will be: +// +// A,B, A0,B0, A1,B1, A2,B2, A3,B3 +// + +// file types: +#define MMDB_FILE_Undefined -1 +#define MMDB_FILE_PDB 0 +#define MMDB_FILE_CIF 1 +#define MMDB_FILE_Binary 2 + +// cleanup flags: +#define PDBCLEAN_ATNAME 0x00000001 +#define PDBCLEAN_TER 0x00000002 +#define PDBCLEAN_CHAIN 0x00000004 +#define PDBCLEAN_CHAIN_STRONG 0x00000008 +#define PDBCLEAN_ALTCODE 0x00000010 +#define PDBCLEAN_ALTCODE_STRONG 0x00000020 +#define PDBCLEAN_SERIAL 0x00000040 +#define PDBCLEAN_SEQNUM 0x00000080 +#define PDBCLEAN_CHAIN_ORDER 0x00000100 +#define PDBCLEAN_CHAIN_ORDER_IX 0x00000200 +#define PDBCLEAN_SOLVENT 0x00000400 +#define PDBCLEAN_INDEX 0x00000800 +#define PDBCLEAN_ELEMENT 0x00001000 +#define PDBCLEAN_ELEMENT_STRONG 0x00002000 + + +// crystallographic info inquery +#define CRRDY_NotPrecise 0x00000001 +#define CRRDY_isTranslation 0x00000002 +#define CRRDY_NoOrthCode 0x00000004 + +#define CRRDY_Complete 0 +#define CRRDY_NoTransfMatrices -1 +#define CRRDY_Unchecked -2 +#define CRRDY_Ambiguous -3 +#define CRRDY_NoCell -4 +#define CRRDY_NoSpaceGroup -5 + + +DefineClass(CMMDBFile) +DefineStreamFunctions(CMMDBFile) + +class CMMDBFile : public CUDData { + + friend class CModel; + friend class CChain; + friend class CResidue; + friend class CAtom; + friend class CChannel; + + public : + + CMMDBFile (); + CMMDBFile ( RPCStream Object ); + ~CMMDBFile(); + + void FreeFileMemory(); + + + // --------------- Reading/Writing external files --------- + + void SetFlag ( word Flag ); + void RemoveFlag ( word Flag ); + + int ReadPDBASCII ( cpstr PDBFileName, + byte gzipMode=GZM_CHECK ); + int ReadPDBASCII1 ( cpstr PDBLFName, + byte gzipMode=GZM_CHECK ); + int ReadPDBASCII ( RCFile f ); + + int ReadCIFASCII ( cpstr CIFFileName, + byte gzipMode=GZM_CHECK ); + int ReadCIFASCII1 ( cpstr CIFLFName, + byte gzipMode=GZM_CHECK ); + int ReadCIFASCII ( RCFile f ); + int ReadFromCIF ( PCMMCIFData CIFD ); + + // adds info from PDB file + int AddPDBASCII1 ( cpstr PDBLFName, + byte gzipMode=GZM_CHECK ); + int AddPDBASCII ( cpstr PDBFileName, + byte gzipMode=GZM_CHECK ); + + // auto format recognition + int ReadCoorFile ( cpstr LFName, + byte gzipMode=GZM_CHECK ); + int ReadCoorFile1 ( cpstr CFName, + byte gzipMode=GZM_CHECK ); + int ReadCoorFile ( RCFile f ); + + int WritePDBASCII ( cpstr PDBFileName, + byte gzipMode=GZM_CHECK ); + int WritePDBASCII1 ( cpstr PDBLFName, + byte gzipMode=GZM_CHECK ); + void WritePDBASCII ( RCFile f ); + + int WriteCIFASCII ( cpstr CIFFileName, + byte gzipMode=GZM_CHECK ); + int WriteCIFASCII1 ( cpstr CIFLFName, + byte gzipMode=GZM_CHECK ); + + int ReadMMDBF ( cpstr MMDBFileName, + byte gzipMode=GZM_CHECK ); + int ReadMMDBF1 ( cpstr MMDBLFName, + byte gzipMode=GZM_CHECK ); + int ReadMMDBF ( RCFile f ); + int WriteMMDBF ( cpstr MMDBFileName, + byte gzipMode=GZM_CHECK ); + int WriteMMDBF1 ( cpstr MMDBLFName, + byte gzipMode=GZM_CHECK ); + + void GetInputBuffer ( pstr Line, int & count ); + + // PutPDBString adds a PDB-keyworded string + // to the existing structure. Note that the string + // is namely added meaning that it will be the + // last REMARK, last JRNL, last ATOM etc. string + // -- always the last one in its group. + int PutPDBString ( cpstr PDBString ); + + + + // PDBCleanup(..) cleans coordinate part to comply with PDB + // standards and MMDB "expectations": + // + // PDBCLEAN_ATNAME pads atom names with spaces to form + // 4-symbol names + // PDBCLEAN_TER inserts TER cards in the end of each chain + // PDBCLEAN_CHAIN generates 1-character chain ids instead of + // those many-character + // PDBCLEAN_CHAIN_STRONG generates 1-character chain ids starting + // from 'A' on for all ids, including the + // single-character ones + // PDBCLEAN_ALTCODE generates 1-character alternative codes + // instead of many-character ones + // PDBCLEAN_ALTCODE_STRONG generates 1-character alternative codes + // from 'A' on for all codes, including the + // single-character ones + // PDBCLEAN_SERIAL puts serial numbers in due order + // PDBCLEAN_SEQNUM renumbers all residues so that they go + // incrementally-by-one without insertion codes + // PDBCLEAN_CHAIN_ORDER puts chains in order of atom's serial + // numbers + // PDBCLEAN_CHAIN_ORDER_IX puts chains in order of atom's + // indices internal to MMDB + // PDBCLEAN_SOLVENT moves solvent chains at the end of each model + // + // Return codes (as bits): + // 0 Ok + // PDBCLEAN_CHAIN too many chains for assigning them + // 1-letter codes + // PDBCLEAN_ATNAME element names were not available + // PDBCLEAN_ALTCODE too many alternative codes encountered. + // + word PDBCleanup ( word CleanKey ); + + // Makes all atoms in chain 'chainID', in all models, as + // 'Het' atoms if Make is set True, and makes them 'ordinary' + // atoms otherwise. 'Ter' is automatically removed when + // converting to 'Het' atoms, and is automatically added + // when converting to 'ordinary' atoms. This may cause + // disorder in serial numbers -- just call + // PDBClean(PDBCLEAN_SERIAL) when necessary to fix this. + void MakeHetAtoms ( cpstr chainID, Boolean Make ); + + // --------------- Working with atoms by serial numbers --- + + PPCAtom GetAtomArray () { return Atom; } + int GetAtomArrayLength() { return AtmLen; } // strictly not for + // use in applications!! + PCAtom GetAtomI ( int index ); // returns Atom[index-1] + + // PutAtom(..) puts atom with the specified properties + // into the structure. The current model is used; if no model + // is set (crModel==NULL), one is created. Coordinates and + // other parameters of the atom need to be set separately. + // The place, at which the atom is put, is determined by + // index. If index is positive, then it points onto (index-1)th + // element of the Atom array (the index counts 1,2,... and + // generally coincides with the atom's serial number). If + // there is already an atom at this position in the system, + // the new atom will REPLACE it. The corresponding residues + // are automatically updated. + // If index is null (=0), the new atom will be put on + // the top of the structure, i.e. it will be put into + // (index=nAtoms+1)-th position. + // If index is negative, then the new atom is INSERTED + // BEFORE the atom in the (-index)th position. For saving + // the computational efforts, this WILL NOT cause the + // recalculation of all atoms' serial numbers according + // to their actual positions. It will be needed, however, + // for putting the things in order at a certain point, + // especially before writing an output ASCII file. NOTE + // that this ordering is never done automatically. + // In a correct PDB file the serial number (serNum) is always + // equal to its position (index). However here we allow them + // to be different for easing the management of relations, + // particularly the connectivity. + // + // Limitation: if PutAtom implies creating new + // chains/residues, these are always created on the top + // of existing chains/residues. + int PutAtom ( int index, + int serNum, + const AtomName atomName, + const ResName resName, + const ChainID chainID, + int seqNum, + const InsCode insCode, + const AltLoc altLoc, + const SegID segID, + const Element element ); + + int PutAtom ( + int index, // same meaning as above + PCAtom A, // pointer to completed atom class + int serNum=0 // 0 means that the serial number + // will be set equal to index. + // Otherwise the serial number + // is set to the specified + // value + ); + + + // RemoveAtom(..) removes atom at the specified index + // in the Atom array. This index is always accessible + // as Atom[index]->index. If this leaves a residue empty, + // the residue is removed. If this leaves an empty chain, + // the chain is removed as well; the same happens to the + // model. + void RemoveAtom ( int index ); + + int FinishStructEdit(); + + void TrimModelTable(); + + // ---------------- Deleting models ----------------------- + + int DeleteAllModels (); + Boolean GetNewChainID ( int modelNo, ChainID chID, int length=1 ); + + // --------------- Enquiring ------------------------------- + + int CrystReady(); + // Returns flags: + // CRRDY_Complete if crystallographic information is complete + // CRRDY_NotPrecise if cryst. inf-n is not precise + // CRRDY_isTranslation if cryst. inf-n contains translation + // CRRDY_NoOrthCode no orthogonalization code + // Fatal: + // CRRDY_NoTransfMatrices if transform. matrices were not + // calculated + // CRRDY_Unchecked if cryst. inf-n was not checked + // CRRDY_Ambiguous if cryst. inf-n is ambiguous + // CRRDY_NoCell if cryst. inf-n is unusable + // CRRDY_NoSpaceGroup if space group is not set + + + Boolean isCrystInfo (); // cell parameters and space group + Boolean isCellInfo (); // cell param-s a,b,c, alpha,beta,gamma + Boolean isSpaceGroup (); // space group on CRYST1 card + Boolean isTransfMatrix(); // orthogonalizing/fractionalizing + // matrices + Boolean isScaleMatrix (); // SCALEx PDB records + Boolean isNCSMatrix (); // MTRIXx PDB records + int GetNumberOfNCSMatrices(); + int GetNumberOfNCSMates (); // Returns the number of + // NCS mates not given in + // the file (iGiven==0) + Boolean GetNCSMatrix ( int NCSMatrixNo, // 0..N-1 + mat44 & ncs_m, int & iGiven ); + + int GetNumberOfSymOps (); // number of symmetry operations + pstr GetSymOp ( int Nop ); // XYZ symmetry operation name + + + // ------------- User-Defined Data ------------------------ + + int RegisterUDInteger ( int udr_type, cpstr UDDataID ); + int RegisterUDReal ( int udr_type, cpstr UDDataID ); + int RegisterUDString ( int udr_type, cpstr UDDataID ); + int GetUDDHandle ( int udr_type, cpstr UDDataID ); + + // ---------------------------------------------------------- + + void SetSyminfoLib ( cpstr syminfo_lib ); + pstr GetSyminfoLib (); + int SetSpaceGroup ( cpstr spGroup ); + pstr GetSpaceGroup (); + pstr GetSpaceGroupFix(); + + void GetAtomStatistics ( RSAtomStat AS ); + + void SetIgnoreSCALEi ( Boolean ignoreScalei ); + + // SetCell(..) is for changing cell parameters + void SetCell ( realtype cell_a, + realtype cell_b, + realtype cell_c, + realtype cell_alpha, + realtype cell_beta, + realtype cell_gamma, + int OrthCode=0 ); + + // PutCell(..) is for setting cell parameters + void PutCell ( realtype cell_a, + realtype cell_b, + realtype cell_c, + realtype cell_alpha, + realtype cell_beta, + realtype cell_gamma, + int OrthCode=0 ); + + int GetCell ( realtype & cell_a, + realtype & cell_b, + realtype & cell_c, + realtype & cell_alpha, + realtype & cell_beta, + realtype & cell_gamma, + realtype & vol, + int & OrthCode ); + + int GetRCell ( realtype & cell_as, + realtype & cell_bs, + realtype & cell_cs, + realtype & cell_alphas, + realtype & cell_betas, + realtype & cell_gammas, + realtype & vols, + int & OrthCode ); + + void GetROMatrix ( mat44 & RO ); + + // GetTMatrix(..) calculates and returns the coordinate + // transformation matrix, which converts orthogonal coordinates + // according to the symmetry operation number Nop and places + // them into unit cell shifted by cellshift_a a's, cellshift_b + // b's and cellshift_c c's. + // + // Return 0 means everything's fine, + // 1 there's no symmetry operation Nop defined + // 2 fractionalizing/orthogonalizing matrices were not + // calculated + // 3 cell parameters were not set up. + int GetTMatrix ( mat44 & TMatrix, int Nop, + int cellshift_a, int cellshift_b, + int cellshift_c ); + + // GetUCTMatrix(..) calculates and returns the coordinate + // transformation matrix, which converts orthogonal coordinates + // according to the symmetry operation number Nop. Translation + // part of the matrix is being chosen such that point (x,y,z) + // has least distance to the center of primary (333) unit cell, + // and then it is shifted by cellshift_a a's, cellshift_b b's and + // cellshift_c c's. + // + // Return 0 means everything's fine, + // 1 there's no symmetry operation Nop defined + // 2 fractionalizing/orthogonalizing matrices were not + // calculated + // 3 cell parameters were not set up. + int GetUCTMatrix ( mat44 & TMatrix, int Nop, + realtype x, realtype y, realtype z, + int cellshift_a, int cellshift_b, + int cellshift_c ); + + // GetFractMatrix(..) calculates and returns the coordinate + // transformation matrix, which converts fractional coordinates + // according to the symmetry operation number Nop and places them + // into unit cell shifted by cellshift_a a's, cellshift_b b's + // and cellshift_c c's. + // + // Return 0 means everything's fine, + // 1 there's no symmetry operation Nop defined + // 2 fractionalizing/orthogonalizing matrices were not + // calculated + // 3 cell parameters were not set up. + int GetFractMatrix ( mat44 & TMatrix, int Nop, + int cellshift_a, int cellshift_b, + int cellshift_c ); + + + // GetSymOpMatrix(..) returns the transformation matrix for + // Nop-th symmetry operator in the space group + // + // Return 0 means everything's fine, + // 1 there's no symmetry operation Nop defined + // 2 fractionalizing/orthogonalizing matrices were not + // calculated + // 3 cell parameters were not set up. + // + int GetSymOpMatrix ( mat44 & TMatrix, int Nop ); + + + int AddNCSMatrix ( mat33 & ncs_m, vect3 & ncs_v, int iGiven ); + int GenerateNCSMates(); // 1: no NCS matrices, 0: Ok + + pstr GetEntryID (); + void SetEntryID ( const IDCode idCode ); + + int GetNofExpDataRecs(); + pstr GetExpDataRec ( int recNo ); // 0.. on + + int GetNofMdlTypeRecs(); + pstr GetMdlTypeRec ( int recNo ); // 0.. on + + int GetFileType() { return FType; } + + void Copy ( PCMMDBFile MMDBFile ); + + void SetShortBinary(); // leaves only coordinates in binary files + + // ------- user-defined data handlers + int PutUDData ( int UDDhandle, int iudd ); + int PutUDData ( int UDDhandle, realtype rudd ); + int PutUDData ( int UDDhandle, cpstr sudd ); + + int GetUDData ( int UDDhandle, int & iudd ); + int GetUDData ( int UDDhandle, realtype & rudd ); + int GetUDData ( int UDDhandle, pstr sudd, int maxLen ); + int GetUDData ( int UDDhandle, pstr & sudd ); + + // GetStructureTitle() returns the contents of TITLE record + // unfolded into single line. If Title is missing, returns + // contents of COMPND(:MOLECULE). If COMPND is missing, returns + // HEADER. If Header is missing, returns PDB code. If no PDB + // code is there, returns "Not available". + pstr GetStructureTitle ( pstr & L ); + + protected : + + word Flags; // special effect flags + int FType; // type of last file operation: + // -1 : none + // 0 : PDB + // 1 : CIF + // 2 : BIN + // encoded as MMDB_FILE_XXXXX above + + CMMDBTitle Title; // title section + CMMDBCryst Cryst; // crystallographic information section + CUDRegister UDRegister; // register of user-defined data + + int nModels; // number of models + PPCModel Model; // array of models [0..nModels-1] + + int nAtoms; // number of atoms + int AtmLen; // length of Atom array + PPCAtom Atom; // array of atoms ordered by serial numbers + + CAtomPath DefPath; // default coordinate path + + CClassContainer SA; // string container for unrecognized strings + // which are between the title and the + // crystallographic sections + CClassContainer Footnote; // string container for footnotes + CClassContainer SB; // string container for unrecognized strings + // which are between the crystallographic and + // the coordinate sections + CClassContainer SC; // string container for unrecognized strings + // following the coordinate section + + // input buffer + int lcount; // input line counter + char S[500]; // read buffer + PCMMCIFData CIF; // CIF file manager + + PCModel crModel; // current model, used at reading a PDB file + PCChain crChain; // current chain, used at reading a PDB file + PCResidue crRes; // current residue, used at reading a PDB file + + Boolean Exclude; // used internally + Boolean ignoreRemarks; // used temporarily + Boolean allowDuplChID; // used temporarily + Boolean enforceUniqueChID; // used temporarily + + void InitMMDBFile (); + void FreeCoordMemory (); + void ReadPDBLine ( RCFile f, pstr L, int maxlen ); + int ReadPDBAtom ( cpstr L ); + int ReadCIFAtom ( PCMMCIFData CIFD ); + int CheckAtomPlace ( int index, cpstr L ); + int CheckAtomPlace ( int index, PCMMCIFLoop Loop ); + int SwitchModel ( cpstr L ); + int SwitchModel ( int nM ); + int AllocateAtom ( int index, + const ChainID chainID, + const ChainID label_asym_id, + const ResName resName, + const ResName label_comp_id, + int seqNum, + int label_seq_id, + int label_entity_id, + const InsCode insCode, + Boolean Replace ); + void ExpandAtomArray ( int inc ); + void AddAtomArray ( int inc ); + + void ApplyNCSTransform ( int NCSMatrixNo ); + + virtual void ResetManager(); + + // --------------- Stream I/O ----------------------------- + void write ( RCFile f ); + void read ( RCFile f ); + + // don't use _ExcludeModel in your applications! + int _ExcludeModel ( int serNum ); + + int CheckInAtom ( int index, PCAtom A ); + int CheckInAtoms ( int index, PPCAtom A, int natms ); + + virtual PCMask GetSelMask ( int selHnd ); + + private : + int modelCnt; // used only at reading files + +}; + + + +// isMMDBBIN will return +// -1 if file FName does not exist +// 0 if file FName is likely a MMDB BIN (binary) file +// 1 if file FName is not a MMDB BIN (binary) file +// 2 if file FName is likely a MMDB BIN (binary) file, +// but of a wrong edition (i.e. produced by a lower +// version of MMDB). +extern int isMMDBBIN ( cpstr FName, byte gzipMode=GZM_CHECK ); +extern int isMMDBBIN ( RCFile f ); + +// isPDB will return +// -1 if file FName does not exist +// 0 if file FName is likely a PDB file +// 1 if file FName is not a PDB file +extern int isPDB ( cpstr FName, byte gzipMode=GZM_CHECK, + Boolean IgnoreBlankLines=False ); +extern int isPDB ( RCFile f, Boolean IgnoreBlankLines=False ); + +#endif + diff --git a/mmdb/mmdb_graph.cpp b/mmdb/mmdb_graph.cpp new file mode 100755 index 0000000..d598dbf --- /dev/null +++ b/mmdb/mmdb_graph.cpp @@ -0,0 +1,2460 @@ +// $Id: mmdb_graph.cpp,v 1.25 2012/01/26 17:52:20 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 22.05.12 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : mmdb_graph +// ~~~~~~~~~ +// **** Classes : CVertex ( graph vertex ) +// ~~~~~~~~~ CEdge ( graph edge ) +// CGraph ( structural graph ) +// CMatch ( match of structural graphs ) +// CGraphMatch ( CSIA algorithms for graph matching ) +// +// (C) E. Krissinel 2000-2012 +// +// When used, please cite: +// +// Krissinel, E. and Henrick, K. (2004) +// Common subgraph isomorphism detection by backtracking search. +// Software - Practice and Experience, 34, 591-607. +// +// ================================================================= +// + +#ifndef __STDLIB_H +#include +#endif + +#ifndef __STRING_H +#include +#endif + +#ifndef __MMDB_Graph__ +#include "mmdb_graph.h" +#endif + +#ifndef __MMDB_Tables__ +#include "mmdb_tables.h" +#endif + + +// ========================== CVertex ============================ + +CVertex::CVertex() : CStream() { + InitVertex(); +} + +CVertex::CVertex ( RPCStream Object ) : CStream(Object) { + InitVertex(); +} + +CVertex::CVertex ( cpstr chem_elem ) + : CStream() { + InitVertex(); + SetVertex ( chem_elem ); +} + +CVertex::CVertex ( int vtype ) + : CStream() { + InitVertex(); + SetVertex ( vtype ); +} + +CVertex::CVertex ( int vtype, cpstr vname ) + : CStream() { + InitVertex(); + SetVertex ( vtype,vname ); +} + +CVertex::CVertex ( cpstr chem_elem, cpstr vname ) + : CStream() { + InitVertex (); + SetVertex ( chem_elem ); + CreateCopy ( name,vname ); +} + +CVertex::~CVertex() { + if (name) delete[] name; +} + +void CVertex::InitVertex() { + name = NULL; + type = 0; + type_ext = 0; + property = 0; + id = 0; + user_id = 0; +} + + +void CVertex::SetVertex ( cpstr chem_elem ) { +// This function generates vertex type according to a chemical +// element name passed in chem_elem. +// +// The element type has the following meaning: +// +// 0xCHSSTTTT +// +// where +// T - resreved for elemenmt type +// S - resreved for symmetry relief +// H - reserved for hydrogen bonds +// C - resreved for chirality flags +// +// Note that when more than 2 symbols are used for chemical element +// name (custom use), fields S may be reallocated for element type +// and then symmetry relief becomes impossible. +// + CreateCopy ( name,chem_elem ); + type = getElementNo ( chem_elem ); + if (type==ELEMENT_UNKNOWN) { + type = 0; + if (name[0]) { + type = (int)name[0]; + if (name[1]) { + type = type*256+(int)name[1]; + if (name[2]) type = type*256+(int)name[2]; + } + } + type += nElementNames; + } +} + +void CVertex::SetVertex ( int vtype ) { +// This function sets vertex type. See comments above for +// the general rule for vertex types implied by this code. +char N[50]; +int type0; + type = vtype; + type0 = vtype & TYPE_MASK; + if ((type0>=1) && (type0<=nElementNames)) + CreateCopy ( name,ElementName[type0-1] ); + else { + sprintf ( N,"%i",type ); + CreateCopy ( name,N ); + } +} + +void CVertex::SetType ( int vtype ) { + type = vtype; +} + +void CVertex::SetTypeExt ( int typeExt ) { + type_ext = typeExt; +} + +void CVertex::SetVertex ( int vtype, cpstr vname ) { + type = vtype; + CreateCopy ( name,vname ); +} + +void CVertex::SetName ( cpstr vname ) { + CreateCopy ( name,vname ); +} + +void CVertex::SetID ( int vid ) { + id = vid; +} + +void CVertex::SetProperty ( int vprop ) { + property = vprop; +} + +int CVertex::GetNBonds() { + return ((type & HYDROGEN_BOND) >> 24); +} + +void CVertex::AddBond() { +int nb = GetNBonds()+1; + type &= ~HYDROGEN_BOND; + type |= nb << 24; +} + +void CVertex::CopyNBonds ( PCVertex V ) { +int nb = V->GetNBonds(); + type &= ~HYDROGEN_BOND; + type |= nb << 24; +} + +void CVertex::RemoveChirality() { + type &= CHIRAL_MASK; +} + +void CVertex::LeaveChirality ( int eltype ) { +// leaves chirality only on specified elements +int vtype; + vtype = type & CHIRAL_MASK; + if (vtype!=eltype) type = vtype; +} + +void CVertex::SaveType() { + user_id = type; +} + +void CVertex::RestoreType() { + type = user_id; +} + +void CVertex::CopyType ( PCVertex V ) { + type = V->type; +} + + +void CVertex::Print ( int PKey ) { + if (PKey!=0) + printf ( " name type" ); + else printf ( " %10s %5i",name,type ); +} + +void CVertex::Copy ( PCVertex V ) { + CreateCopy ( name,V->name ); + type = V->type; + type_ext = V->type_ext; + property = V->property; + id = V->id; + user_id = V->user_id; +} + +void CVertex::write ( RCFile f ) { +int Version=2; + f.WriteInt ( &Version ); + f.CreateWrite ( name ); + f.WriteInt ( &type ); + f.WriteInt ( &property ); + f.WriteInt ( &id ); + f.WriteInt ( &user_id ); + f.WriteInt ( &type_ext ); +} + +void CVertex::read ( RCFile f ) { +int Version; + f.ReadInt ( &Version ); + f.CreateRead ( name ); + f.ReadInt ( &type ); + f.ReadInt ( &property ); + f.ReadInt ( &id ); + f.ReadInt ( &user_id ); + if (Version>1) f.ReadInt ( &type_ext ); + else type_ext = 0; +} + +void CVertex::mem_write ( pstr S, int & l ) { +byte Version=2; + ::mem_write_byte ( Version,S,l ); + ::mem_write ( name ,S,l ); + ::mem_write ( type ,S,l ); + ::mem_write ( property,S,l ); + ::mem_write ( id ,S,l ); + ::mem_write ( user_id ,S,l ); + ::mem_write ( type_ext,S,l ); +} + +void CVertex::mem_read ( cpstr S, int & l ) { +byte Version; + ::mem_read_byte ( Version,S,l ); + ::mem_read ( name ,S,l ); + ::mem_read ( type ,S,l ); + ::mem_read ( property,S,l ); + ::mem_read ( id ,S,l ); + ::mem_read ( user_id ,S,l ); + ::mem_read ( type_ext,S,l ); +} + +MakeStreamFunctions(CVertex); + + + +// =========================== CEdge ============================= + +CEdge::CEdge() : CStream() { + InitEdge(); +} + +CEdge::CEdge ( RPCStream Object ) : CStream(Object) { + InitEdge(); +} + +CEdge::CEdge ( int vx1, int vx2, int btype ) { + InitEdge(); + SetEdge ( vx1,vx2,btype ); +} + +CEdge::~CEdge() {} + +void CEdge::InitEdge() { + v1 = 0; + v2 = 0; + type = 0; + property = 0; +} + + +#define NofBondTypes 4 + +static pstr BondType[NofBondTypes+1] = { + pstr("SING"), pstr("DOUB"), pstr("AROM"), pstr("TRIP"), + pstr("") // should be here for safety +}; + + +void CEdge::SetEdge ( int vx1, int vx2, cpstr btype ) { + v1 = vx1; + v2 = vx2; + type = 0; + while (type=NofBondTypes) { + type = 0; + if (btype[0]) type = (int)btype[0]; + if (btype[1]) type = type*16+(int)btype[1]; + if (btype[2]) type = type*16+(int)btype[2]; + type += NofBondTypes; + } + type++; +} + +void CEdge::SetEdge ( int vx1, int vx2, int btype ) { + v1 = vx1; + v2 = vx2; + type = btype; +} + +void CEdge::SetType ( int btype ) { + type = btype; +} + +void CEdge::SetProperty ( int eprop ) { + property = eprop; +} + +void CEdge::SaveType() { + property = type; +} + +void CEdge::RestoreType() { + type = property; +} + +void CEdge::Print ( int PKey ) { + if (PKey!=0) + printf ( " v1 v2 type" ); + else printf ( " %5i %5i %5i",v1,v2,type ); +} + +void CEdge::Copy ( PCEdge G ) { + v1 = G->v1; + v2 = G->v2; + type = G->type; + property = G->property; +} + +void CEdge::write ( RCFile f ) { +int Version=1; + f.WriteInt ( &Version ); + f.WriteInt ( &v1 ); + f.WriteInt ( &v2 ); + f.WriteInt ( &type ); + f.WriteInt ( &property ); +} + +void CEdge::read ( RCFile f ) { +int Version; + f.ReadInt ( &Version ); + f.ReadInt ( &v1 ); + f.ReadInt ( &v2 ); + f.ReadInt ( &type ); + f.ReadInt ( &property ); +} + +void CEdge::mem_write ( pstr S, int & l ) { +byte Version=1; + ::mem_write_byte ( Version,S,l ); + ::mem_write ( v1 ,S,l ); + ::mem_write ( v2 ,S,l ); + ::mem_write ( type ,S,l ); + ::mem_write ( property,S,l ); +} + +void CEdge::mem_read ( cpstr S, int & l ) { +byte Version; + ::mem_read_byte ( Version,S,l ); + ::mem_read ( v1 ,S,l ); + ::mem_read ( v2 ,S,l ); + ::mem_read ( type ,S,l ); + ::mem_read ( property,S,l ); +} + + +MakeStreamFunctions(CEdge); + + + +// ========================== CGraph ============================ + +CGraph::CGraph() : CStream() { + InitGraph(); +} + +CGraph::CGraph ( PCResidue R, cpstr altLoc ) : CStream() { + InitGraph(); + MakeGraph ( R,altLoc ); +} + +CGraph::CGraph ( RPCStream Object ) : CStream(Object) { + InitGraph(); +} + +CGraph::~CGraph() { + FreeMemory(); +} + +void CGraph::InitGraph() { + nVAlloc = 0; + nEAlloc = 0; + nGAlloc = 0; + nVertices = 0; + nEdges = 0; + nAllVertices = 0; + nAllEdges = 0; + Vertex = NULL; + Edge = NULL; + graph = NULL; + name = NULL; + CreateCopy ( name,pstr("UNNAMED") ); +} + +void CGraph::FreeMemory() { +int i; + + if (Vertex) { + for (i=0;i=nVAlloc) { + nVAlloc += AllocPortion; + V1 = new PCVertex[nVAlloc]; + for (i=0;i0) FreeMemory(); + Vertex = V; + nVertices = vlen; + nAllVertices = vlen; + nVAlloc = vlen; +} + +int CGraph::GetVertexID ( int vertexNo ) { + if ((vertexNo>0) && (vertexNo<=nAllVertices)) + return Vertex[vertexNo-1]->GetID(); + else return MinInt4; +} + +int CGraph::GetNBondedVertices ( int vertexNo ) { + if ((vertexNo>0) && (vertexNo<=nAllVertices)) { + if (Vertex[vertexNo-1]) + return Vertex[vertexNo-1]->GetNBonds(); + } + return 0; +} + +int CGraph::GetBondedVertexID ( int vertexNo, int bond_vx_type, + int bondNo ) { +int i,k, v1,v2; + if ((vertexNo>0) && (vertexNo<=nAllVertices)) { + if (Vertex[vertexNo-1]) { + if (Vertex[vertexNo-1]->GetNBonds()>=bondNo) { + k = 0; + for (i=0;(iv1; + v2 = Edge[i]->v2; + if ((v1==vertexNo) && + ((Vertex[v2-1]->type & TYPE_MASK)==bond_vx_type) && + (Vertex[v2-1]->GetNBonds()==bondNo)) + k = v2; + if ((v2==vertexNo) && + ((Vertex[v1-1]->type & TYPE_MASK)==bond_vx_type) && + (Vertex[v2-1]->GetNBonds()==bondNo)) + k = v1; + } + if (k) return Vertex[k-1]->GetID(); + } + } + } + return MinInt4; +} + +PCVertex CGraph::GetVertex ( int vertexNo ) { + if ((vertexNo>0) && (vertexNo<=nAllVertices)) + return Vertex[vertexNo-1]; + else return NULL; +} + +int CGraph::GetVertexNo ( cpstr vname ) { +int i,k; + k = 0; + if (vname) + for (i=0;(iname)) + k = i+1; + return k; +} + +PCEdge CGraph::GetEdge ( int edgeNo ) { + if ((edgeNo>0) && (edgeNo<=nAllEdges)) + return Edge[edgeNo-1]; + else return NULL; +} + +void CGraph::AddEdge ( PCEdge G ) { +int i; +PPCEdge G1; + + if (nAllEdges>=nEAlloc) { + nEAlloc += AllocPortion; + G1 = new PCEdge[nEAlloc]; + for (i=0;i0) FreeMemory(); + Edge = G; + nEdges = glen; + nAllEdges = glen; + nEAlloc = glen; +} + +void CGraph::GetVertices ( PPCVertex & V, int & nV ) { + V = Vertex; + nV = nVertices; +} + +void CGraph::GetEdges ( PPCEdge & E, int & nE ) { + E = Edge; + nE = nEdges; +} + + +int CGraph::MakeGraph ( PCResidue R, cpstr altLoc ) { +int i,j, a1,a2,e1,e2, nAltLocs,alflag, rc; +Boolean B; +rvector occupancy; +AltLoc aLoc; +PAltLoc aL; +realtype dx,dy,dz, sr; +PCEdge G; + + rc = MKGRAPH_Ok; + // reset graph + FreeMemory(); + + occupancy = NULL; + aL = NULL; + R->GetAltLocations ( nAltLocs,aL,occupancy,alflag ); + if (nAltLocs<=0) return MKGRAPH_NoAtoms; + + if (altLoc) strcpy ( aLoc,altLoc ); + else aLoc[0] = char(0); + if (nAltLocs<=1) { + // Only one alt code is there, check if it is what was ordered + if (strcmp(aLoc,aL[0])) { + rc = MKGRAPH_ChangedAltLoc; + strcpy ( aLoc,aL[0] ); + } + } else if ((alflag & ALF_Mess) || + ((alflag & ALF_NoEmptyAltLoc) && (!aLoc[0]))) { + // There is a mess in the residue alt codes, or empty alt code + // does not designate a conformation but ordered. In this + // situation build graph for maximal-occupancy conformation + // and store its altLoc in aLoc. + rc = MKGRAPH_MaxOccupancy; + dx = -2.0; + for (i=0;idx)) { + dx = occupancy[i]; + strcpy ( aLoc,aL[i] ); + } + } + + SetName ( R->name ); + + nVAlloc = R->nAtoms; // upper estimate for vertices to allocate + if (nVAlloc<=0) { + if (aL) delete[] aL; + FreeVectorMemory ( occupancy,0 ); + return MKGRAPH_NoAtoms; + } + + // allocate vertex array + Vertex = new PCVertex[nVAlloc]; + for (i=0;inAtoms;i++) + if (R->atom[i]) { + if (!R->atom[i]->Ter) { + if (nAltLocs>1) { + // This is a many-altcode residue. aLoc contains the altcode + // that has to be included. Check on it: + B = !strcmp(aLoc,R->atom[i]->altLoc); + if ((!B) && (!R->atom[i]->altLoc[0])) { + // We got a non-aLoc code that is an "empty-altcode". + // Check if this atom has the altcode that we need. + for (j=i+1;(jnAtoms) && (!B);j++) + if (R->atom[j]) { + if ((!R->atom[j]->Ter) && + (!strcmp(R->atom[j]->name,R->atom[i]->name))) + B = !strcmp(aLoc,R->atom[j]->altLoc); + } + // if altcode=aLoc is not there for the atom (B is set + // False) then we take its "empty-code" location + B = !B; + } + } else + B = True; + if (B) { + Vertex[nVertices] = new CVertex ( R->atom[i]->element, + R->atom[i]->name ); + Vertex[nVertices]->id = nVertices; + Vertex[nVertices]->user_id = i; + nVertices++; + } + } + } + + if (nVertices<=0) { + if (aL) delete[] aL; + FreeVectorMemory ( occupancy,0 ); + return MKGRAPH_NoAtoms; + } + + // make edges + nEAlloc = 3*nVertices; + Edge = new PCEdge[nEAlloc]; + for (i=0;iuser_id; + e1 = Vertex[i]->type; + if (e1>nElementNames) e1 = 6; + e1--; + for (j=i+1;juser_id; + e2 = Vertex[j]->type; + if (e2>nElementNames) e2 = 6; + e2--; + dx = R->atom[a2]->x - R->atom[a1]->x; + dy = R->atom[a2]->y - R->atom[a1]->y; + dz = R->atom[a2]->z - R->atom[a1]->z; +// sr = CovalentRadius[e1] + CovalentRadius[e2] + 0.15; + sr = CovalentRadius[e1] + CovalentRadius[e2] + 0.25; + if (dx*dx+dy*dy+dz*dzid = i+1; + } + + if (aL) delete[] aL; + FreeVectorMemory ( occupancy,0 ); + + nAllVertices = nVertices; + nAllEdges = nEdges; + + return rc; + +} + +int CGraph::MakeGraph ( PPCAtom atom, int nAtoms ) { +PCEdge G; +char atomID[100]; +realtype dx,dy,dz, sr; +int i,j, a1,a2,e1,e2, rc; + + rc = MKGRAPH_Ok; + // reset graph + FreeMemory(); + + nVAlloc = nAtoms; // upper estimate for vertices to allocate + if (nVAlloc<=0) return MKGRAPH_NoAtoms; + + // allocate vertex array + Vertex = new PCVertex[nVAlloc]; + for (i=0;iTer) { + Vertex[nVertices] = new CVertex ( atom[i]->element, + atom[i]->GetAtomIDfmt(atomID) ); + Vertex[nVertices]->user_id = i; + nVertices++; + } + } + + if (nVertices<=0) { + FreeMemory(); + return MKGRAPH_NoAtoms; + } + + // make edges + nEAlloc = 3*nVertices; // just an inital guess + Edge = new PCEdge[nEAlloc]; + for (i=0;iuser_id; + e1 = Vertex[i]->type; + if (e1>nElementNames) e1 = 6; + e1--; + for (j=i+1;juser_id; + e2 = Vertex[j]->type; + if (e2>nElementNames) e2 = 6; + e2--; + dx = atom[a2]->x - atom[a1]->x; + dy = atom[a2]->y - atom[a1]->y; + dz = atom[a2]->z - atom[a1]->z; + sr = CovalentRadius[e1] + CovalentRadius[e2] + 0.25; + if (dx*dx+dy*dy+dz*dzid = i+1; + } + + nAllVertices = nVertices; + nAllEdges = nEdges; + + return rc; + +} + + +void CGraph::MakeVertexIDs() { +int i; + for (i=0;iid = i+1; +} + +void CGraph::HideType ( int bond_vx_type ) { +// 1. Moves vertices bond_vx_type to the end of vertex array +// 2. Moves edges to bond_vx_type vertices to the end of edge array +// 3. Saves lengths of full vertex and edge arrays, and redefines +// lengths to initial parts of the arrays not containing +// bond_vx_type vertices. +PPCEdge Edge1; +PPCVertex Vertex1; +int i,k,v1,v2, nEdges1,nVertices1; +ivector iv; + + Edge1 = new PCEdge[nEdges]; + Vertex1 = new PCVertex[nVertices]; + GetVectorMemory ( iv,nVertices,1 ); + + for (i=0;iv1-1; + v2 = Edge[i]->v2-1; + if (Vertex[v1] && Vertex[v2]) { + if ((Vertex[v1]->type & TYPE_MASK)==bond_vx_type) { + Vertex[v2]->AddBond(); + Vertex[v1]->CopyNBonds ( Vertex[v2] ); + } + if ((Vertex[v2]->type & TYPE_MASK)==bond_vx_type) { + Vertex[v1]->AddBond(); + Vertex[v2]->CopyNBonds ( Vertex[v1] ); + } + } + } + + nVertices1 = 0; + for (i=0;itype & TYPE_MASK)!=bond_vx_type) { + Vertex1[nVertices1++] = Vertex[i]; + iv[i+1] = nVertices1; + } + } + k = nVertices1; + for (i=0;itype & TYPE_MASK)==bond_vx_type) { + Vertex1[k++] = Vertex[i]; + iv[i+1] = k; + } + } + + nEdges1 = 0; + for (i=0;iv1 = iv[Edge[i]->v1]; + Edge[i]->v2 = iv[Edge[i]->v2]; + if (((Vertex1[Edge[i]->v1-1]->type & TYPE_MASK)!=bond_vx_type) && + ((Vertex1[Edge[i]->v2-1]->type & TYPE_MASK)!=bond_vx_type)) + Edge1[nEdges1++] = Edge[i]; + } + k = nEdges1; + for (i=0;iv1-1]->type & TYPE_MASK)==bond_vx_type) || + ((Vertex1[Edge[i]->v2-1]->type & TYPE_MASK)==bond_vx_type)) + Edge1[k++] = Edge[i]; + } + + nAllVertices = nVertices; + nAllEdges = nEdges; + nVAlloc = nVertices; + nEAlloc = nEdges; + nVertices = nVertices1; + nEdges = nEdges1; + + if (Vertex) delete[] Vertex; + if (Edge) delete[] Edge; + FreeVectorMemory ( iv,1 ); + + Vertex = Vertex1; + Edge = Edge1; + +} + +void CGraph::ExcludeType ( int type ) { +int i,k; +ivector iv; + GetVectorMemory ( iv,nAllVertices,1 ); + k = 0; + for (i=0;itype & TYPE_MASK)!=type) { + if (kv1]!=0) && (iv[Edge[i]->v2]!=0)) { + if (kv1 = iv[Edge[k]->v1]; + Edge[k]->v2 = iv[Edge[k]->v2]; + k++; + } else { + delete Edge[i]; + Edge[i] = NULL; + } + nAllEdges = k; + nEdges = nAllEdges; + FreeVectorMemory ( iv,1 ); +} + +void CGraph::RemoveChirality() { +int i; + for (i=0;iRemoveChirality(); +} + +void CGraph::LeaveChirality ( int eltype ) { +// leaves chirality for specified atom types +int i; + for (i=0;iLeaveChirality ( eltype ); +} + +void CGraph::MakeSymmetryRelief ( Boolean noCO2 ) { +// This function looks for groups of equivalent vertices +// attached to a single vertice (e.g. chemical SO3 or +// PO3 groups), and re-lables them by adding a unique +// symmetry-relief number. This eliminates equivalent +// matches (3! for each SO3/PO3 group), and increases +// vertex diversity, which considerably speeds up matching. +// The function is cheap and harmless even if such groups +// of vertices are not found. +// If noCO2 is True then CO2 symmetry is not releaved. +ivector v,vc; +int i,j,k,n,m,almask,vjtype, ctype,otype; +Boolean noOxygens; + + otype = 0; + ctype = 0; + + GetVectorMemory ( v ,nVertices,0 ); + GetVectorMemory ( vc,nVertices,1 ); + + for (i=1;i<=nVertices;i++) + vc[i] = 0; + + for (j=0;jv1>0) && (Edge[j]->v1<=nVertices)) + vc[Edge[j]->v1]++; + if ((Edge[j]->v2>0) && (Edge[j]->v2<=nVertices)) + vc[Edge[j]->v2]++; + } + + almask = ~ATOM_LEAVING; + + if (noCO2) { + ctype = getElementNo ( "C" ); + otype = getElementNo ( "O" ); + } + + noOxygens = False; + + for (i=1;i<=nVertices;i++) + if (vc[i]>1) { // vertex at more than 1 edge + // v[] will list connected vertices, k will be their number + k = 0; + for (j=0;jv1==i) && (vc[Edge[j]->v2]==1) && (kv2-1; + if ((Edge[j]->v2==i) && (vc[Edge[j]->v1]==1) && (kv1-1; + } + if (k>1) { + if (noCO2) noOxygens = ((Vertex[i-1]->type & almask)==ctype); + // A group of vertices with single connection is + // identified. Assign symmetry relief modifiers + // to *equivalent* vertices in the group + for (j=0;j=0) && (v[j]type & almask; + if ((!noOxygens) || (vjtype!=otype)) { + n = 1; // symmetry relief modifier + for (m=j+1;m=0) && (v[m]type== + (Vertex[v[m]]->type & almask)) { + Vertex[v[m]]->type |= (n << 16); + n++; + v[m] = -1; + } + } + } + } + } + } + + FreeVectorMemory ( v ,0 ); + FreeVectorMemory ( vc,1 ); + +} + +int CGraph::Build ( Boolean bondOrder ) { +int i,j, rc; + + if (nVertices<=0) return 2; + + if (nGAllocv1>=1) && (Edge[i]->v1<=nVertices) && + (Edge[i]->v2>=1) && (Edge[i]->v2<=nVertices)) { + graph[Edge[i]->v1][Edge[i]->v2] = Edge[i]->type; + graph[Edge[i]->v2][Edge[i]->v1] = Edge[i]->type; + } else + rc = 1; + + } else { + + for (i=0;iv1>=1) && (Edge[i]->v1<=nVertices) && + (Edge[i]->v2>=1) && (Edge[i]->v2<=nVertices)) { + graph[Edge[i]->v1][Edge[i]->v2] = 1; + graph[Edge[i]->v2][Edge[i]->v1] = 1; + } else + rc = 1; + + } + + return rc; + +} + + +const int ring_mask[] = { + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000001, + 0x00000002, + 0x00000004, + 0x00000008, + 0x00000010, + 0x00000020, + 0x00000040, + 0x00000080 +}; + +void CGraph::IdentifyRings() { +CGraphMatch GM; +CGraph ring; +ivector F1,F2; +AtomName aname; +realtype p1,p2; +int i,j,n,nrings,nv; + + Build ( False ); + + for (i=0;itype_ext = 0; + + GM.SetFlag ( GMF_UniqueMatch ); + + for (n=3;n<=10;n++) { + + ring.Reset(); + + for (i=1;i<=n;i++) { + sprintf ( aname,"C%i",i ); + ring.AddVertex ( new CVertex("C",aname) ); + } + + ring.MakeVertexIDs(); + + for (i=1;i<=n;i++) { + j = i+1; + if (j>n) j = 1; + ring.AddEdge ( new CEdge(i,j,1) ); + } + + ring.Build ( False ); + + GM.MatchGraphs ( this,&ring,n,False,EXTTYPE_Ignore ); + + nrings = GM.GetNofMatches(); + for (i=0;itype_ext |= ring_mask[n]; + } + + } + +} + +void CGraph::markConnected ( int vno, int cno ) { +int i; + + Vertex[vno]->type_ext = cno; + for (i=0;itype_ext)) + markConnected ( i,cno ); + +} + + +int CGraph::IdentifyConnectedComponents() { +// Returns the number of connected components and sets +// Vertex[]->type_ext equal to component number >=1. +int nComponents,i; + + nComponents = 0; + + Build ( False ); + + for (i=0;itype_ext = 0; + + i = 0; + while (itype_ext) i++; + else break; + if (i0) { + printf ( " Vertices:\n"" ## " ); + Vertex[0]->Print(1); + printf ( "\n" ); + for (i=0;iPrint(0); + printf ( "\n" ); + } + } + + if (nEdges>0) { + printf ( " Edges:\n"" ## " ); + Edge[0]->Print(1); + printf ( "\n" ); + for (i=0;iPrint(0); + printf ( "\n" ); + } + } + + +} + +void CGraph::Print1() { +int i,j; + for (i=0;iid,Vertex[i]->type,Vertex[i]->name ); + for (j=0;jv1==i+1) + printf ( " %4i(%i)",Edge[j]->v2,Edge[j]->type ); + else if (Edge[j]->v2==i+1) + printf ( " %4i(%i)",Edge[j]->v1,Edge[j]->type ); + printf ( "\n" ); + } +} + + +void CGraph::Copy ( PCGraph G ) { +int i; + + FreeMemory(); + + CreateCopy ( name,G->name ); + nVertices = G->nVertices; + nEdges = G->nEdges; + nAllVertices = G->nAllVertices; + nAllEdges = G->nAllEdges; + if (nAllVertices>0) { + nVAlloc = nAllVertices; + Vertex = new PCVertex[nVAlloc]; + for (i=0;iCopy ( G->Vertex[i] ); + } + } + if (nAllEdges>0) { + nEAlloc = nAllEdges; + Edge = new PCEdge[nEAlloc]; + for (i=0;iCopy ( G->Edge[i] ); + } + } + +} + +void CGraph::write ( RCFile f ) { +int i; +int Version=2; +Boolean bondOrder=False; + f.WriteInt ( &Version ); + f.WriteBool ( &bondOrder ); + f.CreateWrite ( name ); + f.WriteInt ( &nVertices ); + f.WriteInt ( &nEdges ); + f.WriteInt ( &nAllVertices ); + f.WriteInt ( &nAllEdges ); + for (i=0;i1) { + f.ReadInt ( &nAllVertices ); + f.ReadInt ( &nAllEdges ); + } else { + nAllVertices = nVertices; + nAllEdges = nEdges; + } + if (nAllVertices>0) { + nVAlloc = nAllVertices; + Vertex = new PCVertex[nVAlloc]; + for (i=0;i0) { + nEAlloc = nAllEdges; + Edge = new PCEdge[nEAlloc]; + for (i=0;imem_write ( S,l ); + } else { + k = 0; + ::mem_write ( k,S,l ); + } + for (i=0;imem_write ( S,l ); + } else { + k = 0; + ::mem_write ( k,S,l ); + } + +} + +void CGraph::mem_read ( cpstr S, int & l ) { +int i,k; +byte Version; +Boolean bondOrder; + + FreeMemory(); + + ::mem_read_byte ( Version,S,l ); + ::mem_read ( bondOrder ,S,l ); + ::mem_read ( name ,S,l ); + ::mem_read ( nVertices ,S,l ); + ::mem_read ( nEdges ,S,l ); + ::mem_read ( nAllVertices,S,l ); + ::mem_read ( nAllEdges ,S,l ); + if (nAllVertices>0) { + nVAlloc = nAllVertices; + Vertex = new PCVertex[nVAlloc]; + for (i=0;imem_read ( S,l ); + } else + Vertex[i] = NULL; + } + } + if (nAllEdges>0) { + nEAlloc = nAllEdges; + Edge = new PCEdge[nEAlloc]; + for (i=0;imem_read ( S,l ); + } else { + Edge[i] = NULL; + } + } + } + +// Build ( bondOrder ); + +} + +MakeStreamFunctions(CGraph); + + +// ========================== CMatch ============================ + +CMatch::CMatch() : CStream() { + InitMatch(); +} + +CMatch::CMatch ( RPCStream Object ) : CStream ( Object ) { + InitMatch(); +} + +CMatch::CMatch ( ivector FV1, ivector FV2, int nv, int n, int m ) { +int i; + if (FV1 && FV2) { + n1 = n; + n2 = m; + nAlloc = n; + GetVectorMemory ( F1,nAlloc,1 ); + GetVectorMemory ( F2,nAlloc,1 ); + mlength = nv; + for (i=1;i<=mlength;i++) { + F1[i] = FV1[i]; + F2[i] = FV2[i]; + } + } else + InitMatch(); +} + +void CMatch::InitMatch() { + mlength = 0; + n1 = 0; + n2 = 0; + nAlloc = 0; + F1 = NULL; + F2 = NULL; +} + +CMatch::~CMatch() { + FreeVectorMemory ( F1,1 ); + FreeVectorMemory ( F2,1 ); +} + +void CMatch::SetMatch ( ivector FV1, ivector FV2, int nv, int n, int m ) { +int i; + if (FV1 && FV2) { + if (nv>nAlloc) { + FreeVectorMemory ( F1,1 ); + FreeVectorMemory ( F2,1 ); + nAlloc = n; + GetVectorMemory ( F1,nAlloc,1 ); + GetVectorMemory ( F2,nAlloc,1 ); + } + n1 = n; + n2 = m; + mlength = nv; + for (i=1;i<=mlength;i++) { + F1[i] = FV1[i]; + F2[i] = FV2[i]; + } + } else { + FreeVectorMemory ( F1,1 ); + FreeVectorMemory ( F2,1 ); + mlength = 0; + n1 = 0; + n2 = 0; + } +} + + +Boolean CMatch::isMatch ( ivector FV1, ivector FV2, int nv ) { +int i,j; +Boolean B; + if (FV1 && FV2 && (nv<=mlength)) { + B = True; + for (i=1;(i<=nv) && B;i++) { + B = False; + for (j=1;(j<=mlength) && (!B);j++) + B = (FV1[i]==F1[j]) && (FV2[i]==F2[j]); + } + return B; + } + return False; +} + +Boolean CMatch::isCombination ( ivector FV1, ivector FV2, int nv ) { +int i,j; +Boolean B; + if (FV1 && FV2 && (nv==mlength)) { + B = True; + for (i=1;(i<=nv) && B;i++) { + B = False; + for (j=1;(j<=mlength) && (!B);j++) + B = (FV1[i]==F1[j]); + if (B) { + B = False; + for (j=1;(j<=mlength) && (!B);j++) + B = (FV2[i]==F2[j]); + } + } + return B; + } + return False; +} + + +void CMatch::GetMatch ( ivector & FV1, ivector & FV2, int & nv, + realtype & p1, realtype & p2 ) { + FV1 = F1; + FV2 = F2; + nv = mlength; + p1 = mlength; + if (p1>0.0) p1 /= n1; + p2 = mlength; + if (p2>0.0) p2 /= n2; +} + +void CMatch::write ( RCFile f ) { +int i; +int Version=1; + f.WriteInt ( &Version ); + f.WriteInt ( &mlength ); + f.WriteInt ( &n1 ); + f.WriteInt ( &n2 ); + for (i=1;i<=mlength;i++) { + f.WriteInt ( &(F1[i]) ); + f.WriteInt ( &(F2[i]) ); + } +} + +void CMatch::read ( RCFile f ) { +int i,Version; + FreeVectorMemory ( F1,1 ); + FreeVectorMemory ( F2,1 ); + f.ReadInt ( &Version ); + f.ReadInt ( &mlength ); + f.ReadInt ( &n1 ); + f.ReadInt ( &n2 ); + if (mlength>0) { + nAlloc = n1; + GetVectorMemory ( F1,nAlloc,1 ); + GetVectorMemory ( F2,nAlloc,1 ); + for (i=1;i<=mlength;i++) { + f.ReadInt ( &(F1[i]) ); + f.ReadInt ( &(F2[i]) ); + } + } +} + +void CMatch::mem_write ( pstr S, int & l ) { +int i; + ::mem_write ( mlength,S,l ); + ::mem_write ( n1 ,S,l ); + ::mem_write ( n2 ,S,l ); + for (i=1;i<=mlength;i++) { + ::mem_write ( F1[i],S,l ); + ::mem_write ( F2[i],S,l ); + } +} + +void CMatch::mem_read ( cpstr S, int & l ) { +int i; + FreeVectorMemory ( F1,1 ); + FreeVectorMemory ( F2,1 ); + ::mem_read ( mlength,S,l ); + ::mem_read ( n1 ,S,l ); + ::mem_read ( n2 ,S,l ); + if (mlength>0) { + nAlloc = n1; + GetVectorMemory ( F1,nAlloc,1 ); + GetVectorMemory ( F2,nAlloc,1 ); + for (i=1;i<=mlength;i++) { + ::mem_read ( F1[i],S,l ); + ::mem_read ( F2[i],S,l ); + } + } +} + + +MakeStreamFunctions(CMatch); + + + +// ======================== CGraphMatch ========================== + +CGraphMatch::CGraphMatch() + : CStream() { + InitGraphMatch(); +} + +CGraphMatch::CGraphMatch ( RPCStream Object ) + : CStream ( Object ) { + InitGraphMatch(); +} + +CGraphMatch::~CGraphMatch() { + FreeMemory(); +} + +void CGraphMatch::InitGraphMatch() { + G1 = NULL; + G2 = NULL; + n = 0; + m = 0; + P = NULL; + nAlloc = 0; + mAlloc = 0; + nMatches = 0; + maxNMatches = -1; // unlimited + Match = NULL; + nMAlloc = 0; + flags = 0; + swap = False; + wasFullMatch = False; + maxMatch = 0; + timeLimit = 0; // no time limit + Stop = False; + stopOnMaxNMathches = False; + F1 = NULL; + F2 = NULL; + iF1 = NULL; + ix = NULL; +#ifndef _UseRecursion + jj = NULL; +#endif +} + + +void CGraphMatch::SetFlag ( word flag ) { + flags |= flag; +} + +void CGraphMatch::RemoveFlag ( word flag ) { + flags &= ~flag; +} + +void CGraphMatch::SetMaxNofMatches ( int maxNofMatches, + Boolean stopOnMaxN ) { + maxNMatches = maxNofMatches; + stopOnMaxNMathches = stopOnMaxN; +} + +void CGraphMatch::SetTimeLimit ( int maxTimeToRun ) { + timeLimit = maxTimeToRun; +} + +void CGraphMatch::Reset() { + FreeMemory(); +} + +void CGraphMatch::FreeMemory() { +int i; + + if (P) { + FreeMatrixMemory ( P[1],nAlloc,1,0 ); + FreeRecHeap (); + P = P + 1; + delete[] P; + P = NULL; + } + + FreeMatrixMemory ( iF1,nAlloc,1,1 ); + + FreeVectorMemory ( F1 ,1 ); + FreeVectorMemory ( F2 ,1 ); + FreeVectorMemory ( ix ,1 ); + nAlloc = 0; + mAlloc = 0; + + if (Match) { + for (i=0;inVertices<=Gh2->nVertices) { + G1 = Gh1; + G2 = Gh2; + swap = False; + } else { + G1 = Gh2; + G2 = Gh1; + swap = True; + } + n = G1->nVertices; + m = G2->nVertices; + V1 = G1->Vertex; + V2 = G2->Vertex; + c1 = G1->graph; + c2 = G2->graph; + + nMatches = 0; + + if (n<=0) return; + + if ((n>nAlloc) || (m>mAlloc)) GetMemory(); + else FreeRecHeap(); + + n1 = Initialize ( vertexType,vertexExt ); + if (n1<=0) return; + + GetRecHeap(); + + maxMatch = IMax(1,IMin(n,minMatch)); + Stop = False; + startTime = time(NULL); + + // Use of Backtrack(..) and Ullman() is completely + // equivalent. One of them should be commented. + + if (minMatch=minMatch) Backtrack1 ( 1,n1 ); + + } else if (n1>=n) { + + #ifdef _UseRecursion + Backtrack ( 1 ); + #else + Ullman(); + #endif + + } + +} + + +int CGraphMatch::Initialize ( Boolean vertexType, int vertexExt ) { +ivector jF1; +int i,j,v1type,v1type_ext,v2type_ext,almask,iW,pl; + + wasFullMatch = False; + + jF1 = iF1[1]; + for (i=1;i<=n;i++) + jF1[i] = i; + + almask = ~ATOM_LEAVING; + +/* -- experiment for symmetry reliefs +int v2type,v1type_sr,srmask; + srmask = ~SYMREL_MASK; + + for (i=1;i<=n;i++) { + if (vertexType) { + ix[i] = 0; + v1type = V1[i-1]->type & almask; + v1type_sr = v1type & srmask; + pl = 0; + for (j=1;j<=m;j++) { + v2type = V2[j-1]->type & almask; + if ((v1type==v2type) || + (v1type_sr==v2type) || + (v1type==(v2type & srmask))) + P[1][i][++pl] = j; + } + P[1][i][0] = pl; + if (pl) ix[i] = i; + } else { + ix[i] = i; + for (j=1;j<=m;j++) + P[1][i][j] = j; + P[1][i][0] = m; + } + F1[i] = 0; + F2[i] = 0; + } + */ + + for (i=1;i<=n;i++) { + ix[i] = 0; + v1type = V1[i-1]->type & almask; + v1type_ext = V1[i-1]->type_ext; + pl = 0; + for (j=1;j<=m;j++) + if ((v1type==(V2[j-1]->type & almask)) || (!vertexType)) { + if (vertexExt==EXTTYPE_Ignore) + P[1][i][++pl] = j; + else { + v2type_ext = V2[j-1]->type_ext; + if ((!v1type_ext) && (!v2type_ext)) + P[1][i][++pl] = j; + else + switch (vertexExt) { + default : + case EXTTYPE_Ignore : P[1][i][++pl] = j; + break; + case EXTTYPE_Equal : if (v1type_ext==v2type_ext) + P[1][i][++pl] = j; + break; + case EXTTYPE_AND : if (v1type_ext & v2type_ext) + P[1][i][++pl] = j; + break; + case EXTTYPE_OR : if (v1type_ext | v2type_ext) + P[1][i][++pl] = j; + break; + case EXTTYPE_XOR : if (v1type_ext ^ v2type_ext) + P[1][i][++pl] = j; + break; + case EXTTYPE_NotEqual : if (v1type_ext!=v2type_ext) + P[1][i][++pl] = j; + break; + case EXTTYPE_NotAND : if ((v1type_ext & v2type_ext) + ==0) + P[1][i][++pl] = j; + break; + case EXTTYPE_NotOR : if ((v1type_ext | v2type_ext) + ==0) + P[1][i][++pl] = j; + } + } + } + P[1][i][0] = pl; + if (pl) ix[i] = i; + F1[i] = 0; + F2[i] = 0; + } + /* + } else { + for (i=1;i<=n;i++) { + ix[i] = i; + for (j=1;j<=m;j++) + P[1][i][j] = j; + P[1][i][0] = m; + F1[i] = 0; + F2[i] = 0; + } + } + */ + + i = 1; + j = n; + while (i0) + Stop = (difftime(time(NULL),startTime)>timeLimit); + + F1[i] = i; + pli = P[i][i][0]; + + if (i>=n) { + + for (cntj=1;(cntj<=pli) && (!Stop);cntj++) { + F2[n] = P[n][n][cntj]; + CollectMatch ( n ); + } + + } else { + + i1 = i+1; + c1i = c1[i]; + + for (cntj=1;(cntj<=pli) && (!Stop);cntj++) { + j = P[i][i][cntj]; + F2[i] = j; // mapped F1[i]:F2[i], i.e. i:j + // Forward checking + c2j = c2[j]; + pl2 = 1; + for (k=i1;(k<=n) && (pl2>0);k++) { + p1 = P[i][k]; + p2 = P[i1][k]; + c1ik = c1i[k]; + pl1 = p1[0]; + pl2 = 0; + for (cntl=1;cntl<=pl1;cntl++) { + l = p1[cntl]; + if ((c1ik==c2j[l]) && // check that bonds are compatible + (l!=j)) // and make sure jth vertex is excluded + p2[++pl2] = l; + } + p2[0] = pl2; // new length of P-row + } + if (pl2>0) Backtrack ( i1 ); + } + + } + +} + +#else + +void CGraphMatch::Ullman() { +// A non-recursive translation of Ullman's Backtrack. +// It might give some gain in performance, although tests +// on SGI machine show that the gain is negligible, (if +// there is any at all) if compiler's optimization is +// switched on. +int i,pl,i1,pli,cntj,j,pl1,pl2,k,cntl,l,l1,cik; +ivector ci,cj; +ivector p1,p2; + + if (Stop) return; + if (timeLimit>0) + Stop = (difftime(time(NULL),startTime)>timeLimit); + + i = 1; + jj[1] = 1; + pl = P[1][1][0]; + + do { + + F1[i] = i; + pli = P[i][i][0]; + + if (i>=n) { + + for (cntj=jj[n];(cntj<=pli) && (!Stop);cntj++) { + jj[n]++; + F2[n] = P[n][n][cntj]; + CollectMatch ( n ); + } + + } else { + + i1 = i+1; + ci = c1[i]; + for (cntj=jj[i];(cntj<=pli) && (!Stop);cntj++) { + jj[i]++; + j = P[i][i][cntj]; + F2[i] = j; + // Forward checking + cj = c2[j]; + pl2 = 1; + for (k=i1;(k<=n) && (pl2>0);k++) { + p1 = P[i][k]; + p2 = P[i1][k]; + cik = ci[k]; + pl1 = p1[0]; + pl2 = 0; + for (cntl=1;cntl<=pl1;cntl++) { + l = p1[cntl]; + if ((cik==cj[l]) && // check that bonds are compatible + (l!=j)) // and make sure jth vertex is excluded + p2[++pl2] = l; + } + p2[0] = pl2; // new length of P-row + } + if (pl2>0) { + i++; + jj[i] = 1; + i++; // in order to compensate the following decrement + break; + } + } + + } + i--; + + } while ((!Stop) && ((jj[1]<=pl) || (i>1))); + +} + +#endif + +void CGraphMatch::Backtrack1 ( int i, int k0 ) { +// Recursive version of CSIA algorithm for partial +// (substructure-to-substructure) matching +int i1,pl0,cntj,j,k,pl1,pl2,cntl,l,c1ik,ii,iW,k1; +ivector jF1,c1i,c2j; +ivector p0,p1,p2; + + if (Stop) return; + if (timeLimit>0) + Stop = (difftime(time(NULL),startTime)>timeLimit); + + jF1 = iF1[i]; + + if (i>=k0) { + + F1[i] = jF1[i]; + p0 = P[i][jF1[i]]; + pl0 = p0[0]; + + // collect matches of k0-th (the upmost) level + if (pl0>0) { + maxMatch = k0; + for (cntj=1;cntj<=pl0;cntj++) { + F2[k0] = p0[cntj]; + CollectMatch ( k0 ); + } + } + + } else { + + i1 = i+1; + + pl0 = P[i][jF1[i]][0]; + j = i; + for (k=i1;k<=k0;k++) + if (P[i][jF1[k]][0]i) { + iW = jF1[i]; + jF1[i] = jF1[j]; + jF1[j] = iW; + } + + F1[i] = jF1[i]; + p0 = P[i][jF1[i]]; + pl0 = p0[0]; + + c1i = c1[jF1[i]]; + + // 1. Find all matches that include jF1[i]th vertex of graph G1 + + for (cntj=1;(cntj<=pl0) && (!Stop);cntj++) { + j = p0[cntj]; + F2[i] = j; // mapped F1[i]:F2[i], i.e. iF1[i][i]:j + // Forward checking + c2j = c2[j]; + k1 = k0; // k1 is the limit for match size + for (k=i1;(k<=k0) && (k1>=maxMatch);k++) { + ix[k] = 0; + p1 = P[i] [jF1[k]]; + p2 = P[i1][jF1[k]]; + c1ik = c1i [jF1[k]]; + pl1 = p1[0]; + pl2 = 0; + for (cntl=1;cntl<=pl1;cntl++) { + l = p1[cntl]; + if ((c1ik==c2j[l]) && // check that bonds are compatible + (l!=j)) // and make sure jth vertex is excluded + p2[++pl2] = l; + } + p2[0] = pl2; // new length of P-row + if (pl2>0) { + ix[k] = k; + } else if (wasFullMatch) { + k1 = maxMatch-1; // we are not interested in partial + } else { // match anymore + k1--; + } + } + if (k1>=maxMatch) { + // shift unmatching vertices to the end + for (ii=1;ii<=n;ii++) + iF1[i1][ii] = jF1[ii]; + k = i1; + l = k0; + while (k=maxMatch) { + CollectMatch ( i ); // collect match of ith level + maxMatch = i; + } + } + } + + // 2. Find all matches that do not include jF1[i]th vertex + // of graph G1 + + if (k0>maxMatch) { + // Shift jF1[i]th vertex to the end + iW = jF1[i]; + jF1[i] = jF1[k0]; + jF1[k0] = iW; + Backtrack1 ( i,k0-1 ); + } + + } + +} + + +void CGraphMatch::CollectMatch ( int nm ) { +int i; +Boolean B; +PPCMatch M1; + + if (maxNMatches==0) return; + + // find out if this should be a new match + if (nMatches>0) { + // a match is already found; check with it + if (nmmlength) return; + if (nm>Match[0]->mlength) { + nMatches = 0; + } else if (flags & GMF_UniqueMatch) { + // check if such a match was already found + B = False; + for (i=0;(iisMatch(F1,F2,nm); + if (B) return; // repeating match -- just quit. + } else if (flags & GMF_NoCombinations) { + // check if such a match was already found + B = False; + for (i=0;(iisCombination(F1,F2,nm); + if (B) return; // repeating match -- just quit. + } + } + + if (nMatches>=nMAlloc) { + if ((nMAlloc0) nMAlloc = IMin(maxNMatches,nMAlloc+100); + else nMAlloc += 100; + M1 = new PCMatch[nMAlloc]; + for (i=0;iSetMatch ( F1,F2,nm,n,m ); + + if (nm==n) wasFullMatch = True; + + if (nm>maxMatch) maxMatch = nm; + + nMatches++; + + if (stopOnMaxNMathches && (maxNMatches>0) && + (nMatches>=maxNMatches)) + Stop = True; + +} + +void CGraphMatch::PrintMatches() { +int i,j,k; + if (nMatches<=0) + printf ( "\n\n *** NO MATCHES FOUND\n\n" ); + else { + if (flags & GMF_UniqueMatch) + printf ( "\n\n *** FOUND Unique Matches\n\n" ); + else printf ( "\n\n *** FOUND Matches\n\n" ); + printf ( " ## Vertices\n" ); + for (i=0;imlength;j++) { + if (swap) + printf ( " (%i,%i)",Match[i]->F2[j],Match[i]->F1[j] ); + else printf ( " (%i,%i)",Match[i]->F1[j],Match[i]->F2[j] ); + k += 8; + if (k>70) { + printf ( "\n" ); + k = 8; + } + } + printf ( "\n" ); + } + } + printf ( "\n **************************\n" ); +} + +void CGraphMatch::GetMatch ( int MatchNo, ivector & FV1, + ivector & FV2, int & nv, + realtype & p1, realtype & p2 ) { +// do not allocate or dispose FV1 and FV2 in application! +// FV1/p1 will always correspond to Gh1, and FV2/p2 - +// to Gh2 as specified in MatchGraphs(..) + if ((MatchNo<0) || (MatchNo>=nMatches)) { + FV1 = NULL; + FV2 = NULL; + nv = 0; + p1 = 0.0; + p2 = 0.0; + } else if (swap) + Match[MatchNo]->GetMatch ( FV2,FV1,nv,p2,p1 ); + else Match[MatchNo]->GetMatch ( FV1,FV2,nv,p1,p2 ); + +} + + +void CGraphMatch::write ( RCFile f ) { +int i; +int Version=1; + f.WriteInt ( &Version ); + f.WriteInt ( &nMatches ); + f.WriteWord ( &flags ); + f.WriteBool ( &swap ); + for (i=0;iwrite ( f ); +} + +void CGraphMatch::read ( RCFile f ) { +int i,Version; + FreeMemory (); + f.ReadInt ( &Version ); + f.ReadInt ( &nMatches ); + f.ReadWord ( &flags ); + f.ReadBool ( &swap ); + if (nMatches>0) { + nMAlloc = nMatches; + Match = new PCMatch[nMatches]; + for (i=0;iread ( f ); + } + } +} + + +void CGraphMatch::mem_write ( pstr S, int & l ) { +int i; + ::mem_write ( nMatches,S,l ); + ::mem_write ( flags ,S,l ); + ::mem_write ( swap ,S,l ); + for (i=0;imem_write ( S,l ); +} + +void CGraphMatch::mem_read ( cpstr S, int & l ) { +int i; + FreeMemory (); + ::mem_read ( nMatches,S,l ); + ::mem_read ( flags ,S,l ); + ::mem_read ( swap ,S,l ); + if (nMatches>0) { + nMAlloc = nMatches; + Match = new PCMatch[nMatches]; + for (i=0;imem_read ( S,l ); + } + } +} + +MakeStreamFunctions(CGraphMatch); + + + +// ============================================================= + +/* +static char Mol1[][3] = { + "C", "C", "C", "C", "C", "C" }; + +static int Bond1[] = { + 1, 2, + 1, 6, + 2, 3, + 3, 4, + 4, 5, + 5, 6 +}; + +static char Mol2[][3] = { + "C", "C", "C", "C", "C", "C", + "C", "C", "C", "C", "C", "C" }; + +static int Bond2[] = { + 1, 2, + 1, 6, + 2, 3, + 3, 4, + 4, 5, + 5, 6, + 1, 7, + 2, 8, + 3, 9, + 4, 10, + 5, 11, + 6, 12 +}; + + +static char Mol1[][3] = { + "C", "C", "N", "C" }; + +static int Bond1[] = { + 1, 2, + 2, 3, + 3, 4 +}; + +static char Mol2[][3] = { + "C", "C", "N", "C" }; + +static int Bond2[] = { + 1, 2, + 2, 3, + 2, 4, + 3, 4 +}; + +void TestGraphMatch() { +int i,k1,k2, nv1,nb1, nv2,nb2; +PCVertex V; +PCEdge G; +CGraph G1,G2; +CGraphMatch U; + + G1.Reset (); + G1.SetName ( "#1" ); + + nv1 = sizeof(Mol1)/3; + for (i=0;iSetVertex ( Mol1[i] ); + G1.AddVertex ( V ); + } + nb1 = sizeof(Bond1)/(2*sizeof(int)); + k1 = 0; + k2 = 1; + for (i=0;iSetEdge ( Bond1[k1],Bond1[k2],1 ); + G1.AddEdge ( G ); + k1 += 2; + k2 += 2; + } + + G2.Reset (); + G2.SetName ( "#2" ); + + nv2 = sizeof(Mol2)/3; + for (i=0;iSetVertex ( Mol2[i] ); + G2.AddVertex ( V ); + } + nb2 = sizeof(Bond2)/(2*sizeof(int)); + k1 = 0; + k2 = 1; + for (i=0;iSetEdge ( Bond2[k1],Bond2[k2],1 ); + G2.AddEdge ( G ); + k1 += 2; + k2 += 2; + } + + G1.Build(); + G2.Build(); + + U.MatchGraphs ( &G1,&G2,nv1 ); + + U.PrintMatches(); + + +} +*/ + diff --git a/mmdb/mmdb_graph.h b/mmdb/mmdb_graph.h new file mode 100755 index 0000000..70aa523 --- /dev/null +++ b/mmdb/mmdb_graph.h @@ -0,0 +1,484 @@ +// $Id: mmdb_graph.h,v 1.23 2012/01/26 17:52:20 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 08.07.08 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : mmdb_graph +// ~~~~~~~~~ +// **** Classes : CVertex ( graph vertex ) +// ~~~~~~~~~ CEdge ( graph edge ) +// CGraph ( structural graph ) +// CMatch ( match of structural graphs ) +// CGraphMatch ( CSIA algorithms for graphs matching ) +// +// (C) E. Krissinel 2000-2008 +// +// When used, please cite: +// +// Krissinel, E. and Henrick, K. (2004) +// Common subgraph isomorphism detection by backtracking search. +// Software - Practice and Experience, 34, 591-607. +// +// ================================================================= +// + +#ifndef __MMDB_Graph__ +#define __MMDB_Graph__ + + +#ifndef __TIME_H +#include +#endif + +#ifndef __MMDB_Atom__ +#include "mmdb_atom.h" +#endif + +// ========================== CVertex ============================ + +DefineClass(CVertex); + +#define CHIRAL_RIGHT 0x10000000 +#define CHIRAL_LEFT 0x20000000 +#define ATOM_LEAVING 0x40000000 +#define HYDROGEN_BOND 0x0F000000 +#define SYMREL_MASK 0x00FF0000 +#define CHIRAL_MASK 0xCFFFFFFF +#define TYPE_MASK 0x00FFFFFF + +class CVertex : public CStream { + + friend class CGraph; + friend class CGraphMatch; + friend class CSBase0; + + public: + + CVertex (); + CVertex ( RPCStream Object ); + CVertex ( int vtype, cpstr vname ); + CVertex ( int vtype ); + CVertex ( cpstr chem_elem ); + CVertex ( cpstr chem_elem, cpstr name ); + ~CVertex(); + + void SetVertex ( cpstr chem_elem ); + void SetVertex ( int vtype, cpstr vname ); + void SetVertex ( int vtype ); + void SetType ( int vtype ); + void SetTypeExt ( int typeExt ); + + void RemoveChirality(); + void LeaveChirality ( int eltype ); + + void SetName ( cpstr vname ); + void SetProperty ( int vprop ); + void SetID ( int vid ); + void SetUserID ( int vid ) { user_id = vid; } + void AddBond (); + void CopyNBonds ( PCVertex V ); + int GetProperty () { return property; } + int GetID () { return id; } + int GetUserID () { return user_id; } + cpstr GetName () { return name; } + int GetType () { return type; } + int GetTypeExt () { return type_ext; } + int GetNBonds (); + + void SaveType (); // in userid + void RestoreType (); // from userid + void CopyType ( PCVertex V ); + + virtual void Print ( int PKey ); + + virtual void Copy ( PCVertex V ); + + void read ( RCFile f ); + void write ( RCFile f ); + + void mem_read ( cpstr S, int & l ); + void mem_write ( pstr S, int & l ); + + protected: + pstr name; // name may be general, "C", "Hg", "Cl" etc. + int type; // type of vertex, see comments in mmdb_graph.cpp + int type_ext; // vertex type extention + int property; // flagwise properties -- user-defined + int id; // a graph-defined vertex id + int user_id; // a user-defined vertex id + + void InitVertex(); + +}; + +DefineStreamFunctions(CVertex); + + + +// =========================== CEdge ============================= + +#define BOND_SINGLE 1 +#define BOND_DOUBLE 2 +#define BOND_AROMATIC 3 +#define BOND_TRIPLE 4 + +DefineClass(CEdge); + +class CEdge : public CStream { + + friend class CGraph; + friend class CGMatch; + friend class CSBase0; + + public: + + CEdge (); + CEdge ( RPCStream Object ); + CEdge ( int vx1, int vx2, int btype ); // vx1,vx2 are numbered + // as 1,2,3 on and refer + // to vertices in the order + // as they were added to + // the graph; btype>0 + ~CEdge(); + + void SetEdge ( int vx1, int vx2, cpstr btype ); + void SetEdge ( int vx1, int vx2, int btype ); // btype>0 + + void SetType ( int btype ); + void SetProperty ( int eprop ); + void SaveType (); // in property + void RestoreType (); // from property + + inline int GetVertex1 () { return v1; } + inline int GetVertex2 () { return v2; } + inline int GetType () { return type; } + inline int GetProperty () { return property; } + + virtual void Print ( int PKey ); + + virtual void Copy ( PCEdge G ); + + void read ( RCFile f ); + void write ( RCFile f ); + + void mem_read ( cpstr S, int & l ); + void mem_write ( pstr S, int & l ); + + protected: + int v1,v2; // >=1 + int type; + int property; + + void InitEdge(); + +}; + +DefineStreamFunctions(CEdge); + + + +// ========================== CGraph ============================ + +#define MKGRAPH_Ok 0 +#define MKGRAPH_NoAtoms -1 +#define MKGRAPH_ChangedAltLoc 1 +#define MKGRAPH_MaxOccupancy 2 + +DefineClass(CGraph); + +class CGraph : public CStream { + + friend class CGraphMatch; + friend class CSBase0; + + public : + + CGraph (); + CGraph ( PCResidue R, cpstr altLoc=NULL ); + CGraph ( RPCStream Object ); + ~CGraph(); + + void Reset (); + void SetName ( cpstr gname ); + pstr GetName () { return name; } + + // AddVertex(..) and AddEdge(..) do not copy the objects, but + // take them over. This means that application should forget + // about pointers to V and G once they were given to CGraph. + // Vertices and edges must be allocated newly prior each call + // to AddVertex(..) and AddEdge(..). + void AddVertex ( PCVertex V ); + void AddEdge ( PCEdge G ); + void SetVertices ( PPCVertex V, int vlen ); + void SetEdges ( PPCEdge G, int glen ); + + void RemoveChirality(); + void LeaveChirality ( int eltype ); + + // MakeGraph(..) makes a graph corresponding to residue R. + // The graphs vertices then correspond to the residue's atoms + // (CVertex::userid points to atom R->atom[CVertex::userid]), + // edges are calculated as chemical bonds between atoms basing + // on the table of cut-off distances. + // altCode specifies a particular conformation that should be + // used for making the graph. If it is set to "" or NULL ("empty" + // altcode) but the residue does not have conformation which + // contains *only* ""-altcode atoms, a conformation corresponding + // to maximal occupancy will be used. The same will happen if + // altcode information in residue is not correct, whatever altCode + // is specified. + // After making the graph, Build(..) should be called as usual + // before graph matching. + // Non-negative return means that graph has been made. + // MakeGraph(..) may return: + // MKGRAPH_Ok everything is Ok + // MKGRAPH_NoAtoms residue does not have atoms, graph + // is not made + // MKGRAPH_ChangedAltLoc a different altcode was used because + // the residue has only one altcode and + // that is different of + // MKGRAPH_MaxOccupancy a maximal-occupancy conformation has + // been chosen because of default + // ""-altcode supplied or incorrect + // altcode information in the residue + int MakeGraph ( PCResidue R, cpstr altLoc=NULL ); + + int MakeGraph ( PPCAtom atom, int nAtoms ); + + void HideType ( int bond_vx_type ); + void ExcludeType ( int type ); + + void MakeSymmetryRelief ( Boolean noCO2 ); + void IdentifyRings (); + int IdentifyConnectedComponents(); // returns their number >= 1 + + int Build ( Boolean bondOrder ); // returns 0 if Ok + + void MakeVertexIDs (); // simply numbers vertices as 1.. on + int GetVertexID ( int vertexNo ); + int GetVertexNo ( cpstr vname ); + // GetBondedVertexID(..) works after MoveType(..) + int GetNBondedVertices ( int vertexNo ); + int GetBondedVertexID ( int vertexNo, int bond_vx_type, + int bondNo ); + + PCVertex GetVertex ( int vertexNo ); // 1<=vertexNo<=nVertices + inline int GetNofVertices() { return nVertices; } + + PCEdge GetEdge ( int edgeNo ); // 1<=edgeNo<=nEdges + inline int GetNofEdges() { return nEdges; } + + void GetVertices ( PPCVertex & V, int & nV ); + void GetEdges ( PPCEdge & E, int & nE ); + + virtual void Print(); + void Print1(); + + virtual void Copy ( PCGraph G ); + + void read ( RCFile f ); + void write ( RCFile f ); + + void mem_read ( cpstr S, int & l ); + void mem_write ( pstr S, int & l ); + + protected : + pstr name; + int nVertices,nEdges, nAllVertices,nAllEdges; + PPCVertex Vertex; + PPCEdge Edge; + imatrix graph; + + void InitGraph (); + void FreeMemory(); + + void markConnected ( int vno, int cno ); + + private : + int nVAlloc,nEAlloc,nGAlloc; + +}; + +DefineStreamFunctions(CGraph); + + +// ========================== CMatch ============================ + +DefineClass(CMatch); +DefineStreamFunctions(CMatch); + +class CMatch : public CStream { + + friend class CGraphMatch; + + public : + + CMatch (); + CMatch ( RPCStream Object ); + CMatch ( ivector FV1, ivector FV2, int nv, int n, int m ); + ~CMatch(); + + // FV1[] and FV2[] are copied into internal buffers + void SetMatch ( ivector FV1, ivector FV2, int nv, int n, int m ); + + Boolean isMatch ( ivector FV1, ivector FV2, int nv ); + Boolean isCombination ( ivector FV1, ivector FV2, int nv ); + + // do not allocate or dispose FV1 and FV2 in application! + void GetMatch ( ivector & FV1, ivector & FV2, int & nv, + realtype & p1, realtype & p2 ); + + void read ( RCFile f ); + void write ( RCFile f ); + + void mem_read ( cpstr S, int & l ); + void mem_write ( pstr S, int & l ); + + protected : + int n1,n2,mlength; + ivector F1,F2; + + void InitMatch(); + + private : + int nAlloc; + +}; + + +// ======================= CGraphMatch ========================= + +#define _UseRecursion + +#define GMF_UniqueMatch 0x00000001 +#define GMF_NoCombinations 0x00000002 + +#define EXTTYPE_Ignore 0 +#define EXTTYPE_Equal 1 +#define EXTTYPE_AND 2 +#define EXTTYPE_OR 3 +#define EXTTYPE_XOR 4 +#define EXTTYPE_NotEqual 5 +#define EXTTYPE_NotAND 6 +#define EXTTYPE_NotOR 7 + + +DefineClass(CGraphMatch); + +class CGraphMatch : public CStream { + + public : + + CGraphMatch (); + CGraphMatch ( RPCStream Object ); + ~CGraphMatch(); + + void SetFlag ( word flag ); + void RemoveFlag ( word flag ); + void SetMaxNofMatches ( int maxNofMatches, Boolean stopOnMaxN ); + void SetTimeLimit ( int maxTimeToRun=0 ); + Boolean GetStopSignal () { return Stop; } + + void Reset(); + + // MatchGraphs looks for maximal common subgraphs of size + // not less than minMatch. The number of found subgraphs + // is returned by GetNofMatches(), the subgraph vertices + // are returned by GetMatch(..). Control parameters: + // vertexType True if vertex type should be taken + // into account and False otherwise + // vertexExt key to use extended vertex types (defined + // as type_ext in CVertex). + void MatchGraphs ( PCGraph Gh1, PCGraph Gh2, int minMatch, + Boolean vertexType=True, + int vertexExt=EXTTYPE_Ignore ); + void PrintMatches (); + int GetNofMatches () { return nMatches; } + int GetMaxMatchSize() { return maxMatch; } + + // do not allocate or dispose FV1 and FV2 in application! + // FV1/p1 will always correspond to Gh1, and FV2/p2 - + // to Gh2 as specified in MatchGraphs(..) + void GetMatch ( int MatchNo, ivector & FV1, ivector & FV2, + int & nv, realtype & p1, realtype & p2 ); + + void read ( RCFile f ); + void write ( RCFile f ); + + void mem_read ( cpstr S, int & l ); + void mem_write ( pstr S, int & l ); + + protected : + PCGraph G1,G2; + PPCVertex V1; + PPCVertex V2; + imatrix c1,c2; + Boolean swap; +#ifndef _UseRecursion + ivector jj; +#endif + int n,m; + + imatrix3 P; + imatrix iF1; + ivector F1,F2,ix; + + int nMatches,maxNMatches; + PPCMatch Match; + Boolean wasFullMatch,Stop,stopOnMaxNMathches; + word flags; + int maxMatch,timeLimit; + + void InitGraphMatch(); + void FreeMemory (); + void FreeRecHeap (); + void GetMemory (); + void GetRecHeap (); + int Initialize ( Boolean vertexType, int vertexExt ); +#ifdef _UseRecursion + void Backtrack ( int i ); // exact matching +#else + void Ullman (); +#endif + void Backtrack1 ( int i, int k0 ); // exact/partial matching + void CollectMatch ( int nm ); + + private : + int nAlloc,mAlloc,nMAlloc; + time_t startTime; + +}; + +DefineStreamFunctions(CGraphMatch); + +extern void SetGraphAllocPortion ( int alloc_portion ); + +/* +extern void TestGraphMatch(); +*/ + + +#endif diff --git a/mmdb/mmdb_manager.cpp b/mmdb/mmdb_manager.cpp new file mode 100755 index 0000000..77e46f1 --- /dev/null +++ b/mmdb/mmdb_manager.cpp @@ -0,0 +1,392 @@ +// $Id: mmdb_manager.cpp,v 1.25 2012/01/26 17:52:20 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 23.06.13 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : mmdb_manager +// ~~~~~~~~~ +// **** Project : MacroMolecular Data Base (MMDB) +// ~~~~~~~~~ +// **** Classes : CMMDBManager ( MMDB file manager class ) +// ~~~~~~~~~ +// +// (C) E. Krissinel 2000-2013 +// +// ================================================================= +// + + +#ifndef __STRING_H +#include +#endif + +#ifndef __MMDB_Manager__ +#include "mmdb_manager.h" +#endif + + +// ===================== CMMDBManager ======================= + +CMMDBManager::CMMDBManager() : CMMDBBondManager() { +} + +CMMDBManager::CMMDBManager ( RPCStream Object ) + : CMMDBBondManager(Object) { +} + +CMMDBManager::~CMMDBManager() {} + +void CMMDBManager::Copy ( PCMMDBManager MMDB, word CopyMask ) { +PCModel model; +PPCChain chain; +PCChain ch; +ChainID chID; +int i,j, nchains; + + if (CopyMask & MMDBFCM_Flags) Flags = MMDB->Flags; + + if (CopyMask & MMDBFCM_Title) Title.Copy ( &(MMDB->Title) ); + if (CopyMask & MMDBFCM_Cryst) Cryst.Copy ( &(MMDB->Cryst) ); + + if (CopyMask & MMDBFCM_Coord) { + + FreeCoordMemory (); + DeleteAllSelections(); + + nAtoms = MMDB->nAtoms; + AtmLen = nAtoms; + if (nAtoms>0) { + Atom = new PCAtom[AtmLen]; + for (i=0;iAtom[i]) { + Atom[i] = newCAtom(); + Atom[i]->Copy ( MMDB->Atom[i] ); + // the internal atom references are installed + // by residue classes when they are read in + // model->chain below + Atom[i]->SetAtomIndex ( i+1 ); + } else + Atom[i] = NULL; + } + } + + nModels = MMDB->nModels; + if (nModels>0) { + Model = new PCModel[nModels]; + for (i=0;iModel[i]) { + Model[i] = newCModel(); + Model[i]->SetMMDBManager ( this,0 ); + Model[i]->_copy ( MMDB->Model[i] ); + } else + Model[i] = NULL; + } + } + + crModel = NULL; + crChain = NULL; + crRes = NULL; + + if (MMDB->crModel) { + + for (i=0;iserNum==MMDB->crModel->serNum) { + crModel = Model[i]; + break; + } + } + + if (crModel && crModel->Chain && MMDB->crChain) + for (i=0;inChains;i++) + if (crModel->Chain[i]) { + if (!strcmp(crModel->Chain[i]->chainID, + MMDB->crModel->Chain[i]->chainID)) { + crChain = crModel->Chain[i]; + break; + } + } + + if (crChain && crChain->Residue && MMDB->crRes) + for (i=0;inResidues;i++) + if (crChain->Residue[i]) { + if ((!strcmp(crChain->Residue[i]->name, + MMDB->crRes->name)) && + (crChain->Residue[i]->seqNum==MMDB->crRes->seqNum) && + (!strcmp(crChain->Residue[i]->insCode, + MMDB->crRes->insCode))) { + crRes = crChain->Residue[i]; + break; + } + } + } + + /* + if ((MMDB->nSelections>0) && MMDB->Mask) { + nSelections = MMDB->nSelections; + if (nSelections>0) { + Mask = new PCMask [nSelections]; + SelAtom = new PPCAtom[nSelections]; + nSelAtoms = new int [nSelections]; + for (i=0;iCopyMask ( MMDB->Mask[i] ); + nSelAtoms[i] = MMDB->nSelAtoms[i]; + if (nSelAtoms[i]>0) { + SelAtom[i] = new PCAtom[nSelAtoms[i]]; + for (j=0;jSelAtom[i][j]->index]; + } else + SelAtom[i] = NULL; + } + } + } + */ + + } else if (CopyMask & (MMDBFCM_HetInfo | MMDBFCM_SecStruct | + MMDBFCM_Links | MMDBFCM_CisPeps | + MMDBFCM_ChainAnnot)) { + + for (i=0;inModels;i++) + if (MMDB->Model[i]) { + + model = GetModel ( i+1 ); + if (!model) { + model = new CModel( NULL,i+1 ); + AddModel ( model ); + } + + if (CopyMask & MMDBFCM_HetInfo) + model->CopyHets ( MMDB->Model[i] ); + if (CopyMask & MMDBFCM_SecStruct) + model->CopySecStructure ( MMDB->Model[i] ); + if (CopyMask & MMDBFCM_Links) { + model->CopyLinks ( MMDB->Model[i] ); + model->CopyLinkRs ( MMDB->Model[i] ); + } + if (CopyMask & MMDBFCM_CisPeps) + model->CopyCisPeps ( MMDB->Model[i] ); + if (CopyMask & MMDBFCM_ChainAnnot) { + MMDB->GetChainTable ( i+1,chain,nchains ); + for (j=0;jGetChainID ( chID ); + ch = model->GetChain ( chID ); + if (!ch) { + ch = new CChain(); + ch->SetChainID ( chID ); + model->AddChain ( ch ); + } + ch->CopyAnnotations ( chain[j] ); + } + + } + + } + + } + + if (CopyMask & MMDBFCM_SA) SA.Copy ( &(MMDB->SA) ); + if (CopyMask & MMDBFCM_SB) SB.Copy ( &(MMDB->SB) ); + if (CopyMask & MMDBFCM_SC) SC.Copy ( &(MMDB->SC) ); + if (CopyMask & MMDBFCM_Footnotes) + Footnote.Copy ( &(MMDB->Footnote) ); + + if (CopyMask & MMDBFCM_Buffer) { + lcount = MMDB->lcount; + strncpy ( S,MMDB->S,sizeof(S) ); + } + +} + +void CMMDBManager::Delete ( word DelMask ) { +PPCModel model; +PPCChain chain; +int i,j,nm, nchains; + + if (DelMask & MMDBFCM_Flags) Flags = 0; + + if (DelMask & MMDBFCM_Title) Title.Copy ( NULL ); + if (DelMask & MMDBFCM_TitleKeepBM) Title.FreeMemory ( True ); + if (DelMask & MMDBFCM_Cryst) Cryst.Copy ( NULL ); + + if (DelMask & MMDBFCM_Coord) { + FreeCoordMemory (); + DeleteAllSelections(); + } + + if (DelMask & MMDBFCM_SecStruct) { + GetModelTable ( model,nm ); + if (model) + for (i=0;iRemoveSecStructure(); + } + + if (DelMask & MMDBFCM_HetInfo) { + GetModelTable ( model,nm ); + if (model) + for (i=0;iRemoveHetInfo(); + } + + if (DelMask & MMDBFCM_Links) { + GetModelTable ( model,nm ); + if (model) + for (i=0;iRemoveLinks (); + model[i]->RemoveLinkRs(); + } + } + + if (DelMask & MMDBFCM_CisPeps) { + GetModelTable ( model,nm ); + if (model) + for (i=0;iRemoveCisPeps(); + } + + if (DelMask & MMDBFCM_ChainAnnot) { + nm = GetNumberOfModels(); + for (i=1;i<=nm;i++) { + GetChainTable ( i,chain,nchains ); + if (chain) + for (j=0;jFreeAnnotations(); + } + } + + if (DelMask & MMDBFCM_SA) SA.FreeContainer(); + if (DelMask & MMDBFCM_SB) SB.FreeContainer(); + if (DelMask & MMDBFCM_SC) SC.FreeContainer(); + if (DelMask & MMDBFCM_Footnotes) Footnote.FreeContainer(); + + if (DelMask & MMDBFCM_Buffer) { + lcount = 0; + S[0] = char(0); + } + +} + +PCTitleContainer CMMDBManager::GetRemarks() { + return Title.GetRemarks(); +} + + +PCTitleContainer CMMDBManager::GetJournal() { + return Title.GetJournal(); +} + +realtype CMMDBManager::GetResolution() { + return Title.GetResolution(); +} + +int CMMDBManager::ParseBiomolecules() { + return Title.ParseBiomolecules(); +} + +int CMMDBManager::GetNofBiomolecules() { + return Title.GetNofBiomolecules(); +} + +void CMMDBManager::GetBiomolecules ( PPCBiomolecule & BM, + int & nBMs ) { + Title.GetBiomolecules ( BM,nBMs ); +} + +PCBiomolecule CMMDBManager::GetBiomolecule ( int bmNo ) { + return Title.GetBiomolecule ( bmNo ); +} + +PCMMDBManager CMMDBManager::MakeBiomolecule ( int bmNo, int modelNo ) { +PCMMDBManager M; +PPCChain ch; +PCChain chain; +PCModel model; +PCBiomolecule BM; +int i,j,k,n,n0,nChains; + + BM = Title.GetBiomolecule ( bmNo ); + if (!BM) return NULL; + + GetChainTable ( modelNo,ch,nChains ); + if ((!ch) || (nChains<=0)) return NULL; + + n0 = 0; + model = new CModel(); + + for (i=0;(inBMAs) && (n0>=0);i++) + if (BM->BMApply[i]) { + for (j=0;(jBMApply[i]->nMatrices) && (n0>=0);j++) + for (k=0;(kBMApply[i]->nChains) && (n0>=0);k++) { + n0 = -1; + for (n=0;(nGetChainID(),BM->BMApply[i]->chain[k])) + n0 = n; + if (n0>=0) { + chain = new CChain(); + chain->Copy ( ch[n0] ); + chain->ApplyTransform ( BM->BMApply[i]->tm[j] ); + model->AddChain ( chain ); + } + } + } + + if (n0>=0) { + M = new CMMDBManager(); + M->AddModel ( model ); + M->PDBCleanup ( PDBCLEAN_SERIAL | PDBCLEAN_INDEX ); + } else { + delete model; + M = NULL; + } + + return M; + +} + + +// ------------------- Stream functions ---------------------- + + +void CMMDBManager::write ( RCFile f ) { +byte Version=1; + f.WriteByte ( &Version ); + CMMDBBondManager::write ( f ); +} + +void CMMDBManager::read ( RCFile f ) { +byte Version; + f.ReadByte ( &Version ); + CMMDBBondManager::read ( f ); +} + + +MakeStreamFunctions(CMMDBManager) diff --git a/mmdb/mmdb_manager.h b/mmdb/mmdb_manager.h new file mode 100755 index 0000000..fd04b58 --- /dev/null +++ b/mmdb/mmdb_manager.h @@ -0,0 +1,122 @@ +// $Id: mmdb_manager.h,v 1.23 2012/01/26 17:52:20 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 23.06.13 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : mmdb_manager +// ~~~~~~~~~ +// Project : MacroMolecular Data Base (MMDB) +// ~~~~~~~~~ +// **** Classes : CMMDBManager ( MMDB file manager ) +// ~~~~~~~~~ +// +// (C) E. Krissinel 2000-2013 +// +// ================================================================= +// + +#ifndef __MMDB_Manager__ +#define __MMDB_Manager__ + +#ifndef __MMDB_BondMngr__ +#include "mmdb_bondmngr.h" +#endif + + +// ======================= CMMDBManager =========================== + + +// copy masks +#define MMDBFCM_All 0xFFFFFFFF +#define MMDBFCM_Title 0x00000001 +#define MMDBFCM_TitleKeepBM 0x00000002 +#define MMDBFCM_Cryst 0x00000004 +#define MMDBFCM_Coord 0x00000008 +#define MMDBFCM_SecStruct 0x00000010 +#define MMDBFCM_HetInfo 0x00000020 +#define MMDBFCM_Links 0x00000040 +#define MMDBFCM_CisPeps 0x00000080 +#define MMDBFCM_SA 0x00000100 +#define MMDBFCM_SB 0x00000200 +#define MMDBFCM_SC 0x00000400 +#define MMDBFCM_Footnotes 0x00000800 +#define MMDBFCM_ChainAnnot 0x00001000 +#define MMDBFCM_Flags 0x00002000 +#define MMDBFCM_Buffer 0x80000000 +#define MMDBFCM_Top 0xFFFFFFF7 + +DefineStreamFunctions(CMMDBManager) + +class CMMDBManager : public CMMDBBondManager { + + public : + + CMMDBManager (); + CMMDBManager ( RPCStream Object ); + ~CMMDBManager(); + + + // --------------- Copying/Deleting ----------------------- + + // Copy(..) will transfer different sort of information + // between two MMDB's according to the copy mask given + // (cf. MMDBFCM_XXXXX values). Note that the copying content + // replaces the corresponding information (e.g. copying + // coordinates will replace existing coordinates rather than + // add to them). + void Copy ( PCMMDBManager MMDB, word CopyMask ); + + // Delete(..) deletes different sort of information from + // the MMDB according to the delete mask given. + void Delete ( word DelMask ); // DelMask is the same as CopyMask + + PCTitleContainer GetRemarks(); + PCTitleContainer GetJournal(); + + realtype GetResolution(); // -1.0 means no resolution record in file + + int ParseBiomolecules(); // returns the number of biomolecules, + // -2 for general format error + // -3 for errors in BIOMT records + int GetNofBiomolecules(); + void GetBiomolecules ( PPCBiomolecule & BM, int & nBMs ); + + PCBiomolecule GetBiomolecule ( int bmNo ); // bmno=0,1,.. + // returns NULL if bmNo is incorrect + PCMMDBManager MakeBiomolecule ( int bmNo, int modelNo=1 ); + + + + protected : + + // --------------- Stream I/O ----------------------------- + void write ( RCFile f ); + void read ( RCFile f ); + +}; + +#endif + diff --git a/mmdb/mmdb_mask.cpp b/mmdb/mmdb_mask.cpp new file mode 100755 index 0000000..9f50748 --- /dev/null +++ b/mmdb/mmdb_mask.cpp @@ -0,0 +1,246 @@ +// $Id: mmdb_mask.cpp,v 1.20 2012/01/26 17:52:20 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 29.01.10 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : MMDB_Mask +// ~~~~~~~~~ +// **** Project : MacroMolecular Data Base (MMDB) +// ~~~~~~~~~ +// +// **** Classes : CMask ( atom selection mask ) +// ~~~~~~~~~ +// +// (C) E. Krissinel 2000-2010 +// +// ================================================================= +// + +#ifndef __STRING_H +#include +#endif + +#ifndef __STDLIB_H +#include +#endif + +#ifndef __MMDB_Mask__ +#include "mmdb_mask.h" +#endif + + +// ==================== CMask ======================== + +CMask::CMask() : CStream() { + InitMask(); +} + +CMask::CMask ( RPCStream Object ) : CStream(Object) { + InitMask(); +} + +CMask::~CMask() { + ClearMask(); +} + +void CMask::InitMask() { + mlen = 0; + m = NULL; +} + +void CMask::SetMaskBit ( int BitNo ) { +int n,i; + n = BitNo/(8*sizeof(word)); + Expand ( n+1 ); + i = BitNo - n*(8*sizeof(word)); + m[n] |= ((word)1 << i); +} + +void CMask::Expand ( int n ) { +wvector m1; +int i; + if (mlen0)) { + nlen = 0; + w = 0; + while (w==0) { + for (i=0;imlen) + w |= Mask[i]->m[nlen]; + } + nlen++; + w = ~w; + } + Expand ( nlen ); + i = nlen-1; + m[i] = 1; + while (!(m[i] & w)) + m[i] <<= 1; + } else { + Expand ( 1 ); + m[0] = 1; + } +} + +void CMask::CopyMask ( PCMask Mask ) { +int i; + if (mlen!=Mask->mlen) ClearMask(); + if (Mask) { + mlen = Mask->mlen; + if (mlen>0) { + m = new word[mlen]; + for (i=0;im[i]; + } + } +} + +void CMask::SetMask ( PCMask Mask ) { +int i; + if (Mask) { + Expand ( Mask->mlen ); + for (i=0;imlen;i++) + m[i] |= Mask->m[i]; + } +} + +void CMask::RemoveMask ( PCMask Mask ) { +int i,l; + if (Mask) { + l = IMin(mlen,Mask->mlen); + for (i=0;im[i]; + } +} + +void CMask::SelMask ( PCMask Mask ) { +int i,l; + if (Mask) { + l = IMin(mlen,Mask->mlen); + for (i=0;im[i]; + for (i=l;imlen ); + for (i=0;imlen;i++) + m[i] ^= Mask->m[i]; + } +} + +void CMask::ClearMask() { + if (m) delete[] m; + m = NULL; + mlen = 0; +} + +void CMask::NegMask() { +int i; + for (i=0;imlen); + while ((im[i]))) i++; + return (i0) { + m = new word[mlen]; + for (i=0;i +// ~~~~~~~~~ +// **** Project : MacroMolecular Data Base (MMDB) +// ~~~~~~~~~ +// +// **** Classes : CMask ( atom selection mask ) +// ~~~~~~~~~ +// +// (C) E. Krissinel 2000-2008 +// +// ================================================================= +// + +#ifndef __MMDB_Mask__ +#define __MMDB_Mask__ + + +#ifndef __Stream__ +#include "stream_.h" +#endif + + + +// ==================== CMask ======================== + +DefineClass(CMask) +DefineStreamFunctions(CMask) + +class CMask : public CStream { + + public : + + CMask (); + CMask ( RPCStream Object ); + ~CMask(); + + void SetMaskBit ( int BitNo ); + void NewMask ( PPCMask Mask, int nMasks ); + + void CopyMask ( PCMask Mask ); // this = Mask + void SetMask ( PCMask Mask ); // this = this | Mask + void RemoveMask ( PCMask Mask ); // this = this & (~Mask) + void SelMask ( PCMask Mask ); // this = this & Mask + void XadMask ( PCMask Mask ); // this = this ^ Mask + void ClearMask (); // this = NULL + void NegMask (); // this = ~this + + Boolean CheckMask ( PCMask Mask ); // True if the bit is on + Boolean isMask (); // true if any mask bit is on + + inline int getLength() { return mlen; } + + pstr Print ( pstr S ); // returns binary string + + void write ( RCFile f ); + void read ( RCFile f ); + + protected : + int mlen; + wvector m; + + void InitMask(); + void Expand ( int n ); + +}; + + +#endif + diff --git a/mmdb/mmdb_mmcif.cpp b/mmdb/mmdb_mmcif.cpp new file mode 100755 index 0000000..65b2823 --- /dev/null +++ b/mmdb/mmdb_mmcif.cpp @@ -0,0 +1,3671 @@ +// $Id: mmdb_mmcif.cpp,v 1.24 2012/01/26 17:52:20 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2013. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 07.02.13 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : MMDB_MMCIF +// ~~~~~~~~~ +// **** Project : MacroMolecular Data Base (MMDB) +// ~~~~~~~~~ +// **** Classes : CMMCIFCategory ( mmCIF category ) +// ~~~~~~~~~ CMMCIFStruct ( mmCIF structure ) +// CMMCIFLoop ( mmCIF loop ) +// CMMCIFData ( mmCIF data block ) +// CMMCIFFile ( mmCIF file ) +// +// (C) E. Krissinel 2000-2013 +// +// ================================================================= +// + +#ifndef __STRING_H +#include +#endif + +#ifndef __STDLIB_H +#include +#endif + +#ifndef __TIME_H +#include +#endif + +#ifndef __MMDB_MMCIF__ +#include "mmdb_mmcif.h" +#endif + + + +// ====================== SortTags =============================== + +void SortTags ( psvector tag, int len, ivector index ) { +int i,k,l,l1,l2; + if (len==1) { + index[0] = 0; + return; + } + if (strcasecmp(tag[0],tag[1])<0) { + index[0] = 0; + index[1] = 1; + } else { + index[0] = 1; + index[1] = 0; + } + for (k=2;k0) l2 = k; + else { + l1 = 0; + while (l1l2;i--) + index[i] = index[i-1]; + index[l2] = k; + } +} + + + +// ====================== CMMCIFCategory ========================== + + +CMMCIFCategory::CMMCIFCategory() : CStream() { + InitMMCIFCategory(); +} + +CMMCIFCategory::CMMCIFCategory ( cpstr N ) : CStream() { + InitMMCIFCategory(); + SetCategoryName ( N ); +} + +CMMCIFCategory::CMMCIFCategory ( RPCStream Object ) + : CStream(Object) { + InitMMCIFCategory(); +} + +CMMCIFCategory::~CMMCIFCategory() { + FreeMemory(); +} + +void CMMCIFCategory::InitMMCIFCategory() { + name = NULL; + nTags = 0; + tag = NULL; + index = NULL; + nAllocTags = 0; +} + +void CMMCIFCategory::FreeMemory() { +int i; + if (name) delete[] name; + name = NULL; + for (i=0;inAllocTags) { + nAT = nTagsNew + IMin(nAllocTags/2+1,20); + GetVectorMemory ( tag1 ,nAT,0 ); + GetVectorMemory ( index1,nAT,0 ); + for (i=0;i=0) && (tagNo0) { + k = 0; + if (!index) + GetVectorMemory ( index,nAllocTags,0 ); + for (i=0;i=0 : position of the tag found +// <0 : the tag was not found, it could be inserted before +// (-RC-1)th element, where RC is the return value +int l1,l2,l,k; + + if (!tag) return -1; + + if (!index) Sort(); + + l = 0; + l1 = 0; + l2 = nTags-1; + k = 1; + while (l10) l1 = l; + else { + l1 = l; + break; + } + } + + if (k==0) return index[l]; // is at RCth position + k = strcasecmp ( ttag,tag[index[l1]] ); + if (k==0) return index[l1]; // is at RCth position + if (k<0) return -1; // would be at (-RC-1)th position + if (l2!=l1) { + k = strcasecmp ( ttag,tag[index[l2]] ); + if (k==0) return index[l2]; // is at RCth position + if (k>0) return -2-l2; // would be at l2+1=(-RC-1)th position + } + + return -2-l1; // would be at l1+1=(-RC-1)th position + +} + +int CMMCIFCategory::AddTag ( cpstr ttag ) { +// return -1: the tag has been added on the top of array; +// index is added and sorted automatically +// >=0: the tag is already in the array -- its position +// is returned +int i1,i; + if (!tag) { + ExpandTags ( 3 ); // get space for first 3 tags + CreateCopy ( tag[0],ttag ); + nTags = 1; + return -nTags; // the tag has been added on the top of array + } + i1 = GetTagNo ( ttag ); + if (i1>=0) return i1; // non-negative returns mean that + // the tag is already in the array + i1 = -i1-1; // otherwise the tag has to be added and indexed at here + // put new tag on the top of array and update index + ExpandTags ( nTags+1 ); + CreateCopy ( tag[nTags],ttag ); + for (i=nTags;i>i1;i--) + index[i] = index[i-1]; + index[i1] = nTags; + nTags++; + return -nTags; // the tag has been added on the top of array +} + +void CMMCIFCategory::PrintTags() { +int i; + Sort(); + printf ( " Unsorted tags:\n" ); + for (i=0;iname ); + nTags = Category->nTags; + nAllocTags = nTags; + if (nTags>0) { + GetVectorMemory ( tag ,nAllocTags,0 ); + GetVectorMemory ( index,nAllocTags,0 ); + for (i=0;itag[i] ); + index[i] = Category->index[i]; + } + } + } +} + + +void CMMCIFCategory::write ( RCFile f ) { +int i; + if (!index) Sort(); + f.CreateWrite ( name ); + f.WriteInt ( &nTags ); + for (i=0;i0) { + GetVectorMemory ( tag,nTags,0 ); + for (i=0;inAT) { + GetVectorMemory ( field1,nAllocTags,0 ); + for (i=0;i=0) && (tagNo=0) && (field)) { + if (field[k]) delete[] field[k]; + field[k] = NULL; + } + return k; +} + +int CMMCIFStruct::GetReal ( realtype & R, cpstr TName, + Boolean Remove ) { +pstr endptr; +int RC; +int k = GetTagNo ( TName ); + R = 0.0; + if (!field) return CIFRC_NoField; + if (k<0) return CIFRC_NoTag; + if (!field[k]) return CIFRC_NoField; + if (field[k][0]==char(2)) return CIFRC_NoData; + R = strtod ( field[k],&endptr ); + if (endptr==field[k]) RC = CIFRC_WrongFormat; + else { + RC = 0; + if (Remove) { + delete[] field[k]; + field[k] = NULL; + } + } + return RC; +} + +int CMMCIFStruct::GetInteger ( int & I, cpstr TName, + Boolean Remove ) { +pstr endptr; +int RC; +int k = GetTagNo ( TName ); + I = 0; + if (!field) return CIFRC_NoField; + if (k<0) return CIFRC_NoTag; + if (!field[k]) return CIFRC_NoField; + if (field[k][0]==char(2)) { + if (field[k][1]=='.') I = MinInt4; + return CIFRC_NoData; + } + I = mround ( strtod(field[k],&endptr) ); + if (endptr==field[k]) RC = CIFRC_WrongFormat; + else { + RC = 0; + if (Remove) { + delete[] field[k]; + field[k] = NULL; + } + } + return RC; +} + + +void CMMCIFStruct::PutString ( cpstr S, cpstr T, + Boolean NonBlankOnly ) { +pstr p; + if (!S) PutNoData ( CIF_NODATA_QUESTION,T ); + else { + p = pstr(S); + if (NonBlankOnly) + while (*p==' ') p++; + if (!(*p)) PutNoData ( CIF_NODATA_DOT,T ); + else AddField ( S,T,False ); + } +} + +void CMMCIFStruct::PutDate ( cpstr T ) { +time_t t; +tm * tstruct; + char S[100]; + t = time ( NULL ); + tstruct = localtime(&t); + if (tstruct) + sprintf ( S,"%4i-%02i-%02i", + tstruct->tm_year+1900,tstruct->tm_mon+1,tstruct->tm_mday ); + else strcpy ( S,"YYYY-MM-DD" ); + AddField ( S,T,False ); +} + + +void CMMCIFStruct::PutNoData ( int NoDataType, cpstr T ) { +char S[10]; + S[0] = char(2); + if (NoDataType==CIF_NODATA_DOT) S[1] = '.'; + else S[1] = '?'; + S[2] = char(0); + AddField ( S,T,False ); +} + + +void CMMCIFStruct::PutReal ( realtype R, cpstr T, int prec ) { +char rS[100]; + sprintf ( rS,"%.*g",prec,R ); + AddField ( rS,T,False ); +} + +void CMMCIFStruct::PutReal ( realtype R, cpstr T, cpstr format ) { +char rS[100]; + sprintf ( rS,format,R ); + AddField ( DelSpaces(rS,' '),T,False ); +} + +void CMMCIFStruct::PutInteger ( int I, cpstr T ) { +char iS[100]; + if (I>MinInt4) { + sprintf ( iS,"%i",I ); + AddField ( iS,T,False ); + } else + PutNoData ( CIF_NODATA_DOT,T ); +} + + + +#define NODATA_Q pstr("?") +#define NODATA_P pstr(".") + +Boolean CMMCIFStruct::WriteMMCIFStruct ( cpstr FName, + byte gzipMode ) { +CFile f; + f.assign ( FName,True,False,gzipMode ); + if (f.rewrite()) { + WriteMMCIF ( f ); + f.shut(); + return True; + } else + return False; +} + +#define _max_output_line_width 256 + +void CMMCIFStruct::WriteMMCIF ( RCFile f ) { +int i,j,k,l,m,n; +pstr F; + + // calculate maximal length of tags + l = 0; + for (i=0;im) // wrap around if field is too long + f.Write ( pstr("\n ") ); + else { + k = l-strlen(tag[i]); + for (j=0;j0) { + GetVectorMemory ( field,nTags,0 ); + for (i=0;ifield[i] ); + } + } +} + +void CMMCIFStruct::write ( RCFile f ) { +int i; + CMMCIFCategory::write ( f ); + for (i=0;i0) { + GetVectorMemory ( field,nTags,0 ); + for (i=0;i=nTags) { + delete[] field[j]; // delete empty row + field[j] = NULL; + } else + nR++; // count non-empty row + } + if ((nT<=0) || (nR<=0)) + FreeMemory(); // the loop is completely empty + else if ((nT!=nTags) || (nR!=nAllocRows)) { + f1 = new psvector[nR]; + m = 0; + for (j=0;jnAllocRows) { + nAR = nRowsNew + IMin(nAllocRows/2+10,2000); + field1 = new psvector[nAR]; + for (i=0;i=nTags) iColumn = 0; + } + } +} + +void CMMCIFLoop::AddNoData ( int NoDataType ) { +char S[10]; + S[0] = char(2); + if (NoDataType==CIF_NODATA_DOT) S[1] = '.'; + else S[1] = '?'; + S[2] = char(0); + AddString ( S ); +} + +void CMMCIFLoop::AddReal ( realtype R, int prec ) { +char rS[100]; + sprintf ( rS,"%.*g",prec,R ); + AddString ( rS ); +} + +void CMMCIFLoop::AddReal ( realtype R, cpstr format ) { +char rS[100]; + sprintf ( rS,format,R ); + AddString ( DelSpaces(rS,' ') ); +} + +void CMMCIFLoop::AddInteger ( int I ) { +char iS[100]; + if (I>MinInt4) { + sprintf ( iS,"%i",I ); + AddString ( iS ); + } else + AddNoData ( CIF_NODATA_DOT ); +} + + +pstr CMMCIFLoop::GetField ( int rowNo, int tagNo ) { + if ((tagNo>=0) && (tagNo=0) && (rowNo=nRows)) return CIFRC_WrongIndex; + if (!field[nrow]) return CIFRC_NoField; + if (!field[nrow][k]) return CIFRC_NoField; + if (field[nrow][k][0]==char(2)) { + if (Remove) { + delete[] field[nrow][k]; + field[nrow][k] = NULL; + } + } else if (Remove) { + S = field[nrow][k]; + field[nrow][k] = NULL; + } else + CreateCopy ( S,field[nrow][k] ); + return 0; +} + +pstr CMMCIFLoop::GetString ( cpstr TName, int nrow, int & RC ) { +int k = GetTagNo ( TName ); + if (k<0) { + RC = CIFRC_NoTag; + return NULL; + } + if ((nrow<0) || (nrow>=nRows)) { + RC = CIFRC_WrongIndex; + return NULL; + } + if (!field[nrow]) { + RC = CIFRC_NoField; + return NULL; + } + if (!field[nrow][k]) { + RC = CIFRC_NoField; + return NULL; + } + RC = 0; + // char(2) means the field was either '.' or '?' + if (field[nrow][k][0]==char(2)) return NULL; + return field[nrow][k]; +} + +// CopyString() does nothing if RC is not 0 +void CMMCIFLoop::CopyString ( pstr buf, int maxlength, + cpstr TName, int nrow, int & RC ) { +pstr p; +int k; + + if (RC) return; + + k = GetTagNo ( TName ); + if (k<0) { + RC = CIFRC_NoTag; + buf[0] = char(0); + return; + } + if ((nrow<0) || (nrow>=nRows)) { + RC = CIFRC_WrongIndex; + buf[0] = char(0); + return; + } + if (!field[nrow]) { + RC = CIFRC_NoField; + buf[0] = char(0); + return; + } + p = field[nrow][k]; + if (!p) { + RC = CIFRC_NoField; + buf[0] = char(0); + return; + } + + // char(2) means the field was either '.' or '?' + if (p[0]==char(2)) { + buf[0] = p[0]; + buf[1] = char(0); + } else + strncpy ( buf,p,IMin(maxlength,strlen(p)+1) ); + +} + + + +int CMMCIFLoop::DeleteField ( cpstr TName, int nrow ) { +int k = GetTagNo ( TName ); + if (k<0) return CIFRC_NoTag; + if ((nrow<0) || (nrow>=nRows)) + return CIFRC_WrongIndex; + if (field[nrow]) { + if (field[nrow][k]) delete[] field[nrow][k]; + field[nrow][k] = NULL; + } + return k; +} + +int CMMCIFLoop::DeleteRow ( int nrow ) { +int i; + if ((nrow<0) || (nrow>=nRows)) + return CIFRC_WrongIndex; + if (field[nrow]) { + for (i=0;i=nRows)) + return CIFRC_WrongIndex; + R = 0.0; + if (!field[nrow]) return CIFRC_NoField; + if (!field[nrow][k]) return CIFRC_NoField; + if (field[nrow][k][0]==char(2)) return CIFRC_NoField; + R = strtod ( field[nrow][k],&endptr ); + if (endptr==field[nrow][k]) return CIFRC_WrongFormat; + if (Remove) { + delete[] field[nrow][k]; + field[nrow][k] = NULL; + } + return 0; +} + +void CMMCIFLoop::CopyReal ( realtype & R, cpstr TName, int nrow, + int & RC ) { +pstr endptr; +int k; + + if (RC) return; + +// R = 0.0; + k = GetTagNo ( TName ); + + if (k<0) RC = CIFRC_NoTag; + else if ((nrow<0) || (nrow>=nRows)) RC = CIFRC_WrongIndex; + else if (!field[nrow]) RC = CIFRC_NoField; + else if (!field[nrow][k]) RC = CIFRC_NoField; + else if (field[nrow][k][0]==char(2)) RC = CIFRC_NoField; + else { + R = strtod ( field[nrow][k],&endptr ); + if (endptr==field[nrow][k]) RC = CIFRC_WrongFormat; + } + +} + +void CMMCIFLoop::CopyInteger ( int & I, cpstr TName, int nrow, + int & RC ) { +pstr endptr; +int k; + + if (RC) return; + + I = 0; + k = GetTagNo ( TName ); + + if (k<0) RC = CIFRC_NoTag; + else if ((nrow<0) || (nrow>=nRows)) RC = CIFRC_WrongIndex; + else if (!field[nrow]) RC = CIFRC_NoField; + else if (!field[nrow][k]) RC = CIFRC_NoField; + else if (field[nrow][k][0]==char(2)) RC = CIFRC_NoField; + else { + I = mround ( strtod ( field[nrow][k],&endptr ) ); + if (endptr==field[nrow][k]) RC = CIFRC_WrongFormat; + } + +} + +int CMMCIFLoop::GetInteger ( int & I, cpstr TName, int nrow, + Boolean Remove ) { +pstr endptr; +int k = GetTagNo ( TName ); + if (k<0) return CIFRC_NoTag; + if ((nrow<0) || (nrow>=nRows)) + return CIFRC_WrongIndex; + I = 0; + if (!field[nrow]) return CIFRC_NoField; + if (!field[nrow][k]) return CIFRC_NoField; + if (field[nrow][k][0]==char(2)) { + if (field[nrow][k][1]=='.') I = MinInt4; + return CIFRC_NoField; + } + I = mround ( strtod(field[nrow][k],&endptr) ); + if (endptr==field[nrow][k]) return CIFRC_WrongFormat; + if (Remove) { + delete[] field[nrow][k]; + field[nrow][k] = NULL; + } + return 0; +} + + +int CMMCIFLoop::GetSVector ( psvector & S, cpstr TName, + int i1, int i2, Boolean Remove ) { +int j,k,r1,r2; + r1 = IMin(i1,i2); + r2 = IMin(IMax(i1,i2),nRows-1); + if ((r1<0) || (r1>=nRows) || (r2<0)) return CIFRC_WrongIndex; + k = GetTagNo ( TName ); + if (k<0) return CIFRC_NoTag; + if (!S) + GetVectorMemory ( S,r2-r1+1,r1 ); + if (Remove) { + for (j=r1;j<=r2;j++) + if (field[j]) { + S[j] = field[j][k]; + field[j][k] = NULL; + if (S[j]) { + if (S[j][0]==char(2)) { + delete[] S[j]; + S[j] = NULL; + } + } + } else + S[j] = NULL; + } else { + for (j=r1;j<=r2;j++) { + S[j] = NULL; + if (field[j]) { + if (field[j][k]) { + if (field[j][k][0]!=char(2)) + CreateCopy ( S[j],field[j][k] ); + } + } + } + } + return 0; +} + +int CMMCIFLoop::GetRVector ( rvector & R, cpstr TName, + int i1, int i2, Boolean Remove ) { +int j,k,r1,r2,RC; +pstr endptr; + r1 = IMin(i1,i2); + r2 = IMin(IMax(i1,i2),nRows-1); + if ((r1<0) || (r1>=nRows) || (r2<0)) return CIFRC_WrongIndex; + k = GetTagNo ( TName ); + if (k<0) return CIFRC_NoTag; + if (!R) + GetVectorMemory ( R,r2-r1+1,r1 ); + RC = 0; + for (j=r1;j<=r2;j++) { + R[j] = 0.0; + if (field[j]) { + if (field[j][k]) { + R[j] = strtod ( field[j][k],&endptr ); + if (endptr==field[j][k]) RC = CIFRC_WrongFormat; + if (Remove) { + delete[] field[j][k]; + field[j][k] = NULL; + } + } + } + } + return RC; +} + +int CMMCIFLoop::GetIVector ( ivector & I, cpstr TName, + int i1, int i2, Boolean Remove ) { +int j,k,r1,r2,RC; +pstr endptr; + r1 = IMin(i1,i2); + r2 = IMin(IMax(i1,i2),nRows-1); + if ((r1<0) || (r1>=nRows) || (r2<0)) return CIFRC_WrongIndex; + k = GetTagNo ( TName ); + if (k<0) return CIFRC_NoTag; + if (!I) + GetVectorMemory ( I,r2-r1+1,r1 ); + RC = 0; + for (j=r1;j<=r2;j++) { + I[j] = 0; + if (field[j]) { + if (field[j][k]) { + I[j] = mround ( strtod(field[j][k],&endptr) ); + if (endptr==field[j][k]) RC = CIFRC_WrongFormat; + if (Remove) { + delete[] field[j][k]; + field[j][k] = NULL; + } + } + } + } + return RC; +} + + +void CMMCIFLoop::PutString ( cpstr S, cpstr T, int nrow ) { +psmatrix field1; +int nT,nR,iT,i,j; + nT = nTags; + nR = nRows; + iT = AddTag ( T ); + if (iT<0) iT = nTags-1; + if (nTags>nT) { + // a new tag has been added; all field must be reallocated. + nRows = IMax(nR,nrow+1); // nrow is indexed like 0,1,... + nAllocRows = IMax(nR,nrow+IMin(nR/2+1,2000)); + field1 = new psvector[nAllocRows]; + for (i=0;i=nR) { + // only new rows are to be added + ExpandRows ( nrow+1 ); + nRows++; + } + if (!field[nrow]) { + field[nrow] = new pstr[nTags]; + for (j=0;j=nTags) iColumn = 0; +} + + +void CMMCIFLoop::PutNoData ( int NoDataType, cpstr T, int nrow ) { +char S[10]; + S[0] = char(2); + if (NoDataType==CIF_NODATA_DOT) S[1] = '.'; + else S[1] = '?'; + S[2] = char(0); + PutString ( S,T,nrow ); +} + + +void CMMCIFLoop::PutReal ( realtype R, cpstr T, int nrow, int prec ) { +char rS[100]; + sprintf ( rS,"%.*g",prec,R ); + PutString ( rS,T,nrow ); +} + +void CMMCIFLoop::PutReal ( realtype R, cpstr T, int nrow, + cpstr format ) { +char rS[100]; + sprintf ( rS,format,R ); + PutString ( DelSpaces(rS,' '),T,nrow ); +} + +void CMMCIFLoop::PutInteger ( int I, cpstr T, int nrow ) { +char iS[100]; + if (I>MinInt4) { + sprintf ( iS,"%i",I ); + PutString ( iS,T,nrow ); + } else + PutNoData ( CIF_NODATA_DOT,T,nrow ); +} + +void CMMCIFLoop::PutSVector ( psvector S, cpstr T, int i1, int i2 ) { +int i,j,k; + PutString ( S[i2],T,i2 ); + if (iColumn==0) k = nTags-1; + else k = iColumn-1; + for (i=i2-1;i>=i1;i--) { + if (!field[i]) { + field[i] = new pstr[nTags]; + for (j=0;j=i1;i--) { + if (!field[i]) { + field[i] = new pstr[nTags]; + for (j=0;j=i1;l--) { + if (!field[l]) { + field[l] = new pstr[nTags]; + for (j=0;j_max_output_line_width) { + l[i] = -l[i]; + k = 0; + } + } + for (i=0;i_max_output_line_width) { + f.LF(); + m = k+1; + } else + while (n>0) { + f.Write ( pstr(" ") ); + n--; + } + if (field[i]) { + if (field[i][j]) { + F = field[i][j]; + if (k>10000) { + if (F[0]==char(2)) { + f.Write ( pstr(" ") ); + f.WriteLine ( &(F[1]) ); + } else if (!F[0]) { + f.Write ( pstr(" ") ); + f.WriteLine ( NODATA_P ); + } else { + f.Write ( pstr(";") ); + f.WriteLine ( F ); + f.WriteLine ( pstr(";") ); + } + m = 0; + k = 0; + } else if ((((F[0]=='.') || (F[0]=='?')) && (!F[1])) || + strchr(F,' ')) { + f.Write ( pstr(" \"") ); + f.Write ( F ); + f.Write ( pstr("\"") ); + k -= strlen(F)+2; + } else if (F[0]==char(2)) { + f.Write ( pstr(" ") ); + f.Write ( &(F[1]) ); + k--; + } else if (!F[0]) { + f.Write ( pstr(" ") ); + f.Write ( NODATA_P ); + k--; + } else { + f.Write ( pstr(" ") ); + f.Write ( F ); + k -= strlen(F); + } + } else { + f.Write ( pstr(" ") ); + f.Write ( NODATA_Q ); + k--; + } + } else { + f.Write ( pstr(" ") ); + f.Write ( NODATA_Q ); + k--; + } + } + if (m) f.LF(); + } + +} + + +void CMMCIFLoop::Copy ( PCMMCIFCategory Loop ) { +int i,j; + CMMCIFCategory::Copy ( Loop ); + nRows = PCMMCIFLoop(Loop)->nRows; + nAllocRows = nRows; + if ((nTags>0) && (nRows>0)) { + field = new psvector[nRows]; + for (i=0;ifield[i]) { + field[i] = new pstr[nTags]; + for (j=0;jfield[i][j] ); + } + } else + field[i] = NULL; + } + } + iColumn = PCMMCIFLoop(Loop)->iColumn; +} + + +void CMMCIFLoop::write ( RCFile f ) { +int i,j; + CMMCIFCategory::write ( f ); + f.WriteInt ( &nRows ); + if ((nTags>0) && (nRows>0)) + for (i=0;i0) && (nRows>0)) { + field = new psvector[nRows]; + for (i=0;i0) { + WrongCat = new pstr[nWrongFields]; + WrongTag = new pstr[nWrongFields]; + for (i=0;i>\n",lcount ); + return CIFRC_NoDataLine; + } + + llen = _max_buf_len; + L = new char[llen]; + i = 0; + p += 5; + while ((*p) && (*p!=' ') && (*p!=char(9))) { + L[i++] = *p; + p++; + } + L[i] = char(0); + CreateCopy ( name,L ); + + + // 2. Loop over tags until next 'data_' or end of file + + while (p) { + + // skip spaces + while ((*p==' ') || (*p==char(9))) p++; + + if ((*p) && (*p!='#')) { // this is not a comment, continue + if (*p=='_') + GetDataItem ( f,S,L,p,lcount,llen ); + else if (!strncmp(p,"loop_",5)) + GetLoop ( f,S,L,p,lcount,llen ); + else if (!strncmp(p,"data_",5)) { + p = NULL; + break; + } else { + // if got to here, the file is corrupted + strcpy ( _err_string,S ); + _err_line = lcount; + Warning |= CIFW_UnrecognizedItems; + if (flags & CIFFL_PrintWarnings) + printf ( "\n **** mmCIF READ WARNING " + "<>\n%s\n", + lcount,S ); + while ((*p) && (*p!=' ') && (*p!=char(9))) + if (*p=='#') *p = char(0); + else p++; + } + } else + *p = char(0); + + if (Warning && (flags & CIFFL_StopOnWarnings)) { + if (L) delete[] L; + return Warning; + } + + if (!(*p)) { + if (!f.FileEnd()) { + f.ReadLine ( S,_max_buf_len ); + lcount++; + p = &(S[0]); + } else + p = NULL; + } + + } + + if (L) delete[] L; + + Optimize(); // get rid of over-allocated fields. + + return Warning; + +} + + +void CMMCIFData::GetDataItem ( RCFile f, pstr S, pstr & L, + pstr & p, int & lcount, int & llen ) { +PCMMCIFStruct Struct; +char T[100]; +int RC,i; + + i = 0; + while ((*p) && (*p!=' ') && (*p!=char(9)) && (*p!='.')) { + if (i<(int)sizeof(T)-1) T[i++] = *p; + p++; + } + T[i] = char(0); + + if (*p!='.') { // category name missing + strcpy ( L,T ); // item name + T[0] = char(1); // special + T[1] = char(0); // category name + } + + // look for category + i = AddCategory ( T ); + if (i<0) { + // negative value means that the category was not in the list, + // but a place for it has been provided and index updated + Struct = new CMMCIFStruct ( T ); + Category[nCategories-1] = Struct; + } else { + Struct = PCMMCIFStruct(Category[i]); + if (Struct->GetCategoryID()!=MMCIF_Struct) { + strcpy ( _err_string,S ); + _err_line = lcount; + Warning |= CIFW_NotAStructure; + if (flags & CIFFL_PrintWarnings) + printf ( "\n **** mmCIF READ WARNING " + "<>\n%s\n", + lcount,T,S ); + delete Category[i]; + Struct = new CMMCIFStruct ( T ); + Category[i] = Struct; + } + } + + if (*p=='.') { // get item name + i = 0; + p++; // skip period + while ((*p) && (*p!=' ') && (*p!=char(9))) { + T[i++] = *p; + p++; + } + T[i] = char(0); + } else + strcpy ( T,L ); + + if (nWrongFields>0) { + if (CheckWrongField(Struct->name,T)) { + GetField ( f,S,L,p,lcount,llen ); + Struct->DeleteField ( T ); + return; + } + } + + RC = GetField ( f,S,L,p,lcount,llen ); + + if (RC) { + strcpy ( _err_string,S ); + _err_line = lcount; + Warning |= CIFW_MissingField; + if (flags & CIFFL_PrintWarnings) + printf ( "\n **** mmCIF READ WARNING " + "<>\n%s\n", + lcount,S ); + } + + while ((*p==' ') || (*p==char(9))) p++; + if (*p=='#') *p = char(0); + + i = Struct->GetTagNo ( T ); + if (i>=0) { + if (flags & CIFFL_SuggestTags) { + tagNo++; + ParamStr ( T,pstr("\1"),tagNo ); + } else { + strcpy ( _err_string,S ); + _err_line = lcount; + Warning |= CIFW_DuplicateTag; + if (flags & CIFFL_PrintWarnings) + printf ( "\n **** mmCIF READ WARNING " + "<>\n%s\n",lcount,S ); + } + } + Struct->AddField ( L,T ); + +} + +void CMMCIFData::GetLoop ( RCFile f, pstr S, pstr & L, + pstr & p, int & lcount, int & llen ) { +PCMMCIFLoop Loop; +pstr p1; +char T[100]; +Boolean Repeat,WrongField; +int RC,i,nC; + + RC = 0; + + p += 5; // skip 'loop_' tag + + loopNo++; + Loop = NULL; + nC = -1; // undefined category number + do { + + while ((*p==' ') || (*p==char(9))) p++; + p1 = p; + + if (*p=='_') { + + // get category name + i = 0; + while ((*p) && (*p!=' ') && (*p!=char(9)) && (*p!='.')) { + if (i<(int)sizeof(T)-1) T[i++] = *p; + p++; + } + T[i] = char(0); + + if (*p!='.') { // category name missing + strcpy ( L,T ); // item name + if (flags & CIFFL_SuggestCategories) + sprintf ( T,"X%i",loopNo ); + else strcpy ( T,"X" ); + T[0] = char(1); // special category name + } + + if (Loop) { + if (strcmp(Loop->GetCategoryName(),T)) { + // loop ended, empty + p = p1; // play back to last category + Loop = NULL; + } + } else { + // look for category + i = AddCategory ( T ); + if ((i!=nC) && (nC>=0)) { // empty loop; most probably + // a corrupted file + p = p1; // play back to last category + strcpy ( _err_string,S ); + _err_line = lcount; + Warning |= CIFW_EmptyLoop; + if (flags & CIFFL_PrintWarnings) + printf ( "\n **** mmCIF READ WARNING " + "<>\n%s\n",lcount,S ); + // AddCategory(..) has added a NULL-Category on the top of + // category list; remove it now + DeleteCategory ( nCategories-1 ); + Loop = NULL; +// return; + } + if (i<0) { + // negative value means that the category was not in the list, + // but a place for it has been provided and index updated + Loop = new CMMCIFLoop ( T ); + Category[nCategories-1] = Loop; + nC = nCategories-1; + } + } +/* + else if (Loop) { + if (!strcmp(Loop->GetCategoryName(), + Category[i]->GetCategoryName())) { + if (Loop->GetCategoryID()!=MMCIF_Loop) { + Warning |= CIFW_NotALoop; + if (flags & CIFFL_PrintWarnings) + printf ( "\n **** mmCIF READ WARNING " + "<>\n%s\n",lcount,T,S ); + delete Category[i]; + Loop = new CMMCIFLoop ( T ); + Category[i] = Loop; + } + } else + Loop = NULL; + } +*/ + if (Loop) { + + if (*p=='.') { // get item name + i = 0; + p++; // skip period + while ((*p) && (*p!=' ') && (*p!=char(9))) { + T[i++] = *p; + p++; + } + T[i] = char(0); + } else + strcpy ( T,L ); + + if (nWrongFields>0) + WrongField = CheckWrongField ( Loop->name,T ); + else WrongField = False; + + if (!WrongField) { + if (Loop->AddTag(T)>=0) { + if (flags & CIFFL_SuggestTags) { + tagNo++; + ParamStr ( T,pstr("\1"),tagNo ); + Loop->AddTag(T); + } else { + strcpy ( _err_string,S ); + _err_line = lcount; + Warning |= CIFW_DuplicateTag; + if (flags & CIFFL_PrintWarnings) + printf ( "\n **** mmCIF READ WARNING " + "<>\n%s\n",lcount,S ); + } + } + } + Repeat = True; + + } else { + + p = p1; + Repeat = False; + + } + + } else if (!(*p) || (*p=='#')) { + Repeat = !f.FileEnd(); + if (Repeat) { + f.ReadLine ( S,_max_buf_len ); + lcount++; + p = &(S[0]); + } else { + strcpy ( _err_string,S ); + _err_line = lcount; + Warning |= CIFW_UnexpectedEOF; + if (flags & CIFFL_PrintWarnings) + printf ( "\n **** mmCIF READ WARNING " + "<>\n%s\n", + lcount,S ); + } + } else + Repeat = False; + + } while (Repeat); + + if (Loop) { + do { + while ((*p==' ') || (*p==char(9))) p++; + if (!(*p) || (*p=='#')) { + Repeat = !f.FileEnd(); + if (Repeat) { + f.ReadLine ( S,_max_buf_len ); + lcount++; + p = &(S[0]); + } + } else if (*p=='_') Repeat = False; + else if (!strncmp(p,"loop_",5)) Repeat = False; + else if (!strncmp(p,"data_",5)) Repeat = False; + else if (!strncmp(p,"stop_",5)) { + p += 5; + Repeat = False; + } else { + RC = GetField ( f,S,L,p,lcount,llen ); + if (!RC) { + Loop->AddString ( L ); + Repeat = True; + } else + Repeat = False; + } + } while (Repeat); + if ((Loop->iColumn!=0) || (RC)) { + strcpy ( _err_string,S ); + _err_line = lcount; + Warning |= CIFW_LoopFieldMissing; + if (flags & CIFFL_PrintWarnings) + printf ( "\n **** mmCIF READ WARNING " + "<>\n%s\n", + lcount,S ); + } + } + +} + +int CMMCIFData::GetField ( RCFile f, pstr S, pstr & L, + pstr & p, int & lcount, int & llen ) { +Boolean Repeat; +pstr L1; +int i,flen; +char c; + + flen = 0; + L[flen] = char(0); + + do { + + // skip all spaces before the field + while ((*p==' ') || (*p==char(9))) p++; + + if ((*p=='#') || (!(*p))) { + // comment or end of line met; the field should be + // found on the next line + Repeat = !f.FileEnd(); + if (Repeat) { + // take the next line + f.ReadLine ( S,_max_buf_len ); + lcount++; + p = &(S[0]); + Repeat = (*p!=';'); + } else { + // end of file and the field is not taken + L[0] = char(0); + return 1; + } + } else + // first symbol of a field is found + Repeat = False; + + } while (Repeat); + + + if (*p==';') { // this is a multiline field + p++; + strcpy ( L,p ); // take first line of the field + flen = strlen(L); + while (!f.FileEnd()) { + f.ReadLine ( S,_max_buf_len ); + lcount++; + p = &(S[0]); + if (*p==';') { // multiline field terminated + p++; + while ((*p==' ') || (*p==char(9))) p++; + return 0; + } else { // multiline field continues -- take next line + flen += strlen(S)+2; + if (flen>=llen) { + llen = flen + IMin(2000,llen); + L1 = new char[llen]; + strcpy ( L1,L ); + delete[] L; + L = L1; + } + strcat ( L,"\n" ); + strcat ( L,S ); + } + } + + // end of file -- take the last line of the multiline field + p = &(S[strlen(S)]); + + } else { + + i = 0; + if (*p!='_') { + if ((*p=='\'') || (*p=='"')) { + c = *p; + // field in quotation marks + do { + p++; + // stop taking characters either on end of line + // or the quotation mark + while ((*p) && (*p!=c)) { + L[i++] = *p; + p++; + } + while (*p==c) { + // it was a quotation mark -- check that it is followed + // by end of line or space + p++; + if ((*p) && (*p!=' ') && (*p!=char(9))) { + // the quotation mark is not a field terminator and + // belongs to the field. + L[i++] = c; // take the quotation mark + if (*p!=c) // take the non-space character + L[i++] = *p; // but check for field terminator + } + } + // terminate the loop only on space or end of line + } while ((*p) && (*p!=' ') && (*p!=char(9))); + if (*p) p++; + L[i] = char(0); + } else { + // a simplest field without spaces + while ((*p) && (*p!=' ') && (*p!=char(9))) { + L[i++] = *p; + p++; + } + L[i] = char(0); + if (((L[0]=='.') || (L[0]=='?')) && (!L[1])) { + // "no data" tokens + L[1] = L[0]; + L[0] = char(2); + L[2] = char(0); + } + } + } + + } + + return 0; + +} + +void CMMCIFData::Sort() { +int i,k; +psvector cnames; + + k = 0; + for (i=0;iSort(); + cnames[i] = NULL; + CreateCopy ( cnames[i],Category[i]->name ); + } + + SortTags ( cnames,nCategories,index ); + + for (i=0;i=0 : position of the category found +// <0 : the category was not found, it could be inserted before +// (-RC-1)th element, where RC is the return value +int l1,l2,l,k; + + if (!Category) return -1; + + if (!index) Sort(); + + if (cname[0]) { + l = 0; + l1 = 0; + l2 = nCategories-1; + k = 1; + while (l1name ); + if (k<0) l2 = l; + else if (k>0) l1 = l; + else { + l1 = l; + break; + } + } + if (k==0) return index[l]; // is at RCth position + k = strcasecmp(cname,Category[index[l1]]->name); + if (k==0) return index[l1]; // is at RCth position + if (k<0) return -1; // would be at (-RC-1)th position + if (l2!=l1) { + k = strcasecmp(cname,Category[index[l2]]->name); + if (k==0) return index[l2]; // is at RCth position + if (k>0) return -2-l2; // would be at l2+1=(-RC-1)th position + } + return -2-l1; // would be at l1+1=(-RC-1)th position + } else + // 'root' category should be always on top + if (Category[index[0]]->name[0]==char(1)) return index[0]; + + return -1; + +} + +int CMMCIFData::AddCategory ( cpstr cname ) { +// return -1: a place for category has been added on the top of array; +// index is added and sorted automatically +// >=0: the category is already in the array -- its position +// is returned +int l1,l; +PPCMMCIFCategory Category1; +ivector index1; + + + if (!Category) { + Category = new PCMMCIFCategory[1]; + Category[0] = NULL; + GetVectorMemory ( index,1,0 ); + index[0] = 0; + nCategories = 1; + return -nCategories; // the category has been added on the top of array + } + l1 = GetCategoryNo ( cname ); + if (l1>=0) return l1; // non-negative returns mean that + // the category is already in the array + l1 = -l1-1; // otherwise the category has to be added and indexed at here + // put new NULL-category on the top of array and update the index + Category1 = new PCMMCIFCategory[nCategories+1]; + GetVectorMemory ( index1,nCategories+1,0 ); + for (l=0;lWriteMMCIF ( f ); + +} + + +// --------------- Retrieving data + +int CMMCIFData::DeleteCategory ( cpstr CName ) { +int k; + k = GetCategoryNo ( CName ); + if (k<0) return CIFRC_NoCategory; + return DeleteCategory ( k ); +} + +int CMMCIFData::DeleteCategory ( int CatNo ) { +int i; + if (Category[CatNo]) delete Category[CatNo]; + for (i=CatNo+1;iCatNo) index[i]--; + i++; + } + i++; + while (iCatNo) index[i]--; + index[i-1] = index[i]; + i++; + } + nCategories--; + index [nCategories] = 0; + Category[nCategories] = NULL; + return 0; +} + +int CMMCIFData::DeleteStructure ( cpstr CName ) { +int k; + k = GetCategoryNo ( CName ); + if (k<0) return CIFRC_NoCategory; + if (Category[k]->GetCategoryID()==MMCIF_Struct) + return DeleteCategory ( k ); + else return CIFRC_NotAStructure; +} + +int CMMCIFData::DeleteLoop ( cpstr CName ) { +int k; + k = GetCategoryNo ( CName ); + if (k<0) return CIFRC_NoCategory; + if (Category[k]->GetCategoryID()==MMCIF_Loop) + return DeleteCategory ( k ); + else return CIFRC_NotALoop; +} + +PCMMCIFCategory CMMCIFData::GetCategory ( int categoryNo ) { + if ((categoryNo>=0) && (categoryNoGetCategoryID()==MMCIF_Struct) + return PCMMCIFStruct(Category[i]); + else return NULL; +} + +PCMMCIFLoop CMMCIFData::GetLoop ( cpstr CName ) { +int i; + i = GetCategoryNo ( CName ); + if (i<0) return NULL; + if (Category[i]->GetCategoryID()==MMCIF_Loop) + return PCMMCIFLoop(Category[i]); + else return NULL; +} + +PCMMCIFLoop CMMCIFData::FindLoop ( cpstr * tagList ) { +int i; + for (i=0;iGetCategoryID()==MMCIF_Loop) { + if (Category[i]->CheckTags(tagList)) + return PCMMCIFLoop(Category[i]); + } + } + return NULL; +} + +void CMMCIFData::GetDataName ( pstr & dname, Boolean Remove ) { + if (Remove) { + if (dname) delete[] dname; + dname = name; + name = NULL; + } else + CreateCopy ( dname,name ); +} + +int CMMCIFData::CheckData ( cpstr CName, cpstr TName ) { +// CheckData(..) returns positive value if the field is in the +// file: +// CIFRC_Structure category CName is a structure +// CIFRC_Loop category CName is a loop +// Negative returns mean: +// CIFRC_StructureNoTag category CName is present, +// it is a structure, but it does not +// have tag TName +// CIFRC_LoopNoTag category CName is present, +// it is a loop, but it does not have +// tag TName +// CIFRC_NoCategory category CName is not present. +// If TName is set to NULL then only the CName is checked and +// possible returns are CIFRC_Structure, CIFRC_Loop and +// CIFRC_NoCategory. +int i,k; + i = GetCategoryNo ( CName ); + if (i<0) return CIFRC_NoCategory; + if (Category[i]->GetCategoryID()==MMCIF_Struct) + k = CIFRC_Structure; + else k = CIFRC_Loop; + if (TName) { + if (Category[i]->GetTagNo(TName)<0) { + if (k==CIFRC_Structure) + k = CIFRC_StructureNoTag; + else k = CIFRC_LoopNoTag; + } + } + return k; +} + +void CMMCIFData::Optimize() { +int i,k; +PPCMMCIFCategory C1; + k = 0; + for (i=0;iOptimize(); + if (Category[i]->nTags<=0) { + delete Category[i]; + Category[i] = NULL; + } else + k++; + } + if (k>0) { + if (k!=nCategories) { + C1 = new PCMMCIFCategory[k]; + k = 0; + for (i=0;iGetCategoryID()!=MMCIF_Struct) + return CIFRC_NotAStructure; + return PCMMCIFStruct(Category[i])->GetString ( Dest,TName,Remove ); +} + +pstr CMMCIFData::GetString ( cpstr CName, cpstr TName, int & RC ) { +int i = GetCategoryNo ( CName ); + if (i<0) { + RC = CIFRC_NoCategory; + return NULL; + } + if (Category[i]->GetCategoryID()!=MMCIF_Struct) { + RC = CIFRC_NotAStructure; + return NULL; + } + return PCMMCIFStruct(Category[i])->GetString ( TName,RC ); +} + +int CMMCIFData::DeleteField ( cpstr CName, cpstr TName ) { +int i = GetCategoryNo ( CName ); + if (i<0) return CIFRC_NoCategory; + if (Category[i]->GetCategoryID()!=MMCIF_Struct) + return CIFRC_NotAStructure; + return PCMMCIFStruct(Category[i])->DeleteField ( TName ); +} + +int CMMCIFData::GetReal ( realtype & R, cpstr CName, + cpstr TName, Boolean Remove ) { +int i = GetCategoryNo ( CName ); + if (i<0) return CIFRC_NoCategory; + if (Category[i]->GetCategoryID()!=MMCIF_Struct) + return CIFRC_NotAStructure; + return PCMMCIFStruct(Category[i])->GetReal ( R,TName,Remove ); +} + +int CMMCIFData::GetInteger ( int & I, cpstr CName, + cpstr TName, Boolean Remove ) { +int j = GetCategoryNo ( CName ); + if (j<0) return CIFRC_NoCategory; + if (Category[j]->GetCategoryID()!=MMCIF_Struct) + return CIFRC_NotAStructure; + return PCMMCIFStruct(Category[j])->GetInteger ( I,TName,Remove ); +} + +int CMMCIFData::GetLoopLength ( cpstr CName ) { +// GetLoopLength(..) returns CIFRC_NotALoop if the category CName +// is not a loop, CIFRC_NoCategory if the category CName is not +// found. Non-negative returns give the length of the loop (may be +// 0 if the loop is empty). +int i; + i = GetCategoryNo ( CName ); + if (i<0) return CIFRC_NoCategory; + if (Category[i]->GetCategoryID()!=MMCIF_Loop) + return CIFRC_NotALoop; + return PCMMCIFLoop(Category[i])->nRows; +} + +int CMMCIFData::GetLoopString ( pstr & Dest, cpstr CName, + cpstr TName, int nrow, + Boolean Remove ) { +// GetLoopString(..), GetLoopReal(..) and GetLoopInteger(..) act +// like GetString(..), GetReal(..) and GetInteger(..) above for +// nrow-th element of the 'loop_' (indexed like 0..N-1 where N +// is obtained through GetLoopLength(..)). They will return +// CIFRC_WrongIndex if nrow is out of range. +int i = GetCategoryNo ( CName ); + if (i<0) return CIFRC_NoCategory; + if (Category[i]->GetCategoryID()!=MMCIF_Loop) + return CIFRC_NotALoop; + return PCMMCIFLoop(Category[i])->GetString ( Dest,TName,nrow,Remove ); +} + +pstr CMMCIFData::GetLoopString ( cpstr CName, cpstr TName, + int nrow, int & RC ) { +int i = GetCategoryNo ( CName ); + if (i<0) { + RC = CIFRC_NoCategory; + return NULL; + } + if (Category[i]->GetCategoryID()!=MMCIF_Loop) { + RC = CIFRC_NotALoop; + return NULL; + } + return PCMMCIFLoop(Category[i])->GetString ( TName,nrow,RC ); +} + +int CMMCIFData::DeleteLoopField ( cpstr CName, cpstr TName, + int nrow ) { +int i = GetCategoryNo ( CName ); + if (i<0) return CIFRC_NoCategory; + if (Category[i]->GetCategoryID()!=MMCIF_Loop) + return CIFRC_NotALoop; + return PCMMCIFLoop(Category[i])->DeleteField ( TName,nrow ); +} + +int CMMCIFData::GetLoopReal ( realtype & R, cpstr CName, + cpstr TName, int nrow, + Boolean Remove ) { +int i = GetCategoryNo ( CName ); + if (i<0) return CIFRC_NoCategory; + if (Category[i]->GetCategoryID()!=MMCIF_Loop) + return CIFRC_NotALoop; + return PCMMCIFLoop(Category[i])->GetReal ( R,TName,nrow,Remove ); +} + +int CMMCIFData::GetLoopInteger ( int & I, cpstr CName, + cpstr TName, int nrow, + Boolean Remove ) { +int j = GetCategoryNo ( CName ); + if (j<0) return CIFRC_NoCategory; + if (Category[j]->GetCategoryID()!=MMCIF_Loop) + return CIFRC_NotALoop; + return PCMMCIFLoop(Category[j])->GetInteger ( I,TName,nrow,Remove ); +} + + +int CMMCIFData::GetLoopSVector ( psvector & S, cpstr CName, + cpstr TName, int i1, int i2, + Boolean Remove ) { +// GetLoopSVector(..), GetLoopRVector(..) and GetLoopIVector(..) +// read CIF 'loop_' data into allocated vectors of strings, reals and +// integers, correspondingly. The vectors may be deallocated prior +// to call and assigned NULL, in which case they will be allocated +// with offsets of i1, which is also the lower index of the 'loop_' +// data transferred into it. The upper vector index is given by i2 or +// by the loop's length whichever is less. If vectors are not assigned +// NULL prior the call, it is assumed that they are properly (i1-offset, +// i2-i1+1 length) allocated. +// The return codes are same as those of GetLoopString(..), +// GetLoopReal(..) and GetLoopInteger(..). +int i; + i = GetCategoryNo ( CName ); + if (i<0) return CIFRC_NoCategory; + if (Category[i]->GetCategoryID()!=MMCIF_Loop) + return CIFRC_NotALoop; + return PCMMCIFLoop(Category[i])->GetSVector ( S,TName,i1,i2,Remove ); +} + +int CMMCIFData::GetLoopRVector ( rvector & R, cpstr CName, + cpstr TName, int i1, int i2, + Boolean Remove ) { +int i; + i = GetCategoryNo ( CName ); + if (i<0) return CIFRC_NoCategory; + if (Category[i]->GetCategoryID()!=MMCIF_Loop) + return CIFRC_NotALoop; + return PCMMCIFLoop(Category[i])->GetRVector ( R,TName,i1,i2,Remove ); +} + +int CMMCIFData::GetLoopIVector ( ivector & I, cpstr CName, + cpstr TName, int i1, int i2, + Boolean Remove ) { +int j; + j = GetCategoryNo ( CName ); + if (j<0) return CIFRC_NoCategory; + if (Category[j]->GetCategoryID()!=MMCIF_Loop) + return CIFRC_NotALoop; + return PCMMCIFLoop(Category[j])->GetIVector ( I,TName,i1,i2,Remove ); +} + + +// --------------- Storing data + +void CMMCIFData::PutDataName ( cpstr dname ) { +// stores name for 'data_' record + CreateCopy ( name,dname ); +} + +int CMMCIFData::PutNoData ( int NoDataType, cpstr CName, + cpstr TName ) { +PCMMCIFStruct Struct; +int i,RC; + + RC = CIFRC_Ok; + + // look for category + i = AddCategory ( CName ); + if (i<0) { + // negative value means that the category was not in the list, + // but a place for it has been provided and index updated + Struct = new CMMCIFStruct ( CName ); + Category[nCategories-1] = Struct; + } else { + Struct = PCMMCIFStruct(Category[i]); + if (Struct->GetCategoryID()!=MMCIF_Struct) { + RC = CIFRC_NotAStructure; + delete Category[i]; + Struct = new CMMCIFStruct ( CName ); + Category[i] = Struct; + } + } + + Struct->PutNoData ( NoDataType,TName ); + + return RC; + +} + +int CMMCIFData::PutString ( cpstr S, cpstr CName, + cpstr TName, Boolean Concatenate ) { +// PutString(..), PutReal(..) and PutInteger(..) will put the +// values given into the specified category (CName) under the +// specified tag (TName). The category, tag and field are created +// automatically; the field will be replaced silently if identical +// CName.TName is specified in two calls. Calls of these functions +// may follow in random order; however CIF file will have all tags +// grouped by categories and catgories will follow in the order +// of first appearance in PutString(..), PutReal(..) or +// PutInteger(..). +// Return code - one of CIFRC_Ok or CIFRC_NotAStruct +PCMMCIFStruct Struct; +int i,RC; + + RC = CIFRC_Ok; + + // look for category + i = AddCategory ( CName ); + if (i<0) { + // negative value means that the category was not in the list, + // but a place for it has been provided and index updated + Struct = new CMMCIFStruct ( CName ); + Category[nCategories-1] = Struct; + } else { + Struct = PCMMCIFStruct(Category[i]); + if (Struct->GetCategoryID()!=MMCIF_Struct) { + RC = CIFRC_NotAStructure; + delete Category[i]; + Struct = new CMMCIFStruct ( CName ); + Category[i] = Struct; + } + } + + Struct->AddField ( S,TName,Concatenate ); + + return RC; + +} + +int CMMCIFData::PutDate ( cpstr CName, cpstr TName ) { +PCMMCIFStruct Struct; +int i,RC; + + RC = CIFRC_Ok; + + // look for category + i = AddCategory ( CName ); + if (i<0) { + // negative value means that the category was not in the list, + // but a place for it has been provided and index updated + Struct = new CMMCIFStruct ( CName ); + Category[nCategories-1] = Struct; + } else { + Struct = PCMMCIFStruct(Category[i]); + if (Struct->GetCategoryID()!=MMCIF_Struct) { + RC = CIFRC_NotAStructure; + delete Category[i]; + Struct = new CMMCIFStruct ( CName ); + Category[i] = Struct; + } + } + + Struct->PutDate ( TName ); + + return RC; + +} + +int CMMCIFData::PutReal ( realtype R, cpstr CName, + cpstr TName, int prec ) { +char rS[100]; + sprintf ( rS,"%.*g",prec,R ); + return PutString ( rS,CName,TName,False ); +} + +int CMMCIFData::PutInteger ( int I, cpstr CName, + cpstr TName ) { +char iS[100]; + if (I>MinInt4) sprintf ( iS,"%i",I ); + else { + iS[0] = char(2); + iS[1] = '.'; + iS[2] = char(0); + } + return PutString ( iS,CName,TName,False ); +} + + +int CMMCIFData::AddLoop ( cpstr CName, PCMMCIFLoop & Loop ) { +int i,RC; + + RC = CIFRC_Ok; + + // look for category + i = AddCategory ( CName ); + if (i<0) { + // negative value means that the category was not in the list, + // but a place for it has been provided and index updated + Loop = new CMMCIFLoop ( CName ); + Category[nCategories-1] = Loop; + RC = CIFRC_Created; + } else { + Loop = PCMMCIFLoop(Category[i]); + if (Loop->GetCategoryID()!=MMCIF_Loop) { + RC = CIFRC_NotALoop; + delete Category[i]; + Loop = new CMMCIFLoop ( CName ); + Category[i] = Loop; + } + } + + return RC; + +} + +int CMMCIFData::AddStructure ( cpstr CName, + PCMMCIFStruct & Struct ) { +int i,RC; + + RC = CIFRC_Ok; + + // look for category + i = AddCategory ( CName ); + if (i<0) { + // negative value means that the category was not in the list, + // but a place for it has been provided and index updated + Struct = new CMMCIFStruct ( CName ); + Category[nCategories-1] = Struct; + RC = CIFRC_Created; + } else { + Struct = PCMMCIFStruct(Category[i]); + if (Struct->GetCategoryID()!=MMCIF_Struct) { + RC = CIFRC_NotAStructure; + delete Category[i]; + Struct = new CMMCIFStruct ( CName ); + Category[i] = Struct; + } + } + + return RC; + +} + + +int CMMCIFData::PutLoopNoData ( int NoDataType, cpstr CName, + cpstr TName, int nrow ) { +PCMMCIFLoop Loop; +int i,RC; + + RC = CIFRC_Ok; + + // look for category + i = AddCategory ( CName ); + if (i<0) { + // negative value means that the category was not in the list, + // but a place for it has been provided and index updated + Loop = new CMMCIFLoop ( CName ); + Category[nCategories-1] = Loop; + } else { + Loop = PCMMCIFLoop(Category[i]); + if (Loop->GetCategoryID()!=MMCIF_Loop) { + RC = CIFRC_NotALoop; + delete Category[i]; + Loop = new CMMCIFLoop ( CName ); + Category[i] = Loop; + } + } + + Loop->PutNoData ( NoDataType,TName,nrow ); + + return RC; + +} + + +int CMMCIFData::PutLoopString ( cpstr S, cpstr CName, + cpstr TName, int nrow ) { +// PutLoopString(..), PutLoopReal(..) and PutLoopInteger(..) act +// like PutString(..), PutReal(..) and PutInteger(..) above for +// nrow-th element of the 'loop_' CName (indexed begining from 0). +// In consequitive calls, given values of nrow does not have to be +// ordered; the most efficient way is to start with HIGHEST value +// for nrow in the loop and move down to 0. The least efficient way +// is to start with nrow=0 and move up. +PCMMCIFLoop Loop; +int i,RC; + + RC = CIFRC_Ok; + + // look for category + i = AddCategory ( CName ); + if (i<0) { + // negative value means that the category was not in the list, + // but a place for it has been provided and index updated + Loop = new CMMCIFLoop ( CName ); + Category[nCategories-1] = Loop; + } else { + Loop = PCMMCIFLoop(Category[i]); + if (Loop->GetCategoryID()!=MMCIF_Loop) { + RC = CIFRC_NotALoop; + delete Category[i]; + Loop = new CMMCIFLoop ( CName ); + Category[i] = Loop; + } + } + + Loop->PutString ( S,TName,nrow ); + + return RC; + +} + +int CMMCIFData::PutLoopReal ( realtype R, cpstr CName, + cpstr TName, int nrow, int prec ) { +char rS[100]; + sprintf ( rS,"%.*g",prec,R ); + return PutLoopString ( rS,CName,TName,nrow ); +} + +int CMMCIFData::PutLoopInteger ( int I, cpstr CName, + cpstr TName, int nrow ) { +char iS[100]; + sprintf ( iS,"%i",I ); + return PutLoopString ( iS,CName,TName,nrow ); +} + + +int CMMCIFData::PutLoopSVector ( psvector S, cpstr CName, + cpstr TName, int i1, int i2 ) { +// PutLoopSVector(..), PutLoopRVector(..) and PutLoopIVector(..) +// put vectors of values into specified loop fields. Parameters i1 +// and i2 give the range of indices of values which are to be +// transfered. To transfer an entire vector allocated as [0..N-1] +// i1 shoudl be set to 0 and i2 - to N-1. Note that the loop is +// always indexed as starting form 0 on, therefore negative i1 and +// i2 are not allowed, and specifying i1>0 will leave first i1 +// elements of the CIF loop for the corresponding tag undefined +// (will be output like '?'). +PCMMCIFLoop Loop; +int i,RC; + + RC = CIFRC_Ok; + + // look for category + i = AddCategory ( CName ); + if (i<0) { + // negative value means that the category was not in the list, + // but a place for it has been provided and index updated + Loop = new CMMCIFLoop ( CName ); + Category[nCategories-1] = Loop; + } else { + Loop = PCMMCIFLoop(Category[i]); + if (Loop->GetCategoryID()!=MMCIF_Loop) { + RC = CIFRC_NotALoop; + delete Category[i]; + Loop = new CMMCIFLoop ( CName ); + Category[i] = Loop; + } + } + + Loop->PutSVector ( S,TName,i1,i2 ); + + return RC; + +} + +int CMMCIFData::PutLoopRVector ( rvector R, cpstr CName, + cpstr TName, + int i1, int i2, int prec ) { +PCMMCIFLoop Loop; +int i,RC; + + RC = CIFRC_Ok; + + // look for category + i = AddCategory ( CName ); + if (i<0) { + // negative value means that the category was not in the list, + // but a place for it has been provided and index updated + Loop = new CMMCIFLoop ( CName ); + Category[nCategories-1] = Loop; + } else { + Loop = PCMMCIFLoop(Category[i]); + if (Loop->GetCategoryID()!=MMCIF_Loop) { + RC = CIFRC_NotALoop; + delete Category[i]; + Loop = new CMMCIFLoop ( CName ); + Category[i] = Loop; + } + } + + Loop->PutRVector ( R,TName,i1,i2,prec ); + + return RC; + +} + +int CMMCIFData::PutLoopIVector ( ivector I, cpstr CName, + cpstr TName, + int i1, int i2 ) { +PCMMCIFLoop Loop; +int j,RC; + + RC = CIFRC_Ok; + + // look for category + j = AddCategory ( CName ); + if (j<0) { + // negative value means that the category was not in the list, + // but a place for it has been provided and index updated + Loop = new CMMCIFLoop ( CName ); + Category[nCategories-1] = Loop; + } else { + Loop = PCMMCIFLoop(Category[j]); + if (Loop->GetCategoryID()!=MMCIF_Loop) { + RC = CIFRC_NotALoop; + delete Category[j]; + Loop = new CMMCIFLoop ( CName ); + Category[j] = Loop; + } + } + + Loop->PutIVector ( I,TName,i1,i2 ); + + return RC; + +} + + +int CMMCIFData::RenameCategory ( cpstr CName, + cpstr newCName ) { +int i,RC; + i = GetCategoryNo ( CName ); + if (i>=0) { + Category[i]->PutCategoryName ( newCName ); + Sort(); + RC = CIFRC_Ok; + } else + RC = CIFRC_NoCategory; + return RC; +} + + +void CMMCIFData::Copy ( PCMMCIFData Data ) { +int i; + FreeMemory(0); + CreateCopy ( name,Data->name ); + nCategories = Data->nCategories; + if (nCategories>0) { + Category = new PCMMCIFCategory[nCategories]; + GetVectorMemory ( index,nCategories,0 ); + for (i=0;iCategory[i]) { + if (Data->Category[i]->GetCategoryID()==MMCIF_Struct) + Category[i] = new CMMCIFStruct(); + else Category[i] = new CMMCIFLoop(); + Category[i]->Copy ( Data->Category[i] ); + } else + Category[i] = NULL; + index[i] = Data->index[i]; + } + } + flags = Data->flags; + Warning = Data->Warning; +} + + +int CMMCIFData::CopyCategory ( PCMMCIFData Data, cpstr CName, + cpstr newCName ) { +PCMMCIFCategory Cat; +int i,di,dc,RC; + + di = Data->GetCategoryNo ( CName ); + + if (di>=0) { + + RC = CIFRC_Ok; + dc = Data->Category[di]->GetCategoryID(); + + // look for category + i = AddCategory ( CName ); + if (i<0) { + // negative value means that the category was not in the list, + // but a place for it has been provided and index updated + if (dc==MMCIF_Loop) Cat = new CMMCIFLoop ( CName ); + else Cat = new CMMCIFStruct ( CName ); + Category[nCategories-1] = Cat; + } else { + Cat = Category[i]; + if (Cat->GetCategoryID()!=dc) { + RC = CIFRC_NotAStructure; + delete Category[i]; + if (dc==MMCIF_Loop) Cat = new CMMCIFLoop ( CName ); + else Cat = new CMMCIFStruct ( CName ); + Category[i] = Cat; + } + } + + Cat->Copy ( Data->Category[di] ); + if (newCName) { + Cat->PutCategoryName ( newCName ); + Sort(); + } + + } else + RC = CIFRC_NoCategory; + + return RC; + +} + +void CMMCIFData::PrintCategories() { +// for debuging only +int i; + printf ( " Total %i categories:\n",nCategories ); + for (i=0;iGetCategoryID()==MMCIF_Loop) + printf ( "Loop %s\n",Category[i]->name ); + else printf ( "Structure %s\n",Category[i]->name ); + } +} + + +void CMMCIFData::write ( RCFile f ) { +int i,k; + if (!index) Sort(); + f.CreateWrite ( name ); + f.WriteInt ( &nCategories ); + for (i=0;iGetCategoryID(); + f.WriteInt ( &k ); + Category[i]->write ( f ); + } else { + k = -1; + f.WriteInt ( &k ); + } + f.WriteInt ( &(index[i]) ); + } + f.WriteInt ( &flags ); + f.WriteInt ( &Warning ); +} + + +void CMMCIFData::read ( RCFile f ) { +int i,k; + FreeMemory(0); + f.CreateRead ( name ); + f.ReadInt ( &nCategories ); + if (nCategories>0) { + Category = new PCMMCIFCategory[nCategories]; + GetVectorMemory ( index,nCategories,0 ); + for (i=0;i=0) { + if (k==MMCIF_Struct) Category[i] = new CMMCIFStruct(); + else Category[i] = new CMMCIFLoop(); + Category[i]->read ( f ); + } else + Category[i] = NULL; + f.ReadInt ( &(index[i]) ); + } + } + f.ReadInt ( &flags ); + f.ReadInt ( &Warning ); +} + + +MakeStreamFunctions(CMMCIFData) + + + +// ====================== CMMCIFFile ============================= + + +CMMCIFFile::CMMCIFFile() : CStream() { + InitMMCIFFile(); +} + +CMMCIFFile::CMMCIFFile ( cpstr FName, byte gzipMode ) : CStream() { + InitMMCIFFile (); + ReadMMCIFFile ( FName,gzipMode ); +} + +CMMCIFFile::CMMCIFFile ( RPCStream Object ) : CStream(Object) { + InitMMCIFFile(); +} + +CMMCIFFile::~CMMCIFFile() { + FreeMemory(); +} + +void CMMCIFFile::InitMMCIFFile() { + nData = 0; + nAllocData = 0; + data = NULL; + index = NULL; + PrintWarnings = False; + StopOnWarning = False; +} + +void CMMCIFFile::FreeMemory() { +int i; + for (i=0;iSetPrintWarnings ( PrintWarnings ); + CIF->SetStopOnWarning ( StopOnWarning ); + RC = CIF->ReadMMCIFData ( f,S,lcount ); + if (!RC) { + ExpandData ( nData+1 ); + data[nData] = CIF; + nData++; + CIF = NULL; + } + } + if (CIF) delete CIF; + f.shut(); + if (RC==CIFRC_NoDataLine) { + if (nData>0) RC = 0; + } + Sort(); + return RC; + } else + return CIFRC_CantOpenFile; + +} + +int CMMCIFFile::WriteMMCIFFile ( cpstr FName, byte gzipMode ) { +CFile f; + f.assign ( FName,True,False,gzipMode ); + if (f.rewrite()) { + WriteMMCIF ( f ); + f.shut(); + return 0; + } else + return CIFRC_CantOpenFile; +} + +void CMMCIFFile::WriteMMCIF ( RCFile f ) { +int i; + for (i=0;iWriteMMCIF ( f ); +} + + +void CMMCIFFile::Sort() { +psvector tag; +int i; + if (nData>0) { + FreeVectorMemory ( index,0 ); + GetVectorMemory ( index,nData,0 ); + GetVectorMemory ( tag ,nData,0 ); + for (i=0;iname ); + } + SortTags ( tag,nData,index ); + for (i=0;i=0 : position of the DName found +// <0 : the DName was not found, it could be inserted before +// (-RC-1)th element, where RC is the return value +int l1,l2,l,k; + + if (!data) return -1; + if (!index) Sort(); + + l = 0; + l1 = 0; + l2 = nData-1; + k = 1; + while (l1name ); + if (k<0) l2 = l; + else if (k>0) l1 = l; + else { + l1 = l; + break; + } + } + + if (k==0) return index[l]; // is at RCth position + k = strcasecmp ( DName,data[index[l1]]->name ); + if (k==0) return index[l1]; // is at RCth position + if (k<0) return -1; // would be at (-RC-1)th position + if (l2!=l1) { + k = strcasecmp ( DName,data[index[l2]]->name ); + if (k==0) return index[l2]; // is at RCth position + if (k>0) return -2-l2; // would be at l2+1=(-RC-1)th position + } + + return -2-l1; // would be at l1+1=(-RC-1)th position + +} + +PCMMCIFData CMMCIFFile::GetCIFData ( int dataNo ) { + if ((dataNo>=0) && (dataNo=0) return data[l]; + else return NULL; +} + +void CMMCIFFile::ExpandData ( int nDataNew ) { +int i,nAD; +PPCMMCIFData data1; +ivector index1; + if (nDataNew>nAllocData) { + nAD = nDataNew + IMin(nAllocData/2+1,100); + data1 = new PCMMCIFData[nAD]; + GetVectorMemory ( index1,nAD,0 ); + for (i=0;i=0: the CIF data structure is already in the array +// -- its position is returned +int i1,i; + if (!data) { + ExpandData ( 3 ); // get space for first 3 CIF data structures + data[0] = new CMMCIFData ( DName ); + nData = 1; + return -nData; // the CIF data structure has been added + // "on the top" of array + } + i1 = GetCIFDataNo ( DName ); + if (i1>=0) return i1; // non-negative returns mean that the CIF + // data structure is already in the array + i1 = -i1-1; // otherwise the data has to be added and indexed at here + // put new CIF data structure on the top of array and update index + ExpandData ( nData+1 ); + data[nData] = new CMMCIFData ( DName ); + for (i=nData;i>i1;i--) + index[i] = index[i-1]; + index[i1] = nData; + nData++; + return -nData; // the tag has been added on the top of array +} + + +int CMMCIFFile::DeleteMMCIFData ( cpstr DName ) { +int dataNo = GetCIFDataNo ( DName ); + + if (dataNo>=0) return DeleteMMCIFData ( dataNo ); + return dataNo; + +} + +int CMMCIFFile::DeleteMMCIFData ( int dataNo ) { +int i; + + if ((0<=dataNo) && (dataNonData; + nAllocData = nData; + if (nData>0) { + data = new PCMMCIFData[nData]; + for (i=0;idata[i]) { + data[i] = new CMMCIFData(); + data[i]->Copy ( File->data[i] ); + } else + data[i] = NULL; + } + } +} + + +void CMMCIFFile::write ( RCFile f ) { +int i,k; + f.WriteInt ( &nData ); + for (i=0;iwrite ( f ); + } else { + k = 0; + f.WriteInt ( &k ); + } +} + +void CMMCIFFile::read ( RCFile f ) { +int i,k; + FreeMemory(); + f.ReadInt ( &nData ); + nAllocData = nData; + if (nData>0) { + data = new PCMMCIFData[nData]; + for (i=0;iread ( f ); + } else + data[i] = NULL; + } + } +} + + +MakeStreamFunctions(CMMCIFFile) + + +int isCIF ( cpstr FName, byte gzipMode ) { +CFile f; +int rc; + + f.assign ( FName,True,False,gzipMode ); + if (f.reset(True)) { + rc = isCIF ( f ); + f.shut(); + } else + rc = -1; + + return rc; + +} + +int isCIF ( RCFile f ) { +char S[_max_buf_len+1]; +Boolean Done; +pstr p; + + f.ReadLine ( S,_max_buf_len ); + S[_max_buf_len] = char(0); + Done = False; + while (!Done) { + p = &(S[0]); + while ((*p==' ') || (*p==char(9))) p++; + Done = !strncmp(p,"data_",5); + if (!Done) { + if (f.FileEnd()) { + Done = True; + p = NULL; + } else { + f.ReadLine ( S,_max_buf_len ); + S[_max_buf_len] = char(0); + } + } + } + + if (!p) return 1; + if (!strncmp(p,"data_",5)) return 0; + else return 1; + +} + + +pstr GetCIFMessage ( pstr M, int RC ) { +int LineNo; +pstr InputLine; + + InputLine = GetMMCIFInputBuffer ( LineNo ); + + if (RC>10) { + if (RC & CIFW_UnrecognizedItems) + sprintf ( M,"unrecognized items found on %ith line\n%s", + LineNo,InputLine ); + else if (RC & CIFW_MissingField) + sprintf ( M,"expected data field not found; line %i reads\n%s", + LineNo,InputLine ); + else if (RC & CIFW_EmptyLoop) + sprintf ( M,"empty loop ('loop_') on %ith line\n%s", + LineNo,InputLine ); + else if (RC & CIFW_UnexpectedEOF) + sprintf ( M,"unexpected end of file; line %i reads\n%s", + LineNo,InputLine ); + else if (RC & CIFW_LoopFieldMissing) + sprintf ( M,"expected data field in a loop not found; " + "line %i reads\n%s", LineNo,InputLine ); + else if (RC & CIFW_LoopFieldMissing) + sprintf ( M,"expected data field in a loop not found; " + "line %i reads\n%s", LineNo,InputLine ); + else if (RC & CIFW_NotAStructure) + sprintf ( M,"a loop is used as a structure on line %i\n%s", + LineNo,InputLine ); + else if (RC & CIFW_NotALoop) + sprintf ( M,"a structure is used as a loop on line %i\n%s", + LineNo,InputLine ); + else if (RC & CIFW_DuplicateTag) + sprintf ( M,"duplicate tag was found on line %i\n%s", + LineNo,InputLine ); + else + sprintf ( M,"undocumented warning issued for line %i\n%s", + LineNo,InputLine ); + } else if (RC<0) + switch (RC) { + case CIFRC_StructureNoTag : strcpy(M,"tag of a structure not " + "found"); + break; + case CIFRC_LoopNoTag : strcpy(M,"tag of a loop not found"); + break; + case CIFRC_NoCategory : strcpy(M,"category not found"); + break; + case CIFRC_WrongFormat : strcpy(M,"wrong format of a number"); + break; + case CIFRC_NoTag : strcpy(M,"tag not found"); + break; + case CIFRC_NotAStructure : strcpy(M,"category is not a " + "structure"); + break; + case CIFRC_NotALoop : strcpy(M,"category is not a loop"); + break; + case CIFRC_WrongIndex : strcpy(M,"index outside the loop's " + "limits"); + break; + case CIFRC_NoField : strcpy(M,"data is absent"); + break; + case CIFRC_Created : strcpy(M,"category created"); + break; + case CIFRC_CantOpenFile : strcpy(M,"can't open CIF file"); + break; + case CIFRC_NoDataLine : strcpy(M,"'data_' tag not found." ); + break; + default : strcpy(M,"undocumented return code"); + } + + return M; + +} diff --git a/mmdb/mmdb_mmcif.h b/mmdb/mmdb_mmcif.h new file mode 100755 index 0000000..4b04ad5 --- /dev/null +++ b/mmdb/mmdb_mmcif.h @@ -0,0 +1,2129 @@ +// $Id: mmdb_mmcif.h,v 1.23 2012/01/26 17:52:20 ekr Exp $ +// ================================================================= +// +// CCP4 Coordinate Library: support of coordinate-related +// functionality in protein crystallography applications. +// +// Copyright (C) Eugene Krissinel 2000-2008. +// +// This library is free software: you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License version 3, modified in accordance with the provisions +// of the license to address the requirements of UK law. +// +// You should have received a copy of the modified GNU Lesser +// General Public License along with this library. If not, copies +// may be downloaded from http://www.ccp4.ac.uk/ccp4license.php +// +// 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 Lesser General Public License for more details. +// +// ================================================================= +// +// 16.01.13 <-- Date of Last Modification. +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// ----------------------------------------------------------------- +// +// **** Module : MMDB_MMCIF +// ~~~~~~~~~ +// **** Project : MacroMolecular Data Base (MMDB) +// ~~~~~~~~~ +// **** Classes : CMMCIFCategory ( mmCIF category ) +// ~~~~~~~~~ CMMCIFStruct ( mmCIF structure ) +// CMMCIFLoop ( mmCIF loop ) +// CMMCIFData ( mmCIF data block ) +// CMMCIFFile ( mmCIF file ) +// +// (C) E. Krissinel 2000-2013 +// +// ================================================================= +// + + +#ifndef __MMDB_MMCIF__ +#define __MMDB_MMCIF__ + + +#ifndef __Stream__ +#include "stream_.h" +#endif + + + +// ====================== CMMCIFCategory ========================== + +#define MMCIF_Category 0 +#define MMCIF_Struct 1 +#define MMCIF_Loop 2 +#define MMCIF_Data 3 + +DefineClass(CMMCIFCategory) +DefineStreamFunctions(CMMCIFCategory) + +/// \brief CMMCIFCategory is a base class for CMMCIFStruct and +/// CMMCIFLoop, implementations of mmCIF's "structure" and +/// "loop" categories. +/*! +This class is not instantiated independently in any applications, +however, it provides a few public functions which work for +both CMMCIFStruct and CMMCIFLoop. + +All data in mmCIF hierarchy is addressed using construct +"category.tag" plus row number (>=0) for loops. Category names +should always start from underscore, while tags normally start +with a letter, e.g. "_barrel.id". + +See general principles of working with mmCIF files and mmCIF +hierarchies in Section \"\ref mmcif_handler\". +*/ + +class CMMCIFCategory : public CStream { + + friend class CMMCIFData; + + public : + + /// \brief Basic constructor. + CMMCIFCategory (); + + /// \brief Constructor that assigns category name. + /// \param[in] N category name (must start with underscore). + CMMCIFCategory ( cpstr N ); + + /// \brief Constructor for MMDB data streaming functions. + CMMCIFCategory ( RPCStream Object ); + + /// \brief Destructor. + ~CMMCIFCategory(); + + /// \brief Returns category name. + /// \return NULL if name was not set + /// \return pointer to character string if name was set + pstr GetCategoryName() { return name; } + + /// \brief Sets category name. + /// \param N new category name + void SetCategoryName ( cpstr N ); + + /// \brief Returns category type. + /// This function may be used when retrieving categories + /// (structures and loops) from data blocks (CMMCIFData). + /// \return MMCIF_Category for CMMCIFCategory + /// \return MMCIF_Struct for CMMCIFStruct + /// \return MMCIF_Loop for CMMCIFLoop + virtual int GetCategoryID() { return MMCIF_Category; } + + /// \brief Virtual function for writing category's content + /// into mmCIF file. + /// Default implementation does nothing. + virtual void WriteMMCIF ( RCFile ) {} + + /// \brief Virtual function for optimizig data structures. + /// Optimized data structures take less RAM and their indexes + /// are sorted for quicker access. Sorting is done automatically + /// as new data is added to the category. If the + /// category is edited (fields/data removed), it may need + /// optimization and re-sorting for efficiency.\n\n + /// The sorting preserves the order of actual appearance of + /// tags in mmCIF file. If a category is created + /// programmatically, the order of tags in mmCIF file will be + /// the same as order of adding them to the category. + virtual void Optimize(); + + /// \brief Sorts category's data for quicker access. + /// The sorting is essentially re-indexing of data for quicker + /// access. It does not change the order of data in both mmCIF + /// hierarchy and mmCIF file. E.g., if tag "serial_no" was 2nd + /// one in given category before sorting, it will remain on 2nd + /// place after it, therefore no change in tag number passed + /// to functions in CMMCIFStruct, CMMCIFLoop and CMMCIFData. + void Sort(); + + /// \brief Returns serial number of a tag in the category. + /// \param[in] ttag tag (or name of a field in category) + /// \return \b >=0 : the tag is in given position + /// \return \b <0 : the tag was not found, but it could be + /// inserted before tag with (-rc-1)th index, where + /// 'rc' is the return. + int GetTagNo ( cpstr ttag ); + + /// \brief Adds a tag to the category. + /// Adding a tag in CMMCIFCategory does not reserve any + /// placeholder for the corresponding value. All tags get + /// automatically sorted (reindexed) for quicker access. + /// Tags will appear in mmCIF file in order of their addition + /// to the category. + /// \param[in] ttag tag to be added. + /// \return \b >=0 the tag is already in the category, and return + /// is its serial number. No changes to the category + /// is done + /// \return \b <0 the tag was added to the list of tags, and + /// return is minus total number of tags in the + /// category. + int AddTag ( cpstr ttag ); + + /// \brief Returns the total number of tags in the category + int GetNofTags() { return nTags; } + + /// \brief Returns tag with the specified serial number. + /// The tags are enumerated as 0..GetNofTags()-1. + /// \param tagNo tag's serial number + /// \return \b NULL: tagNo is outside the range + /// of 0..GetNofTags()-1 + /// \return \b not \b NULL: tag in tagNo'th position + pstr GetTag ( int tagNo ); // 0..nTags-1 + + /// \brief Prints list of tags to stdout. + /// Both sorted and unsorted tags are printed to standard + /// output. This function may be used for debugging. + void PrintTags(); + + /// \brief Returns True if all tags from the list are found + /// in the category. + /// The size of the list of tags may be less than the number + /// of tags in the category, and order of tags is disregarded. + /// \param[in] tagList list of tags to be checked for presence + /// in the category. The list must end with NULL + /// pointer, or your program will crash. + /// \return \b True if all tags from the list were found in the + /// category + /// \return \b False if one or more tags from the list were not + /// found in the category. + /// + /// Example: + /// \code + /// cpstr tagList[] = {"id","type","date",NULL}; + /// CMMCIFStruct cifStruct; + /// if (cifStruct.CheckTags(tagList)) + /// printf ( " all tags are found in category %s\n", + /// cifStruct.GetCategoryName() ); + /// \endcode + /// This function is useful for finding categories in + /// "dirty cifs", where category name is not given. + Boolean CheckTags ( cpstr * tagList ); + + /// \brief Deep copy of categories. + /// Deep copy duplicates all data and memory allocations, + /// producing a genuine clone of the original. Only deep copy + /// should be used for copying MMDB objects, a mere assignment + /// operator will fail you. + /// \param[in] Category a pointer to CMMCIFCategory, the content of + /// which is copied into 'this' category. + virtual void Copy ( PCMMCIFCategory Category ); + + /// \brief MMDB stream writer. + void write ( RCFile f ); + + /// \brief MMDB stream reader. + void read ( RCFile f ); + + protected: + int nTags; + pstr name; + psvector tag; + ivector index; + int nAllocTags; + + void InitMMCIFCategory (); + virtual void FreeMemory (); + void ExpandTags ( int nTagsNew ); + void PutCategoryName ( cpstr newName ); + +}; + + + +// ====================== CMMCIFStruct ============================ + +DefineClass(CMMCIFStruct) +DefineStreamFunctions(CMMCIFStruct) + +/// \brief Constants used to specify mmCIF's \"data not given\" and +/// \"data not available\" data types. +#define CIF_NODATA_DOT 0 +#define CIF_NODATA_QUESTION 1 +#define CIF_NODATA_DOT_FIELD pstr("\x02" ".") +#define CIF_NODATA_QUESTION_FIELD pstr("\x02" "?") + +/// \brief CMMCIFStruct represents mmCIF's \"structure\" category, +/// where data follows directly the corresponding tag. +/*! +mmCIF's \"structure\" category has the following form: +\code +_structure_name.tag0 value0 +_structure_name.tag1 value1 +........... +_structure_name.tagN valueN +\endcode +CMMCIFStruct represents this construct by keeping category name +(\"_structure_name\") and associated lists of tags +(\"tag0,tag1...tagN\") and their values (\"value0,value1...valueN\"). + +The structure is created automatically when an mmCIF file is read, +or it may be created programatically and then pushed into file. + +Access to data is provided via tags. Internally, all values are kept +as character fields, and it is only on the retrieval stage that they +are converted to other data types (integers, floats or strings). +If conversion is not possible, an error code is returned by the +corresponding functions, which should be checked by the application. + +See general principles of working with mmCIF files and mmCIF +hierarchies, as well as some code samples, in Section +\"\ref mmcif_handler\". +*/ + +class CMMCIFStruct : public CMMCIFCategory { + + public : + + /// \brief Basic constructor + CMMCIFStruct (); + + /// \brief Constructor that assigns structure name. + /// \param[in] N structure name (must start with underscore). + CMMCIFStruct ( cpstr N ); + + /// \brief Constructor for MMDB data streaming functions + CMMCIFStruct ( RPCStream Object ); + + /// \brief Destructor + ~CMMCIFStruct(); + + /// \brief Adds field to the structure. + /// \param[in] F field value + /// \param[in] T tag name + /// \param[in] Concatenate flag to concatenate existing field + /// with the value of \b F. If tag \b T is already in + /// the structure and \b Concatenate=True, then + /// value of \b F is appended to the existing field. + /// Otherwise, the field is replaced with the value + /// of \b F + void AddField ( cpstr F, cpstr T, Boolean Concatenate=False ); + + /// \brief Returns category type \b MMCIF_Struct. + int GetCategoryID() { return MMCIF_Struct; } + + /// \brief Optimizes structure for RAM and data access speed. + /// Optimized data structures take less RAM and their indexes + /// are sorted for quicker access. Sorting is done automatically + /// as new data is added to the category. If the structure + /// is edited (fields/data removed), it may need + /// optimization and re-sorting for efficiency.\n\n + /// The sorting preserves the order of actual appearance of + /// tags in mmCIF file. If a structure is created + /// programmatically, the order of tags in mmCIF file will be + /// the same as order of adding them to the structure. + void Optimize(); + + /// \brief Returns value of field corresponding to tag in the + /// specified position. + /// Tag positions are defined by the order of their appearance in + /// mmCIF file (if structure was read from a file), or by the + /// order of their addition to the structure (if structure was + /// created programmatically). Tags are numbered as + /// 0...GetNofTags()-1. + /// \param[in] tagNo tag number (position in the structure) + /// \return \b NULL: tag does not exist + /// \return \b CIF_NODATA_DOT_FIELD the field contains + /// \"data not given\" value + /// \return \b CIF_NODATA_QUESTION_FIELD the field contains + /// \"data not available\" value + /// \return \b not \b NULL: string value of the field + pstr GetField ( int tagNo ); // 0..nTags-1 + + /// \brief Fetches value, corresponding to the given tag, as + /// a string + /// \param[out] S pointer to string, which will point to newly + /// allocated character string, containing value + /// associated with tag \b TName. If tag or value + /// is not found, or if value corresponds to + /// mmCIF's \"data not given\" or + /// \"data not available\", \b S returns NULL. + /// \param[in] TName character string with tag name + /// \param[in] Remove flag to remove the tag and its value from + /// structure after it is read. + /// \return \b CIFRC_NoTag: tag is not found + /// \return \b CIFRC_NoField: value is not found + /// \return \b CIFRC_Ok: success. If \b S returns NULL, then + /// the value corresponds to either + /// \"data not available\" or + /// \"data not given\". + /// \remarks If \b S!=NULL at time of call, the function will + /// try to dispose the string it points on. This allows a slick + /// re-use of the same pointer in consequitive calls. This also + /// means that one should never pass unallocated pointer to + /// this function. Safe use assumes the following patern: + /// \code + /// CMMCIFStruct mmCIFStruct; + /// pstr S; // this is merely "char *S" + /// int rc; + /// + /// S = NULL; // null pointer before first use + /// rc = mmCIFStruct.GetString ( S,"id" ); + /// if (rc) CreateCopy ( S,"*** data not found" ); + /// if (!S) CreateCopy ( S,"*** data not given or not available" ); + /// printf ( " rc=%i, S='%s'\n",rc,S ); + /// + /// rc = mmCIFStruct.GetString ( S,"property" ); + /// if (rc) CreateCopy ( S,"*** data not found" ); + /// if (!S) CreateCopy ( S,"*** data not given or not available" ); + /// printf ( " rc=%i, S='%s'\n",rc,S ); + /// + /// // etc etc etc + /// + /// delete[] S; // application is responsible for final + /// // disposal of memory + /// \endcode + int GetString ( pstr & S, cpstr TName, Boolean Remove=False ); + + /// \brief Returns pointer to value associated with given tag. + /// \param[in] TName character string with tag name + /// \param[out] RC return code: + /// \arg \b CIFRC_NoTag: tag is not found + /// \arg \b CIFRC_NoField: value is not found + /// \arg \b CIFRC_Ok: success. If function returns NULL, then + /// the value corresponds to either + /// \"data not available\" or + /// \"data not given\". + /// \return \b NULL: either tag or value is not found, or the + /// value is \"data not available\" or \"data not given\". + /// Read return code \b RC in order to interpret NULL return. + /// \return \b not \b NULL: pointer (\c char \c *) to value + /// associated with \b TName. + /// \remarks Never try to dispose memory pointed by the return + /// value, or your program will crash. + pstr GetString ( cpstr TName, int & RC ); // NULL if TName + // is not there + + /// \brief Deletes field associated with given tag. + /// \param[in] TName character string with tag name + /// \return \b >=0: field deleted + /// \return \b <0: either field or tag is not found + int DeleteField ( cpstr TName ); // <0 the field was not there + + /// \brief Fetches value, corresponding to the given tag, as + /// a real number. + /// \param[out] R reference to real number to accept the value. + /// In case of failure, \b R returns zero. + /// \param[in] TName character string with tag name + /// \param[in] Remove flag to remove the tag and its value from + /// structure after it is read. + /// \return \b CIFRC_NoTag: tag is not found + /// \return \b CIFRC_NoField: field is not found + /// \return \b CIFRC_WrongFormat: value is not a real or integer + /// number. + /// \return \b CIFRC_NoData: value is either + /// \"data not available\" or + /// \"data not given\". + /// \return \b CIFRC_Ok: success. + int GetReal ( realtype & R, cpstr TName, Boolean Remove=False ); + + /// \brief Fetches value, corresponding to the given tag, as + /// an integer number. + /// \param[out] I reference to integer number to accept the + /// value. In case of failure, \b I returns zero, except + /// when value is \"data not available\" or + /// \"data not given\", when I returns \c MinInt4. + /// \param[in] TName character string with tag name + /// \param[in] Remove flag to remove the tag and its value from + /// structure after it is read. + /// \return \arg \b CIFRC_NoTag: tag is not found + /// \return \b CIFRC_NoField: field is not found + /// \return \b CIFRC_WrongFormat: value is not an integer number. + /// \return \b CIFRC_NoData: value is either + /// \"data not available\" or + /// \"data not given\". + /// \return \b CIFRC_Ok: success. + int GetInteger ( int & I, cpstr TName, Boolean Remove=False ); + + /// \brief Sets string value for given tag. + /// \param[in] S character string with value to be set. + /// If \b S==NULL, the \"data not given\" value + /// will be set. If \b S==\"\" (empty string), the + /// \"data not available\" value is stored. + /// \param[in] TName character string with tag name. If tag + /// is not found, it will be added to the structure. + /// \param[in] NonBlankOnly flag to treat white-space-only + /// strings: + /// \arg \b False: set as is + /// \arg \b True: set \"data not available\" value instead. + void PutString ( cpstr S, cpstr TName, + Boolean NonBlankOnly=False ); + + /// \brief Sets current date in format YYYY-MM-DD as a value + /// for given tag. + /// \param[in] T character string with tag name. If tag + /// is not found, it will be added to the structure. + void PutDate ( cpstr T ); + + /// \brief Sets \"data not given\" or \"data not available\" + /// values for given tag. + /// \param[in] NoDataType can be either + /// \arg \b CIF_NODATA_DOT for \"data not given\" + /// \arg \b CIF_NODATA_QUESTION for \"data not available\" + /// \param[in] T character string with tag name. If tag + /// is not found, it will be added to the structure. + void PutNoData ( int NoDataType, cpstr T ); + + /// \brief Sets float-point value for given tag. + /// \param[in] R real number with value to be set. + /// \param[in] TName character string with tag name. If tag + /// is not found, it will be added to the structure. + /// \param[in] prec float-point precision; g-format with given + /// precision will be used + void PutReal ( realtype R, cpstr TName, int prec=8 ); + + /// \brief Sets float-point value for given tag. + /// \param[in] R real number with value to be set. + /// \param[in] TName character string with tag name. If tag + /// is not found, it will be added to the structure. + /// \param[in] format format string to convert \b R. + void PutReal ( realtype R, cpstr TName, cpstr format ); + + /// \brief Sets integer value for given tag. + /// \param[in] I integer number with value to be set. + /// \param[in] TName character string with tag name. If tag + /// is not found, it will be added to the structure. + void PutInteger ( int I, cpstr TName ); + + /// \brief Writes structure data in mmCIF format into file. + /// \param[in] FName character string with file name. + /// \param[in] gzipMode flag to controll compression of files: + /// \arg \b GZM_NONE: do not compress + /// \arg \b GZM_CHECK: check file name suffix and compress + /// (or not) accordingly + /// \arg \b GZM_ENFORCE_GZIP: force gzip compression despite + /// suffix + /// \arg \b GZM_ENFORCE_COMPRESS: force using compress despite + /// suffix + /// \return \b True: success + /// \return \b False: can not open file for writing. + /// \remarks This function does not create a valid mmCIF file + /// as \"data_XXX\" record will be missing. It may be used for + /// debugging though. + Boolean WriteMMCIFStruct ( cpstr FName, + byte gzipMode=GZM_CHECK ); + + /// \brief Writes structure into given file. + /// \param f reference to MMDB's file class. The file should be + /// opened and closed by application. + /// \remarks There is a very limited use of this function on + /// application level. It is primarily used by CMMCIFData class. + void WriteMMCIF ( RCFile f ); + + /// \brief Deep copy of structures. + /// Deep copy duplicates all data and memory allocations, + /// producing a genuine clone of the original. Only deep copy + /// should be used for copying MMDB objects, a mere assignment + /// operator will fail you. + /// \param[in] Struct a pointer to CMMCIFStruct, the content of + /// which is copied into 'this' structure. + void Copy ( PCMMCIFCategory Struct ); + + /// \brief MMDB stream writer. + void write ( RCFile f ); + + /// \brief MMDB stream reader. + void read ( RCFile f ); + + protected: + psvector field; + + void InitMMCIFStruct(); + void FreeMemory(); + +}; + + + +// ====================== CMMCIFLoop ============================== + +DefineClass(CMMCIFLoop) +DefineStreamFunctions(CMMCIFLoop) + +/// \brief CMMCIFLoop represents mmCIF's \"loop\" category, which keeps +/// rows of data values associated with tags. +/*! +mmCIF's \"loop\" category has the following form: +\code +loop_ +_loop_name.tag0 value0 +_loop_name.tag1 value1 +........... +_loop_name.tagN valueN +value00 value10 ... valueN0 +value01 value11 ... valueN1 +........... +value0M value1M ... valueNM +\endcode +CMMCIFLoop represents this construct by keeping category name +(\"_loop_name\") and associated lists of tags +(\"tag0,tag1...tagN\") and data vectors +(\"[value00...value0M],[value10...value1M]...[valueN0...valueNM]\"). + +The loop object is created automatically when an mmCIF file is read, +or it may be created programatically and then pushed into file. + +Access to data is provided via tags and data indexes. Internally, +all values are kept as character fields, and it is only on the +retrieval stage that they are converted to other data types +(integers, floats or strings). If conversion is not possible, an +error code is returned by the corresponding functions, which should +be checked by the application. + +The following code gives an example of creating mmCIF loop category +and populating it with data: +\code +CMMCIFLoop loop; +char S[100]; +int i; + + // Specify loop name: + loop.SetCategoryName ( "_sample_loop" ); + + // Create loop structure, i.e., list of tags first: + loop.AddLoopTag ( "id" ); + loop.AddLoopTag ( "name" ); + loop.AddLoopTag ( "value" ); + + // Now populate it with data. This my be done in 2 ways. + // Here is how you write loop data in stream fashion, + // value-after-value: + for (i=0;i<3;i++) { + loop.AddInteger ( i ); + sprintf ( S,"1st_way-%i",i ); + loop.AddString ( S ); + loop.AddReal ( 2.5*(i+1) ); + } + + // Here is how you populate loop data using direct-access + // functions: + for (i=3;i<6;i++) { + loop.PutReal ( 2.5*(i+1),"value",i ); + loop.PutInteger ( i,"id" ); + sprintf ( S,"2nd way: %i",i ); + loop.PutString ( S,"name" ); + } + + loop.WriteMMCIFLoop ( "sample_loop.cif" ); + +\endcode + +The resulting file \b sample_loop.cif will contain: + +\code + +loop_ +_sample_loop.id +_sample_loop.name +_sample_loop.value +0 1st_way-0 2.5 +1 1st_way-1 5.0 +2 1st_way-2 7.5 +3 "2nd way: 3" 10.0 +4 "2nd way: 4" 12.5 +5 "2nd way: 5" 15.0 + +\endcode + +See general principles of working with mmCIF files and mmCIF +hierarchies, as well as some code samples, in Section +\"\ref mmcif_handler\". +*/ + +class CMMCIFLoop : public CMMCIFCategory { + + friend class CMMCIFData; + + public : + + /// \brief Basic constructor + CMMCIFLoop (); + + /// \brief Constructor that assigns structure name. + /// \param[in] N structure name (must start with underscore). + CMMCIFLoop ( cpstr N ); + + /// \brief Constructor for MMDB data streaming functions + CMMCIFLoop ( RPCStream Object ); + + /// \brief Destructor + ~CMMCIFLoop(); + + /// \brief Adds tag to the loop. + /// The tag is appended to the list of existing tags. The order + /// of tags cannot be changed. + /// \param[in] T tag name + /// \param[in] Remove flag to remove all fields in the loop. + void AddLoopTag ( cpstr T, Boolean Remove=True ); + + /// \brief Sets string value at current loop position. + /// When \b CMMCIFLoop::Add[Data] functions use internal loop + /// pointer. When category is created or cleared (by using + /// \b CMMCIFTLoop::AddLoopTag ( T,True )) the pointer is set to + /// 0th row and 0th column (tag). After each call to + /// \b CMMCIFLoop::Add[Data] function, internal pointer advances + /// to next column (tag), and wraps over to next row, 0th tag, + /// if list of tags is exhausted. Any remaining fields in last + /// row will be populated with \"data not given\" value. + /// \param[in] S character string with value to be set. + /// If \b S==NULL, the \"data not given\" value + /// will be set. If \b S==\"\" (empty string), the + /// \"data not available\" value is stored. + /// \param[in] NonBlankOnly flag to treat white-space-only + /// strings: + /// \arg \b False: set as is + /// \arg \b True: set \"data not available\" value instead. + void AddString ( cpstr S, Boolean NonBlankOnly=False ); + + /// \brief Sets \"data not given\" or \"data not available\" at + /// current loop position. + /// When \b CMMCIFLoop::Add[Data] functions use internal loop + /// pointer. When category is created or cleared (by using + /// \b CMMCIFTLoop::AddLoopTag ( T,True )) the pointer is set to + /// 0th row and 0th column (tag). After each call to + /// \b CMMCIFLoop::Add[Data] function, internal pointer advances + /// to next column (tag), and wraps over to next row, 0th tag, + /// if list of tags is exhausted. Any remaining fields in last + /// row will be populated with \"data not given\" value. + /// \param[in] NoDataType integer key specifying which type of + /// data absence should be set as a value: + /// \arg \b CIF_NODATA_DOT for \"data not given\" + /// \arg \b CIF_NODATA_QUESTION for \"data not available\" + void AddNoData ( int NoDataType ); + + /// \brief Sets float-point value at current loop position. + /// When \b CMMCIFLoop::Add[Data] functions use internal loop + /// pointer. When category is created or cleared (by using + /// \b CMMCIFTLoop::AddLoopTag ( T,True )) the pointer is set to + /// 0th row and 0th column (tag). After each call to + /// \b CMMCIFLoop::Add[Data] function, internal pointer advances + /// to next column (tag), and wraps over to next row, 0th tag, + /// if list of tags is exhausted. Any remaining fields in last + /// row will be populated with \"data not given\" value. + /// \param[in] R real number with value to be set. + /// \param[in] prec float-point precision; g-format with given + /// precision will be used + void AddReal ( realtype R, int prec=8 ); + + /// \brief Sets float-point value at current loop position in + /// given format. + /// When \b CMMCIFLoop::Add[Data] functions use internal loop + /// pointer. When category is created or cleared (by using + /// \b CMMCIFTLoop::AddLoopTag ( T,True )) the pointer is set to + /// 0th row and 0th column (tag). After each call to + /// \b CMMCIFLoop::Add[Data] function, internal pointer advances + /// to next column (tag), and wraps over to next row, 0th tag, + /// if list of tags is exhausted. Any remaining fields in last + /// row will be populated with \"data not given\" value. + /// \brief Sets float-point value for given tag. + /// \param[in] R real number with value to be set. + /// \param[in] format format string to convert \b R. + void AddReal ( realtype R, cpstr format ); + + /// \brief Sets integer value at current loop position in given + /// format. + /// When \b CMMCIFLoop::Add[Data] functions use internal loop + /// pointer. When category is created or cleared (by using + /// \b CMMCIFTLoop::AddLoopTag ( T,True )) the pointer is set to + /// 0th row and 0th column (tag). After each call to + /// \b CMMCIFLoop::Add[Data] function, internal pointer advances + /// to next column (tag), and wraps over to next row, 0th tag, + /// if list of tags is exhausted. Any remaining fields in last + /// row will be populated with \"data not given\" value. + /// \param[in] I integer number with value to be set. + void AddInteger ( int I ); + + /// \brief Returns current length of the loop (i.e. the number + /// of rows). + /// \return number of data rows in the loop. + int GetLoopLength() { return nRows; } + + /// \brief Returns string pointer on the field corresponding to + /// tag in the specified position, in the specified row. + /// Tag positions are defined by the order of their appearance in + /// mmCIF file (if loop was read from a file), or by the + /// order of their addition to the loop (if loop was + /// created programmatically). + /// \param[in] rowNo row number (0...GetLoopLength()-1) + /// \param[in] tagNo tag number (0...GetNofTags()-1) + /// \return \b NULL: tag or row do not exist + /// \return \b CIF_NODATA_DOT_FIELD the field contains + /// \"data not given\" value + /// \return \b CIF_NODATA_QUESTION_FIELD the field contains + /// \"data not available\" value + /// \return \b not \b NULL: string value of the field + /// \remarks Never try to dispose memory pointed by the return + /// value, or your program will crash. + pstr GetField ( int rowNo, int tagNo ); + + /// \brief Fetches value, corresponding to the given tag, in + /// the given row, as a string + /// \param[out] S pointer to string, which will point to newly + /// allocated character string, containing value + /// associated with tag \b TName and row \b nrow. + /// If tag, row or value + /// is not found, or if value corresponds to + /// mmCIF's \"data not given\" or + /// \"data not available\", \b S returns NULL. + /// \param[in] TName character string with tag name + /// \param[in] nrow row number (0...GetLoopLength()-1) + /// \param[in] Remove flag to remove the field from + /// structure after it is read. + /// \return \b CIFRC_NoTag: tag is not found + /// \return \b CIFRC_WrongIndex: row is not found + /// \return \b CIFRC_NoField: value is not found + /// \return \b CIFRC_Ok: success. If \b S returns NULL, then + /// the value corresponds to either + /// \"data not available\" or + /// \"data not given\". + /// \remarks If \b S!=NULL at time of call, the function will + /// try to dispose the string it points on. This allows a slick + /// re-use of the same pointer in consequitive calls. This also + /// means that one should never pass unallocated pointer to + /// this function. Safe use assumes the following patern: + /// \code + /// CMMCIFLoop mmCIFLoop; + /// pstr S; // this is merely "char *S" + /// int rc; + /// + /// S = NULL; // null pointer before first use + /// rc = mmCIFLoop.GetString ( S,"id",1 ); + /// if (rc) CreateCopy ( S,"*** data not found" ); + /// if (!S) CreateCopy ( S,"*** data not given or not available" ); + /// printf ( " rc=%i, S='%s'\n",rc,S ); + /// + /// rc = mmCIFLoop.GetString ( S,"property",0 ); + /// if (rc) CreateCopy ( S,"*** data not found" ); + /// if (!S) CreateCopy ( S,"*** data not given or not available" ); + /// printf ( " rc=%i, S='%s'\n",rc,S ); + /// + /// // etc etc etc + /// + /// delete[] S; // application is responsible for final + /// // disposal of memory + /// \endcode + int GetString ( pstr & S, cpstr TName, int nrow, + Boolean Remove=False ); + + /// \brief Returns pointer to value associated with given tag, + /// in the given row of the loop. + /// \param[in] TName character string with tag name + /// \param[in] nrow row number (0...GetLoopLength()-1) + /// \param[out] RC return code: + /// \arg \b CIFRC_NoTag: tag is not found + /// \arg \b CIFRC_WrongIndex: row is not found + /// \arg \b CIFRC_NoField: value is not found + /// \arg \b CIFRC_Ok: success. If function returns NULL, then + /// the value corresponds to either + /// \"data not available\" or + /// \"data not given\". + /// \return \b NULL: either tag, row or value is not found, or the + /// value is \"data not available\" or \"data not given\". + /// Read return code \b RC in order to interpret NULL return. + /// \return \b not \b NULL: pointer (\c char \c *) to value + /// associated with \b TName. + /// \remarks Never try to dispose memory pointed by the return + /// value, or your program will crash. + pstr GetString ( cpstr TName, int nrow, int & RC ); + + /// \brief Copies value, associated with given tag, + /// in the given row, into specified buffer. + /// Terminating NULL character is appended. + /// \param[out] buf character string to accept the value + /// \param[in] maxlength maximum number of bytes to copy + /// \param[in] TName character string with tag name + /// \param[in] nrow row number (0...GetLoopLength()-1) + /// \param[out] RC return code: + /// \arg \b CIFRC_NoTag: tag is not found + /// \arg \b CIFRC_WrongIndex: row is not found + /// \arg \b CIFRC_NoField: value is not found + /// \arg \b CIFRC_Ok: success. + /// \remarks Destination string \b buf is not modified if + /// \b RC!=CIFRC_Ok . + void CopyString ( pstr buf, int maxlength, + cpstr TName, int nrow, int & RC ); + + /// \brief Deletes field associated with given tag in + /// the given row. + /// \param[in] TName character string with tag name + /// \param[in] nrow row number (0...GetLoopLength()-1) + /// \return \b >=0: field deleted + /// \return \b <0: either field or tag is not found + int DeleteField ( cpstr TName, int nrow ); + + /// \brief Deletes all fields in given row. + /// \param[in] nrow row number (0...GetLoopLength()-1) + /// \return \b CIFRC_Ok: fields deleted + /// \return \b CIFRC_WrongIndex: row not found + /// \remarks Note that this function delets just the fields, but + /// not the row. If you wish the row to be deleted, call + /// CMMCIFLoop::Optimize() function after this one. + int DeleteRow ( int nrow ); + + /// \brief Fetches value, corresponding to the given tag, + /// in the given row, as a real number. + /// \param[out] R reference to real number to accept the value. + /// In case of failure, \b R returns zero. + /// \param[in] TName character string with tag name + /// \param[in] nrow row number (0...GetLoopLength()-1) + /// \param[in] Remove flag to remove the field from + /// the loop after it is read. + /// \return \b CIFRC_NoTag: tag is not found + /// \return \b CIFRC_WrongIndex: row not found + /// \return \b CIFRC_NoField: field is not found + /// \return \b CIFRC_WrongFormat: value is not a real or integer + /// number. + /// \return \b CIFRC_NoData: value is either + /// \"data not available\" or + /// \"data not given\". + /// \return \b CIFRC_Ok: success. + int GetReal ( realtype & R, cpstr TName, int nrow, + Boolean Remove=False ); + + /// \brief Copies value, associated with given tag, + /// in the given row, into specified destination as + /// a real number. + /// \param[out] R reference to real number to accept the value + /// \param[in] TName character string with tag name + /// \param[in] nrow row number (0...GetLoopLength()-1) + /// \param[out] RC return code: + /// \arg \b CIFRC_NoTag: tag is not found + /// \arg \b CIFRC_WrongIndex: row is not found + /// \arg \b CIFRC_NoField: value is not found + /// \arg \b CIFRC_Ok: success. + /// \remarks Destination \b R is set 0 if \b RC!=CIFRC_Ok. + void CopyReal ( realtype & R, cpstr TName, int nrow, int & RC ); + + /// \brief Copies value, associated with given tag, + /// in the given row, into specified destination as + /// an integer number. + /// \param[out] I reference to integer number to accept the value + /// \param[in] TName character string with tag name + /// \param[in] nrow row number (0...GetLoopLength()-1) + /// \param[out] RC return code: + /// \arg \b CIFRC_NoTag: tag is not found + /// \arg \b CIFRC_WrongIndex: row is not found + /// \arg \b CIFRC_NoField: value is not found + /// \arg \b CIFRC_Ok: success. + /// \remarks Destination \b I is set 0 if \b RC!=CIFRC_Ok. + void CopyInteger ( int & I, cpstr TName, int nrow, int & RC ); + + /// \brief Fetches value, corresponding to the given tag, + /// in the given row, as an integer number. + /// \param[out] I reference to integer number to accept the value. + /// In case of failure, \b R returns zero. + /// \param[in] TName character string with tag name + /// \param[in] nrow row number (0...GetLoopLength()-1) + /// \param[in] Remove flag to remove the field from + /// the loop after it is read. + /// \return \b CIFRC_NoTag: tag is not found + /// \return \b CIFRC_WrongIndex: row not found + /// \return \b CIFRC_NoField: field is not found + /// \return \b CIFRC_WrongFormat: value is not a real or integer + /// number. + /// \return \b CIFRC_NoData: value is either + /// \"data not available\" or + /// \"data not given\". + /// \return \b CIFRC_Ok: success. + int GetInteger ( int & I, cpstr TName, int nrow, + Boolean Remove=False ); + + /// \brief Fetches set of values, corresponding to the given + /// tag, in the given range of rows, as a vector of + /// strings. + /// \param[out] S reference to string vector to accept + /// the values. if \b S==NULL , the vector will be + /// allocated with starting index of \b i1. + /// \param[in] TName character string with tag name + /// \param[in] i1 minimum row number to fetch, the actual + /// index will be calculated as \b max(0,min(i1,i2)) + /// \param[in] i2 maximum row number to fetch, the actual + /// index will be calculated as + /// \b min(GetLoopLength()-1,max(i1,i2)) + /// \param[in] Remove flag to remove fetched fields from + /// the loop after they are read. + /// \return \b CIFRC_NoTag: tag is not found + /// \return \b CIFRC_WrongIndex: invalid range of rows + /// \return \b CIFRC_Ok: success. + /// + /// For safe use, \b S should be pre-allocated by calling + /// process. Only elements \b S[i1] to \b S[i2] will contain + /// fetched data, others remain untouched. The calling + /// process is responsible for the disposal of \b S. Example: + /// \code + /// CMMCIFLoop loop; + /// psvector S; // equivalent to char **S + /// int i,i1,i2,rc,n; + /// + /// // ... get loop data + /// + /// n = loop.GetLoopLength(); + /// i1 = 5; i2 = n - 5; // could be wrong! + /// + /// // allocate vector of strings + /// GetVectorMemory ( S,n,0 ); // "0" for starting index + /// for (i=0;i