From 143f3545e8cbd4529cb2a1f7311135f6a16e8342 Mon Sep 17 00:00:00 2001 From: Michael Banck Date: Wed, 5 Oct 2016 23:34:31 +0100 Subject: [PATCH] Import libint_1.1.6.orig.tar.gz [dgit import orig libint_1.1.6.orig.tar.gz] --- .hgtags | 3 + COPYING | 280 + INSTALL | 15 + LICENSE | 18 + Makefile | 79 + README | 10 + bin/config.guess | 1544 ++++ bin/config.sub | 1788 ++++ bin/install-sh | 238 + bin/ltmain.sh | 9656 +++++++++++++++++++++ bin/objectdir.pl | 167 + configure.in | 579 ++ doc/MakeRules.in | 19 + doc/MakeVars.in | 52 + doc/Makefile | 56 + doc/progman/Makefile | 12 + doc/progman/macros.tex | 24 + doc/progman/progman.tex | 646 ++ doc/progman/refs.bib | 117 + lib/MakeRules | 21 + lib/MakeSuffixRules | 32 + lib/autoconf/libtool.m4 | 7982 +++++++++++++++++ src/Makefile | 74 + src/bin/MakeRules.in | 27 + src/bin/MakeVars.in | 82 + src/bin/Makefile | 80 + src/bin/constants.h | 37 + src/bin/libderiv/Makefile | 17 + src/bin/libderiv/build_libderiv.c | 296 + src/bin/libderiv/build_libderiv.h | 63 + src/bin/libderiv/emit_d1hrr_build.c | 248 + src/bin/libderiv/emit_d1hrr_build_macro.c | 244 + src/bin/libderiv/emit_deriv12_managers.c | 1441 +++ src/bin/libderiv/emit_deriv1_managers.c | 1326 +++ src/bin/libderiv/emit_deriv_build.c | 447 + src/bin/libderiv/emit_deriv_build_macro.c | 431 + src/bin/libderiv/mem_man.c | 149 + src/bin/libderiv/mem_man.h | 8 + src/bin/libint/Makefile | 17 + src/bin/libint/build_libint.c | 226 + src/bin/libint/build_libint.h | 38 + src/bin/libint/emit_hrr_build.c | 354 + src/bin/libint/emit_hrr_build_macro.c | 229 + src/bin/libint/emit_order.c | 757 ++ src/bin/libint/emit_vrr_build.c | 289 + src/bin/libint/emit_vrr_build_macro.c | 245 + src/bin/libint/mem_man.c | 149 + src/bin/libint/mem_man.h | 8 + src/bin/libint_config.h.in | 59 + src/bin/libr12/Makefile | 17 + src/bin/libr12/build_libr12.c | 202 + src/bin/libr12/build_libr12.h | 28 + src/bin/libr12/emit_gr_order.c | 1194 +++ src/bin/libr12/emit_grt_order.c | 1189 +++ src/bin/libr12/emit_hrr_t_build.c | 435 + src/bin/libr12/emit_vrr_r_build.c | 295 + src/bin/libr12/emit_vrr_t1_build.c | 252 + src/bin/libr12/emit_vrr_t2_build.c | 253 + src/bin/libr12/mem_man.c | 149 + src/bin/libr12/mem_man.h | 8 + src/lib/MakeRules.in | 79 + src/lib/MakeVars.in | 112 + src/lib/Makefile | 80 + src/lib/libderiv/Makefile | 17 + src/lib/libderiv/Makefile.library | 51 + src/lib/libint/Makefile | 16 + src/lib/libint/Makefile.library | 69 + src/lib/libint/vrr_build.c | 138 + src/lib/libr12/Makefile | 17 + src/lib/libr12/Makefile.library | 75 + src/lib/libr12/r_vrr_build.c | 136 + src/lib/libr12/t1_vrr_build.c | 111 + src/lib/libr12/t2_vrr_build.c | 112 + updates | 24 + 74 files changed, 35738 insertions(+) create mode 100644 .hgtags create mode 100644 COPYING create mode 100644 INSTALL create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README create mode 100644 bin/config.guess create mode 100644 bin/config.sub create mode 100755 bin/install-sh create mode 100644 bin/ltmain.sh create mode 100644 bin/objectdir.pl create mode 100644 configure.in create mode 100644 doc/MakeRules.in create mode 100644 doc/MakeVars.in create mode 100644 doc/Makefile create mode 100644 doc/progman/Makefile create mode 100644 doc/progman/macros.tex create mode 100644 doc/progman/progman.tex create mode 100644 doc/progman/refs.bib create mode 100644 lib/MakeRules create mode 100644 lib/MakeSuffixRules create mode 100644 lib/autoconf/libtool.m4 create mode 100644 src/Makefile create mode 100644 src/bin/MakeRules.in create mode 100644 src/bin/MakeVars.in create mode 100644 src/bin/Makefile create mode 100644 src/bin/constants.h create mode 100644 src/bin/libderiv/Makefile create mode 100644 src/bin/libderiv/build_libderiv.c create mode 100644 src/bin/libderiv/build_libderiv.h create mode 100644 src/bin/libderiv/emit_d1hrr_build.c create mode 100644 src/bin/libderiv/emit_d1hrr_build_macro.c create mode 100644 src/bin/libderiv/emit_deriv12_managers.c create mode 100644 src/bin/libderiv/emit_deriv1_managers.c create mode 100644 src/bin/libderiv/emit_deriv_build.c create mode 100644 src/bin/libderiv/emit_deriv_build_macro.c create mode 100644 src/bin/libderiv/mem_man.c create mode 100644 src/bin/libderiv/mem_man.h create mode 100644 src/bin/libint/Makefile create mode 100644 src/bin/libint/build_libint.c create mode 100644 src/bin/libint/build_libint.h create mode 100644 src/bin/libint/emit_hrr_build.c create mode 100644 src/bin/libint/emit_hrr_build_macro.c create mode 100644 src/bin/libint/emit_order.c create mode 100644 src/bin/libint/emit_vrr_build.c create mode 100644 src/bin/libint/emit_vrr_build_macro.c create mode 100644 src/bin/libint/mem_man.c create mode 100644 src/bin/libint/mem_man.h create mode 100644 src/bin/libint_config.h.in create mode 100644 src/bin/libr12/Makefile create mode 100644 src/bin/libr12/build_libr12.c create mode 100644 src/bin/libr12/build_libr12.h create mode 100644 src/bin/libr12/emit_gr_order.c create mode 100644 src/bin/libr12/emit_grt_order.c create mode 100644 src/bin/libr12/emit_hrr_t_build.c create mode 100644 src/bin/libr12/emit_vrr_r_build.c create mode 100644 src/bin/libr12/emit_vrr_t1_build.c create mode 100644 src/bin/libr12/emit_vrr_t2_build.c create mode 100644 src/bin/libr12/mem_man.c create mode 100644 src/bin/libr12/mem_man.h create mode 100644 src/lib/MakeRules.in create mode 100644 src/lib/MakeVars.in create mode 100644 src/lib/Makefile create mode 100644 src/lib/libderiv/Makefile create mode 100644 src/lib/libderiv/Makefile.library create mode 100644 src/lib/libint/Makefile create mode 100644 src/lib/libint/Makefile.library create mode 100644 src/lib/libint/vrr_build.c create mode 100644 src/lib/libr12/Makefile create mode 100644 src/lib/libr12/Makefile.library create mode 100644 src/lib/libr12/r_vrr_build.c create mode 100644 src/lib/libr12/t1_vrr_build.c create mode 100644 src/lib/libr12/t2_vrr_build.c create mode 100644 updates diff --git a/.hgtags b/.hgtags new file mode 100644 index 0000000..a39ef99 --- /dev/null +++ b/.hgtags @@ -0,0 +1,3 @@ +42fa8921c08ff9c931ed64ea44f7f26ade38c0f2 LIBINT_1_00 +16ee783eb9d1439a2f60fafb548fc4069560b668 release-1-1-4 +a3b76e10a69ed919970e79aaf8be63db880be520 release-1-1-0 diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..d8cf7d4 --- /dev/null +++ b/COPYING @@ -0,0 +1,280 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) 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 +this service 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 make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. 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. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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 +MERCHANTABILITY AND 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. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..2b91b7a --- /dev/null +++ b/INSTALL @@ -0,0 +1,15 @@ +The recommended installation procedure: +0) create a directory for object files $(OBJDIR) +1) cd $(OBJDIR) +1) $(SRCDIR)/configure + Most often you will need to specify command-line options to configure. + To obtain a list of configure options run 'configure --help'. +2) make +3) make install + +If you are compiling from sources obtained via Mercurial then prior to step 0 you need to run the following 2 commands: +aclocal -I lib/autoconf +autoconf + +Report all problems to libint@valeyev.net + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8778785 --- /dev/null +++ b/LICENSE @@ -0,0 +1,18 @@ +LIBINT - a library for the evaluation of molecular integrals of two-body +operators over Gaussian functions +Copyright (C) 1996-2014 Edward F. Valeev and Justin T. Fermann + +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 +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, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..079c80e --- /dev/null +++ b/Makefile @@ -0,0 +1,79 @@ +TOPDIR=. +ifndef SRCDIR + SRCDIR=$(shell pwd) +endif + +-include $(TOPDIR)/Makedirlist + +SUBDIRS = src +ALLSUBDIRS = $(SUBDIRS) doc + +default:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(JOBS)) || exit 1; \ + done + +ifndef DODEPEND +DODEPENDOPT = "DODEPEND=no" +endif + +doc:: + (cd doc && $(MAKE) $(DODEPENDOPT) install) || exit 1; + +install:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) install) || exit 1; \ + done + +install_inc:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) install_inc) || exit 1; \ + done + +install_target:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) install_target) || exit 1; \ + done + +uninstall:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) uninstall) || exit 1; \ + done + +clean:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) clean) || exit 1; \ + done + +oclean:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) oclean) || exit 1; \ + done + +distclean:: + for dir in $(ALLSUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) distclean) || exit 1; \ + done + -rm -rf autom4te.cache config.status config.log depcheck* libtool \ +Makedirlist include + +targetclean:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) targetclean) || exit 1; \ + done + +realclean:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) realclean) || exit 1; \ + done + diff --git a/README b/README new file mode 100644 index 0000000..b8d7710 --- /dev/null +++ b/README @@ -0,0 +1,10 @@ +LIBINT - a library for the evaluation of molecular integrals of two-body +operators over Gaussian functions +Copyright (C) 1996-2014 Edward F. Valeev and Justin T. Fermann + +See INSTALL for installation intructions. + +Contact info: + o project page: http://sf.net/projects/libint/ + o other info - http://libint.valeyev.net/ + o e-mail - libint@valeyev.edu diff --git a/bin/config.guess b/bin/config.guess new file mode 100644 index 0000000..2055429 --- /dev/null +++ b/bin/config.guess @@ -0,0 +1,1544 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# 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"). +# +# 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 + +# 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-gnu`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/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + aarch64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo ${UNAME_MACHINE}-unknown-linux-gnu + 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="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + 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-gnu + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + else + echo ${UNAME_MACHINE}-unknown-linux-gnueabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + hexagon:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + LIBC=gnu + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #ifdef __dietlibc__ + LIBC=dietlibc + #endif + #else + #include + #ifdef __UCLIBC__ + LIBC=uclibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + 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-gnu"; exit; } + ;; + or1k:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + or32:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-gnu + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + 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-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + tile*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + LIBC=gnu + test -r /lib/libc.so && od -An -S13 /lib/libc.so | grep -q __uClibc_main && LIBC=uclibc + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + 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 + case $UNAME_PROCESSOR in + i386) + eval $set_cc_for_build + 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 + UNAME_PROCESSOR="x86_64" + fi + fi ;; + unknown) UNAME_PROCESSOR=powerpc ;; + esac + 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/bin/config.sub b/bin/config.sub new file mode 100644 index 0000000..8b612ab --- /dev/null +++ b/bin/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-*) 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/bin/install-sh b/bin/install-sh new file mode 100755 index 0000000..5871924 --- /dev/null +++ b/bin/install-sh @@ -0,0 +1,238 @@ +#! /bin/sh +# +# install - install a program, script, or datafile +# This comes from X11R5. +# +# 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. +# + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +transformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + true +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + else + instcmd=mkdir + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + true + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + true + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + true + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' +' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + true + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + true + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# 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 $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 diff --git a/bin/ltmain.sh b/bin/ltmain.sh new file mode 100644 index 0000000..9ae038c --- /dev/null +++ b/bin/ltmain.sh @@ -0,0 +1,9656 @@ + +# 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 + # -stdlib=* select c++ std lib with clang + -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|-stdlib=*) + 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/bin/objectdir.pl b/bin/objectdir.pl new file mode 100644 index 0000000..2c18e21 --- /dev/null +++ b/bin/objectdir.pl @@ -0,0 +1,167 @@ +# Emacs should use -*- Perl -*- mode. + +while ($arg = shift) { + if ($arg eq "-x") { + $excluded[$#excluded+1] = shift; + } + else { + $srcdir = $arg; + } +} + +($mydev,$myino,$mymode,$mynlink,$myuid,$mygid,$myrdev,$mysize, + $myatime,$mymtime,$myctime,$myblksize,$myblocks) + = stat("."); + +if (substr($srcdir,0,1) eq "/") { + $topdir = ""; +} +else { + $topdir = "."; +} + +$stubhead = "# Generated by objectdir.pl -- edit at own risk.\n"; + + +if (-d "$srcdir/src") { + local($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, + $atime,$mtime,$ctime,$blksize,$blocks) + = stat("$srcdir/src"); + mkdir ("src", $mode); +} +else { + die "couldn't find source distribution"; +} +if (-d "$srcdir/src/bin") { + local($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, + $atime,$mtime,$ctime,$blksize,$blocks) + = stat("$srcdir/src/bin"); + mkdir ("src/bin", $mode); +} +else { + die "couldn't find source distribution"; +} +if (-d "$srcdir/src/lib") { + local($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, + $atime,$mtime,$ctime,$blksize,$blocks) + = stat("$srcdir/src/lib"); + mkdir ("src/lib", $mode); +} +else { + die "couldn't find source distribution"; +} + +open(MAKEDIRLIST,">Makedirlist"); +open(INCDIRLIST,">src/libintdirlist.h"); + +&dodir("$srcdir",".",$topdir); + +close(MAKEDIRLIST); +close(INCDIRLIST); + +exit; + +sub dodir { + local($dir,$objdir,$topdir) = @_; + local($file); + local(@files); + + #print "In directory $dir\n"; + + opendir(DIR, $dir) || (warn "Can't open $dir: $!\n", return); + @files = readdir(DIR); + closedir(DIR); + + foreach $file (@files) { + if ($file eq "." || $file eq ".." || $file eq "CVS") { + next; + } + + local($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, + $atime,$mtime,$ctime,$blksize,$blocks) + = stat("$dir/$file"); + + if ($dev == $mydev && $ino == $myino) { next; } + + if (-d "$dir/$file") { + mkdir ("$objdir/$file", $mode); + local($nexttop); + if ($topdir eq ".") { + $nexttop = "../"; + } + elsif ($topdir eq "" ) { + $nexttop = ""; + } + else { + $nexttop = "$topdir../"; + } + &dodir("$dir/$file", "$objdir/$file", $nexttop); + } + elsif ("$file" eq "Makefile" && isobjectdirmake("$dir/$file")) { + #print "Found $dir/Makefile\n"; + local($nextdir); + &domake("$topdir$dir", "$objdir/$file"); + &doconfigfiles("$objdir"); + } + } +} + +sub isobjectdirmake { + local($file) = shift; + open(MAKEFILE,"<$file"); + while () { + if (/SRCDIR/) { + return 1; + } + } + return 0; +} + +sub doconfigfiles { + local($dir) = @_; + $dir =~ s/\.//g; + $dir =~ s/\//_/g; + $dir = uc($dir); + $dir =~ s/^_//; + if ($dir ne "" && ! &excluded($dir)) { + printf MAKEDIRLIST "HAVE_LIBINT_%s=yes\n", $dir; + printf INCDIRLIST "#define HAVE_LIBINT_%s 1\n", $dir; + } +} + +sub domake { + local($topdir, $stubmake) = @_; + + if (-f $stubmake) { + open(STUBMAKE,"<$stubmake"); + local($line) = scalar(); + close(STUBMAKE); + if ($line eq $stubhead) { + print "Overwriting " + } + else { + print "Skipping $stubmake\n"; + return; + } + } + else { + print "Writing "; + } + print "$stubmake\n"; + + open(STUBMAKE,">$stubmake"); + print STUBMAKE "$stubhead"; + print STUBMAKE "SRCDIR = $topdir\n"; + print STUBMAKE "VPATH = \$(SRCDIR)\n"; + print STUBMAKE "include \$(SRCDIR)/Makefile\n"; + close(STUBMAKE); +} + +sub excluded { + my $dir = shift; + my $i; + foreach $i (0..($#excluded)) { + if ($dir eq $excluded[$i]) { return 1; } + } + return 0; +} diff --git a/configure.in b/configure.in new file mode 100644 index 0000000..dc86e88 --- /dev/null +++ b/configure.in @@ -0,0 +1,579 @@ +define([libint_mmm_version],[1.1.6]) +define([libint_buildid],[stable]) +define([libint_so_version],[1:0:0]) + +dnl Process this file with autoconf to produce a configure script. +define([AC_CACHE_LOAD], )dnl for debugging configure.in +define([AC_CACHE_SAVE], )dnl for debugging configure.in +AC_INIT(src/bin/libint/build_libint.c) +AC_PREREQ(2.52) +AC_CONFIG_HEADER(src/bin/libint_config.h) +AC_CONFIG_AUX_DIR(bin) +AC_CONFIG_MACRO_DIR([lib/autoconf]) + +AC_CANONICAL_SYSTEM +AC_SET_MAKE + +AC_DEFINE_UNQUOTED(HOST_ARCH, "$host") +AC_DEFINE_UNQUOTED(TARGET_ARCH, "$target") + +define([default_prefix_dash],ifelse(libint_buildid, ,[],[-])) +define([default_prefix],"/usr/local") + +LIBINT_MMM_VERSION=libint_mmm_version +changequote(<<, >>)dnl +LIBINT_MAJOR_VERSION=`echo $LIBINT_MMM_VERSION|sed 's/\([0-9]*\)\.[0-9]*\.[0-9]*/\1/'` +LIBINT_MINOR_VERSION=`echo $LIBINT_MMM_VERSION|sed 's/[0-9]*\.\([0-9]*\)\.[0-9]*/\1/'` +LIBINT_MICRO_VERSION=`echo $LIBINT_MMM_VERSION|sed 's/[0-9]*\.[0-9]*\.\([0-9]*\)/\1/'` +changequote([, ])dnl +AC_DEFINE_UNQUOTED(LIBINT_MAJOR_VERSION,$LIBINT_MAJOR_VERSION) +AC_DEFINE_UNQUOTED(LIBINT_MINOR_VERSION,$LIBINT_MINOR_VERSION) +AC_DEFINE_UNQUOTED(LIBINT_MICRO_VERSION,$LIBINT_MICRO_VERSION) + +LIBINT_SO_VERSION=libint_so_version +AC_SUBST(LIBINT_SO_VERSION) + +dnl --------- Features --------- + +AC_ARG_ENABLE(debug, +[ --enable-debug Compile with debugging options], +[ +case $enableval in + yes) + DEBUG=yes + ;; + no) + DEBUG=no + ;; + opt) + DEBUG=opt + ;; + *) + AC_MSG_ERROR([Invalid value for --enable-debug ($enableval)]) + ;; +esac +],[ + DEBUG=no +] +) + + +EXCLUDED_DIRS= + +INCLUDE_DERIV=yes +AC_ARG_ENABLE(deriv, +[ --enable-deriv Compile with 1st- and 2nd-order derivative ERI support], +[ +case $enableval in + yes) + INCLUDE_DERIV=yes + ;; + no) + INCLUDE_DERIV=no + ;; + *) + AC_MSG_ERROR([Invalid value for --enable-deriv ($enableval)]) + ;; +esac +],[ + INCLUDE_DERIV=yes +] +) +if test $INCLUDE_DERIV = yes; then + AC_DEFINE(INCLUDE_DERIV) +else + EXCLUDED_DIRS="-x SRC_BIN_LIBDERIV $EXCLUDED_DIRS" +fi + +INCLUDE_R12=yes +AC_ARG_ENABLE(r12, +[ --enable-r12 Compile with linear R12 methods integrals support], +[ +case $enableval in + yes) + INCLUDE_R12=yes + ;; + no) + INCLUDE_R12=no + ;; + *) + AC_MSG_ERROR([Invalid value for --enable-r12 ($enableval)]) + ;; +esac +],[ + INCLUDE_R12=yes +] +) +if test $INCLUDE_R12 = yes; then + AC_DEFINE(INCLUDE_R12) +else + EXCLUDED_DIRS="-x SRC_BIN_LIBR12 $EXCLUDED_DIRS" +fi + +LIBINT_MAX_AM=4 +AC_ARG_WITH(libint-max-am, +[ --with-libint-max-am Gives the maximum angular momentum of ERI this library will be able to handle.], +if test $withval -le 0; then + AC_MSG_ERROR([Invalid value for --with-libint-max-am ($withval)]) +else + LIBINT_MAX_AM=$withval +fi +if test $LIBINT_MAX_AM -ge 11; then + AC_MSG_ERROR([Value for --with-libint-max-am too high ($withval). Are you sure you know what you are doing?]) +fi +) + +LIBINT_OPT_AM=$((($LIBINT_MAX_AM/2)+1)) +AC_ARG_WITH(libint-opt-am, +[ --with-libint-opt-am Gives the level of optimization for ERIs this library will use (opt-am <= max-am).], +if test $withval -le $LIBINT_MAX_AM; then + LIBINT_OPT_AM=$withval +fi +) + +if test $LIBINT_MAX_AM -gt 3; then + LIBDERIV_MAX_AM1=3 +else + LIBDERIV_MAX_AM1=$(($LIBINT_MAX_AM-1)) +fi +AC_ARG_WITH(libderiv-max-am1, +[ --with-libderiv-max-am1 Gives the maximum angular momentum of 1st derivative ERI this library will be able to handle.], +if test $withval -le 0 -o $withval -ge $LIBINT_MAX_AM; then + AC_MSG_ERROR([Invalid value for --with-libderiv-max-am1 ($withval)]) +else + LIBDERIV_MAX_AM1=$withval +fi +) + +if test $LIBDERIV_MAX_AM1 -gt 1; then + LIBDERIV_MAX_AM2=$(($LIBDERIV_MAX_AM1-1)) +else + if test $(($LIBINT_MAX_AM-$LIBDERIV_MAX_AM1)) -gt 1; then + LIBDERIV_MAX_AM2=$LIBDERIV_MAX_AM1 + else + AC_MSG_ERROR([Value of --with-libint-max-am is too low ($LIBINT_MAX_AM) to include second-derivative integrals support.]) + fi +fi +AC_ARG_WITH(libderiv-max-am2, +[ --with-libderiv-max-am2 Gives the maximum angular momentum of 2nd derivative ERI this library will be able to handle.], +if test $withval -le 0 -o $withval -ge $LIBDERIV_MAX_AM1; then + AC_MSG_ERROR([Invalid value for --with-libderiv-max-am2 ($withval)]) +else + LIBDERIV_MAX_AM2=$withval +fi +) + +LIBR12_MAX_AM=$(($LIBINT_MAX_AM-1)) +AC_ARG_WITH(libr12-max-am, +[ --with-libr12-max-am Gives the maximum angular momentum of linear R12 method integrals this library will be able to handle.], +if test $withval -le 0 -o $withval -ge $LIBINT_MAX_AM; then + AC_MSG_ERROR([Invalid value for --with-libr12-max-am ($withval)]) +else + LIBR12_MAX_AM=$withval +fi +) + +LIBR12_OPT_AM=$((($LIBR12_MAX_AM/2)+1)) +AC_ARG_WITH(libr12-opt-am, +[ --with-libr12-opt-am Gives the level of optimization for linear R12 method integrals this library will use (opt-am <= max-am).], +if test $withval -le $LIBR12_MAX_AM; then + LIBR12_OPT_AM=$withval +fi +) + +MAX_CLASS_SIZE=300 +AC_ARG_WITH(max-class-size, +[ --with-max-class-size Restricts the length of VRR build routines to avoid compiler failures.], +if test $withval -le 10; then + AC_MSG_ERROR([Invalid value for --with-class-size ($withval)]) +else + MAX_CLASS_SIZE=$withval +fi +) + +AC_ARG_ENABLE(long-double, +[ --enable-long-double Compute all integrals using long double precision.], +[ +case $enableval in + yes) + LONG_DOUBLE=1 + ;; + no) + LONG_DOUBLE=0 + ;; + *) + AC_MSG_ERROR([Invalid value for --enable-long-double ($enableval)]) + ;; +esac +],[ + LONG_DOUBLE=0 +] +) + +AC_SUBST(LIBINT_MAX_AM) +AC_SUBST(LIBINT_OPT_AM) +AC_SUBST(LIBDERIV_MAX_AM1) +AC_SUBST(LIBDERIV_MAX_AM2) +AC_SUBST(LIBR12_MAX_AM) +AC_SUBST(LIBR12_OPT_AM) +AC_SUBST(MAX_CLASS_SIZE) +AC_SUBST(LONG_DOUBLE) + +AC_DEFINE_UNQUOTED(LIBINT_MAX_AM,$LIBINT_MAX_AM) +AC_DEFINE_UNQUOTED(LIBINT_OPT_AM,$LIBINT_OPT_AM) +AC_DEFINE_UNQUOTED(LIBDERIV_MAX_AM1,$LIBDERIV_MAX_AM1) +AC_DEFINE_UNQUOTED(LIBDERIV_MAX_AM2,$LIBDERIV_MAX_AM2) +AC_DEFINE_UNQUOTED(LIBDERIV_MAX_AM12,$LIBDERIV_MAX_AM2) +AC_DEFINE_UNQUOTED(LIBR12_MAX_AM,$LIBR12_MAX_AM) +AC_DEFINE_UNQUOTED(LIBR12_OPT_AM,$LIBR12_OPT_AM) +AC_DEFINE_UNQUOTED(LIBINT_MAX_CLASS_SIZE,$MAX_CLASS_SIZE) +AC_DEFINE_UNQUOTED(LIBR12_MAX_CLASS_SIZE,$MAX_CLASS_SIZE) +AC_DEFINE_UNQUOTED(LONG_DOUBLE,$LONG_DOUBLE) + +BUILDID="libint_buildid" +AC_ARG_WITH(build-id, +[ --with-build-id Gives an identifier for the build.], +BUILDID=$withval +) +AC_SUBST(BUILDID) +AC_DEFINE_UNQUOTED(LIBINT_BUILDID,"$BUILDID") + +if test "$BUILDID"; then + LIBINT_VERSION="$LIBINT_MMM_VERSION-$BUILDID" +else + LIBINT_VERSION="$LIBINT_MMM_VERSION" +fi + +AC_DEFINE_UNQUOTED(LIBINT_VERSION, "$LIBINT_VERSION") +AC_SUBST(LIBINT_VERSION) + +ac_default_prefix="/usr/local/libint/$LIBINT_VERSION" + +AC_ARG_WITH(cc, +[ --with-cc Gives the name of the C compiler to use.], +CC=$withval +) + +AC_ARG_WITH(cxx, +[ --with-cxx Gives the name of the C++ compiler to use.], +CXX=$withval +) + +COPTIONS_OPT= +AC_ARG_WITH(cc-optflags, +[ --with-cc-optflags Gives optimization flags for the C compiler.], +COPTIONS_OPT=$withval +) + +CXXOPTIONS_OPT= +AC_ARG_WITH(cxx-optflags, +[ --with-cxx-optflags Gives optimization flags for the C++ compiler.], +CXXOPTIONS_OPT=$withval +) + +AC_ARG_WITH(ranlib, +[ --with-ranlib Gives the name of the ranlib program.], +RANLIB=$withval +) + +AC_ARG_WITH(ar, +[ --with-ar Names the archive creator.], +AR=$withval +) + +ARFLAGS=r +AC_ARG_WITH(ar-flags, +[ --with-ar-flags Flags for the the archive creator.], +ARFLAGS=$withval +) +AC_SUBST(ARFLAGS) + +AC_ARG_WITH(ld, +[ --with-ld Names the object linker.], +LD=$withval +) + +if test $prefix = $ac_default_prefix -o $prefix = NONE; then + libintincludedir=$includedir +else + libintincludedir=$includedir/$SC_VERSION +fi +AC_ARG_WITH(libint-includedir, +[ --with-libint-includedir Specifies include file install subdir.], +libintincludedir=$withval +) +AC_SUBST(libintincludedir) + +AC_ARG_WITH(incdirs, +[ --with-incdirs Specifies include directories (-Idir1 -Idir2).], +EXTRAINCDIRS=$withval +CPPFLAGS=$withval +echo Using extra include directories: $withval +) + +AC_ARG_WITH(libs, +[ --with-libs Specifies libraries (-llib1 -llib2).], +LIBS=$withval +echo Using extra libraries: $withval +) + +LDFLAGS= +LIBDIRS= +AC_ARG_WITH(libdirs, +[ --with-libdirs Specifies library directories (-Ldir1 -Ldir2).], +LIBDIRS=$withval +LDFLAGS=$withval +echo Using extra library directories: $withval +) + +SCRATCHDIR=tmp +AC_ARG_WITH(scratchdir, +[ --with-scratchdir Specifies the location for the machine-generated library source and object files.], +SCRATCHDIR=$withval +) +AC_SUBST(SCRATCHDIR) + +dnl --------- Want absolute path for srcdir, not relative. --------- + +if test X$ac_srcdir_defaulted = Xyes; then + case $srcdir in + ..*) + srcdir=`(cd $srcdir; pwd)` + #srcdir=`(cd $srcdir; echo $PWD)` + ;; + esac +fi + +dnl --------- Checks for programs. --------- +AC_PROG_LN_S +AC_PROG_INSTALL +AC_PROG_RANLIB +AC_PROG_CC +dnl ac_prog_cxx's order isn't what i need +AC_CHECK_PROGS(CXX, g++ c++ gcc CC cxx xlC_r, gcc) +dnl sees if CXX is a GNU compiler +AC_PROG_CXX +AC_PROG_CPP +AC_PROG_CXXCPP +AC_CHECK_PROG(AR,ar,ar) +AC_CHECK_PROG(PERL,perl,perl) +AC_PATH_PROG(PDFLATEX,pdflatex,,$PATH:/usr/local/bin) +AC_PATH_PROG(PSLATEX,pslatex,,$PATH:/usr/local/bin) +AC_PATH_PROG(BIBTEX,bibtex,,$PATH:/usr/local/bin) + +dnl The lack of certain tools is a show stopper + +changequote(<<, >>)dnl + +if [ X$PERL = X ]; then + echo "Could not find the program perl. It can be obtained at" + echo "ftp://prep.ai.mit.edu/pub/gnu" + exit 1 +fi + +changequote([, ])dnl + +dnl -------- Checks for compiler/linker options. ---------- + +# options needed only for optimization +if test "X$COPTIONS_OPT" = X; then + COPTIONS_OPT=-O +fi +# options needed only for debugging +COPTIONS_DBG=-g +# options that are always needed +COPTIONS_MISC= + +# options needed only for optimization +if test "X$CXXOPTIONS_OPT" = X; then + CXXOPTIONS_OPT=-O +fi +# options needed only for debugging +CXXOPTIONS_DBG=-g +# options that are always needed +CXXOPTIONS_MISC= + +OBJSUF=o +LIBSUF=a + +dnl -- check how dependency information is built -- + +# The GNU compilers work with: +CCDEPENDSUF=none +CXXDEPENDSUF=none +CCDEPENDFLAGS=-M +CXXDEPENDFLAGS=-M + +/bin/rm -f depcheck.u depcheck.c depcheck.o + +# Check for an IBM visual age C compiler +echo "#include " > depcheck.c +$CC $CPPFLAGS $CFLAGS -M depcheck.c > /dev/null 2>&1 +if test -f depcheck.u; then + CCDEPENDSUF=u +fi +/bin/rm -f depcheck.u depcheck.c depcheck.o + +# Check for an IBM visual age C++ compiler +echo "#include " > depcheck.cc +$CXX $CPPFLAGS $CXXFLAGS -M -E depcheck.cc > /dev/null 2>&1 +if test -f depcheck.u; then + CXXDEPENDSUF=u + CXXDEPENDFLAGS="-M -E" +fi +/bin/rm -f depcheck.u depcheck.c depcheck.o + +dnl -- special optimization options -- + +AC_MSG_CHECKING([for additional optimization options]) +case $target in + rs6000-ibm-aix3.2.* | rs6000-ibm-aix4.* | powerpc-ibm-aix4.* | powerpc-ibm-aix5.*) + if test X$GCC != Xyes; then + COPTIONS_OPT="$COPTIONS_OPT -qnolm" + fi + if test X$GXX != Xyes; then + CXXOPTIONS_OPT="$CXXOPTIONS_OPT -qnolm -qrtti" + fi + AC_MSG_RESULT([rs6000 or powerpc]) + ;; + *) + AC_MSG_RESULT([none]) + ;; +esac + +dnl -- special architecture options -- + +if test "X$COPTIONS_OPT" = X; then + AC_MSG_WARN([C optimization options are not given! For optimum performance use --with-cc-optflags configure option]) +fi +if test "X$CXXOPTIONS_OPT" = X; then + AC_MSG_WARN([C++ optimization options are not given! For optimum performance use --with-cxx-optflags configure option]) +fi + +dnl ----------- check for GNU libc++-v3 prerelease bug --------------- + +if test X$GXX = Xyes; then +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +AC_MSG_CHECKING([for GNU libc++-v3 prerelease bug]) +AC_TRY_LINK([ +#include +#include <$iostream> +],[ +],[ +AC_MSG_RESULT([no]) +], +EXTRADEFINES="$EXTRADEFINES -D_ISOC99_SOURCE=1" +AC_MSG_RESULT([yes]) +); +AC_LANG_RESTORE +fi + +dnl -- other options -- + +AC_MSG_CHECKING([GNU c++ library/template flags]) +if test X$GXX = Xyes; then + # automatic template instantiation causes problems with libstc++-v3 + #CXXOPTIONS_MISC="$CXXOPTIONS_MISC -fno-implicit-templates" + #EXPLICIT_TEMPLATE_INSTANTIATION=yes + #AC_DEFINE(EXPLICIT_TEMPLATE_INSTANTIATION) + AC_MSG_RESULT([GNU]) +else + case $target in + *) + AC_MSG_RESULT([generic non GNU]) + ;; + esac +fi + +if test $DEBUG = yes; then + CFLAGS="$COPTIONS_DBG $COPTIONS_MISC" + CXXFLAGS="$CXXOPTIONS_DBG $CXXOPTIONS_MISC" + LDFLAGS="$LDFLAGS -g" +elif test $DEBUG = opt; then + CFLAGS="$COPTIONS_DBG $COPTIONS_OPT $COPTIONS_MISC" + CXXFLAGS="$CXXOPTIONS_DBG $COPTIONS_OPT $CXXOPTIONS_MISC" + LDFLAGS="$LDFLAGS -g" +else + CFLAGS="$COPTIONS_OPT $COPTIONS_MISC" + CXXFLAGS="$CXXOPTIONS_OPT $CXXOPTIONS_MISC" +fi + +AC_SUBST(EXTRAINCLUDE) + +AC_SUBST(CFLAGS) +AC_SUBST(CXXFLAGS) + +AC_SUBST(LIBDIRS) + +AC_SUBST(OBJSUF) +AC_SUBST(LIBSUF) +AC_SUBST(CCDEPENDSUF) +AC_SUBST(CXXDEPENDSUF) +AC_SUBST(CCDEPENDFLAGS) +AC_SUBST(CXXDEPENDFLAGS) + +dnl -------- Checks for architecture specific features. -------- +dnl (Doesn't work for cross compilation.) +dnl AC_CHECK_SIZEOF(void*) + +AC_SUBST(EXTRADEFINES) + +dnl ---------- Checks for header files. ----------- + +AC_HEADER_STDC + +dnl -- Checks for typedefs, structures, and compiler characteristics. -- +AC_C_CONST +AC_TYPE_SIZE_T + +CC="$CC" CFLAGS="$CXXFLAGS" CPPFLAGS="$CPPFLAGS" \ +LD="$LD" LDFLAGS="$LDFLAGS" LIBS="-lm $LIBS $FLIBS" \ +LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" \ + +dnl --------- Shared library configuration. --------- + +enablelibtool=yes +AC_ARG_ENABLE(libtool, +[ --disable-libtool Do not use libtool.], +[ +case $enableval in + yes) + ;; + no) + enablelibtool=no + ;; + *) + AC_MSG_ERROR([Invalid value for --(dis|en)able-libtool ($enableval)]) + ;; +esac +]) + +if test "$enablelibtool" = yes; then + +dnl by default make only static libraries +AC_DISABLE_SHARED +AC_PROG_LIBTOOL + +OBJSUF=lo +LIBSUF=la + +else + +enable_shared=no + +fi + +if test "$enable_shared" = "no"; then + OBJSUF=o + LIBSUF=a +fi + +ENABLESHARED=$enable_shared +AC_SUBST(ENABLESHARED) + +dnl make Makefiles in object tree +$PERL $srcdir/bin/objectdir.pl $EXCLUDED_DIRS $srcdir + +AC_OUTPUT(src/bin/MakeVars src/bin/MakeRules src/lib/MakeVars src/lib/MakeRules + doc/MakeVars doc/MakeRules) diff --git a/doc/MakeRules.in b/doc/MakeRules.in new file mode 100644 index 0000000..bea010e --- /dev/null +++ b/doc/MakeRules.in @@ -0,0 +1,19 @@ + +HAVE_MAKERULES = yes + +default: $(TARGET) + +install:: install_target + +install_target:: $(TARGET) + $(INSTALL) $(INSTALLDIROPT) $(docdir) + $(LTINST) $(INSTALL) $(INSTALLDOCOPT) $< $(docdir) + +clean: $(SRCDIR)/Makefile + -rm -f $(TEXGARBAGE) + +distclean:: clean + +targetclean:: clean + +realclean:: clean diff --git a/doc/MakeVars.in b/doc/MakeVars.in new file mode 100644 index 0000000..1af8a10 --- /dev/null +++ b/doc/MakeVars.in @@ -0,0 +1,52 @@ +# Emacs should use -*- Makefile -*- mode. + +# this is usually overridden +TARGET_TO_MAKE = $(shell basename `pwd`) + +ifndef SRCDIR + SRCDIR = . +endif +SRCTOPDIR = $(SRCDIR)/$(TOPDIR) + +host = @host@ +host_cpu = @host_cpu@ +host_vendor = @host_vendor@ +host_os = @host_os@ + +target = @target@ +target_cpu = @target_cpu@ +target_vendor = @target_vendor@ +target_os = @target_os@ + +LIBINT_VERSION = @LIBINT_VERSION@ +LIBINT_SO_VERSION = @LIBINT_SO_VERSION@ +BUILDID = @BUILDID@ + +PDFLATEX = @PDFLATEX@ +PSLATEX = @PSLATEX@ +BIBTEX = @BIBTEX@ +# The document suffix (pdf or ps) +# Preferentially make pdf manuals, only revert to ps if necessary +ifdef BIBTEX +ifdef PSLATEX +DOCSUF = ps +LATEX = $(PSLATEX) +endif +ifdef PDFLATEX +DOCSUF = pdf +LATEX = $(PDFLATEX) +endif +endif +TEXINPUTS = :$(SRCDIR):$(SRCDIR)/..: +BIBINPUTS = $(TEXINPUTS) +TEXGARBAGE = *.bbl *.blg *.aux *.log *.ps *.pdf + +INSTALL = @INSTALL@ +INSTALLDIROPT = -d -m 0755 +INSTALLDOCOPT = -m 0644 + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +docdir=$(prefix)/doc +includedir=@libintincludedir@ + diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 0000000..10a0b3a --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,56 @@ +TOPDIR=.. +ifndef SRCDIR + SRCDIR=$(shell pwd) +endif + +-include $(TOPDIR)/Makedirlist + +SUBDIRS = progman + +default:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(JOBS)) || exit 1; \ + done + +ifndef DODEPEND +DODEPENDOPT = "DODEPEND=no" +endif + +install:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) install) || exit 1; \ + done + +install_target:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) install_target) || exit 1; \ + done + +clean:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) clean) || exit 1; \ + done + +distclean:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) distclean) || exit 1; \ + done + -rm -f MakeRules MakeSuffixRules MakeVars + +targetclean:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) targetclean) || exit 1; \ + done + +realclean:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) realclean) || exit 1; \ + done + diff --git a/doc/progman/Makefile b/doc/progman/Makefile new file mode 100644 index 0000000..5c9ff21 --- /dev/null +++ b/doc/progman/Makefile @@ -0,0 +1,12 @@ +TOPDIR=../.. +ifndef SRCDIR + SRCDIR=$(shell pwd) +endif +TOPOBJDIR = $(shell ls -d `pwd`/$(TOPDIR)) + +TARGET = progman.$(DOCSUF) + +-include $(TOPDIR)/doc/MakeVars +-include $(TOPDIR)/doc/MakeRules +-include $(TOPDIR)/doc/MakeSuffixRules +include $(SRCDIR)/$(TOPDIR)/lib/MakeRules diff --git a/doc/progman/macros.tex b/doc/progman/macros.tex new file mode 100644 index 0000000..c0bd251 --- /dev/null +++ b/doc/progman/macros.tex @@ -0,0 +1,24 @@ + +\newcommand{\LIBINT}{{\tt LIBINT}} +\newcommand{\LIBINTv}{{\tt LIBINT} Version 1.1} + +\newcommand{\libint}{{\tt libint}} +\newcommand{\libderiv}{{\tt libderiv}} +\newcommand{\librij}{{\tt libr12}} + +\newcommand{\libinth}{{\tt libint.h}} +\newcommand{\libderivh}{{\tt libderiv.h}} +\newcommand{\librijh}{{\tt libr12.h}} + +\newcommand{\libinta}{{\tt libint.a}} +\newcommand{\libderiva}{{\tt libderiv.a}} +\newcommand{\librija}{{\tt libr12.a}} + +\newcommand{\n}{{\bf n}} +\newcommand{\A}{{\bf A}} +\newcommand{\B}{{\bf B}} +\newcommand{\C}{{\bf C}} +\newcommand{\D}{{\bf D}} + +\def\bmath#1{\mbox{\boldmath$#1$}} + diff --git a/doc/progman/progman.tex b/doc/progman/progman.tex new file mode 100644 index 0000000..4469164 --- /dev/null +++ b/doc/progman/progman.tex @@ -0,0 +1,646 @@ +% +% The LIBINT Programmer's Manual +% + +\documentclass[12pt]{article} +\usepackage{amsmath} +\setlength{\textheight}{9in} +\setlength{\textwidth}{6.5in} +\setlength{\hoffset}{0in} +\setlength{\voffset}{0in} +\setlength{\headheight}{0in} +\setlength{\headsep}{0in} +\setlength{\topmargin}{0in} +\setlength{\oddsidemargin}{-0.05in} +\setlength{\evensidemargin}{-0.05in} +\setlength{\marginparsep}{0in} +\setlength{\marginparwidth}{0in} +\setlength{\parsep}{0.8ex} +\setlength{\parskip}{1ex plus \fill} +\baselineskip 18pt +\renewcommand{\topfraction}{.8} +\renewcommand{\bottomfraction}{.2} + +\begin{document} +\include{macros} + +\begin{center} +\ \\ +\vspace{2.0in} +{\bf {\Large The \LIBINT\ Programmer's Manual}} \\ +\vspace{0.5in} +\LIBINTv \\ +\vspace{0.5in} +Edward F.\ Valeev \\ +\ \\ +{\em Center for Computational Molecular Science and Technology, \mbox{Georgia +Institute of Technology,} Atlanta, Georgia 30332-0400} +\ \\ +\vspace{0.3in} +Created on: \today +\end{center} + +\thispagestyle{empty} + +\newpage +\section{Introduction} +\LIBINT\ is a collection of functions to compute two-body integrals over Gaussian +functions which appear in electronic and molecular structure theories. +\LIBINTv \cite{Libint1}\ has three components which compute different types of integrals: + +\begin{itemize} + +\item \libint\ computes the Coulomb integrals, which in electronic structure theory +are called electron repulsion integrals (ERIs). This is by far the most common type of +integrals in molecular structure theory. + +\item \libderiv\ computes first and second derivatives of ERIs with respect to the +coordinates of the basis function origin. This type of integrals are also very common +in the electronic structure theory, where they appear in analytic gradient expressions. + +\item \librij\ computes types integrals that appear in Kutzelnigg's linear R12 theories +for electronic structure.\cite{Kutzelnigg85,Kutzelnigg91} All linear R12 methods, such as +MP2-R12, contain terms in the wave function that are linear in the interelectronic distances +$r_{ij}$ (hence the name). Appearance of several types of {\em two}-body integrals +is due to the use of the approximate resolution of the identity to reduce three- and four-body +integrals to products of simpler integrals. + +\end{itemize} + +The components come as separate library archives, named \libinta , \libderiva , and \librija , +with header files named \libinth , \libderivh , and \librijh , respectively. +Note that both \libderiv\ and \librij\ depend on functions in \libint. In that sense \libint\ is +the central component of \LIBINT, thus we will \libint\ most often as an example in this manual. + +\LIBINT\ uses recursive schemes that originate in seminal Obara-Saika method\cite{Obara86} and Head-Gordon and Pople's +variation thereof.\cite{Head-Gordon88} +The idea of \LIBINT\ is to optimize {\em computer implementation} of such methods by implementing +an optimizing compiler to generate automatically highly-specialized code that runs well on +superscalar architectures. The advantages of the optimizing compiler approach are: +\begin{itemize} +\item it allows to achieve high-performance +for the {\em one-quartet-at-a-time} method of computing integrals. +Thus \LIBINT\ avoids vectorization as an approach to achieving high efficiency, +since vectorization increases memory footprint and complicates programming. If the use of vector +machines increases again, \LIBINT\ will be vectorized, however currently there are no firm plans +to do that. +\item new recurrence relations are rather easy to implement in efficient code. +\librij\ is a good example of that. +\end{itemize} + +For more details on priciples of \LIBINT\ you should consult Justin Fermann's thesis.\cite{Fermann96:PhD} + +\section{Notation} + +Following Obara and Saika,\cite{Obara86} +we write an {\em unnormalized primitive Cartesian} Gaussian function centered at {\bf A}\ as +\begin{eqnarray} +\phi ({\bf r}; \zeta, \n, {\bf A}) & = & (x - A_x)^{n_x} (y - A_y)^{n_y} (z - A_z)^{n_z} \nonumber \\ +& & \times \exp [-\zeta({\bf r}-{\bf A})^2]\ , +\end{eqnarray} +where {\bf r}\ is the coordinate vector of the electron, $\zeta$ is the orbital exponent, and +\n\ is a set of non-negative integers. The sum of $n_x$, $n_y$, and $n_z$ will be denoted $\lambda(\n)$ +and be referred to as the angular momentum or orbital quantum number of the Gaussian function. +Hereafter \n\ will be termed the angular momentum index. +Henceforth, $n_i$ will refer to the $i$-th component of \n, where $i \in \{x, y, z\}$. +Basic vector addition rules will apply to these vector-like triads of numbers, e.g. +$\n + {\bf 1}_x \equiv \{ n_x+1, n_y, n_z\}$. + +A set of $(\lambda(\n) + 1)(\lambda(\n) + 2)/2$ functions with the same $\lambda(\n)$, $\zeta$, and centered +at the common center +but with different \n\ form a {\em Cartesian shell}, +or just a {\em shell}. For example, an $s$ shell ($\lambda=0$) has one function, a $p$ shell ($\lambda=1$) -- +3 functions, etc. +The order of functions in shells that \LIBINT\ uses is as follows: +\begin{eqnarray} +p & : & p_x, p_y, p_z \nonumber \\ +d & : & d_{xx}, d_{xy}, d_{xz}, d_{yy}, d_{yz}, d_{zz} \nonumber \\ +f & : & f_{xxx}, f_{xxy}, f_{xxz}, f_{xyy}, f_{xyz}, f_{xzz}, f_{yyy}, f_{yyz}, f_{yzz}, f_{zzz} \nonumber \\ +{\rm etc.} \nonumber +\end{eqnarray} +In general, the following loop structure can be used to generate angular momentum indices in the canonical \LIBINT\ order for all +members of a shell of angular momentum {\tt am}: +\begin{verbatim} +for(int i=0; i<=am; i++) { + int nx = am - i; /* exponent of x */ + for(int j=0; j<=i; j++) { + int ny = i-j; /* exponent of y */ + int nz = j; /* exponent of z */ + } +} +\end{verbatim} + +The normalization constant for a primitive Gaussian $\phi ({\bf r}; \zeta, \n, {\bf A})$ +\begin{eqnarray} +N(\zeta,\n) & = & \left[ \left(\frac{2}{\pi}\right)^{3/4}\frac{2^{(\lambda(\n))}\zeta^{(2\lambda(\n)+3)/4}} + {[(2n_x-1)!!(2n_y-1)!!(2n_z-1)!!]^{1/2}} \right] +\end{eqnarray} + +A contracted Gaussian function is just a linear combination of primitive Gaussians (also termed {\em primitives}) +centered at the same center {\bf A} and with the same momentum indices {\bf n} +but with different exponents $\zeta_i$: +\begin{eqnarray} +\phi ({\bf r}; \bmath{\zeta}, {\bf C}, \n, {\bf A}) & = & (x - A_x)^{n_x} (y - A_y)^{n_y} (z - A_z)^{n_z} \nonumber \\ +& & \times \sum_{i=1}^M C_i \exp [-\zeta_i ({\bf r}-{\bf A})^2]\ , +\end{eqnarray} +Contracted Gaussians form shells the same way as primitives. +The contraction coefficients {\bf C} already include normalization constants so that the resulting combination +is properly normalized. Published contraction coefficients {\bf c} are linear coefficients for normalized primitives, +hence the normalization-including contraction coefficients {\bf C} have to be computed from them as +\begin{eqnarray} \label{eq:C1} +C_i & = & c_i N(\zeta_i,\n) +\end{eqnarray} +and scaled further so that the self-overlap of the contracted function is 1: +\begin{eqnarray} \label{eq:C2} +\frac{\pi^{3/2} (2n_x-1)!!(2n_y-1)!!(2n_z-1)!!}{2^{\lambda(\n)}} +\sum_{i=1}^M \sum_{j=1}^M \frac{C_i C_j }{(\zeta_i+\zeta_j)^{\lambda(\n)+3/2}} & = & 1 +\end{eqnarray} + +If sets of orbital exponents are used to form contracted Gaussians of one angular momentum only +then this is called a {\em segmented} contraction scheme. If there is a set of exponents that forms +contracted Gaussians of several angular momenta then such scheme is called {\em general} contraction. +Examples of basis sets that include general contractions include Atomic Natural Orbitals (ANO) sets. +\LIBINT\ was not designed to handle general contractions very well. You should use either split general contractions +into segments for each angular momentum (it's done for correlation consistent basis sets) +or use basis sets with segmented contractions only. + +An integral of a two-electron operator $\hat{O}({\bf r}_1, {\bf r}_2)$ over unnormalized +primitive Cartesian Gaussians is written as +\begin{eqnarray} +\int \phi({\bf r}_1; \zeta_a, {\bf a}, {\bf A}) \phi ({\bf r}_2; \zeta_c, {\bf c}, \C) \hat{O}({\bf r}_1, {\bf r}_2) +\phi({\bf r}_1; \zeta_b, {\bf b}, \B) \phi({\bf r}_2; \zeta_d, {\bf d}, \D) d{\bf r}_1 d{\bf r}_2 \equiv ({\bf ab} |\hat{O}|{\bf cd}) +\end{eqnarray} +A set of integrals $\{ ({\bf a} {\bf b}|\hat{O}({\bf r}_1, {\bf r}_2)|{\bf c} {\bf d}) \}$ +over all possible combinations of functions ${\bf a} \in {\rm Shell A}$, ${\bf b} \in {\rm Shell B}$, etc. +is termed a {\em shell}, or {\em quartet}, or {\em class} of integrals. For example, a $(ps|sd)$ class consists of +$3 \times 1 \times 1 \times 6 = 18$ integrals. + +The following definitions have been used throughout this work: +\begin{eqnarray} +\zeta & = & \zeta_a + \zeta_b \\ +\eta & = & \zeta_c + \zeta_d \\ +\rho & = & \frac{\zeta\eta}{\zeta+\eta} \\ +{\bf P}& = & \frac{\zeta_a {\bf A} + \zeta_b \B}{\zeta} \\ +{\bf Q}& = & \frac{\zeta_c \C + \zeta_d \D}{\eta} \\ +{\bf W}& = & \frac{\zeta {\bf P} + \eta {\bf Q}}{\zeta+\eta} +\end{eqnarray} +{\em Incomplete gamma} function is defined as +\begin{eqnarray} +F_m(T) & = & \int_0^{1} dt\ t^{2m}\ \exp (-Tt^2) +\end{eqnarray} + +Evaluation of integrals over functions of non-zero angular momentum starts with the +{\em auxiliary} integrals over primitive $s$-functions +defined as +\begin{eqnarray} +({\bf 00}|{\bf 00})^{(m)} & = & 2 F_m(\rho |{\bf PQ}|^2) \sqrt{\frac{\rho}{\pi}}S_{12}S_{34} +\end{eqnarray} +where ${\bf PQ} = {\bf P} - {\bf Q}$ and primitive overlaps $S_{12}$ and $S_{34}$ +are computed as +\begin{eqnarray} +S_{12} & = & \Bigl( \frac{\pi}{\zeta} \Bigr)^{3/2} +\exp \Bigl(-\frac{\zeta_a\zeta_b}{\zeta} |{\bf AB}|^2 \Bigr) \\ +S_{34} & = & \Bigl( \frac{\pi}{\eta} \Bigr)^{3/2} +\exp \Bigl(-\frac{\zeta_c\zeta_d}{\eta} |{\bf CD}|^2 \Bigr) +\end{eqnarray} +In the evaluation of integrals over contracted functions it is convenient to +use auxiliary integrals over primitives which include contraction and normalization factors of the +target quartet $({\bf ab}|{\bf cd})$: +\begin{eqnarray} \label{eq:0000m} +({\bf 00}|{\bf 00})^{(m)} & = & 2 F_m(\rho |{\bf PQ}|^2) \sqrt{\frac{\rho}{\pi}}S_{12}S_{34} +C_1 C_2 C_3 C_4 +\end{eqnarray} +where the coefficients $C_a$, $C_b$, $C_c$, and $C_d$ are +normalization-including contraction coefficients (Eqs. (\ref{eq:C1}) +and (\ref{eq:C2})) for the first basis function out of each respective shell +in the target quartet. + +\section{Overview of \LIBINT 's API} + +Prototypes for externaly accessible functions of \LIBINT's components are contained +in header files \libinth\, \libderivh\, and \librijh . Although \LIBINT's +machine generated source is written in C++, functions and data structures of +the external interface are linked according to C convention, which simplifies +its use in C and FORTRAN programs. + +So let's look at header file \libinth. Inside the standard header wrappers, +library static parameters are {\tt define}d: +\begin{verbatim} +#define REALTYPE double +#define LIBINT_MAX_AM 8 +#define LIBINT_OPT_AM 5 +\end{verbatim} +These parameters depend on how library was configured before compilation (see compilation manual). +The first macro is the basic datatype for real numbers that \LIBINT\ uses +to compute integrals. It can be {\tt double} or {\tt long double}. With some compilers, e.g. +IBM Visual Age C++, the latter datatype allows higher precision calculations. +Macro {\tt LIBINT\_MAX\_AM} specifies the +maximum angular momentum + 1 of basis functions for which +electron repulsion integrals can be computed. Hence in this example up to $k$ functions ($L_{\rm max}=7$) +can be handled. + +Before any component of \LIBINT\ can be used some static data has to be initialized +via a corresponding function call. That function for \libint\ is +\begin{verbatim} +void init_libint_base(); +\end{verbatim} +After {\tt init\_libint\_base()} has been called one has to initialize one or several corresponding +integrals evaluator objects. Objects are ``constructed' and ``destructed'' by calling +the following functions +\begin{verbatim} +int init_libint(Libint_t *, int max_am, int max_num_prim_comb); +void free_libint(Libint_t *); +\end{verbatim} +The first argument to either function is the pointer to the object. +Second and third arguments to {\tt init\_libint()} are the maximum angular momentum +of the basis functions to be handled by this object and the maximum number of +combinations of primitives per shell quartet that this object will handle. +The latter quantity can be safely computed as a fourth power of the maximum +number of primitives per shell in the basis set. {\tt init\_libint()} returns the +number of {\tt REALTYPE}-sized words of memory that was allocated for the object. +The amount of memory depends heavily on {\tt max\_am} and somewhat on +{\tt max\_num\_prim\_comb}. Memory tracking is not done by \LIBINT\ internally and +is left to the user's code. In order to compute how much memory an evaluator object +will require one can call the following function: +\begin{verbatim} +int libint_storage_required(int max_am, int max_num_prim_comb); +\end{verbatim} +The return value is the number of {\tt REALTYPE}-sized words of memory that +a {\tt Libint\_t} object will require for the given values of {\tt max\_am} +and {\tt max\_num\_prim\_comb}. + +Note that integrals evaluator objects themselves are completely thread-safe and can be used +in multiple thread environments. However, {\tt init\_libint\_base()} is not reentrant, hence proper +locking must be ensured. +However, it needs to be called only once in the process, +after that all threads can use \libint . + +After a {\tt Libint\_t} object has been initialized, +we are ready to compute ERIs. In order to do that user must provide +shell quartet data to the evaluator object and call an appropriate method +to compute the integrals. +\LIBINT 's philosophy is to provide the leanest possible code. Thus it does not provide any functionality +related to computing recurrence relation prerequisites, such as geometric quantities and incomplete gamma +function values defined in the previous section. It is fully user's responsibility to compute the necessary +data and feed it to the evaluator object. +So let's look at the definition of {\tt Libint\_t}: +\begin{verbatim} +typedef struct { + REALTYPE *int_stack; + prim_data *PrimQuartet; + REALTYPE AB[3]; + REALTYPE CD[3]; + REALTYPE *vrr_classes[15][15]; + REALTYPE *vrr_stack; + } Libint_t; +\end{verbatim} +The most important 3 members of the type are {\tt PrimQuartet}, {\tt AB}, and +{\tt CD}. All three of these members have to be set properly before a shell quartet can be computed. +{\tt PrimQuartet} is the array of data for each combination of primitives that +contribute to this shell quartet. The datatype for {\tt PrimQuartet} is described below. +{\tt AB} and {\tt CD} store quantities {\bf AB} and {\bf CD} for this shell quartet. +The rest of the data in {\tt Libint\_t} object is not meant for external use. + +While {\tt Libint\_t.AB} and {\tt Libint\_.CD} are trivial to compute, +the primitive quartet data is more involved. Let's look at definition of {\tt prim\_data}: +\begin{verbatim} +typedef struct pdata{ + REALTYPE F[29]; + REALTYPE U[6][3]; + REALTYPE twozeta_a; + REALTYPE twozeta_b; + REALTYPE twozeta_c; + REALTYPE twozeta_d; + REALTYPE oo2z; + REALTYPE oo2n; + REALTYPE oo2zn; + REALTYPE poz; + REALTYPE pon; + REALTYPE oo2p; + REALTYPE ss_r12_ss; + } prim_data; +\end{verbatim} +Let's look at what quantities each component of {\tt prim\_data} holds: +\begin{itemize} +\item {\tt F} -- values of auxiliary primitive integrals $({\bf 00}|{\bf 00})^{(m)}$ (Eq. (\ref{eq:0000m})) +for $0 \leq m \leq \lambda({\bf a}) + \lambda({\bf b}) + \lambda({\bf c}) + \lambda({\bf d}) + C$, +where $C = 0$ when computing ERIs, $C=1$ when computing first derivative ERIs and integrals for +linear R12 methods, and $C=2$ when computing second derivative ERIs. +\item {\tt U} -- geometric quantities {\bf PA} ({\tt U[0]}), {\bf QC} ({\tt U[2]}), +{\bf WP} ({\tt U[4]}), and {\bf WQ} ({\tt U[5]}). If \libderiv\ is being used then +the following quatities are stored in {\tt U[1]} and {\tt U[3]}: {\bf PB} and {\bf QD}. +If \librij\ is being used then +the following quantities are stored in {\tt U[1]} and {\tt U[3]}: {\bf QA} and {\bf PC}. +\item {\tt twozeta\_a} -- $2 \zeta_a$ (only used by \libderiv\ and \librij) +\item {\tt twozeta\_b} -- $2 \zeta_b$ (only used by \libderiv\ and \librij) +\item {\tt twozeta\_c} -- $2 \zeta_c$ (only used by \libderiv\ and \librij) +\item {\tt twozeta\_d} -- $2 \zeta_d$ (only used by \libderiv\ and \librij) +\item {\tt oo2z} -- $\frac{1}{2\zeta}$ +\item {\tt oo2n} -- $\frac{1}{2\eta}$ +\item {\tt oo2zn} -- $\frac{1}{2(\zeta+\eta)}$ +\item {\tt poz} -- $\frac{\rho}{\zeta}$ +\item {\tt pon} -- $\frac{\rho}{\eta}$ +\item {\tt oo2p} -- $\frac{1}{2\rho}$ +\item {\tt ss\_r12\_ss} -- $({\bf 00}|r_{12}|{\bf 00}) = \frac{1}{\rho} ({\bf 00}|{\bf 00})^{(0)} + +|{\bf PQ}|^2 (({\bf 00}|{\bf 00})^{(0)} - ({\bf 00}|{\bf 00})^{(1)})$ +(only used by \librij) +\end{itemize} +Most of these quantities are simple to evaluate. Evaluation of the incomplete gamma function +{\tt prim\_data.F} is more involved. One should consult external sources for information on how +to compute it efficiently.\cite{Obara86,Gill91} + +Once the quartet data has been computed for every unique combination of primitives and put into {\tt Libint\_t.PrimQuartet}, +ERIs can be computed. Appropriate functions are accessed via a four-dimensional array of pointers +called {\tt build\_eri}: +\begin{verbatim} +extern REALTYPE *(*build_eri[8][8][8][8])(Libint_t *, int); +\end{verbatim} +where the first argument is the integrals evaluator object, the second is the number of primitive quartet +combinations that were stored in the previous step in {\tt Libint\_t.PrimQuartet}, and the array indices +refer to the angular momenta of respective shells. +For example, a function which evaluates a quartet of $(ps|ds)$ integrals is referred to as \linebreak +{\tt build\_eri[1][0][2][0](inteval1,num\_prim\_comb)}. The functions return pointer to the array that holds +target integrals. The integrals are stored in ``row major'' order.\cite{KnuthACP} For example, if +the number of functions in each shell is $n_a$, $n_b$, $n_c$, and $n_d$, respectively, +then the integral $(ab|cd)$ is found at position $abcd = ( (a n_b + b) n_c + c) n_d + d$. + +{\bf Note} that currently \LIBINT\ has a very important restriction on the angular momentum ordering of the functions +in shell quartets that it can handle. \LIBINT\ can evaluate a shell quartet +$({\bf ab}|{\bf cd})$ if $\lambda({\bf a}) \geq \lambda({\bf b})$, +$\lambda({\bf c}) \geq \lambda({\bf d})$, and $\lambda({\bf c}) + \lambda({\bf d}) \geq \lambda({\bf a}) + \lambda({\bf b})$. +If one needs to compute a quartet that doesn't conform the rule, e.g. of type $(pf|sd)$, +permutational symmetry of integrals can be utilized to compute such quartet:\footnote{Note that some +of the integrals that \librij\ computes possess different permutational symmetries than ERIs. One can still +compute all desired integrals in that case.} +\begin{eqnarray} +(pq|rs) = (pq|sr) = (qp|rs) = (qp|sr) = (rs|pq) = (rs|qp)= (sr|pq) = (sr|qp) +\end{eqnarray} +In the case of $(pf|sd)$ shell quartet, one computes quartet $(ds|fp)$ instead, and then +permutes function indices back to obtain the desired $(pf|sd)$. + +The final integrals that \LIBINT\ computes are not fully normalized yet. The reason is that the auxiliary +integrals $({\bf 00}|{\bf 00})^{(m)}$ include normalization factors of the first function of each shell. +For example, in a $(ds|fp)$ quartet computed by \LIBINT\ only integrals $(d_{xx} s|f_{xxx} p_x)$, +$(d_{yy} s|f_{xxx} p_x)$, $(d_{xx} s|f_{yyy} p_x)$, etc., +will be properly normalized. In order to compute integrals in terms of functions which are all normalized to unity +one has to multiply each integral by a ``renormalization'' prefactor: +\begin{eqnarray} +(ab|cd) & \equiv & \frac{N(\zeta_a,{\bf a}) N(\zeta_b,{\bf b}) N(\zeta_c,{\bf c}) N(\zeta_d,{\bf d})} +{N(\zeta_a, \begin{pmatrix}\lambda({\bf a}) \\ 0 \\ 0 \end{pmatrix}) N(\zeta_b, \begin{pmatrix}\lambda({\bf b}) \\ 0 \\ 0 \end{pmatrix}) +N(\zeta_c, \begin{pmatrix}\lambda({\bf c}) \\ 0 \\ 0 \end{pmatrix}) N(\zeta_d, \begin{pmatrix}\lambda({\bf d}) \\ 0 \\ 0 \end{pmatrix})} +(ab|cd) +\end{eqnarray} + +\subsection{Notes on using \libderiv} +Component \libderiv\ is used to evaluate derivatives of ERIs with respect to basis function positions. +Using \libderiv\ is mostly similar to how \libint\ is used. Here we only concentrate on significant +differences which have not been noted before or on aspects of use specific to \libderiv . + +One quartet of ERIs $({\bf ab}|{\bf cd})$ has total of 12 first derivatives +\begin{eqnarray} +& & \frac{\partial ({\bf ab}|{\bf cd})}{\partial A_i}, \frac{\partial ({\bf ab}|{\bf cd})}{\partial B_i}, +\frac{\partial ({\bf ab}|{\bf cd})}{\partial C_i}, +\frac{\partial ({\bf ab}|{\bf cd})}{\partial D_i} :\quad i \in \{x,y,z\} \nonumber +\end{eqnarray} +and $12*12=144$ second derivatives, although $12*13/2=78$ derivatives are unique because of +permutation symmetry with respect to the order of taking the derivative: +\begin{eqnarray} +& & \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_i \partial A_j}, \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial B_i \partial B_j}, +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial C_i \partial C_j}, \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial D_i \partial D_j} :\quad +i \leq j \in \{x,y,z\} \nonumber \\ +& & \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_i \partial B_j}, \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_i \partial C_j}, +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_i \partial D_j}, \nonumber \\ +& & \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial B_i \partial C_j}, \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial B_i \partial D_j}, +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial C_i \partial D_j} : \quad i,j \in \{x,y,z\} \nonumber +\end{eqnarray} +Translational invariance of ERIs can be used to eliminate any 3 of 12 first derivatives +\begin{eqnarray} \label{eqn:TId1eri} +\frac{\partial ({\bf ab}|{\bf cd})}{\partial B_i} & = & - \frac{\partial ({\bf ab}|{\bf cd})}{\partial A_i} - +\frac{\partial ({\bf ab}|{\bf cd})}{\partial C_i} - \frac{\partial ({\bf ab}|{\bf cd})}{\partial D_i} \quad i \in \{x,y,z\} +\end{eqnarray} +and +33 of 78 second derivatives +\begin{eqnarray} \label{eqn:TId2eri_AB} +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_i \partial B_j} & = & - \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_i \partial A_j} - +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_i \partial C_j} - \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_i \partial D_j} \quad i,j \in \{x,y,z\} \\ +\label{eqn:TId2eri_BB} +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial B_i \partial B_j} & = & \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_i \partial A_j} + +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_i \partial C_j} + \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_i \partial D_j} \nonumber \\ +& & \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_i \partial C_j} + +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial C_i \partial C_j} + \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial C_i \partial D_j} \nonumber \\ +& & \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_j \partial D_i} + +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial C_j \partial D_i} + \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial D_i \partial D_j} \quad i \leq j \in \{x,y,z\} \\ +\label{eqn:TId2eri_BC} +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial B_i \partial C_j} & = & - \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_i \partial C_j} - +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial C_i \partial C_j} - \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial C_j \partial D_i} \quad i,j \in \{x,y,z\} \\ +\label{eqn:TId2eri_BD} +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial B_i \partial D_j} & = & - \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_i \partial D_j} - +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial C_i \partial D_j} - \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial D_i \partial D_j} \quad i,j \in \{x,y,z\} \\ +\end{eqnarray} + +While \libint\ computes one target quartet at a time, \libderiv\ evaluates all +of its possible unique derivatives. There are 2 types of ``compute'' functions in \libderiv\ (see \libderivh): +\begin{verbatim} +extern void (*build_deriv1_eri[5][5][5][5])(Libderiv_t *, int); +extern void (*build_deriv12_eri[4][4][4][4])(Libderiv_t *, int); +\end{verbatim} +The former refers to functions which compute only first derivative ERIs, and the second +refers to functions which compute both first and second derivative ERIs. +The dimensions of each array are determined by the following 2 configure-time macros: +\begin{verbatim} +#define LIBDERIV_MAX_AM1 5 +#define LIBDERIV_MAX_AM12 4 +\end{verbatim} + +Note that ``compute'' functions in \libint, {\tt build\_eri}, simply return a pointer +to the target quartet, whereas \libderiv 's functions return target data through integrals +evaluator object, {\tt Libderiv\_t}. Such objects are initialized using one of the following functions: +\begin{verbatim} +int init_libderiv1(Libderiv_t *, int max_am, int max_num_prim_quartets, + int max_cart_class_size); +int init_libderiv12(Libderiv_t *, int max_am, int max_num_prim_quartets, + int max_cart_class_size); +\end{verbatim} +These functions initialize objects for use with {\tt build\_deriv1\_eri} and +{\tt build\_deriv12\_eri} compute functions, respectively. It is illegal to use +a {\tt Libderiv\_t} object initialized by {\tt init\_libderiv1()} with +{\tt build\_deriv12\_eri} compute functions. +Memory requirements for initializing these two types of objects are evaluated using +\begin{verbatim} +int libderiv1_storage_required(int max_am, int max_num_prim_quartets, + int max_cart_class_size); +int libderiv12_storage_required(int max_am, int max_num_prim_quartets, + int max_cart_class_size); +\end{verbatim} + +Structure of {\tt Libderiv\_t} is essentially similar to {\tt Libint\_t}: +\begin{verbatim} +typedef struct { + double *int_stack; + prim_data *PrimQuartet; + double *zero_stack; + double *ABCD[12+144]; + double AB[3]; + double CD[3]; + double *deriv_classes[9][9][12]; + double *deriv2_classes[9][9][144]; + double *dvrr_classes[9][9]; + double *dvrr_stack; + } Libderiv_t; +\end{verbatim} +User passes quartet data to \libderiv\ through {\tt PrimQuartet}, {\tt AB}, +and {\tt CD}. Data is returned through member {\tt ABCD}. The dimension of {\tt ABCD} +is explicitly written as 12+144 which refer to the number of +all (including nonunique) first and second derivatives of ERIs. If a derivative index runs +For example, {\tt ABCD[4]} and {\tt ABCD[11]} point +to derivative quartets $\frac{\partial ({\bf ab}|{\bf cd})}{\partial B_y}$ and $\frac{\partial ({\bf ab}|{\bf cd})}{\partial D_z}$, respectively. +Similarly, {\tt ABCD[13]} and {\tt ABCD[27]} refer to $\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_x \partial A_y}$ +and $\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_y \partial B_x}$, respectively. + +Due to the translation invariance relations and the permutational symmetry of the second derivative integrals, +some derivative quartets are not computed and thus +only some elements of this array are initialized. Eqs. (\ref{eqn:TId1eri}-\ref{eqn:TId2eri_BD}) +specify how to evaluate elements which are not computed. Thus {\tt build\_deriv1\_eri()} and {\tt build\_deriv12\_eri()} +functions produce 9 and $9+45=54$ unique derivative quartets, respectively. The unique quartets and corresponding +elements of {\tt Libderiv\_t.ABCD} are listed here: +\begin{scriptsize} +\begin{eqnarray} +\frac{\partial ({\bf ab}|{\bf cd})}{\partial A_x} \quad 0 \quad \quad \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_y \partial A_y} \quad 25 \quad \quad +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial C_x \partial D_x} \quad 93 \nonumber \\ +\frac{\partial ({\bf ab}|{\bf cd})}{\partial A_y} \quad 1 \quad \quad \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_y \partial A_z} \quad 26 \quad \quad +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial C_x \partial D_y} \quad 94 \nonumber \\ +\frac{\partial ({\bf ab}|{\bf cd})}{\partial A_z} \quad 2 \quad \quad \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_y \partial C_x} \quad 30 \quad \quad +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial C_x \partial D_z} \quad 95 \nonumber \\ +\frac{\partial ({\bf ab}|{\bf cd})}{\partial C_x} \quad 6 \quad \quad \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_y \partial C_y} \quad 31 \quad \quad +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial C_y \partial C_y} \quad 103 \nonumber \\ +\frac{\partial ({\bf ab}|{\bf cd})}{\partial C_y} \quad 7 \quad \quad \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_y \partial C_z} \quad 32 \quad \quad +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial C_y \partial C_z} \quad 104 \nonumber \\ +\frac{\partial ({\bf ab}|{\bf cd})}{\partial C_z} \quad 8 \quad \quad \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_y \partial D_x} \quad 33 \quad \quad +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial C_y \partial D_x} \quad 105 \nonumber \\ +\frac{\partial ({\bf ab}|{\bf cd})}{\partial D_x} \quad 9 \quad \quad \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_y \partial D_y} \quad 34 \quad \quad +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial C_y \partial D_y} \quad 106 \nonumber \\ +\frac{\partial ({\bf ab}|{\bf cd})}{\partial D_y} \quad 10 \quad \quad \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_y \partial D_z} \quad 35 \quad \quad +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial C_y \partial D_z} \quad 107 \nonumber \\ +\frac{\partial ({\bf ab}|{\bf cd})}{\partial D_z} \quad 11 \quad \quad \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_z \partial A_z} \quad 38 \quad \quad +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial C_z \partial C_z} \quad 116 \nonumber \\ +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_x \partial A_x} \quad 12 \quad \quad \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_z \partial C_x} \quad 42 \quad \quad +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial C_z \partial D_x} \quad 117 \nonumber \\ +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_x \partial A_y} \quad 13 \quad \quad \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_z \partial C_y} \quad 43 \quad \quad +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial C_z \partial D_y} \quad 118 \nonumber \\ +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_x \partial A_z} \quad 14 \quad \quad \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_z \partial C_z} \quad 44 \quad \quad +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial C_z \partial D_z} \quad 119 \nonumber \\ +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_x \partial C_x} \quad 18 \quad \quad \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_z \partial D_x} \quad 45 \quad \quad +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial D_x \partial D_x} \quad 129 \nonumber \\ +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_x \partial C_y} \quad 19 \quad \quad \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_z \partial D_y} \quad 46 \quad \quad +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial D_x \partial D_y} \quad 130 \nonumber \\ +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_x \partial C_z} \quad 20 \quad \quad \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_z \partial D_z} \quad 47 \quad \quad +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial D_x \partial D_z} \quad 131 \nonumber \\ +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_x \partial D_x} \quad 21 \quad \quad \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial C_x \partial C_x} \quad 90 \quad \quad +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial D_y \partial D_y} \quad 142 \nonumber \\ +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_x \partial D_y} \quad 22 \quad \quad \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial C_x \partial C_y} \quad 91 \quad \quad +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial D_y \partial D_z} \quad 143 \nonumber \\ +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial A_x \partial D_z} \quad 23 \quad \quad \frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial C_x \partial C_z} \quad 92 \quad \quad +\frac{\partial^2 ({\bf ab}|{\bf cd})}{\partial D_z \partial D_z} \quad 155 \nonumber +\end{eqnarray} +\end{scriptsize} + +Each derivative quartet is identical in structure to a nondifferentiated +quartet, i.e. individual integrals are arranged in a row major order. Normalization convention +for the derivative integrals is the same as for the regular ERIs. + +\subsection{Notes on using \librij} +Component \librij\ is used to evaluate integrals used in linear R12 theories\cite{Kutzelnigg85,Kutzelnigg91,Klopper92,Valeev00:r12ints}. +over operators $\frac{1}{r_{12}}$, $r_{12}$, $[r_{12},\hat{T}_1]$, and $[r_{12},\hat{T}_2]$. +Using \librij\ is mostly similar to how \libint\ is used. Here we only concentrate on significant +differences which have not been noted before or on aspects of use specific to \librij . + +There are two types of compute functions in \librij\ (see \librijh): +\begin{verbatim} +extern void (*build_r12_gr[7][7][7][7])(Libr12_t *, int); +extern void (*build_r12_grt[7][7][7][7])(Libr12_t *, int); +\end{verbatim} +The former computes integrals of operators $\frac{1}{r_{12}}$ ("{\em g}") and $r_{12}$ ("{\em r}") only,\footnote{As of this writing, +these functions have not been implemented yet.} +whereas in addition the latter computes also integrals of operators $[r_{12},\hat{T}_1]$ and $[r_{12},\hat{T}_2]$ ("{\em t}").\footnote{Note +that in the literature the sum of reversed commutators is usually used, i.e. $[\hat{T}_1 + \hat{T}_2,r_{12}] = - [r_{12},\hat{T}_1] - [r_{12},\hat{T}_2]$.} +The size of each dimension of these function pointer arrays is determined by +\begin{verbatim} +#define LIBR12_MAX_AM 7 +\end{verbatim} +which corresponds to the maximum angular momentum of basis functions which \librij\ can handle, incremented by one. + +Evaluator object type {\tt Libr12\_t} is defined as +\begin{verbatim} +#define NUM_TE_TYPES 4 + +typedef struct { + REALTYPE *int_stack; + prim_data *PrimQuartet; + contr_data ShellQuartet; + REALTYPE *te_ptr[NUM_TE_TYPES]; + REALTYPE *t1vrr_classes[13][13]; + REALTYPE *t2vrr_classes[13][13]; + REALTYPE *rvrr_classes[13][13]; + REALTYPE *gvrr_classes[14][14]; + REALTYPE *r12vrr_stack; + + } Libr12_t; +\end{verbatim} +The usual array of data structures {\tt PrimQuartet} is there along with a new +data structure {\tt ShellQuartet} for shell quartet data into which {\tt Libint\_t}'s +{\bf AB} and {\bf CD} have migrated: +\begin{verbatim} +typedef struct { + REALTYPE AB[3]; + REALTYPE CD[3]; + REALTYPE AC[3]; + REALTYPE ABdotAC, CDdotCA; + } contr_data; +\end{verbatim} +Members of the data structure correspond to the following quantities: +{\bf AB}, {\bf CD}, {\bf AC}, ${\bf AB}\cdot{\bf AC}$, and ${\bf CD}\cdot{\bf CA}$. +Before computing a set of shell quartet, one initializes {\tt PrimQuartet} with the primitive quartet +data and {\tt ShellQuartet} with the shell quartet data. Pointers to computed shell quartets +are returned in {\tt Libr12\_t.te\_ptr}. {\tt te\_ptr[0]} refers to the quartet of ERIs, +{\tt te\_ptr[1]} -- to the quartet of integrals of the ${r_{12}}$ operator, +{\tt te\_ptr[2]} -- to the quartet of integrals of the $[r_{12},\hat{T}_1]$ +operator, {\tt te\_ptr[3]} -- to the quartet of integrals of the $[r_{12},\hat{T}_2]$ +operator. The integrals follow the aforementioned normalization convention of \LIBINT . + +One must remember that the commutator integrals have different permutational symmetry +than ERIs and integrals of the $r_{12}$ operator, namely: +\begin{eqnarray} +(pq|[r_{12},\hat{T}_1]|rs) & = & (pq|[r_{12},\hat{T}_1]|sr) = -(qp|[r_{12},\hat{T}_1]|rs) = -(qp|[r_{12},\hat{T}_1]|sr) = \nonumber \\ += (rs|[r_{12},\hat{T}_2]|pq) & = &(sr|[r_{12},\hat{T}_2]|pq) = -(rs|[r_{12},\hat{T}_2]|qp) = -(sr|[r_{12},\hat{T}_2]|qp) +\end{eqnarray} +One must keep them in mind when computing such integrals with \librij because of the required +preordering of shells in the shell quartet according to the canonical \LIBINT\ order (see above). +To obtain the desired integrals shells need to be reordered back, which is slightly more involved +for the commutator integrals than for ERIs. Nevertheless, the reordering is always possible +because integrals of both $[r_{12},\hat{T}_1]$ and $[r_{12},\hat{T}_2]$ operators are computed simultaneously. + +\section{Example: using \libint} + +%All integrals are +%retrieved using the following loop structure: +%\begin{verbatim} +%int na; /* the number of functions in first shell */ +%int nb; /* the number of functions in second shell */ +%int nc; /* the number of functions in third shell */ +%int nd; /* the number of functions in fourth shell */ +% +%REALTYPE raw_ints = build_eri[la][lb][lc][ld] +% +%for(int a=0; a='`$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) 2011 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)], + [Go], [_LT_LANG(GO)], + [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 + + +m4_ifndef([AC_PROG_GO], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_GO. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +m4_defun([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GOC], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +AC_CHECK_TOOL(GOC, gccgo) +if test -z "$GOC"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GOC"; then + AC_CHECK_PROG(GOC, gccgo, gccgo, false) +fi +])#m4_defun +])#m4_ifndef + + +# _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([AC_PROG_GO], + [LT_LANG(GO)], + [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) + +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 there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test $_lt_result -eq 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 -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; 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([TAG]) +# --------------------------------- +# 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\"`' + m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], + [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) + 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 + ;; +*-*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*) + case $host in + i?86-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD="${LD-ld}_sol2" + fi + ;; + *) + 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 \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_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 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + 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"`env 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 # correct to gnu/linux during the next big refactor + 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 # correct to gnu/linux during the next big refactor + 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 # correct to gnu/linux during the next big refactor + 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 # correct to gnu/linux during the next big refactor + 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 + ;; + +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[[23]].*) 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 # correct to gnu/linux during the next big refactor + 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 + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + 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 # correct to gnu/linux during the next big refactor + 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 # correct to gnu/linux during the next big refactor + 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 glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux # correct to gnu/linux during the next big refactor + 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 + + # 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="/lib /usr/lib $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 # correct to gnu/linux during the next big refactor + 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 # correct to gnu/linux during the next big refactor + 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 # correct to gnu/linux during the next big refactor + 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 # correct to gnu/linux during the next big refactor + 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 # correct to gnu/linux during the next big refactor + 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 # correct to gnu/linux during the next big refactor + 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 glibc/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};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /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 ' + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" + fi + ;; + 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\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) + # 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\ F* | *Sun*Fortran*) + _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 ' + ;; + *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,' + ;; + *Intel*\ [[CF]]*Compiler*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *Portland\ Group*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + 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(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + _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_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)='${wl}-rpath ${wl}$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(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + _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 + ;; + + # 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_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_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_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 + ;; + + freebsd2.*) + # 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 +], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF +package foo +func foo() { +} +_LT_EOF +]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +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_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_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_GO_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Go compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GO_CONFIG], +[AC_REQUIRE([LT_PROG_GO])dnl +AC_LANG_SAVE + +# Source file extension for Go test sources. +ac_ext=go + +# Object file extension for compiled Go test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="package main; func main() { }" + +# Code to be used in simple link tests +lt_simple_link_test_code='package main; func main() { }' + +# 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=${GOC-"gccgo"} +CFLAGS=$GOFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# Go 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_GO_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_GO +# ---------- +AC_DEFUN([LT_PROG_GO], +[AC_CHECK_TOOL(GOC, gccgo,) +]) + + +# 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/src/Makefile b/src/Makefile new file mode 100644 index 0000000..55b6902 --- /dev/null +++ b/src/Makefile @@ -0,0 +1,74 @@ +TOPDIR=.. +ifndef SRCDIR + SRCDIR=$(shell pwd) +endif + +-include $(TOPDIR)/Makedirlist + +SUBDIRS = bin lib + +default:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(JOBS)) || exit 1; \ + done + +ifndef DODEPEND +DODEPENDOPT = "DODEPEND=no" +endif + +install:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) install) || exit 1; \ + done + +install_inc:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) install_inc) || exit 1; \ + done + +install_target:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) install_target) || exit 1; \ + done + +uninstall:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) uninstall) || exit 1; \ + done + +clean:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) clean) || exit 1; \ + done + +oclean:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) oclean) || exit 1; \ + done + +distclean:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) distclean) || exit 1; \ + done + -rm -rf libintdirlist.h + +targetclean:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) targetclean) || exit 1; \ + done + +realclean:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) realclean) || exit 1; \ + done + diff --git a/src/bin/MakeRules.in b/src/bin/MakeRules.in new file mode 100644 index 0000000..5b90607 --- /dev/null +++ b/src/bin/MakeRules.in @@ -0,0 +1,27 @@ + +HAVE_MAKERULES = yes + +BINOBJ = $(BUILD_CSRC:%.c=%.$(OBJSUF)) $(BUILD_CXXSRC:%.cc=%.$(OBJSUF)) +$(BUILD_BINARY): $(BINOBJ) + $(LD) $^ $(LDFLAGS) $(SYSLIBS) -o $@ + +.PHONY: install install_inc install_target uninstall clean oclean distclean targetclean realclean +install:: + +install_inc:: + +install_target:: + +uninstall:: + +clean:: oclean + -rm -f $(BUILD_BINARY) + +oclean:: + -rm -f $(BINOBJ) + +distclean:: clean + +targetclean:: + +realclean:: clean diff --git a/src/bin/MakeVars.in b/src/bin/MakeVars.in new file mode 100644 index 0000000..11bd81c --- /dev/null +++ b/src/bin/MakeVars.in @@ -0,0 +1,82 @@ +# Emacs should use -*- Makefile -*- mode. + +# this is usually overridden +TARGET_TO_MAKE = $(shell basename `pwd`) + +ifndef SRCDIR + SRCDIR = . +endif +SRCTOPDIR = $(SRCDIR)/$(TOPDIR) + +host = @host@ +host_cpu = @host_cpu@ +host_vendor = @host_vendor@ +host_os = @host_os@ + +target = @target@ +target_cpu = @target_cpu@ +target_vendor = @target_vendor@ +target_os = @target_os@ + +LIBINT_VERSION = @LIBINT_VERSION@ +BUILDID = @BUILDID@ + +# The object code suffix +OBJSUF = @OBJSUF@ + +# The library suffix +LIBSUF = @LIBSUF@ + +# The suffix generated by the -M compiler option +CCDEPENDSUF = @CCDEPENDSUF@ +CXXDEPENDSUF = @CXXDEPENDSUF@ +CCDEPENDFLAGS = @CCDEPENDFLAGS@ +CXXDEPENDFLAGS = @CXXDEPENDFLAGS@ + +CC = @CC@ +CXX = @CXX@ + +CCDEPEND = @CC@ +CXXDEPEND = @CXX@ + +AR = @AR@ +ARFLAGS = @ARFLAGS@ + +LD = $(CC) +LDFLAGS = @LDFLAGS@ + +INSTALL = @INSTALL@ +INSTALLDIROPT = -d -m 0755 +INSTALLLIBOPT = -m 0644 +INSTALLBINOPT = -m 0755 +INSTALLSCRIPTOPT = -m 0755 + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +bindir=@bindir@ +libdir=@libdir@ +includedir=@libintincludedir@ + +RANLIB = @RANLIB@ +COMPRESS = gzip +UNCOMPRESS = gzip -d + +# first check for generated include files in the machine dependent directories +# and then for include files in the src directory +INCLUDE = -I$(TOPDIR)/src/bin -I$(SRCTOPDIR)/include -I$(SRCTOPDIR)/src/bin \ + @CPPFLAGS@ +DEFINES = @DEFS@ @EXTRADEFINES@ + +CPPFLAGS = $(DEFINES) $(INCLUDE) + +CFLAGS = @CFLAGS@ +HIGHOPT_CFLAGS = $(CFLAGS) +NOALIAS_CFLAGS = + +CXXFLAGS = @CXXFLAGS@ +HIGHOPT_CXXFLAGS = $(CXXFLAGS) +NOALIAS_CXXFLAGS = $(NOALIAS_CFLAGS) + +SYSLIBS = @LIBS@ + +TARGET_HEADERS = $(HEADERS:%=$(top_objdir)/include/libint/%) diff --git a/src/bin/Makefile b/src/bin/Makefile new file mode 100644 index 0000000..32c0312 --- /dev/null +++ b/src/bin/Makefile @@ -0,0 +1,80 @@ +TOPDIR=../.. +ifndef SRCDIR + SRCDIR=$(shell pwd) +endif + +-include $(TOPDIR)/Makedirlist + +SUBDIRS = libint +ifeq ($(HAVE_LIBINT_SRC_BIN_LIBR12),yes) +SUBDIRS := $(SUBDIRS) libr12 +endif +ifeq ($(HAVE_LIBINT_SRC_BIN_LIBDERIV),yes) +SUBDIRS := $(SUBDIRS) libderiv +endif + +default:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(JOBS)) || exit 1; \ + done + +ifndef DODEPEND +DODEPENDOPT = "DODEPEND=no" +endif + +install:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) install) || exit 1; \ + done + +install_inc:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) install_inc) || exit 1; \ + done + +install_target:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) install_target) || exit 1; \ + done + +uninstall:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) uninstall) || exit 1; \ + done + +clean:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) clean) || exit 1; \ + done + +oclean:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) oclean) || exit 1; \ + done + +distclean:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) distclean) || exit 1; \ + done + -rm -rf MakeVars MakeRules MakeSuffixRules libint_config.h + +targetclean:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) targetclean) || exit 1; \ + done + +realclean:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) realclean) || exit 1; \ + done + diff --git a/src/bin/constants.h b/src/bin/constants.h new file mode 100644 index 0000000..71e006f --- /dev/null +++ b/src/bin/constants.h @@ -0,0 +1,37 @@ + +#ifndef _libint_constants_h_ +#define _libint_constants_h_ + +static const char cart_comp[] = "XYZ"; +static const char am_letter[] = "0pdfghiklmnoqrtuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; +static const char *number[] = {"zero","one","two","three","four","five","six","seven","eight","nine","ten","eleven", + "twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen","twenty", + "twentyone", "twentytwo", "twentythree", "twentyfour", "twentyfive", "twentysix", "twentyseven", + "twentyeight", "twentynine", "thirty"}; + +static inline int io(int i) { return i*(i+1)/2; } +static inline int iop1(int i) { return (i+1)*(i+2)/2; } + +/*---------------------------------------------------------------------------------- + hash(a,b) returns the index of the (a[0] a[1]) type product within a doublet. + a contains x y and z exponents of functions on centers A and B, and b contains + their angular momenta + ----------------------------------------------------------------------------------*/ +static inline int hash(int a[2][3], int b[2]) +{ + int c[2] = {0,0}; + int i; + + if(b[0]){ + i=b[0]-a[0][0]; + c[0]=i+io(i)-a[0][1]; + } + if(b[1]){ + i=b[1]-a[1][0]; + c[1]=i+io(i)-a[1][1]; + } + + return c[0]*io(b[1]+1)+c[1]; +} + +#endif diff --git a/src/bin/libderiv/Makefile b/src/bin/libderiv/Makefile new file mode 100644 index 0000000..cc52f29 --- /dev/null +++ b/src/bin/libderiv/Makefile @@ -0,0 +1,17 @@ +TOPDIR=../../.. +ifndef SRCDIR + SRCDIR=$(shell pwd) +endif + +BUILD_BINARY = build_libderiv +BUILD_CSRC = build_libderiv.c mem_man.c \ +emit_deriv1_managers.c emit_deriv12_managers.c emit_deriv_build.c emit_d1hrr_build.c \ +emit_deriv_build_macro.c emit_d1hrr_build_macro.c +CONFIG = ../libint_config.h + +-include $(TOPDIR)/src/bin/MakeVars +-include $(TOPDIR)/src/bin/MakeRules +include $(SRCDIR)/$(TOPDIR)/lib/MakeRules +include $(SRCDIR)/$(TOPDIR)/lib/MakeSuffixRules + +%.$(OBJSUF):: $(CONFIG) diff --git a/src/bin/libderiv/build_libderiv.c b/src/bin/libderiv/build_libderiv.c new file mode 100644 index 0000000..dbc3295 --- /dev/null +++ b/src/bin/libderiv/build_libderiv.c @@ -0,0 +1,296 @@ +#include +#include +#include +#include +#include + +FILE *outfile, *d1hrr_header, + *deriv_header, *libderiv_header, *init_code; +int libderiv1_stack_size[MAX_AM/2+1]; +#if EMIT_DERIV2_MANAGERS +int libderiv2_stack_size[MAX_AM/2+1]; +#endif +int libderiv12_stack_size[MAX_AM/2+1]; +LibderivParams_t Params; + +void punt(char *); +extern void emit_deriv1_managers(); +#if EMIT_DERIV2_MANAGERS +extern void emit_deriv2_managers(); +#endif +extern void emit_deriv12_managers(); +extern void emit_d1hrr_build(); +extern void emit_d1hrr_build_macro(); +extern void emit_deriv_build(); +extern void emit_deriv_build_macro(); + +int main() +{ + int i,j,k,l,f; + int j_min, j_max, k_min, k_max, l_min, l_max; + int errcod; + int new_am, new_am1, new_am2, new_am12; + int class_size; + int num_subfunctions; + int max_class_size = 785; + + /*------------------------------- + Initialize files and libraries + -------------------------------*/ + outfile = fopen("./output.dat", "w"); + d1hrr_header = fopen("./d1hrr_header.h","w"); + deriv_header = fopen("./deriv_header.h","w"); + libderiv_header = fopen("./libderiv.h","w"); + init_code = fopen("./init_libderiv.cc","w"); + + /*--------------------------------------------- + Getting the new_am1, new_am12, and deriv_lvl + from user and making sure it is consistent + with libint.h + ---------------------------------------------*/ + new_am1 = LIBDERIV_MAX_AM1; + if (new_am1 <= 0) + punt(" MAX_AM1 must be positive."); + if (new_am1 > LIBINT_MAX_AM - 1) + punt(" MAX_AM1 is greater than the installed libint.a allows.\n Recompile libint.a with greater MAX_AM."); + +#if EMIT_DERIV2_MANAGERS + new_am2 = LIBDERIV_MAX_AM2; + if (new_am2 <= 0) + punt(" MAX_AM2 must be positive."); + if (new_am2 > LIBINT_MAX_AM - 2) + punt(" MAX_AM2 is greater than the installed libint.a allows.\n Recompile libint.a with greater MAX_AM."); +#endif + + new_am12 = LIBDERIV_MAX_AM12; + if (new_am12 <= 0) + punt(" MAX_AM12 must be positive."); + if (new_am12 > LIBINT_MAX_AM - 2) + punt(" Maximum MAX_AM12 is greater than the installed libint.a allows.\n Recompile libint.a with greater MAX_AM."); + + new_am = (new_am1 > new_am12) ? new_am1 : new_am12; +#if EMIT_DERIV2_MANAGERS + new_am = (new_am > new_am2) ? new_am : new_am2; +#endif + + /*------------- + Init globals + -------------*/ + for(l=0;l<=new_am1;l++) + libderiv1_stack_size[l] = 0; +#if EMIT_DERIV2_MANAGERS + for(l=0;l<=new_am2;l++) + libderiv2_stack_size[l] = 0; +#endif + for(l=0;l<=new_am12;l++) + libderiv12_stack_size[l] = 0; + Params.new_am = 2*new_am; + Params.new_am1 = 2*new_am1; +#if EMIT_DERIV2_MANAGERS + Params.new_am2 = 2*new_am2; +#endif + Params.new_am12 = 2*new_am12; + Params.old_am = 0; + Params.opt_am = 2*LIBINT_OPT_AM; + Params.max_am_to_inline_vrr_worker = -1; + Params.max_am_manager_to_inline_vrr_worker = -1; + Params.max_am_to_inline_deriv_worker = -1; + Params.max_am_manager_to_inline_deriv_worker = -1; + Params.max_am_to_inline_hrr_worker = -1; + Params.max_am_manager_to_inline_hrr_worker = -1; + Params.max_am_to_inline_d1hrr_worker = -1; + Params.max_am_manager_to_inline_d1hrr_worker = -1; + Params.max_am_to_inline_vrr_manager = -1; + + /* Setting up init_libderiv.c, header.h */ + fprintf(init_code,"#include \n"); + fprintf(init_code,"#include \n"); + fprintf(init_code,"#include \n"); + fprintf(init_code,"#include \"libderiv.h\"\n"); + fprintf(init_code,"#include \"d1hrr_header.h\"\n\n"); + fprintf(init_code,"extern \"C\" {\n"); + fprintf(init_code,"void (*build_deriv1_eri[%d][%d][%d][%d])(Libderiv_t *, int);\n\n", + new_am1+1,new_am1+1,new_am1+1,new_am1+1); +#if EMIT_DERIV2_MANAGERS + fprintf(init_code,"void (*build_deriv2_eri[%d][%d][%d][%d])(Libderiv_t *, int);\n\n", + new_am2+1,new_am2+1,new_am2+1,new_am2+1); +#endif + fprintf(init_code,"void (*build_deriv12_eri[%d][%d][%d][%d])(Libderiv_t *, int);\n\n", + new_am12+1,new_am12+1,new_am12+1,new_am12+1); + fprintf(init_code,"int libderiv1_stack_size[%d];\n",new_am1+1); +#if EMIT_DERIV2_MANAGERS + fprintf(init_code,"int libderiv2_stack_size[%d];\n",new_am2+1); +#endif + fprintf(init_code,"int libderiv12_stack_size[%d];\n",new_am12+1); + fprintf(init_code,"void init_libderiv_base()\n{\n"); + + emit_deriv1_managers(); + emit_deriv12_managers(); +#if EMIT_DERIV2_MANAGERS + emit_deriv2_managers(); +#endif + emit_d1hrr_build(); + emit_d1hrr_build_macro(); + emit_deriv_build(); + emit_deriv_build_macro(); + + /* put computed stack sizes for each angular momentum level into init_libderiv_base() */ + for(l=0;l<=new_am1;l++) + fprintf(init_code,"\n libderiv1_stack_size[%d] = %d;",l,libderiv1_stack_size[l]); +#if EMIT_DERIV2_MANAGERS + for(l=0;l<=new_am2;l++) + fprintf(init_code,"\n libderiv2_stack_size[%d] = %d;",l,libderiv2_stack_size[l]); +#endif + for(l=0;l<=new_am12;l++) + fprintf(init_code,"\n libderiv12_stack_size[%d] = %d;",l,libderiv12_stack_size[l]); + + fprintf(init_code,"\n}\n\n"); + fprintf(init_code,"/* These functions initialize library objects */\n"); + fprintf(init_code,"/* Library objects operate independently of each other */\n"); + + fprintf(init_code,"int init_libderiv1(Libderiv_t *libderiv, int max_am, int max_num_prim_quartets, int max_cart_class_size)\n{\n"); + fprintf(init_code," int memory = 0;\n\n"); + fprintf(init_code," if (max_am >= LIBDERIV_MAX_AM1) return -1;\n"); + fprintf(init_code," libderiv->int_stack = (double *) malloc(libderiv1_stack_size[max_am]*sizeof(double));\n"); + fprintf(init_code," memory += libderiv1_stack_size[max_am];\n"); + fprintf(init_code," libderiv->zero_stack = (double *) malloc(max_cart_class_size*sizeof(double));\n"); + fprintf(init_code," bzero((char *)libderiv->zero_stack,max_cart_class_size*sizeof(double));\n"); + fprintf(init_code," memory += max_cart_class_size;\n"); + fprintf(init_code," libderiv->PrimQuartet = (prim_data *) malloc(max_num_prim_quartets*sizeof(prim_data));\n"); + fprintf(init_code," memory += max_num_prim_quartets*sizeof(prim_data)/sizeof(double);\n"); + fprintf(init_code," return memory;\n}\n\n"); + +#if EMIT_DERIV2_MANAGERS + fprintf(init_code,"int init_libderiv2(Libderiv_t *libderiv, int max_am, int max_num_prim_quartets, int max_cart_class_size)\n{\n"); + fprintf(init_code," int memory = 0;\n\n"); + fprintf(init_code," if (max_am >= LIBDERIV_MAX_AM2) return -1;\n"); + fprintf(init_code," libderiv->int_stack = (double *) malloc(libderiv2_stack_size[max_am]*sizeof(double));\n"); + fprintf(init_code," memory += libderiv2_stack_size[max_am];\n"); + fprintf(init_code," libderiv->zero_stack = (double *) malloc(max_cart_class_size*sizeof(double));\n"); + fprintf(init_code," bzero((char *)libderiv->zero_stack,max_cart_class_size*sizeof(double));\n"); + fprintf(init_code," memory += max_cart_class_size;\n"); + fprintf(init_code," libderiv->PrimQuartet = (prim_data *) malloc(max_num_prim_quartets*sizeof(prim_data));\n"); + fprintf(init_code," memory += max_num_prim_quartets*sizeof(prim_data)/sizeof(double);\n"); + fprintf(init_code," return memory;\n}\n\n"); +#endif + + fprintf(init_code,"int init_libderiv12(Libderiv_t *libderiv, int max_am, int max_num_prim_quartets, int max_cart_class_size)\n{\n"); + fprintf(init_code," int memory = 0;\n\n"); + fprintf(init_code," if (max_am >= LIBDERIV_MAX_AM12) return -1;\n"); + fprintf(init_code," libderiv->int_stack = (double *) malloc(libderiv12_stack_size[max_am]*sizeof(double));\n"); + fprintf(init_code," memory += libderiv12_stack_size[max_am];\n"); + fprintf(init_code," libderiv->zero_stack = (double *) malloc(max_cart_class_size*sizeof(double));\n"); + fprintf(init_code," bzero((char *)libderiv->zero_stack,max_cart_class_size*sizeof(double));\n"); + fprintf(init_code," memory += max_cart_class_size;\n"); + fprintf(init_code," libderiv->PrimQuartet = (prim_data *) malloc(max_num_prim_quartets*sizeof(prim_data));\n"); + fprintf(init_code," memory += max_num_prim_quartets*sizeof(prim_data)/sizeof(double);\n"); + fprintf(init_code," return memory;\n}\n\n"); + + fprintf(init_code,"void free_libderiv(Libderiv_t *libderiv)\n{\n"); + fprintf(init_code," if (libderiv->int_stack != NULL) {\n"); + fprintf(init_code," free(libderiv->int_stack);\n"); + fprintf(init_code," libderiv->int_stack = NULL;\n"); + fprintf(init_code," }\n"); + fprintf(init_code," if (libderiv->zero_stack != NULL) {\n"); + fprintf(init_code," free(libderiv->zero_stack);\n"); + fprintf(init_code," libderiv->zero_stack = NULL;\n"); + fprintf(init_code," }\n"); + fprintf(init_code," if (libderiv->PrimQuartet != NULL) {\n"); + fprintf(init_code," free(libderiv->PrimQuartet);\n"); + fprintf(init_code," libderiv->PrimQuartet = NULL;\n"); + fprintf(init_code," }\n\n"); + fprintf(init_code," return;\n}\n\n"); + fprintf(init_code,"int libderiv1_storage_required(int max_am, int max_num_prim_quartets, int max_cart_class_size)\n{\n"); + fprintf(init_code," int memory = 0;\n\n"); + fprintf(init_code," if (max_am >= LIBDERIV_MAX_AM1) return -1;\n"); + fprintf(init_code," memory += libderiv1_stack_size[max_am];\n"); + fprintf(init_code," memory += max_cart_class_size;\n"); + fprintf(init_code," memory += max_num_prim_quartets*sizeof(prim_data)/sizeof(double);\n"); + fprintf(init_code," return memory;\n}\n"); +#if EMIT_DERIV2_MANAGERS + fprintf(init_code,"int libderiv2_storage_required(int max_am, int max_num_prim_quartets, int max_cart_class_size)\n{\n"); + fprintf(init_code," int memory = 0;\n\n"); + fprintf(init_code," if (max_am >= LIBDERIV_MAX_AM2) return -1;\n"); + fprintf(init_code," memory += libderiv2_stack_size[max_am];\n"); + fprintf(init_code," memory += max_cart_class_size;\n"); + fprintf(init_code," memory += max_num_prim_quartets*sizeof(prim_data)/sizeof(double);\n"); + fprintf(init_code," return memory;\n}\n"); +#endif + fprintf(init_code,"int libderiv12_storage_required(int max_am, int max_num_prim_quartets, int max_cart_class_size)\n{\n"); + fprintf(init_code," int memory = 0;\n\n"); + fprintf(init_code," if (max_am >= LIBDERIV_MAX_AM12) return -1;\n"); + fprintf(init_code," memory += libderiv12_stack_size[max_am];\n"); + fprintf(init_code," memory += max_cart_class_size;\n"); + fprintf(init_code," memory += max_num_prim_quartets*sizeof(prim_data)/sizeof(double);\n"); + fprintf(init_code," return memory;\n}\n"); + fprintf(init_code,"}\n"); /* end of extern "C" */ + fclose(init_code); + fclose(d1hrr_header); + fclose(deriv_header); + + /* Setting up libderiv.h */ + fprintf(libderiv_header,"#ifndef _psi3_libderiv_h\n"); + fprintf(libderiv_header,"#define _psi3_libderiv_h\n\n"); + fprintf(libderiv_header,"#include \n\n"); + fprintf(libderiv_header,"/* Maximum angular momentum of functions in a basis set plus 1 */\n"); + fprintf(libderiv_header,"#define LIBDERIV_MAX_AM1 %d\n",1+new_am1); +#if EMIT_DERIV2_MANAGERS + fprintf(libderiv_header,"#define LIBDERIV_MAX_AM2 %d\n",1+new_am2); +#endif + fprintf(libderiv_header,"#define LIBDERIV_MAX_AM12 %d\n",1+new_am12); + fprintf(libderiv_header,"#ifdef DERIV_LVL\n"); + fprintf(libderiv_header," #undef DERIV_LVL\n"); + fprintf(libderiv_header,"#endif\n"); + fprintf(libderiv_header,"#define DERIV_LVL %d\n\n",DERIV_LVL); + fprintf(libderiv_header,"typedef struct {\n"); + fprintf(libderiv_header," double *int_stack;\n"); + fprintf(libderiv_header," prim_data *PrimQuartet;\n"); + fprintf(libderiv_header," double *zero_stack;\n"); + fprintf(libderiv_header," double *ABCD[12+144];\n"); + fprintf(libderiv_header," double AB[3];\n"); + fprintf(libderiv_header," double CD[3];\n"); + fprintf(libderiv_header," double *deriv_classes[%d][%d][%d];\n",1+2*new_am,1+2*new_am,12); + fprintf(libderiv_header," double *deriv2_classes[%d][%d][%d];\n",1+2*new_am,1+2*new_am,144); + fprintf(libderiv_header," double *dvrr_classes[%d][%d];\n",1+2*new_am,1+2*new_am); + fprintf(libderiv_header," double *dvrr_stack;\n"); + fprintf(libderiv_header," } Libderiv_t;\n\n"); + fprintf(libderiv_header,"#ifdef __cplusplus\n"); + fprintf(libderiv_header,"extern \"C\" {\n"); + fprintf(libderiv_header,"#endif\n"); + fprintf(libderiv_header,"extern void (*build_deriv1_eri[%d][%d][%d][%d])(Libderiv_t *, int);\n", + new_am1+1,new_am1+1,new_am1+1,new_am1+1); +#if EMIT_DERIV2_MANAGERS + fprintf(libderiv_header,"extern void (*build_deriv2_eri[%d][%d][%d][%d])(Libderiv_t *, int);\n", + new_am2+1,new_am2+1,new_am2+1,new_am2+1); +#endif + fprintf(libderiv_header,"extern void (*build_deriv12_eri[%d][%d][%d][%d])(Libderiv_t *, int);\n", + new_am12+1,new_am12+1,new_am12+1,new_am12+1); + fprintf(libderiv_header,"void init_libderiv_base();\n\n"); + fprintf(libderiv_header,"int init_libderiv1(Libderiv_t *, int max_am, int max_num_prim_quartets, int max_cart_class_size);\n"); +#if EMIT_DERIV2_MANAGERS + fprintf(libderiv_header,"int init_libderiv2(Libderiv_t *, int max_am, int max_num_prim_quartets, int max_cart_class_size);\n"); +#endif + fprintf(libderiv_header,"int init_libderiv12(Libderiv_t *, int max_am, int max_num_prim_quartets, int max_cart_class_size);\n"); + fprintf(libderiv_header,"void free_libderiv(Libderiv_t *);\n\n"); + fprintf(libderiv_header,"int libderiv1_storage_required(int max_am, int max_num_prim_quartets, int max_cart_class_size);\n"); +#if EMIT_DERIV2_MANAGERS + fprintf(libderiv_header,"int libderiv2_storage_required(int max_am, int max_num_prim_quartets, int max_cart_class_size);\n"); +#endif + fprintf(libderiv_header,"int libderiv12_storage_required(int max_am, int max_num_prim_quartets, int max_cart_class_size);\n"); + fprintf(libderiv_header,"#ifdef __cplusplus\n"); + fprintf(libderiv_header,"}\n"); + fprintf(libderiv_header,"#endif\n\n"); + fprintf(libderiv_header,"#endif\n"); + fclose(libderiv_header); + fclose(outfile); + exit(0); +} + + +void punt(char* str) +{ + printf("%s",str); + exit(1); +} + + diff --git a/src/bin/libderiv/build_libderiv.h b/src/bin/libderiv/build_libderiv.h new file mode 100644 index 0000000..13569ef --- /dev/null +++ b/src/bin/libderiv/build_libderiv.h @@ -0,0 +1,63 @@ +#define MAX_AM 16 +#define DERIV_LVL 2 +#define DEFAULT_NEW_AM1 6 /*--- first derivatives of up to f-functions ---*/ +#define DEFAULT_NEW_AM2 4 /*--- first derivatives of up to d-functions ---*/ +#define DEFAULT_NEW_AM12 4 /*--- second derivatives of up to d-functions ---*/ +#define EMIT_DERIV2_MANAGERS 0 /*--- whether to produce manager functions that compute + second derivatives only ---*/ + + +typedef struct { + + /* Twice the maximum AM for which deriv1/deriv2/deriv12 manager routines need to be generated */ + int new_am; + + /* Twice the maximum AM for which deriv1 manager routines need to be generated */ + int new_am1; + +#if EMIT_DERIV2_MANAGERS + /* Twice the maximum AM for which deriv2 manager routines need to be generated */ + int new_am2; +#endif + + /* Twice the maximum AM for which deriv12 manager routines need to be generated */ + int new_am12; + + /* The maximum AM + 1 for which machine-generated VRR workers are present in libint.a */ + int opt_am; + + /* Twice the AM for which manager routines are already + generated and stored in an existing library */ + int old_am; + + /* The maximum AM for which VRR workers will be made inline functions + Determined by libint.a */ + int max_am_to_inline_vrr_worker; + + /* The maximum AM for which DERIV workers will be made inline functions */ + int max_am_to_inline_deriv_worker; + + /* The maximum AM of the VRR managers which will inline VRR workers + Determined by libint.a */ + int max_am_manager_to_inline_vrr_worker; + + /* The maximum AM of the VRR managers which will inline DERIV workers */ + int max_am_manager_to_inline_deriv_worker; + + /* The maximum AM for which HRR workers will be made inline functions + Determined by libint.a */ + int max_am_to_inline_hrr_worker; + + /* The maximum AM for which D1HRR workers will be made inline functions */ + int max_am_to_inline_d1hrr_worker; + + /* The maximum AM of the HRR/VRR managers which will inline HRR workers */ + int max_am_manager_to_inline_hrr_worker; + + /* The maximum AM of the HRR managers which will inline D1HRR workers */ + int max_am_manager_to_inline_d1hrr_worker; + + /* The maximum AM for which VRR managers will be inlined into HRR managers */ + int max_am_to_inline_vrr_manager; + +} LibderivParams_t; diff --git a/src/bin/libderiv/emit_d1hrr_build.c b/src/bin/libderiv/emit_d1hrr_build.c new file mode 100644 index 0000000..8a34ee5 --- /dev/null +++ b/src/bin/libderiv/emit_d1hrr_build.c @@ -0,0 +1,248 @@ +#include +#include +#include +#include + +extern FILE *outfile, *libint_src, *d1hrr_header; +extern LibderivParams_t Params; + +extern void punt(char *); + +void emit_d1hrr_build() +{ + int new_am = Params.new_am; + int old_am = Params.old_am; + int am_to_inline = Params.max_am_to_inline_d1hrr_worker; + + FILE *code; + int p,q,r,s; + int ax,ay,az,bx,by,bz,cx,cy,cz,dx,dy,dz; + int i,j,nj,i_i0,i_i1; + int k,l,nl,k_i0,k_i1; + int i0_step,i1_step; + int a, b; + int flag; + int am_in[2]; + int class_size; + int la, lb; + int ld, lc, ld_max; + int curr_count,curr_subfunction; + int current_highest_am, to_inline; + int errcod; + char code_name[19]; + char function_name[17]; + + + for(lc=0;lc<=new_am;lc++) { + ld_max = (lc+1)/2; + for(ld=1;ld<=ld_max;ld++) { + + /*----------------------- + HRR on centers C and D + -----------------------*/ + + am_in[0] = lc-ld; + am_in[1] = ld; + + /* Is this function to be made inline */ + current_highest_am = (am_in[0] > am_in[1]) ? am_in[0] : am_in[1]; + to_inline = (current_highest_am <= am_to_inline) ? 1 : 0; + + sprintf(function_name,"d1hrr3_build_%c%c",am_letter[am_in[0]],am_letter[am_in[1]]); + sprintf(code_name,"d1hrr3_build_%c%c.cc",am_letter[am_in[0]],am_letter[am_in[1]]); + code = fopen(code_name,"w"); + + /* include the function into the d1hrr_header.h */ + if (to_inline) + fprintf(d1hrr_header, "#ifndef INLINE_D1HRR_WORKER\n"); + fprintf(d1hrr_header,"void %s(const double *, double *, const double *, const double *, \n",function_name); + fprintf(d1hrr_header," double, const double *, double, const double *, double, const double *,\n"); + fprintf(d1hrr_header," double, const double *, double, const double *, double, const double *, int);\n"); + if (to_inline) + fprintf(d1hrr_header, "#endif\n"); + + fprintf(code," /* This machine-generated function computes a quartet of |%c%c) first derivative ERIs */\n\n", + am_letter[am_in[0]],am_letter[am_in[1]]); + fprintf(code,"void %s(const double *CD, double *vp, const double *I0, const double *I1,\n",function_name); + fprintf(code," double c2, const double *I2, double c3, const double *I3, double c4, const double *I4,\n"); + fprintf(code," double c5, const double *I5, double c6, const double *I6, double c7, const double *I7, int ab_num)\n{\n"); + fprintf(code," int ab;\n"); + fprintf(code," const double CD0 = CD[0];\n"); + fprintf(code," const double CD1 = CD[1];\n"); + fprintf(code," const double CD2 = CD[2];\n"); + + nl = (am_in[1]*(am_in[1]+1))/2; + i0_step = (am_in[0]+2)*(am_in[0]+3)*nl/2; + i1_step = (am_in[0]+1)*(am_in[0]+2)*nl/2; + fprintf(code," for(ab=0;ab +#include +#include +#include + +extern FILE *outfile, *libint_src, *d1hrr_header; +extern LibderivParams_t Params; + +extern void punt(char *); + +void emit_d1hrr_build_macro() +{ + int new_am = Params.new_am; + int old_am = Params.old_am; + int am_to_inline = Params.max_am_to_inline_d1hrr_worker; + + FILE *code; + int p,q,r,s; + int ax,ay,az,bx,by,bz,cx,cy,cz,dx,dy,dz; + int i,j,nj,i_i0,i_i1; + int k,l,nl,k_i0,k_i1; + int i0_step,i1_step; + int a, b; + int flag; + int am_in[2]; + int class_size; + int la, lb; + int ld, lc, ld_max; + int curr_count,curr_subfunction; + int current_highest_am, to_inline; + int errcod; + char code_name[19]; + char function_name[17]; + + + for(lc=0;lc<=new_am;lc++) { + ld_max = (lc+1)/2; + for(ld=1;ld<=ld_max;ld++) { + + /*----------------------- + HRR on centers C and D + -----------------------*/ + + am_in[0] = lc-ld; + am_in[1] = ld; + + /* Is this function to be made inline */ + current_highest_am = (am_in[0] > am_in[1]) ? am_in[0] : am_in[1]; + to_inline = (current_highest_am <= am_to_inline) ? 1 : 0; + if (!to_inline) + continue; + + sprintf(function_name,"d1hrr3_build_%c%c",am_letter[am_in[0]],am_letter[am_in[1]]); + sprintf(code_name,"d1hrr3_build_%c%c.h",am_letter[am_in[0]],am_letter[am_in[1]]); + code = fopen(code_name,"w"); + + fprintf(code,"#ifndef _libderiv_%s\n",function_name); + fprintf(code,"#define _libderiv_%s\n",function_name); + fprintf(code," /* This machine-generated function computes a quartet of |%c%c) first derivative ERIs */\n\n", + am_letter[am_in[0]],am_letter[am_in[1]]); + fprintf(code,"#define %s(CD,vp,I0,I1,c2,I2,c3,I3,c4,I4,c5,I5,c6,I6,c7,I7,ab_num)\\\n{\\\n",function_name); + fprintf(code," int ab;\\\n"); + fprintf(code," const double CD0 = CD[0];\\\n"); + fprintf(code," const double CD1 = CD[1];\\\n"); + fprintf(code," const double CD2 = CD[2];\\\n"); + fprintf(code," double *II0 = I0;\\\n"); + fprintf(code," double *II1 = I1;\\\n"); + fprintf(code," double *II2 = I2;\\\n"); + fprintf(code," double *II3 = I3;\\\n"); + fprintf(code," double *II4 = I4;\\\n"); + fprintf(code," double *II5 = I5;\\\n"); + fprintf(code," double *II6 = I6;\\\n"); + fprintf(code," double *II7 = I7;\\\n"); + fprintf(code," double *target = vp;\\\n\\\n"); + + nl = (am_in[1]*(am_in[1]+1))/2; + i0_step = (am_in[0]+2)*(am_in[0]+3)*nl/2; + i1_step = (am_in[0]+1)*(am_in[0]+2)*nl/2; + fprintf(code," for(ab=0;ab +#include +#include +#include +#include +#include +#include + +#define MAXNODE 10000 +#define MAX_NUM_TARGET_VRR_NODES 2000 +#define NONODE -1000000 +#define NUMPARENTS 40 + +static int last_hrr_node = 0; /* Global pointer to the last node on the HRR stack */ +static int last_vrr_node = 0; /* Global pointer to the last node on the VRR stack */ + +extern FILE *outfile, *d1hrr_header, *init_code; +extern int libderiv12_stack_size[MAX_AM/2+1]; +extern LibderivParams_t Params; + +typedef struct node{ + int A, B, C, D; /* Angular momenta on centers A and C */ + int m; + int deriv_lvl; /* Derivative level */ + int deriv_ind[12]; /* Derivative indices along each of nuclear coordinates */ + int size; /* Class size in double words */ + int pointer; + int children[8]; /* Up to 8 children of the class */ + int parents_counter; + int num_parents; /* Number of parents */ + int parents[NUMPARENTS]; /* Pointers to parents */ + int llink; /* Pointer to a class computed right before computing this one */ + int rlink; /* Pointer to a class to be computed after this one is */ + int marked; /* Flag indicating that this node has been computed */ + int target; /* Flag indicating that this node is among targets */ + } class; + +static int first_hrr_to_compute = 0; /* Number of the first class to be computed + (pointer to the beginning of the linked list) */ +static int first_vrr_to_compute = 0; /* Number of the first class to be computed + (pointer to the beginning of the linked list) */ + +/*--- This is the maximum ang. momentum allowed for any (intermediate) classes ---*/ +#define LMAX_AM LIBINT_MAX_AM+1 +static int hrr_hash_table[2*LMAX_AM][2*LMAX_AM][2*LMAX_AM][2*LMAX_AM]; +static int vrr_hash_table[2*LMAX_AM][2*LMAX_AM][4*LMAX_AM]; + +extern void punt(char *); +static int mk_dhrr_node(class node, class *allnodes, int new); +static int mk_deriv_node(class node, class *allnodes, int new); +static void mark_dhrr_parents(int n, class *allnodes, int rent); +static void mark_vrr_parents(int n, class *allnodes, int rent); +static void mark_parents(int n, class *allnodes, int rent); +static int alloc_mem_dhrr(class *nodes); +static int alloc_mem_vrr(class *nodes); + +static void get_deriv_indices(class *node,int * di, int *dj); + +void emit_deriv12_managers() +{ + int new_am = Params.new_am12; + int old_am = Params.old_am; + int am_to_inline_into_hrr = Params.max_am_to_inline_vrr_manager; + int am_to_inline_vrr = Params.max_am_manager_to_inline_vrr_worker; + int am_to_inline_hrr = Params.max_am_manager_to_inline_hrr_worker; + int am_to_inline_deriv = Params.max_am_manager_to_inline_deriv_worker; + int am_to_inline_d1hrr = Params.max_am_manager_to_inline_d1hrr_worker; + int to_inline_into_hrr, to_inline_vrr, to_inline_hrr, to_inline_deriv, to_inline_d1hrr; + + int i, j, k, l; + int di, dj, dk, dl; + int la, lc, lc_min, ld, ld_max, ld_min; + int lb, lb_min, lb_max; + int current_highest_am; + int max_node_am; + int last_mem; + int child0, child1, child; + int num_children; + int offset; + + class nodes[MAXNODE]; /* Stack of nodes */ + class *hrr_nodes = &(nodes[0]); + class *vrr_nodes; + int target_data; + int done; + int max_stack_size = 0; + + int target_hrr_nodes[144+12]; /* List of unique targets on the top of HRR tree (144 second derivatives + 12 first derivatives + 1 ERI) */ + int target_d2hrr_nodes[12][12]; /* This is used to refer to second derivative targets only */ + int target_d1hrr_nodes[12]; /* This is used to refer to first derivative targets only */ + int num_hrr_targets; + int first_empty_slot; + + int target_vrr_nodes[MAX_NUM_TARGET_VRR_NODES]; + int num_vrr_targets; + char hrr_code_name[80]; + char hrr_function_name[80]; + char vrr_code_name[80]; + char vrr_function_name[80]; + char inline_vrr_list_name[80]; + char inline_hrr_list_name[80]; + FILE *hrr_code, *vrr_code, *inline_vrr_list, *inline_hrr_list; + + + for(la=0;la<=new_am;la++) { + lb_max = la/2; + lb_min = (la <= new_am/2) ? 0 : la - new_am/2; + lc_min = la; + for(lb=lb_min;lb<=lb_max;lb++) { + for(lc=lc_min;lc<=new_am;lc++) { + ld_max = lc/2; + ld_min = (lc <= new_am/2) ? 0 : lc - new_am/2; + for(ld=ld_min;ld<=ld_max;ld++) { + + current_highest_am = (la-lb > lb) ? la-lb : lb; + current_highest_am = (current_highest_am > lc-ld) ? current_highest_am : lc-ld; + current_highest_am = (current_highest_am > ld) ? current_highest_am : ld; + to_inline_into_hrr = (current_highest_am <= am_to_inline_into_hrr) ? 1 : 0; + to_inline_vrr = (current_highest_am <= am_to_inline_vrr) ? 1 : 0; + to_inline_hrr = (current_highest_am <= am_to_inline_hrr) ? 1 : 0; + to_inline_deriv = (current_highest_am <= am_to_inline_deriv) ? 1 : 0; + to_inline_d1hrr = (current_highest_am <= am_to_inline_d1hrr) ? 1 : 0; + + /*--------------------------------------------------------------- + Form code and function names for HRR and VRR ordering routines + ---------------------------------------------------------------*/ + sprintf(hrr_function_name,"d12hrr_order_%c%c%c%c", + am_letter[la-lb], + am_letter[lb], + am_letter[lc-ld], + am_letter[ld]); + sprintf(vrr_function_name,"d12vrr_order_%c%c%c%c", + am_letter[la-lb], + am_letter[lb], + am_letter[lc-ld], + am_letter[ld]); + sprintf(hrr_code_name,"%s.cc",hrr_function_name); + if (to_inline_into_hrr) + sprintf(vrr_code_name,"%s.h",vrr_function_name); + else + sprintf(vrr_code_name,"%s.cc",vrr_function_name); + sprintf(inline_vrr_list_name,"inline_%s.h",vrr_function_name); + sprintf(inline_hrr_list_name,"inline_%s.h",hrr_function_name); + hrr_code = fopen(hrr_code_name,"w"); + vrr_code = fopen(vrr_code_name,"w"); + inline_vrr_list = fopen(inline_vrr_list_name,"w"); + inline_hrr_list = fopen(inline_hrr_list_name,"w"); + + /*----------------------------------- + Write the overhead to the HRR code + -----------------------------------*/ + fprintf(hrr_code,"#include \n"); + fprintf(hrr_code,"#include \n"); + fprintf(hrr_code,"#include \n"); + fprintf(hrr_code,"#include \"libderiv.h\"\n"); + if (to_inline_hrr) + fprintf(hrr_code,"#define INLINE_HRR_WORKER\n"); + if (to_inline_d1hrr) + fprintf(hrr_code,"#define INLINE_D1HRR_WORKER\n"); + if (to_inline_hrr || to_inline_d1hrr) + fprintf(hrr_code,"#include \"%s\"\n",inline_hrr_list_name); + fprintf(hrr_code,"#include \n\n"); + fprintf(hrr_code,"#include \"d1hrr_header.h\"\n\n"); + if (to_inline_into_hrr) + fprintf(hrr_code,"#include \"%s\"\n",vrr_code_name); + else + fprintf(hrr_code,"extern void %s(Libderiv_t *, prim_data *);\n\n",vrr_function_name); + fprintf(hrr_code," /* Computes derivatives of (%c%c|%c%c) integrals */\n\n", + am_letter[la-lb],am_letter[lb],am_letter[lc-ld],am_letter[ld]); + fprintf(hrr_code,"void %s(Libderiv_t *Libderiv, int num_prim_comb)\n{\n",hrr_function_name); + fprintf(hrr_code," prim_data *Data = Libderiv->PrimQuartet;\n"); + fprintf(hrr_code," double *int_stack = Libderiv->int_stack;\n"); + fprintf(hrr_code," double *zero_stack = Libderiv->zero_stack;\n"); + fprintf(hrr_code," int i,j;\n double tmp, *target;\n\n"); + + /*----------------------------------------------------------------- + Include the function into the dhrr_header.h and init_libderiv.cc + -----------------------------------------------------------------*/ + fprintf(d1hrr_header,"void %s(Libderiv_t *, int);\n",hrr_function_name); + fprintf(init_code," build_deriv12_eri[%d][%d][%d][%d] = %s;\n",la-lb,lb,lc-ld,ld,hrr_function_name); + + /*----------------------------------- + Write the overhead to the VRR code + -----------------------------------*/ + fprintf(vrr_code,"#include \n"); + fprintf(vrr_code,"#include \n"); + fprintf(vrr_code,"#include \"libderiv.h\"\n"); + if (to_inline_vrr) + fprintf(vrr_code,"#define INLINE_VRR_WORKER\n"); + if (to_inline_deriv) + fprintf(vrr_code,"#define INLINE_DERIV_WORKER\n"); + if (to_inline_hrr) + fprintf(vrr_code,"#define INLINE_HRR_WORKER\n"); + if (to_inline_vrr || to_inline_deriv || to_inline_hrr) + fprintf(vrr_code,"#include \"%s\"\n",inline_vrr_list_name); + fprintf(vrr_code,"#include \n"); + fprintf(vrr_code,"#include \n"); + fprintf(vrr_code,"#include \"deriv_header.h\"\n\n"); + fprintf(vrr_code," /* Computes quartets necessary to compute derivatives of (%c%c|%c%c) integrals */\n\n", + am_letter[la-lb],am_letter[lb],am_letter[lc-ld],am_letter[ld]); + if (to_inline_into_hrr) + fprintf(vrr_code,"inline "); + fprintf(vrr_code,"void %s(Libderiv_t *Libderiv, prim_data *Data)\n{\n",vrr_function_name); + + + /*-------------------------------------------------- + Starting at the target node(s) set up an HRR graph. + --------------------------------------------------*/ + last_hrr_node = 0; + num_hrr_targets=0; + + /*--- First add second derivative ERIs ---*/ + for(di=0;di<12;di++) { /* Now USING translational invariance here */ + if (di<3 || di>5) + for(dj=di;dj<12;dj++) + if (dj<3 || dj>5) + { + target_hrr_nodes[num_hrr_targets] = last_hrr_node; + hrr_nodes[last_hrr_node].A = la-lb; + hrr_nodes[last_hrr_node].B = lb; + hrr_nodes[last_hrr_node].C = lc-ld; + hrr_nodes[last_hrr_node].D = ld; + hrr_nodes[last_hrr_node].m = 0; + hrr_nodes[last_hrr_node].deriv_lvl = 2; + for(dk=0;dk<12;dk++) + hrr_nodes[last_hrr_node].deriv_ind[dk] = 0; + hrr_nodes[last_hrr_node].deriv_ind[di] += 1; + hrr_nodes[last_hrr_node].deriv_ind[dj] += 1; + first_hrr_to_compute = last_hrr_node; + k = mk_dhrr_node(hrr_nodes[last_hrr_node], hrr_nodes, 1); + if (k == first_hrr_to_compute) { /* If the node hasn't been added to the tree before */ + if (num_hrr_targets) { + hrr_nodes[target_hrr_nodes[num_hrr_targets-1]].llink = first_hrr_to_compute; + hrr_nodes[first_hrr_to_compute].rlink = target_hrr_nodes[num_hrr_targets-1]; + hrr_nodes[first_hrr_to_compute].llink = -1; + } + else { + hrr_nodes[first_hrr_to_compute].rlink = -1; + hrr_nodes[first_hrr_to_compute].llink = -1; + } + num_hrr_targets++; + } + hrr_nodes[k].target = 1; + } + } + +#if 1 + /*--- Now add first derivative ERIs ---*/ + for(di=0;di<12;di++) + if (di<3 || di>5) { + target_hrr_nodes[num_hrr_targets] = last_hrr_node; + hrr_nodes[last_hrr_node].A = la-lb; + hrr_nodes[last_hrr_node].B = lb; + hrr_nodes[last_hrr_node].C = lc-ld; + hrr_nodes[last_hrr_node].D = ld; + hrr_nodes[last_hrr_node].m = 0; + hrr_nodes[last_hrr_node].deriv_lvl = 1; + for(dk=0;dk<12;dk++) + hrr_nodes[last_hrr_node].deriv_ind[dk] = 0; + hrr_nodes[last_hrr_node].deriv_ind[di] += 1; + first_hrr_to_compute = last_hrr_node; + k = mk_dhrr_node(hrr_nodes[last_hrr_node], hrr_nodes, 1); + if (k == first_hrr_to_compute) { /* If the node hasn't been added to the tree before */ + if (num_hrr_targets) { + hrr_nodes[target_hrr_nodes[num_hrr_targets-1]].llink = first_hrr_to_compute; + hrr_nodes[first_hrr_to_compute].rlink = target_hrr_nodes[num_hrr_targets-1]; + hrr_nodes[first_hrr_to_compute].llink = -1; + } + else { + hrr_nodes[first_hrr_to_compute].rlink = -1; + hrr_nodes[first_hrr_to_compute].llink = -1; + } + num_hrr_targets++; + } + hrr_nodes[k].target = 1; + } +#endif + + /*------------------------------------------- + Traverse the graph starting at each target + -------------------------------------------*/ + for(i=0;i0){ + mark_dhrr_parents(hrr_nodes[j].children[k], hrr_nodes, j); + } + } + + /* Empirically determined that it's better to start with a small stack */ + init_mem(1); + + + /*--------------------------------------------------------------- + Allocate and zero out space for classes to be generated by VRR + ---------------------------------------------------------------*/ + for(i=last_hrr_node-1;i>=0;i--) { + if (hrr_nodes[i].B == 0 && hrr_nodes[i].D == 0) { + hrr_nodes[i].marked = 1; + hrr_nodes[i].pointer = get_mem(hrr_nodes[i].size); + get_deriv_indices(&hrr_nodes[i],&di,&dj); + if (hrr_nodes[i].deriv_lvl == 0) + fprintf(hrr_code," Libderiv->dvrr_classes[%d][%d] = int_stack + %d;\n", + hrr_nodes[i].A, hrr_nodes[i].C, hrr_nodes[i].pointer); + else if (hrr_nodes[i].deriv_lvl == 1) { + fprintf(hrr_code," Libderiv->deriv_classes[%d][%d][%d] = int_stack + %d;\n", + hrr_nodes[i].A, hrr_nodes[i].C, di, hrr_nodes[i].pointer); + } + else if (hrr_nodes[i].deriv_lvl == 2) { + fprintf(hrr_code," Libderiv->deriv2_classes[%d][%d][%d] = int_stack + %d;\n", + hrr_nodes[i].A, hrr_nodes[i].C, di*12+dj, hrr_nodes[i].pointer); + } + else { + punt("deriv_lvl = 3\n"); + } + } + } + fprintf(hrr_code," memset(int_stack,0,%ld);\n\n",get_total_memory()*sizeof(double)); + + + /*---------------------------- + Build the HRR call sequence + ----------------------------*/ + if (lb != 0 || ld != 0) { + target_data = alloc_mem_dhrr(hrr_nodes); + } + + + last_mem = get_total_memory(); + fprintf(hrr_code," Libderiv->dvrr_stack = int_stack + %d;\n",last_mem); + fprintf(hrr_code," for(i=0;i 0 || hrr_nodes[j].D > 0) { + /*--- compute the number of children ---*/ + num_children = 0; + for(i=0;i<8;i++) + if (hrr_nodes[j].children[i] > 0) + num_children++; + + if (hrr_nodes[j].B == 0 && hrr_nodes[j].D != 0) { + offset = 6; + if (num_children > 2) { + fprintf(hrr_code, " d1hrr3_build_%c%c(Libderiv->CD,int_stack+%d,", + am_letter[hrr_nodes[j].C], am_letter[hrr_nodes[j].D], hrr_nodes[j].pointer); + /* Add this function to the list of inlined functions if necessary */ + max_node_am = (hrr_nodes[j].C > hrr_nodes[j].D) ? hrr_nodes[j].C : hrr_nodes[j].D; + if (to_inline_d1hrr && max_node_am <= Params.max_am_to_inline_d1hrr_worker) + fprintf(inline_hrr_list,"#include \"d1hrr3_build_%c%c.h\"\n", am_letter[hrr_nodes[j].C], am_letter[hrr_nodes[j].D]); + } + else { + fprintf(hrr_code, " hrr3_build_%c%c(Libderiv->CD,int_stack+%d,", + am_letter[hrr_nodes[j].C], am_letter[hrr_nodes[j].D], hrr_nodes[j].pointer); + /* Add this function to the list of inlined functions if necessary */ + max_node_am = (hrr_nodes[j].C > hrr_nodes[j].D) ? hrr_nodes[j].C : hrr_nodes[j].D; + if (to_inline_hrr && max_node_am <= Params.max_am_to_inline_hrr_worker) + fprintf(inline_hrr_list,"#include \n", + am_letter[hrr_nodes[j].C], am_letter[hrr_nodes[j].D]); + } + } + else if (hrr_nodes[j].B != 0) { + offset = 0; + if (num_children > 2) { + fprintf(hrr_code, " d1hrr1_build_%c%c(Libderiv->AB,int_stack+%d,", + am_letter[hrr_nodes[j].A], am_letter[hrr_nodes[j].B], hrr_nodes[j].pointer); + /* Add this function to the list of inlined functions if necessary */ + max_node_am = (hrr_nodes[j].A > hrr_nodes[j].B) ? hrr_nodes[j].A : hrr_nodes[j].B; + if (to_inline_d1hrr && max_node_am <= Params.max_am_to_inline_d1hrr_worker) + fprintf(inline_hrr_list,"#include \"d1hrr1_build_%c%c.h\"\n", am_letter[hrr_nodes[j].A], am_letter[hrr_nodes[j].B]); + } + else { + fprintf(hrr_code, " hrr1_build_%c%c(Libderiv->AB,int_stack+%d,", + am_letter[hrr_nodes[j].A], am_letter[hrr_nodes[j].B], hrr_nodes[j].pointer); + /* Add this function to the list of inlined functions if necessary */ + max_node_am = (hrr_nodes[j].A > hrr_nodes[j].B) ? hrr_nodes[j].A : hrr_nodes[j].B; + if (to_inline_hrr && max_node_am <= Params.max_am_to_inline_hrr_worker) + fprintf(inline_hrr_list,"#include \n", am_letter[hrr_nodes[j].A], am_letter[hrr_nodes[j].B]); + } + } + + /*--- If the first child is one of VRR derivative classes - need to compute its location ---*/ + child0 = hrr_nodes[j].children[0]; + fprintf(hrr_code, "int_stack+%d,",hrr_nodes[child0].pointer); + + /*--- If the second child is one of VRR derivative classes - need to compute its location ---*/ + child1 = hrr_nodes[j].children[1]; + fprintf(hrr_code, "int_stack+%d,",hrr_nodes[child1].pointer); + + /*--- Now go through the rest of the children ---*/ + if (num_children > 2) + for(i=0;i<6;i++) { + if (hrr_nodes[j].children[i+2] > 0) { + child = hrr_nodes[j].children[i+2]; + fprintf(hrr_code, " %.1lf, int_stack+%d,", + (double) hrr_nodes[j].deriv_ind[offset+i], + hrr_nodes[child].pointer); + } + else + fprintf(hrr_code, " 0.0, zero_stack,"); + } + + + if (hrr_nodes[j].B == 0 && hrr_nodes[j].D != 0) + fprintf(hrr_code, "%d);\n", io(1+hrr_nodes[j].A)*io(1+hrr_nodes[j].B)); + else if (hrr_nodes[j].B != 0) + fprintf(hrr_code, "%d);\n", io(1+hrr_nodes[j].C)*io(1+hrr_nodes[j].D)); + + } + + /* Pass the "target" quartets to CINTS */ + if (hrr_nodes[j].target) { + get_deriv_indices(&hrr_nodes[j],&di,&dj); + if (hrr_nodes[j].deriv_lvl == 1) + fprintf(hrr_code," Libderiv->ABCD[%d] = int_stack + %d;\n",di,hrr_nodes[j].pointer); + else if (hrr_nodes[j].deriv_lvl == 2) + fprintf(hrr_code," Libderiv->ABCD[%d] = int_stack + %d;\n",12+di*12+dj,hrr_nodes[j].pointer); + else + punt("deriv_lvl = 3\n"); + } + j = hrr_nodes[j].rlink; + } while (j != -1); + + fprintf(hrr_code,"\n}\n"); + fclose(hrr_code); + fclose(inline_hrr_list); + printf("Done with %s\n",hrr_code_name); + for(i=0;i= MAX_NUM_TARGET_VRR_NODES) + punt("Number of VRR targets has exceeded the hardwired maximum MAX_NUM_TARGET_VRR_NODES\n"); + for(i=0;i0){ + mark_parents(vrr_nodes[j].children[k], vrr_nodes, j); + } + } + } + + /* Empirically determined that it's better to start with a small stack */ + init_mem(1); + + /* Build the call sequence */ + target_data = alloc_mem_vrr(vrr_nodes); + last_mem += get_total_memory(); + if (max_stack_size < last_mem) + max_stack_size = last_mem; + fprintf(vrr_code," double *dvrr_stack = Libderiv->dvrr_stack;\n double *tmp, *target_ptr;\n"); + fprintf(vrr_code," int i, am[2];\n"); + + j = first_vrr_to_compute; + do { + fprintf(vrr_code, " /* compute (%d %d | %d %d) m=%d deriv level %d */\n", + vrr_nodes[j].A,vrr_nodes[j].B, + vrr_nodes[j].C,vrr_nodes[j].D, + vrr_nodes[j].m, vrr_nodes[j].deriv_lvl); + fprintf(vrr_code, " /* deriv_ind: %d %d %d %d %d %d %d %d %d %d %d %d */\n", + vrr_nodes[j].deriv_ind[0], vrr_nodes[j].deriv_ind[1], vrr_nodes[j].deriv_ind[2], + vrr_nodes[j].deriv_ind[3], vrr_nodes[j].deriv_ind[4], vrr_nodes[j].deriv_ind[5], + vrr_nodes[j].deriv_ind[6], vrr_nodes[j].deriv_ind[7], vrr_nodes[j].deriv_ind[8], + vrr_nodes[j].deriv_ind[9], vrr_nodes[j].deriv_ind[10], vrr_nodes[j].deriv_ind[11]); + + /*--------------------------------------------------------- + Decide which routine to use to compute the current class + ---------------------------------------------------------*/ + if (vrr_nodes[j].deriv_lvl) { /*--- use build_deriv ---*/ + fprintf(vrr_code, " deriv_build_"); + get_deriv_indices(&vrr_nodes[j],&di,&dj); + if (vrr_nodes[j].deriv_lvl == 2 && vrr_nodes[j].target == 0) + punt("There's a non-target second derivative class\n"); + + switch (di) { + case 0: case 1: case 2: + fprintf(vrr_code, "A%c_%c(Data,%d,",cart_comp[di],am_letter[vrr_nodes[j].A], + io(1+vrr_nodes[j].B)*io(1+vrr_nodes[j].C)*io(1+vrr_nodes[j].D)); + /* Add this function to the list of inlined functions if necessary */ + max_node_am = vrr_nodes[j].A; + if (to_inline_deriv && max_node_am <= Params.max_am_to_inline_deriv_worker) + fprintf(inline_vrr_list,"#include \"deriv_build_A%c_%c.h\"\n", + cart_comp[di], am_letter[vrr_nodes[j].A]); + break; + + case 3: case 4: case 5: + fprintf(vrr_code, "B%c_%c(Data,%d,%d,",cart_comp[di-3],am_letter[vrr_nodes[j].B], + io(1+vrr_nodes[j].A),io(1+vrr_nodes[j].C)*io(1+vrr_nodes[j].D)); + /* Add this function to the list of inlined functions if necessary */ + max_node_am = vrr_nodes[j].B; + if (to_inline_deriv && max_node_am <= Params.max_am_to_inline_deriv_worker) + fprintf(inline_vrr_list,"#include \"deriv_build_B%c_%c.h\"\n", + cart_comp[di-3], am_letter[vrr_nodes[j].B]); + break; + + case 6: case 7: case 8: + fprintf(vrr_code, "C%c_%c(Data,%d,%d,",cart_comp[di-6],am_letter[vrr_nodes[j].C], + io(1+vrr_nodes[j].A)*io(1+vrr_nodes[j].B),io(1+vrr_nodes[j].D)); + /* Add this function to the list of inlined functions if necessary */ + max_node_am = vrr_nodes[j].C; + if (to_inline_deriv && max_node_am <= Params.max_am_to_inline_deriv_worker) + fprintf(inline_vrr_list,"#include \"deriv_build_C%c_%c.h\"\n", + cart_comp[di-6], am_letter[vrr_nodes[j].C]); + break; + + case 9: case 10: case 11: + fprintf(vrr_code, "D%c_%c(Data,%d,",cart_comp[di-9],am_letter[vrr_nodes[j].D], + io(1+vrr_nodes[j].A)*io(1+vrr_nodes[j].B)*io(1+vrr_nodes[j].C)); + /* Add this function to the list of inlined functions if necessary */ + max_node_am = vrr_nodes[j].D; + if (to_inline_deriv && max_node_am <= Params.max_am_to_inline_deriv_worker) + fprintf(inline_vrr_list,"#include \"deriv_build_D%c_%c.h\"\n", + cart_comp[di-9], am_letter[vrr_nodes[j].D]); + break; + } + + fprintf(vrr_code, "dvrr_stack+%d", vrr_nodes[j].pointer); + for(k=0; k<2; k++){ + if(vrr_nodes[j].children[k] > 0) + fprintf(vrr_code, ", dvrr_stack+%d", vrr_nodes[vrr_nodes[j].children[k]].pointer); + else if (vrr_nodes[j].children[k] == NONODE) + fprintf(vrr_code, ", NULL"); + else + fprintf(vrr_code, ", Data->F+%d", (-1)*vrr_nodes[j].children[k]); + } + fprintf(vrr_code, ");\n"); + } + else if (vrr_nodes[j].B + vrr_nodes[j].D > 0) { /*--- build_hrr ---*/ + if (vrr_nodes[j].B == 0 && vrr_nodes[j].D != 0) { + fprintf(vrr_code, " hrr3_build_%c%c(Libderiv->CD,dvrr_stack+%d,dvrr_stack+%d,", + am_letter[vrr_nodes[j].C], am_letter[vrr_nodes[j].D], vrr_nodes[j].pointer, + vrr_nodes[vrr_nodes[j].children[0]].pointer); + if (vrr_nodes[j].children[1] > 0) + fprintf(vrr_code, "dvrr_stack+%d,%d);\n\n", vrr_nodes[vrr_nodes[j].children[1]].pointer, + io(1+vrr_nodes[j].A)*io(1+vrr_nodes[j].B)); + else + fprintf(vrr_code, "Data->F,%d);\n\n", io(1+vrr_nodes[j].A)*io(1+vrr_nodes[j].B)); + /* Add this function to the list of inlined functions if necessary */ + max_node_am = (vrr_nodes[j].C > vrr_nodes[j].D) ? vrr_nodes[j].C : vrr_nodes[j].D; + if (to_inline_hrr && max_node_am <= Params.max_am_to_inline_hrr_worker) + fprintf(inline_vrr_list,"#include \n", am_letter[vrr_nodes[j].C], am_letter[vrr_nodes[j].D]); + } + else if (vrr_nodes[j].B != 0) { + fprintf(vrr_code, " hrr1_build_%c%c(Libderiv->AB,dvrr_stack+%d,dvrr_stack+%d,", + am_letter[vrr_nodes[j].A], am_letter[vrr_nodes[j].B], vrr_nodes[j].pointer, + vrr_nodes[vrr_nodes[j].children[0]].pointer); + if (vrr_nodes[j].children[1] > 0) + fprintf(vrr_code, "dvrr_stack+%d,%d);\n\n", vrr_nodes[vrr_nodes[j].children[1]].pointer, + io(1+vrr_nodes[j].C)*io(1+vrr_nodes[j].D)); + else + fprintf(vrr_code, "Data->F,%d);\n", io(1+vrr_nodes[j].C)*io(1+vrr_nodes[j].D)); + /* Add this function to the list of inlined functions if necessary */ + max_node_am = (vrr_nodes[j].A > vrr_nodes[j].B) ? vrr_nodes[j].A : vrr_nodes[j].B; + if (to_inline_hrr && max_node_am <= Params.max_am_to_inline_hrr_worker) + fprintf(inline_vrr_list,"#include \n", am_letter[vrr_nodes[j].A], am_letter[vrr_nodes[j].B]); + } + } + else { /*--- build_vrr ---*/ + if (vrr_nodes[j].A <= LIBINT_OPT_AM && vrr_nodes[j].C <= LIBINT_OPT_AM) { + fprintf(vrr_code, " _BUILD_%c0%c0(Data,", am_letter[vrr_nodes[j].A], am_letter[vrr_nodes[j].C]); + /* Add this function to the list of inlined functions if necessary */ + max_node_am = (vrr_nodes[j].A > vrr_nodes[j].C) ? vrr_nodes[j].A : vrr_nodes[j].C; + if (to_inline_vrr && max_node_am <= Params.max_am_to_inline_vrr_worker) + fprintf(inline_vrr_list,"#include \n", am_letter[vrr_nodes[j].A], am_letter[vrr_nodes[j].C]); + } + else { + fprintf(vrr_code, " am[0] = %d; am[1] = %d;\n", vrr_nodes[j].A, vrr_nodes[j].C); + fprintf(vrr_code, " vrr_build_xxxx(am,Data,"); + } + fprintf(vrr_code, "dvrr_stack+%d", vrr_nodes[j].pointer); + for(k=0; k<5; k++){ + if(vrr_nodes[j].children[k] > 0) + fprintf(vrr_code, ", dvrr_stack+%d", vrr_nodes[vrr_nodes[j].children[k]].pointer); + else if (vrr_nodes[j].children[k] == NONODE) + fprintf(vrr_code, ", NULL"); + else + fprintf(vrr_code, ", Data->F+%d", (-1)*vrr_nodes[j].children[k]); + } + fprintf(vrr_code, ");\n"); + } + + /*----------------------------------------------- + If this derivative class is one of the targets + copy it to a location pointed by deriv_classes + to be used by the calling hrr_order routine + -----------------------------------------------*/ + if (vrr_nodes[j].target == 1) { + fprintf(vrr_code, " tmp = dvrr_stack + %d;\n", vrr_nodes[j].pointer); + get_deriv_indices(&vrr_nodes[j],&di,&dj); + if (vrr_nodes[j].deriv_lvl == 0) + fprintf(vrr_code, " target_ptr = Libderiv->dvrr_classes[%d][%d];\n", + vrr_nodes[j].A, vrr_nodes[j].C); + else if (vrr_nodes[j].deriv_lvl == 1) + fprintf(vrr_code, " target_ptr = Libderiv->deriv_classes[%d][%d][%d];\n", + vrr_nodes[j].A, vrr_nodes[j].C, di); + else if (vrr_nodes[j].deriv_lvl == 2) + fprintf(vrr_code, " target_ptr = Libderiv->deriv2_classes[%d][%d][%d];\n", + vrr_nodes[j].A, vrr_nodes[j].C, di*12+dj); + fprintf(vrr_code, " for(i=0;i<%d;i++)\n",vrr_nodes[j].size); + fprintf(vrr_code, " target_ptr[i] += tmp[i];\n\n"); + } + else + fprintf(vrr_code, "\n"); + + j = vrr_nodes[j].rlink; + } while (j != -1); + fprintf(vrr_code, "\n}\n\n"); + fclose(vrr_code); + fclose(inline_vrr_list); + printf("Done with %s\n",vrr_code_name); + for(i=0;i= MAXNODE) { + printf(" Maximum stack size is reached. Change MAXNODE and recompile.\n\n"); + exit(1); + } + } + + /* If the parent class wasn't on stack already (!new) - increase the parent counter */ + if(!new){ + allnodes[thisnode].num_parents++; + allnodes[thisnode].parents_counter++; + if (allnodes[thisnode].num_parents > NUMPARENTS) { + printf("Number of parents exceeds the limit\n"); + exit(1); + } + } + + + /* now make all child nodes */ + if (!made) { + if(node.B){ + O[0].A = node.A+1; + O[0].B = node.B-1; + O[0].C = node.C; + O[0].D = node.D; + O[0].m = node.m; + O[0].deriv_lvl = node.deriv_lvl; + memcpy(O[0].deriv_ind,node.deriv_ind,12*sizeof(int)); + allnodes[thisnode].children[0] = + mk_dhrr_node(O[0], allnodes, made); + O[1].A = node.A; + O[1].B = node.B-1; + O[1].C = node.C; + O[1].D = node.D; + O[1].m = node.m; + O[1].deriv_lvl = node.deriv_lvl; + memcpy(O[1].deriv_ind,node.deriv_ind,12*sizeof(int)); + allnodes[thisnode].children[1] = + mk_dhrr_node(O[1], allnodes, made); + for(i=0;i<6;i++) + if (node.deriv_ind[i]) { + O[2+i].A = node.A; + O[2+i].B = node.B-1; + O[2+i].C = node.C; + O[2+i].D = node.D; + O[2+i].m = node.m; + O[2+i].deriv_lvl = node.deriv_lvl-1; + memcpy(O[2+i].deriv_ind,node.deriv_ind,12*sizeof(int)); + O[2+i].deriv_ind[i]--; + allnodes[thisnode].children[2+i] = + mk_dhrr_node(O[2+i], allnodes, made); + } + } + else if(node.D){ + O[0].A = node.A; + O[0].B = node.B; + O[0].C = node.C+1; + O[0].D = node.D-1; + O[0].m = node.m; + O[0].deriv_lvl = node.deriv_lvl; + memcpy(O[0].deriv_ind,node.deriv_ind,12*sizeof(int)); + allnodes[thisnode].children[0] = + mk_dhrr_node(O[0], allnodes, made); + O[1].A = node.A; + O[1].B = node.B; + O[1].C = node.C; + O[1].D = node.D-1; + O[1].m = node.m; + O[1].deriv_lvl = node.deriv_lvl; + memcpy(O[1].deriv_ind,node.deriv_ind,12*sizeof(int)); + allnodes[thisnode].children[1] = + mk_dhrr_node(O[1], allnodes, made); + for(i=0;i<6;i++) + if (node.deriv_ind[i+6]) { + O[2+i].A = node.A; + O[2+i].B = node.B; + O[2+i].C = node.C; + O[2+i].D = node.D-1; + O[2+i].m = node.m; + O[2+i].deriv_lvl = node.deriv_lvl-1; + memcpy(O[2+i].deriv_ind,node.deriv_ind,12*sizeof(int)); + O[2+i].deriv_ind[i+6]--; + allnodes[thisnode].children[2+i] = + mk_dhrr_node(O[2+i], allnodes, made); + } + } + } + + return thisnode; + +} + + +/* Recursive function that builds a hybrid HRR/VRR/deriv subgraph given the parent */ + +static int mk_deriv_node(class node, class *allnodes, int new) +{ + + int i, j, k, l; + int di; + class O[5]; + int subnodes = 0; + int thisnode; + int rlink, llink; + int made = 0; + + /* If it's not a derivative class - do some checks to see if need to proceed */ + if (node.deriv_lvl == 0 && node.A + node.B + node.C + node.D == 0) + return (-1)*node.m; + + /* Search for the parent node on stack + If it's not there - we'll add it to the end of the stack */ + thisnode = last_vrr_node; + /* it's already placed on the stack allnodes - make sure children don't get created again (made = 1) */ + if (node.deriv_lvl != 0) { + for(i=0;i= MAXNODE) { + printf(" Maximum stack size is reached. Change MAXNODE and recompile.\n\n"); + exit(1); + } + } + + /* If the parent class wasn't on stack already (!new) - increase the parent counter */ + if(!new){ + allnodes[thisnode].num_parents++; + allnodes[thisnode].parents_counter++; + if (allnodes[thisnode].num_parents > NUMPARENTS) { + printf("Number of parents exceeds the limit\n"); + exit(1); + } + } + + + /* now make all child nodes */ + if (!made) { + /* derivative ERI */ + if (node.deriv_lvl) { + for(i=0;i<12;i++) { + if (node.deriv_ind[i] != 0) { + switch (i) { + case 0: case 1: case 2: + O[0].A = node.A+1; + O[0].B = node.B; + O[0].C = node.C; + O[0].D = node.D; + O[0].m = 0; + O[0].deriv_lvl = node.deriv_lvl-1; + for(di=0;di<12;di++) + O[0].deriv_ind[di] = node.deriv_ind[di]; + O[0].deriv_ind[i] = node.deriv_ind[i]-1; + allnodes[thisnode].children[0] = mk_deriv_node(O[0], allnodes, made); + if (node.A > 0) { + O[1].A = node.A-1; + O[1].B = node.B; + O[1].C = node.C; + O[1].D = node.D; + O[1].m = 0; + O[1].deriv_lvl = node.deriv_lvl-1; + for(di=0;di<12;di++) + O[1].deriv_ind[di] = node.deriv_ind[di]; + O[1].deriv_ind[i] = node.deriv_ind[i]-1; + allnodes[thisnode].children[1] = mk_deriv_node(O[1], allnodes, made); + } + break; + + case 3: case 4: case 5: + O[0].A = node.A; + O[0].B = node.B+1; + O[0].C = node.C; + O[0].D = node.D; + O[0].m = 0; + O[0].deriv_lvl = node.deriv_lvl-1; + for(di=0;di<12;di++) + O[0].deriv_ind[di] = node.deriv_ind[di]; + O[0].deriv_ind[i] = node.deriv_ind[i]-1; + allnodes[thisnode].children[0] = mk_deriv_node(O[0], allnodes, made); + if (node.B > 0) { + O[1].A = node.A; + O[1].B = node.B-1; + O[1].C = node.C; + O[1].D = node.D; + O[1].m = 0; + O[1].deriv_lvl = node.deriv_lvl-1; + for(di=0;di<12;di++) + O[1].deriv_ind[di] = node.deriv_ind[di]; + O[1].deriv_ind[i] = node.deriv_ind[i]-1; + allnodes[thisnode].children[1] = mk_deriv_node(O[1], allnodes, made); + } + break; + + case 6: case 7: case 8: + O[0].A = node.A; + O[0].B = node.B; + O[0].C = node.C+1; + O[0].D = node.D; + O[0].m = 0; + O[0].deriv_lvl = node.deriv_lvl-1; + for(di=0;di<12;di++) + O[0].deriv_ind[di] = node.deriv_ind[di]; + O[0].deriv_ind[i] = node.deriv_ind[i]-1; + allnodes[thisnode].children[0] = mk_deriv_node(O[0], allnodes, made); + if (node.C > 0) { + O[1].A = node.A; + O[1].B = node.B; + O[1].C = node.C-1; + O[1].D = node.D; + O[1].m = 0; + O[1].deriv_lvl = node.deriv_lvl-1; + for(di=0;di<12;di++) + O[1].deriv_ind[di] = node.deriv_ind[di]; + O[1].deriv_ind[i] = node.deriv_ind[i]-1; + allnodes[thisnode].children[1] = mk_deriv_node(O[1], allnodes, made); + } + break; + + case 9: case 10: case 11: + O[0].A = node.A; + O[0].B = node.B; + O[0].C = node.C; + O[0].D = node.D+1; + O[0].m = 0; + O[0].deriv_lvl = node.deriv_lvl-1; + for(di=0;di<12;di++) + O[0].deriv_ind[di] = node.deriv_ind[di]; + O[0].deriv_ind[i] = node.deriv_ind[i]-1; + allnodes[thisnode].children[0] = mk_deriv_node(O[0], allnodes, made); + if (node.D > 0) { + O[1].A = node.A; + O[1].B = node.B; + O[1].C = node.C; + O[1].D = node.D-1; + O[1].m = 0; + O[1].deriv_lvl = node.deriv_lvl-1; + for(di=0;di<12;di++) + O[1].deriv_ind[di] = node.deriv_ind[di]; + O[1].deriv_ind[i] = node.deriv_ind[i]-1; + allnodes[thisnode].children[1] = mk_deriv_node(O[1], allnodes, made); + } + break; + } + break; + } + } + } + /* HRR case */ + else if (node.B + node.D != 0) { + if(node.B){ + O[0].A = node.A+1; + O[0].B = node.B-1; + O[0].C = node.C; + O[0].D = node.D; + O[0].m = node.m; + O[0].deriv_lvl = 0; + memset(O[0].deriv_ind,0,12*sizeof(int)); + allnodes[thisnode].children[0] = mk_deriv_node(O[0], allnodes, made); + O[1].A = node.A; + O[1].B = node.B-1; + O[1].C = node.C; + O[1].D = node.D; + O[1].m = node.m; + O[1].deriv_lvl = 0; + memset(O[1].deriv_ind,0,12*sizeof(int)); + allnodes[thisnode].children[1] = mk_deriv_node(O[1], allnodes, made); + } + else if(node.D){ + O[0].A = node.A; + O[0].B = node.B; + O[0].C = node.C+1; + O[0].D = node.D-1; + O[0].m = node.m; + O[0].deriv_lvl = 0; + memset(O[0].deriv_ind,0,12*sizeof(int)); + allnodes[thisnode].children[0] = mk_deriv_node(O[0], allnodes, made); + O[1].A = node.A; + O[1].B = node.B; + O[1].C = node.C; + O[1].D = node.D-1; + O[1].m = node.m; + O[1].deriv_lvl = 0; + memset(O[1].deriv_ind,0,12*sizeof(int)); + allnodes[thisnode].children[1] = mk_deriv_node(O[1], allnodes, made); + } + } + /* VRR case */ + else { + if(node.A){ + O[0].A = node.A-1; + O[0].B = 0; + O[0].C = node.C; + O[0].D = 0; + O[0].m = node.m; + O[0].deriv_lvl = 0; + memset(O[0].deriv_ind,0,12*sizeof(int)); + allnodes[thisnode].children[0] = mk_deriv_node(O[0], allnodes, made); + O[1].A = node.A-1; + O[1].B = 0; + O[1].C = node.C; + O[1].D = 0; + O[1].m = node.m+1; + O[1].deriv_lvl = 0; + memset(O[1].deriv_ind,0,12*sizeof(int)); + allnodes[thisnode].children[1] = mk_deriv_node(O[1], allnodes, made); + if(node.A>1){ + O[2].A = node.A-2; + O[2].B = 0; + O[2].C = node.C; + O[2].D = 0; + O[2].m = node.m; + O[2].deriv_lvl = 0; + memset(O[2].deriv_ind,0,12*sizeof(int)); + allnodes[thisnode].children[2] = mk_deriv_node(O[2], allnodes, made); + O[3].A = node.A-2; + O[3].B = 0; + O[3].C = node.C; + O[3].D = 0; + O[3].m = node.m+1; + O[3].deriv_lvl = 0; + memset(O[3].deriv_ind,0,12*sizeof(int)); + allnodes[thisnode].children[3] = mk_deriv_node(O[3], allnodes, made); + } + if(node.C){ + O[4].A = node.A-1; + O[4].B = 0; + O[4].C = node.C-1; + O[4].D = 0; + O[4].m = node.m+1; + O[4].deriv_lvl = 0; + memset(O[4].deriv_ind,0,12*sizeof(int)); + allnodes[thisnode].children[4] = mk_deriv_node(O[4], allnodes, made); + } + } + else if(node.C){ + O[0].A = node.A; + O[0].B = 0; + O[0].C = node.C-1; + O[0].D = 0; + O[0].m = node.m; + O[0].deriv_lvl = 0; + memset(O[0].deriv_ind,0,12*sizeof(int)); + allnodes[thisnode].children[0] = mk_deriv_node(O[0], allnodes, made); + O[1].A = node.A; + O[1].B = 0; + O[1].C = node.C-1; + O[1].D = 0; + O[1].m = node.m+1; + O[1].deriv_lvl = 0; + memset(O[1].deriv_ind,0,12*sizeof(int)); + allnodes[thisnode].children[1] = mk_deriv_node(O[1], allnodes, made); + if(node.C>1){ + O[2].A = node.A; + O[2].B = 0; + O[2].C = node.C-2; + O[2].D = 0; + O[2].m = node.m; + O[2].deriv_lvl = 0; + memset(O[2].deriv_ind,0,12*sizeof(int)); + allnodes[thisnode].children[2] = mk_deriv_node(O[2], allnodes, made); + O[3].A = node.A; + O[3].B = 0; + O[3].C = node.C-2; + O[3].D = 0; + O[3].m = node.m+1; + O[3].deriv_lvl = 0; + memset(O[3].deriv_ind,0,12*sizeof(int)); + allnodes[thisnode].children[3] = mk_deriv_node(O[3], allnodes, made); + } + } + } + } + + return thisnode; + +} + + + +/* Make hrr_nodes[rent] a parent of hrr_nodes[n] and proceed recursively */ + +static void mark_dhrr_parents(int n, class *allnodes, int rent) +{ + int i; + int *tmp; + + /* handle case where it's in the parent list already */ + for(i=allnodes[n].num_parents-1; i>=allnodes[n].parents_counter; i--) + if(rent==allnodes[n].parents[i]) return; + + /* if the parent rent is not in the list - add it to the list! */ + i = --allnodes[n].parents_counter; + allnodes[n].parents[i] = rent; + /* hits from all of the parents has been received - schedule it for computation and mark all of its children */ + if (i == 0 && (allnodes[n].B != 0 || allnodes[n].D != 0)) { + allnodes[n].llink = -1; + allnodes[n].rlink = first_hrr_to_compute; + allnodes[first_hrr_to_compute].llink = n; + first_hrr_to_compute = n; + + for(i=0; i<8; i++) + if(allnodes[n].children[i]>0) + mark_dhrr_parents(allnodes[n].children[i], allnodes, n); + } + return; +} + + +/* Make vrr_nodes[rent] a parent of vrr_nodes[n] and proceed recursively */ + +static void mark_vrr_parents(int n, class *allnodes, int rent) +{ + int i; + int *tmp; + + /* handle case where it's in there already */ + for(i=allnodes[n].num_parents-1; i>=allnodes[n].parents_counter; i--) + if(rent==allnodes[n].parents[i]) return; + + + /* if the parent rent is not in the list - add it to the list! */ + i = --allnodes[n].parents_counter; + allnodes[n].parents[i] = rent; + /* hits from all of the parents has been received - schedule it for computation and mark all of its children */ + if (i == 0) { + allnodes[n].llink = -1; + allnodes[n].rlink = first_vrr_to_compute; + allnodes[first_vrr_to_compute].llink = n; + first_vrr_to_compute = n; + + for(i=0; i<5; i++) + if(allnodes[n].children[i]>0) + mark_vrr_parents(allnodes[n].children[i], allnodes, n); + + } + return; +} + + +static void mark_parents(int n, class *allnodes, int rent) +{ + int i; + int *tmp; + + /* handle case where it's in there already */ + for(i=allnodes[n].num_parents-1; i>=allnodes[n].parents_counter; i--) + if(rent==allnodes[n].parents[i]) return; + + + /* if the parent rent is not in the list - add it to the list! */ + i = --allnodes[n].parents_counter; + allnodes[n].parents[i] = rent; + /* hits from all of the parents has been received - schedule it for computation and mark all of its children */ + if (i == 0) { + allnodes[n].llink = -1; + allnodes[n].rlink = first_vrr_to_compute; + allnodes[first_vrr_to_compute].llink = n; + first_vrr_to_compute = n; + + for(i=0; i<5; i++) + if(allnodes[n].children[i]>0) + mark_vrr_parents(allnodes[n].children[i], allnodes, n); + + } + return; +} + + + +/* This functions controls memory placement of computed classes on the CINTS stack */ + +static int alloc_mem_dhrr(class *nodes) +{ + int i, j, k, l; + int size; + int child; + int free_it; + + j = first_hrr_to_compute; + do{ + /* Node to compute */ + if (nodes[j].marked == 0) { + nodes[j].marked = 1; /* sign that it has been passed */ + nodes[j].pointer = get_mem(nodes[j].size); /* Allocate memory for it on a CINTS-provided stack */ + } + + /* Figure out which children can be freed, + i.e. which children are not targets and have all parents marked */ + for(k=0; k<8; k++){ + child = nodes[j].children[k]; + if(child>0) + if (nodes[child].target == 0) { + free_it = 1; + for(l=0; l0){ + free_it = 1; + for(l=0; l= last_vrr_node) + punt("Linked list goes out of boundary\n"); + } while (j != -1); + + return nodes[0].pointer; +} + + +static void get_deriv_indices(class *node,int *di, int *dj) +{ + int i, j; + i = j = 0; + + switch(node->deriv_lvl) { + + case 0: + break; + + case 1: + for(i=0;i<12;i++) + if (node->deriv_ind[i] != 0) { + break; + } + i = i; + j = 0; + break; + + case 2: + for(i=0;i<12;i++) + if (node->deriv_ind[i] != 0) { + if (node->deriv_ind[i] == 2) { + j = i; + break; + } + else { + for(j=i+1;j<12;j++) + if (node->deriv_ind[j] != 0) + break; + break; + } + } + break; + } + + *di = i; *dj = j; + return; +} diff --git a/src/bin/libderiv/emit_deriv1_managers.c b/src/bin/libderiv/emit_deriv1_managers.c new file mode 100644 index 0000000..4cc5c79 --- /dev/null +++ b/src/bin/libderiv/emit_deriv1_managers.c @@ -0,0 +1,1326 @@ +/*------------------------------------------------------------------------------------------------------ + Builds a library of functions-calls for applying HRR and VRR + ------------------------------------------------------------------------------------------------------*/ + +#include +#include +#include +#include +#include +#include +#include + +#define MAXNODE 5000 +#define NONODE -1000000 +#define NUMPARENTS 21 + +static int last_hrr_node = 0; /* Global pointer to the last node on the HRR stack */ +static int last_vrr_node = 0; /* Global pointer to the last node on the VRR stack */ + +extern FILE *outfile, *d1hrr_header, *init_code; +extern int libderiv1_stack_size[MAX_AM/2+1]; +extern LibderivParams_t Params; + +typedef struct node{ + int A, B, C, D; /* Angular momenta on centers A and C */ + int m; + int deriv_lvl; /* Derivative level */ + int deriv_ind[12]; /* Derivative indices along each of nuclear coordinates */ + int size; /* Class size in double words */ + int pointer; + int children[8]; /* Up to 8 children of the class */ + int parents_counter; + int num_parents; /* Number of parents */ + int parents[NUMPARENTS]; /* Pointers to parents */ + int llink; /* Pointer to a class computed right before computing this one */ + int rlink; /* Pointer to a class to be computed after this one is */ + int marked; /* Flag indicating that this node has been computed */ + int target; /* Flag indicating that this node is among targets */ + } class; + +static int first_hrr_to_compute = 0; /* Number of the first class to be computed + (pointer to the beginning of the linked list) */ +static int first_vrr_to_compute = 0; /* Number of the first class to be computed + (pointer to the beginning of the linked list) */ + +/*--- This is the maximum ang. momentum allowed for any (intermediate) classes ---*/ +#define LMAX_AM LIBINT_MAX_AM+1 +static int hrr_hash_table[2*LMAX_AM][2*LMAX_AM][2*LMAX_AM][2*LMAX_AM]; +static int vrr_hash_table[2*LMAX_AM][2*LMAX_AM][4*LMAX_AM]; + +extern void punt(char *); +static int mk_dhrr_node(class node, class *allnodes, int new); +static int mk_deriv_node(class node, class *allnodes, int new); +static void mark_dhrr_parents(int n, class *allnodes, int rent); +static void mark_vrr_parents(int n, class *allnodes, int rent); +static void mark_parents(int n, class *allnodes, int rent); +static int alloc_mem_dhrr(class *nodes); +static int alloc_mem_vrr(class *nodes); + + +void emit_deriv1_managers() +{ + int new_am = Params.new_am1; + int old_am = Params.old_am; + int am_to_inline_into_hrr = Params.max_am_to_inline_vrr_manager; + int am_to_inline_vrr = Params.max_am_manager_to_inline_vrr_worker; + int am_to_inline_hrr = Params.max_am_manager_to_inline_hrr_worker; + int am_to_inline_deriv = Params.max_am_manager_to_inline_deriv_worker; + int am_to_inline_d1hrr = Params.max_am_manager_to_inline_d1hrr_worker; + int to_inline_into_hrr, to_inline_vrr, to_inline_hrr, to_inline_deriv, to_inline_d1hrr; + + int i, j, k, l; + int la, lc, lc_min, ld, ld_max, ld_min; + int lb, lb_min, lb_max; + int current_highest_am; + int max_node_am; + int last_mem; + int child0, child1, child; + int num_children; + int offset; + class nodes[MAXNODE]; /* Stack of nodes */ + class *hrr_nodes = &(nodes[0]); + class *vrr_nodes; + int target_data; + int done; + int max_stack_size = 0; + int target_hrr_nodes[12]; /* Array of unique targets on the HRR graph + (multiple targets are needed in derivative calculations) */ + int num_hrr_targets; + int target_vrr_nodes[1000]; + int num_vrr_targets; + char hrr_code_name[] = "d1hrr_order_0000.cc"; + char hrr_function_name[] = "d1hrr_order_0000"; + char vrr_code_name[] = "d1vrr_order_0000.cc"; + char vrr_function_name[] = "d1vrr_order_0000"; + char inline_vrr_list_name[] = "inline_d1vrr_order_0000.h"; + char inline_hrr_list_name[] = "inline_d1hrr_order_0000.h"; + FILE *hrr_code, *vrr_code, *inline_vrr_list, *inline_hrr_list; + + + for(la=0;la<=new_am;la++) { + lb_max = la/2; + lb_min = (la <= new_am/2) ? 0 : la - new_am/2; + lc_min = la; + for(lb=lb_min;lb<=lb_max;lb++) { + for(lc=lc_min;lc<=new_am;lc++) { + ld_max = lc/2; + ld_min = (lc <= new_am/2) ? 0 : lc - new_am/2; + for(ld=ld_min;ld<=ld_max;ld++) { + + current_highest_am = (la-lb > lb) ? la-lb : lb; + current_highest_am = (current_highest_am > lc-ld) ? current_highest_am : lc-ld; + current_highest_am = (current_highest_am > ld) ? current_highest_am : ld; + to_inline_into_hrr = (current_highest_am <= am_to_inline_into_hrr) ? 1 : 0; + to_inline_vrr = (current_highest_am <= am_to_inline_vrr) ? 1 : 0; + to_inline_hrr = (current_highest_am <= am_to_inline_hrr) ? 1 : 0; + to_inline_deriv = (current_highest_am <= am_to_inline_deriv) ? 1 : 0; + to_inline_d1hrr = (current_highest_am <= am_to_inline_d1hrr) ? 1 : 0; + + /*--------------------------------------------------------------- + Form code and function names for HRR and VRR ordering routines + ---------------------------------------------------------------*/ + sprintf(hrr_function_name,"d1hrr_order_%c%c%c%c", + am_letter[la-lb],am_letter[lb], + am_letter[lc-ld],am_letter[ld]); + sprintf(vrr_function_name,"d1vrr_order_%c%c%c%c", + am_letter[la-lb],am_letter[lb], + am_letter[lc-ld],am_letter[ld]); + sprintf(hrr_code_name,"%s.cc",hrr_function_name); + if (to_inline_into_hrr) + sprintf(vrr_code_name,"%s.h",vrr_function_name); + else + sprintf(vrr_code_name,"%s.cc",vrr_function_name); + sprintf(inline_vrr_list_name,"inline_d1vrr_order_%c%c%c%c.h", + am_letter[la-lb],am_letter[lb], + am_letter[lc-ld],am_letter[ld]); + sprintf(inline_hrr_list_name,"inline_d1hrr_order_%c%c%c%c.h", + am_letter[la-lb],am_letter[lb], + am_letter[lc-ld],am_letter[ld]); + hrr_code = fopen(hrr_code_name,"w"); + vrr_code = fopen(vrr_code_name,"w"); + inline_vrr_list = fopen(inline_vrr_list_name,"w"); + inline_hrr_list = fopen(inline_hrr_list_name,"w"); + + /*----------------------------------- + Write the overhead to the HRR code + -----------------------------------*/ + fprintf(hrr_code,"#include \n"); + fprintf(hrr_code,"#include \n"); + fprintf(hrr_code,"#include \n"); + fprintf(hrr_code,"#include \"libderiv.h\"\n"); + if (to_inline_hrr) + fprintf(hrr_code,"#define INLINE_HRR_WORKER\n"); + if (to_inline_d1hrr) + fprintf(hrr_code,"#define INLINE_D1HRR_WORKER\n"); + if (to_inline_hrr || to_inline_d1hrr) + fprintf(hrr_code,"#include \"%s\"\n",inline_hrr_list_name); + fprintf(hrr_code,"#include \n\n"); + fprintf(hrr_code,"#include \"d1hrr_header.h\"\n\n"); + if (to_inline_into_hrr) + fprintf(hrr_code,"#include \"%s\"\n",vrr_code_name); + else + fprintf(hrr_code,"extern void %s(Libderiv_t *, prim_data *);\n\n",vrr_function_name); + fprintf(hrr_code," /* Computes derivatives of (%c%c|%c%c) integrals */\n\n", + am_letter[la-lb],am_letter[lb],am_letter[lc-ld],am_letter[ld]); + fprintf(hrr_code,"void %s(Libderiv_t *Libderiv, int num_prim_comb)\n{\n",hrr_function_name); + fprintf(hrr_code," prim_data *Data = Libderiv->PrimQuartet;\n"); + fprintf(hrr_code," double *int_stack = Libderiv->int_stack;\n"); + fprintf(hrr_code," double *zero_stack = Libderiv->zero_stack;\n"); + fprintf(hrr_code," int i,j;\n double tmp, *target;\n\n"); + + /*-------------------------------------------------------------- + Include the function into the hrr_header.h and init_libint.cc + --------------------------------------------------------------*/ + fprintf(d1hrr_header,"void %s(Libderiv_t *, int);\n",hrr_function_name); + fprintf(init_code," build_deriv1_eri[%d][%d][%d][%d] = %s;\n",la-lb,lb,lc-ld,ld,hrr_function_name); + + /*----------------------------------- + Write the overhead to the VRR code + -----------------------------------*/ + fprintf(vrr_code,"#include \n"); + fprintf(vrr_code,"#include \n"); + fprintf(vrr_code,"#include \"libderiv.h\"\n"); + if (to_inline_vrr) + fprintf(vrr_code,"#define INLINE_VRR_WORKER\n"); + if (to_inline_deriv) + fprintf(vrr_code,"#define INLINE_DERIV_WORKER\n"); + if (to_inline_hrr) + fprintf(vrr_code,"#define INLINE_HRR_WORKER\n"); + if (to_inline_vrr || to_inline_deriv || to_inline_hrr) + fprintf(vrr_code,"#include \"%s\"\n",inline_vrr_list_name); + fprintf(vrr_code,"#include \n"); + fprintf(vrr_code,"#include \n"); + fprintf(vrr_code,"#include \"deriv_header.h\"\n\n"); + fprintf(vrr_code," /* Computes quartets necessary to compute derivatives of (%c%c|%c%c) integrals */\n\n", + am_letter[la-lb],am_letter[lb],am_letter[lc-ld],am_letter[ld]); + if (to_inline_into_hrr) + fprintf(vrr_code,"inline "); + fprintf(vrr_code,"void %s(Libderiv_t *Libderiv, prim_data *Data)\n{\n",vrr_function_name); + + + /*-------------------------------------------------- + Starting at the target node(s) set up an HRR graph. + --------------------------------------------------*/ + + last_hrr_node = 0; + num_hrr_targets=0; + for(i=0;i<12;i++) + if (i<3 || i>5) { + target_hrr_nodes[num_hrr_targets] = last_hrr_node; + hrr_nodes[last_hrr_node].A = la-lb; + hrr_nodes[last_hrr_node].B = lb; + hrr_nodes[last_hrr_node].C = lc-ld; + hrr_nodes[last_hrr_node].D = ld; + hrr_nodes[last_hrr_node].m = 0; + hrr_nodes[last_hrr_node].deriv_lvl = 1; + memset(hrr_nodes[last_hrr_node].deriv_ind,0,12*sizeof(int)); + hrr_nodes[last_hrr_node].deriv_ind[i] += 1; + first_hrr_to_compute = last_hrr_node; + k = mk_dhrr_node(hrr_nodes[last_hrr_node], hrr_nodes, 1); + if (k == first_hrr_to_compute) { /* If the node hasn't been added to the tree before */ + if (num_hrr_targets) { + hrr_nodes[target_hrr_nodes[num_hrr_targets-1]].llink = first_hrr_to_compute; + hrr_nodes[first_hrr_to_compute].rlink = target_hrr_nodes[num_hrr_targets-1]; + hrr_nodes[first_hrr_to_compute].llink = -1; + } + else { + hrr_nodes[first_hrr_to_compute].rlink = -1; + hrr_nodes[first_hrr_to_compute].llink = -1; + } + num_hrr_targets++; + } + hrr_nodes[k].target = 1; + } + + + /*------------------------------------------- + Traverse the graph starting at each target + -------------------------------------------*/ + for(i=0;i0){ + mark_dhrr_parents(hrr_nodes[j].children[k], hrr_nodes, j); + } + } + + + init_mem(1); + + /*--------------------------------------------------------------- + Allocate and zero out space for classes to be generated by VRR + ---------------------------------------------------------------*/ + for(i=last_hrr_node-1;i>=0;i--) { + if (hrr_nodes[i].B == 0 && hrr_nodes[i].D == 0) { + hrr_nodes[i].marked = 1; + hrr_nodes[i].pointer = get_mem(hrr_nodes[i].size); + if (hrr_nodes[i].deriv_lvl == 0) + fprintf(hrr_code," Libderiv->dvrr_classes[%d][%d] = int_stack + %d;\n", + hrr_nodes[i].A,hrr_nodes[i].C,hrr_nodes[i].pointer); + else { + for(j=0;j<12;j++) + if (hrr_nodes[i].deriv_ind[j] != 0) { + break; + } + fprintf(hrr_code," Libderiv->deriv_classes[%d][%d][%d] = int_stack + %d;\n", + hrr_nodes[i].A,hrr_nodes[i].C,j,hrr_nodes[i].pointer); + } + } + } + fprintf(hrr_code," memset(int_stack,0,%ld);\n\n",get_total_memory()*sizeof(double)); + + + /*---------------------------- + Build the HRR call sequence + ----------------------------*/ + if (lb != 0 || ld != 0) { + target_data = alloc_mem_dhrr(hrr_nodes); + } + + + last_mem = get_total_memory(); + fprintf(hrr_code," Libderiv->dvrr_stack = int_stack + %d;\n",last_mem); + fprintf(hrr_code," for(i=0;i 0 || hrr_nodes[j].D > 0) { + /*--- compute the number of children ---*/ + num_children = 0; + for(i=0;i<8;i++) + if (hrr_nodes[j].children[i] > 0) + num_children++; + + if (hrr_nodes[j].B == 0 && hrr_nodes[j].D != 0) { + offset = 6; + if (num_children > 2) { + fprintf(hrr_code, " d1hrr3_build_%c%c(Libderiv->CD,int_stack+%d,", + am_letter[hrr_nodes[j].C], am_letter[hrr_nodes[j].D], hrr_nodes[j].pointer); + /* Add this function to the list of inlined functions if necessary */ + max_node_am = (hrr_nodes[j].C > hrr_nodes[j].D) ? hrr_nodes[j].C : hrr_nodes[j].D; + if (to_inline_d1hrr && max_node_am <= Params.max_am_to_inline_d1hrr_worker) + fprintf(inline_hrr_list,"#include \"d1hrr3_build_%c%c.h\"\n", am_letter[hrr_nodes[j].C], am_letter[hrr_nodes[j].D]); + } + else { + fprintf(hrr_code, " hrr3_build_%c%c(Libderiv->CD,int_stack+%d,", + am_letter[hrr_nodes[j].C], am_letter[hrr_nodes[j].D], hrr_nodes[j].pointer); + /* Add this function to the list of inlined functions if necessary */ + max_node_am = (hrr_nodes[j].C > hrr_nodes[j].D) ? hrr_nodes[j].C : hrr_nodes[j].D; + if (to_inline_hrr && max_node_am <= Params.max_am_to_inline_hrr_worker) + fprintf(inline_hrr_list,"#include \n", am_letter[hrr_nodes[j].C], am_letter[hrr_nodes[j].D]); + } + } + else if (hrr_nodes[j].B != 0) { + offset = 0; + if (num_children > 2) { + fprintf(hrr_code, " d1hrr1_build_%c%c(Libderiv->AB,int_stack+%d,", + am_letter[hrr_nodes[j].A], am_letter[hrr_nodes[j].B], hrr_nodes[j].pointer); + /* Add this function to the list of inlined functions if necessary */ + max_node_am = (hrr_nodes[j].A > hrr_nodes[j].B) ? hrr_nodes[j].A : hrr_nodes[j].B; + if (to_inline_d1hrr && max_node_am <= Params.max_am_to_inline_d1hrr_worker) + fprintf(inline_hrr_list,"#include \"d1hrr1_build_%c%c.h\"\n", am_letter[hrr_nodes[j].A], am_letter[hrr_nodes[j].B]); + } + else { + fprintf(hrr_code, " hrr1_build_%c%c(Libderiv->AB,int_stack+%d,", + am_letter[hrr_nodes[j].A], am_letter[hrr_nodes[j].B], hrr_nodes[j].pointer); + /* Add this function to the list of inlined functions if necessary */ + max_node_am = (hrr_nodes[j].A > hrr_nodes[j].B) ? hrr_nodes[j].A : hrr_nodes[j].B; + if (to_inline_hrr && max_node_am <= Params.max_am_to_inline_hrr_worker) + fprintf(inline_hrr_list,"#include \n", am_letter[hrr_nodes[j].A], am_letter[hrr_nodes[j].B]); + } + } + + /*--- If the first child is one of VRR derivative classes - need to compute its location ---*/ + child0 = hrr_nodes[j].children[0]; + fprintf(hrr_code, "int_stack+%d,",hrr_nodes[child0].pointer); + + /*--- If the second child is one of VRR derivative classes - need to compute its location ---*/ + child1 = hrr_nodes[j].children[1]; + fprintf(hrr_code, "int_stack+%d,",hrr_nodes[child1].pointer); + + /*--- Now go through the rest of the children ---*/ + if (num_children > 2) + for(i=0;i<6;i++) { + if (hrr_nodes[j].children[i+2] > 0) { + child = hrr_nodes[j].children[i+2]; + fprintf(hrr_code, " %.1lf, int_stack+%d,", + (double) hrr_nodes[j].deriv_ind[offset+i], + hrr_nodes[child].pointer); + } + else + fprintf(hrr_code, " 0.0, zero_stack,"); + } + + + if (hrr_nodes[j].B == 0 && hrr_nodes[j].D != 0) + fprintf(hrr_code, "%d);\n", io(1+hrr_nodes[j].A)*io(1+hrr_nodes[j].B)); + else if (hrr_nodes[j].B != 0) + fprintf(hrr_code, "%d);\n", io(1+hrr_nodes[j].C)*io(1+hrr_nodes[j].D)); + + } + + /* Pass the "target" quartets to CINTS */ + if (hrr_nodes[j].target) { + for(i=0;i<12;i++) + if (hrr_nodes[j].deriv_ind[i] != 0) { + break; + } + fprintf(hrr_code," Libderiv->ABCD[%d] = int_stack + %d;\n",i,hrr_nodes[j].pointer); + } + j = hrr_nodes[j].rlink; + } while (j != -1); + + fprintf(hrr_code,"\n}\n"); + fclose(hrr_code); + fclose(inline_hrr_list); + printf("Done with %s\n",hrr_code_name); + for(i=0;i0){ + mark_parents(vrr_nodes[j].children[k], vrr_nodes, j); + } + } + } + + init_mem(1); + + /* Build the call sequence */ + target_data = alloc_mem_vrr(vrr_nodes); + last_mem += get_total_memory(); + if (max_stack_size < last_mem) + max_stack_size = last_mem; + fprintf(vrr_code," double *dvrr_stack = Libderiv->dvrr_stack;\n double *tmp, *target_ptr;\n"); + fprintf(vrr_code," int i, am[2];\n"); + + j = first_vrr_to_compute; + do { + fprintf(vrr_code, " /* compute (%d %d | %d %d) m=%d deriv level %d */\n", + vrr_nodes[j].A,vrr_nodes[j].B, + vrr_nodes[j].C,vrr_nodes[j].D, + vrr_nodes[j].m, vrr_nodes[j].deriv_lvl); + fprintf(vrr_code, " /* deriv_ind: %d %d %d %d %d %d %d %d %d %d %d %d */\n", + vrr_nodes[j].deriv_ind[0], vrr_nodes[j].deriv_ind[1], vrr_nodes[j].deriv_ind[2], + vrr_nodes[j].deriv_ind[3], vrr_nodes[j].deriv_ind[4], vrr_nodes[j].deriv_ind[5], + vrr_nodes[j].deriv_ind[6], vrr_nodes[j].deriv_ind[7], vrr_nodes[j].deriv_ind[8], + vrr_nodes[j].deriv_ind[9], vrr_nodes[j].deriv_ind[10], vrr_nodes[j].deriv_ind[11]); + + /*--------------------------------------------------------- + Decide which routine to use to compute the current class + ---------------------------------------------------------*/ + if (vrr_nodes[j].deriv_lvl) { /*--- use build_deriv ---*/ + fprintf(vrr_code, " deriv_build_"); + for(i=0;i<12;i++) + if (vrr_nodes[j].deriv_ind[i] != 0) { + break; + } + switch (i) { + case 0: case 1: case 2: + fprintf(vrr_code, "A%c_%c(Data,%d,",cart_comp[i],am_letter[vrr_nodes[j].A], + io(1+vrr_nodes[j].B)*io(1+vrr_nodes[j].C)*io(1+vrr_nodes[j].D)); + /* Add this function to the list of inlined functions if necessary */ + max_node_am = vrr_nodes[j].A; + if (to_inline_deriv && max_node_am <= Params.max_am_to_inline_deriv_worker) + fprintf(inline_vrr_list,"#include \"deriv_build_A%c_%c.h\"\n", + cart_comp[i], am_letter[vrr_nodes[j].A]); + break; + + case 3: case 4: case 5: + fprintf(vrr_code, "B%c_%c(Data,%d,%d,",cart_comp[i-3],am_letter[vrr_nodes[j].B], + io(1+vrr_nodes[j].A),io(1+vrr_nodes[j].C)*io(1+vrr_nodes[j].D)); + /* Add this function to the list of inlined functions if necessary */ + max_node_am = vrr_nodes[j].B; + if (to_inline_deriv && max_node_am <= Params.max_am_to_inline_deriv_worker) + fprintf(inline_vrr_list,"#include \"deriv_build_B%c_%c.h\"\n", + cart_comp[i-3], am_letter[vrr_nodes[j].B]); + break; + + case 6: case 7: case 8: + fprintf(vrr_code, "C%c_%c(Data,%d,%d,",cart_comp[i-6],am_letter[vrr_nodes[j].C], + io(1+vrr_nodes[j].A)*io(1+vrr_nodes[j].B),io(1+vrr_nodes[j].D)); + /* Add this function to the list of inlined functions if necessary */ + max_node_am = vrr_nodes[j].C; + if (to_inline_deriv && max_node_am <= Params.max_am_to_inline_deriv_worker) + fprintf(inline_vrr_list,"#include \"deriv_build_C%c_%c.h\"\n", + cart_comp[i-6], am_letter[vrr_nodes[j].C]); + break; + + case 9: case 10: case 11: + fprintf(vrr_code, "D%c_%c(Data,%d,",cart_comp[i-9],am_letter[vrr_nodes[j].D], + io(1+vrr_nodes[j].A)*io(1+vrr_nodes[j].B)*io(1+vrr_nodes[j].C)); + /* Add this function to the list of inlined functions if necessary */ + max_node_am = vrr_nodes[j].D; + if (to_inline_deriv && max_node_am <= Params.max_am_to_inline_deriv_worker) + fprintf(inline_vrr_list,"#include \"deriv_build_D%c_%c.h\"\n", + cart_comp[i-9], am_letter[vrr_nodes[j].D]); + break; + } + + fprintf(vrr_code, "dvrr_stack+%d", vrr_nodes[j].pointer); + for(k=0; k<2; k++){ + if(vrr_nodes[j].children[k] > 0) + fprintf(vrr_code, ", dvrr_stack+%d", vrr_nodes[vrr_nodes[j].children[k]].pointer); + else if (vrr_nodes[j].children[k] == NONODE) + fprintf(vrr_code, ", NULL"); + else + fprintf(vrr_code, ", Data->F+%d", (-1)*vrr_nodes[j].children[k]); + } + fprintf(vrr_code, ");\n"); + } + else if (vrr_nodes[j].B + vrr_nodes[j].D > 0) { /*--- build_hrr ---*/ + if (vrr_nodes[j].B == 0 && vrr_nodes[j].D != 0) { + fprintf(vrr_code, " hrr3_build_%c%c(Libderiv->CD,dvrr_stack+%d,dvrr_stack+%d,", + am_letter[vrr_nodes[j].C], am_letter[vrr_nodes[j].D], vrr_nodes[j].pointer, + vrr_nodes[vrr_nodes[j].children[0]].pointer); + if (vrr_nodes[j].children[1] > 0) + fprintf(vrr_code, "dvrr_stack+%d,%d);\n\n", vrr_nodes[vrr_nodes[j].children[1]].pointer, + io(1+vrr_nodes[j].A)*io(1+vrr_nodes[j].B)); + else + fprintf(vrr_code, "Data->F,%d);\n\n", io(1+vrr_nodes[j].A)*io(1+vrr_nodes[j].B)); + /* Add this function to the list of inlined functions if necessary */ + max_node_am = (vrr_nodes[j].C > vrr_nodes[j].D) ? vrr_nodes[j].C : vrr_nodes[j].D; + if (to_inline_hrr && max_node_am <= Params.max_am_to_inline_hrr_worker) + fprintf(inline_vrr_list,"#include \n", am_letter[vrr_nodes[j].C], am_letter[vrr_nodes[j].D]); + } + else if (vrr_nodes[j].B != 0) { + fprintf(vrr_code, " hrr1_build_%c%c(Libderiv->AB,dvrr_stack+%d,dvrr_stack+%d,", + am_letter[vrr_nodes[j].A], am_letter[vrr_nodes[j].B], vrr_nodes[j].pointer, + vrr_nodes[vrr_nodes[j].children[0]].pointer); + if (vrr_nodes[j].children[1] > 0) + fprintf(vrr_code, "dvrr_stack+%d,%d);\n\n", vrr_nodes[vrr_nodes[j].children[1]].pointer, + io(1+vrr_nodes[j].C)*io(1+vrr_nodes[j].D)); + else + fprintf(vrr_code, "Data->F,%d);\n", io(1+vrr_nodes[j].C)*io(1+vrr_nodes[j].D)); + /* Add this function to the list of inlined functions if necessary */ + max_node_am = (vrr_nodes[j].A > vrr_nodes[j].B) ? vrr_nodes[j].A : vrr_nodes[j].B; + if (to_inline_hrr && max_node_am <= Params.max_am_to_inline_hrr_worker) + fprintf(inline_vrr_list,"#include \n", am_letter[vrr_nodes[j].A], am_letter[vrr_nodes[j].B]); + } + } + else { /*--- build_vrr ---*/ + if (vrr_nodes[j].A <= LIBINT_OPT_AM && vrr_nodes[j].C <= LIBINT_OPT_AM) { + fprintf(vrr_code, " _BUILD_%c0%c0(Data,", am_letter[vrr_nodes[j].A], am_letter[vrr_nodes[j].C]); + /* Add this function to the list of inlined functions if necessary */ + max_node_am = (vrr_nodes[j].A > vrr_nodes[j].C) ? vrr_nodes[j].A : vrr_nodes[j].C; + if (to_inline_vrr && max_node_am <= Params.max_am_to_inline_vrr_worker) + fprintf(inline_vrr_list,"#include \n", am_letter[vrr_nodes[j].A], am_letter[vrr_nodes[j].C]); + } + else { + fprintf(vrr_code, " am[0] = %d; am[1] = %d;\n", vrr_nodes[j].A, vrr_nodes[j].C); + fprintf(vrr_code, " vrr_build_xxxx(am,Data,"); + } + fprintf(vrr_code, "dvrr_stack+%d", vrr_nodes[j].pointer); + for(k=0; k<5; k++){ + if(vrr_nodes[j].children[k] > 0) + fprintf(vrr_code, ", dvrr_stack+%d", vrr_nodes[vrr_nodes[j].children[k]].pointer); + else if (vrr_nodes[j].children[k] == NONODE) + fprintf(vrr_code, ", NULL"); + else + fprintf(vrr_code, ", Data->F+%d", (-1)*vrr_nodes[j].children[k]); + } + fprintf(vrr_code, ");\n"); + } + + /*----------------------------------------------- + If this derivative class is one of the targets + copy it to a location pointed by deriv_classes + to be used by the calling hrr_order routine + -----------------------------------------------*/ + if (vrr_nodes[j].target == 1) { + fprintf(vrr_code, " tmp = dvrr_stack + %d;\n", vrr_nodes[j].pointer); + if (vrr_nodes[j].deriv_lvl == 0) + fprintf(vrr_code, " target_ptr = Libderiv->dvrr_classes[%d][%d];\n", + vrr_nodes[j].A,vrr_nodes[j].C); + else + fprintf(vrr_code, " target_ptr = Libderiv->deriv_classes[%d][%d][%d];\n", + vrr_nodes[j].A,vrr_nodes[j].C,i); + fprintf(vrr_code, " for(i=0;i<%d;i++)\n",vrr_nodes[j].size); + fprintf(vrr_code, " target_ptr[i] += tmp[i];\n\n"); + } + else + fprintf(vrr_code, "\n"); + + j = vrr_nodes[j].rlink; + } while (j != -1); + fprintf(vrr_code, "\n}\n\n"); + fclose(vrr_code); + fclose(inline_vrr_list); + printf("Done with %s\n",vrr_code_name); + for(i=0;i= MAXNODE) { + printf(" Maximum stack size is reached. Change MAXNODE and recompile.\n\n"); + exit(1); + } + } + + /* If the parent class wasn't on stack already (!new) - increase the parent counter */ + if(!new){ + allnodes[thisnode].num_parents++; + allnodes[thisnode].parents_counter++; + if (allnodes[thisnode].num_parents > NUMPARENTS) { + printf("Number of parents exceeds the limit\n"); + exit(1); + } + } + + + /* now make all child nodes */ + if (!made) { + if(node.B){ + O[0].A = node.A+1; + O[0].B = node.B-1; + O[0].C = node.C; + O[0].D = node.D; + O[0].m = node.m; + O[0].deriv_lvl = node.deriv_lvl; + memcpy(O[0].deriv_ind,node.deriv_ind,12*sizeof(int)); + allnodes[thisnode].children[0] = + mk_dhrr_node(O[0], allnodes, made); + O[1].A = node.A; + O[1].B = node.B-1; + O[1].C = node.C; + O[1].D = node.D; + O[1].m = node.m; + O[1].deriv_lvl = node.deriv_lvl; + memcpy(O[1].deriv_ind,node.deriv_ind,12*sizeof(int)); + allnodes[thisnode].children[1] = + mk_dhrr_node(O[1], allnodes, made); + for(i=0;i<6;i++) + if (node.deriv_ind[i]) { + O[2+i].A = node.A; + O[2+i].B = node.B-1; + O[2+i].C = node.C; + O[2+i].D = node.D; + O[2+i].m = node.m; + O[2+i].deriv_lvl = node.deriv_lvl-1; + memcpy(O[2+i].deriv_ind,node.deriv_ind,12*sizeof(int)); + O[2+i].deriv_ind[i]--; + allnodes[thisnode].children[2+i] = + mk_dhrr_node(O[2+i], allnodes, made); + } + } + else if(node.D){ + O[0].A = node.A; + O[0].B = node.B; + O[0].C = node.C+1; + O[0].D = node.D-1; + O[0].m = node.m; + O[0].deriv_lvl = node.deriv_lvl; + memcpy(O[0].deriv_ind,node.deriv_ind,12*sizeof(int)); + allnodes[thisnode].children[0] = + mk_dhrr_node(O[0], allnodes, made); + O[1].A = node.A; + O[1].B = node.B; + O[1].C = node.C; + O[1].D = node.D-1; + O[1].m = node.m; + O[1].deriv_lvl = node.deriv_lvl; + memcpy(O[1].deriv_ind,node.deriv_ind,12*sizeof(int)); + allnodes[thisnode].children[1] = + mk_dhrr_node(O[1], allnodes, made); + for(i=0;i<6;i++) + if (node.deriv_ind[i+6]) { + O[2+i].A = node.A; + O[2+i].B = node.B; + O[2+i].C = node.C; + O[2+i].D = node.D-1; + O[2+i].m = node.m; + O[2+i].deriv_lvl = node.deriv_lvl-1; + memcpy(O[2+i].deriv_ind,node.deriv_ind,12*sizeof(int)); + O[2+i].deriv_ind[i+6]--; + allnodes[thisnode].children[2+i] = + mk_dhrr_node(O[2+i], allnodes, made); + } + } + } + + return thisnode; + +} + + +/* Recursive function that builds a hybrid HRR/VRR/deriv subgraph given the parent */ + +int mk_deriv_node(class node, class *allnodes, int new) +{ + + int i, j, k, l; + class O[5]; + int subnodes = 0; + int thisnode; + int rlink, llink; + int made = 0; + + /* If it's not a derivative class - do some checks to see if need to proceed */ + if (node.deriv_lvl == 0 && node.A + node.B + node.C + node.D == 0) + return (-1)*node.m; + + /* Search for the parent node on stack + If it's not there - we'll add it to the end of the stack */ + thisnode = last_vrr_node; + /* it's already placed on the stack allnodes - make sure children don't get created again (made = 1) */ + if (node.deriv_lvl != 0) { + for(i=0;i= MAXNODE) { + printf(" Maximum stack size is reached. Change MAXNODE and recompile.\n\n"); + exit(1); + } + } + + /* If the parent class wasn't on stack already (!new) - increase the parent counter */ + if(!new){ + allnodes[thisnode].num_parents++; + allnodes[thisnode].parents_counter++; + if (allnodes[thisnode].num_parents > NUMPARENTS) { + printf("Number of parents exceeds the limit\n"); + exit(1); + } + } + + + /* now make all child nodes */ + if (!made) { + /* derivative ERI */ + if (node.deriv_lvl) { + for(i=0;i<12;i++) { + if (node.deriv_ind[i] != 0) { + switch (i) { + case 0: case 1: case 2: + O[0].A = node.A+1; + O[0].B = node.B; + O[0].C = node.C; + O[0].D = node.D; + O[0].m = 0; + O[0].deriv_lvl = node.deriv_lvl-1; + memset(O[0].deriv_ind,0,12*sizeof(int)); + O[0].deriv_ind[i] = node.deriv_ind[i]-1; + allnodes[thisnode].children[0] = mk_deriv_node(O[0], allnodes, made); + if (node.A > 0) { + O[1].A = node.A-1; + O[1].B = node.B; + O[1].C = node.C; + O[1].D = node.D; + O[1].m = 0; + O[1].deriv_lvl = node.deriv_lvl-1; + memset(O[1].deriv_ind,0,12*sizeof(int)); + O[1].deriv_ind[i] = node.deriv_ind[i]-1; + allnodes[thisnode].children[1] = mk_deriv_node(O[1], allnodes, made); + } + break; + + case 3: case 4: case 5: + O[0].A = node.A; + O[0].B = node.B+1; + O[0].C = node.C; + O[0].D = node.D; + O[0].m = 0; + O[0].deriv_lvl = node.deriv_lvl-1; + memset(O[0].deriv_ind,0,12*sizeof(int)); + O[0].deriv_ind[i] = node.deriv_ind[i]-1; + allnodes[thisnode].children[0] = mk_deriv_node(O[0], allnodes, made); + if (node.B > 0) { + O[1].A = node.A; + O[1].B = node.B-1; + O[1].C = node.C; + O[1].D = node.D; + O[1].m = 0; + O[1].deriv_lvl = node.deriv_lvl-1; + memset(O[1].deriv_ind,0,12*sizeof(int)); + O[1].deriv_ind[i] = node.deriv_ind[i]-1; + allnodes[thisnode].children[1] = mk_deriv_node(O[1], allnodes, made); + } + break; + + case 6: case 7: case 8: + O[0].A = node.A; + O[0].B = node.B; + O[0].C = node.C+1; + O[0].D = node.D; + O[0].m = 0; + O[0].deriv_lvl = node.deriv_lvl-1; + memset(O[0].deriv_ind,0,12*sizeof(int)); + O[0].deriv_ind[i] = node.deriv_ind[i]-1; + allnodes[thisnode].children[0] = mk_deriv_node(O[0], allnodes, made); + if (node.C > 0) { + O[1].A = node.A; + O[1].B = node.B; + O[1].C = node.C-1; + O[1].D = node.D; + O[1].m = 0; + O[1].deriv_lvl = node.deriv_lvl-1; + memset(O[1].deriv_ind,0,12*sizeof(int)); + O[1].deriv_ind[i] = node.deriv_ind[i]-1; + allnodes[thisnode].children[1] = mk_deriv_node(O[1], allnodes, made); + } + break; + + case 9: case 10: case 11: + O[0].A = node.A; + O[0].B = node.B; + O[0].C = node.C; + O[0].D = node.D+1; + O[0].m = 0; + O[0].deriv_lvl = node.deriv_lvl-1; + memset(O[0].deriv_ind,0,12*sizeof(int)); + O[0].deriv_ind[i] = node.deriv_ind[i]-1; + allnodes[thisnode].children[0] = mk_deriv_node(O[0], allnodes, made); + if (node.D > 0) { + O[1].A = node.A; + O[1].B = node.B; + O[1].C = node.C; + O[1].D = node.D-1; + O[1].m = 0; + O[1].deriv_lvl = node.deriv_lvl-1; + memset(O[1].deriv_ind,0,12*sizeof(int)); + O[1].deriv_ind[i] = node.deriv_ind[i]-1; + allnodes[thisnode].children[1] = mk_deriv_node(O[1], allnodes, made); + } + break; + } + break; + } + } + } + /* HRR case */ + else if (node.B + node.D != 0) { + if(node.B){ + O[0].A = node.A+1; + O[0].B = node.B-1; + O[0].C = node.C; + O[0].D = node.D; + O[0].m = node.m; + O[0].deriv_lvl = 0; + memset(O[0].deriv_ind,0,12*sizeof(int)); + allnodes[thisnode].children[0] = mk_deriv_node(O[0], allnodes, made); + O[1].A = node.A; + O[1].B = node.B-1; + O[1].C = node.C; + O[1].D = node.D; + O[1].m = node.m; + O[1].deriv_lvl = 0; + memset(O[1].deriv_ind,0,12*sizeof(int)); + allnodes[thisnode].children[1] = mk_deriv_node(O[1], allnodes, made); + } + else if(node.D){ + O[0].A = node.A; + O[0].B = node.B; + O[0].C = node.C+1; + O[0].D = node.D-1; + O[0].m = node.m; + O[0].deriv_lvl = 0; + memset(O[0].deriv_ind,0,12*sizeof(int)); + allnodes[thisnode].children[0] = mk_deriv_node(O[0], allnodes, made); + O[1].A = node.A; + O[1].B = node.B; + O[1].C = node.C; + O[1].D = node.D-1; + O[1].m = node.m; + O[1].deriv_lvl = 0; + memset(O[1].deriv_ind,0,12*sizeof(int)); + allnodes[thisnode].children[1] = mk_deriv_node(O[1], allnodes, made); + } + } + /* VRR case */ + else { + if(node.A){ + O[0].A = node.A-1; + O[0].B = 0; + O[0].C = node.C; + O[0].D = 0; + O[0].m = node.m; + O[0].deriv_lvl = 0; + memset(O[0].deriv_ind,0,12*sizeof(int)); + allnodes[thisnode].children[0] = mk_deriv_node(O[0], allnodes, made); + O[1].A = node.A-1; + O[1].B = 0; + O[1].C = node.C; + O[1].D = 0; + O[1].m = node.m+1; + O[1].deriv_lvl = 0; + memset(O[1].deriv_ind,0,12*sizeof(int)); + allnodes[thisnode].children[1] = mk_deriv_node(O[1], allnodes, made); + if(node.A>1){ + O[2].A = node.A-2; + O[2].B = 0; + O[2].C = node.C; + O[2].D = 0; + O[2].m = node.m; + O[2].deriv_lvl = 0; + memset(O[2].deriv_ind,0,12*sizeof(int)); + allnodes[thisnode].children[2] = mk_deriv_node(O[2], allnodes, made); + O[3].A = node.A-2; + O[3].B = 0; + O[3].C = node.C; + O[3].D = 0; + O[3].m = node.m+1; + O[3].deriv_lvl = 0; + memset(O[3].deriv_ind,0,12*sizeof(int)); + allnodes[thisnode].children[3] = mk_deriv_node(O[3], allnodes, made); + } + if(node.C){ + O[4].A = node.A-1; + O[4].B = 0; + O[4].C = node.C-1; + O[4].D = 0; + O[4].m = node.m+1; + O[4].deriv_lvl = 0; + memset(O[4].deriv_ind,0,12*sizeof(int)); + allnodes[thisnode].children[4] = mk_deriv_node(O[4], allnodes, made); + } + } + else if(node.C){ + O[0].A = node.A; + O[0].B = 0; + O[0].C = node.C-1; + O[0].D = 0; + O[0].m = node.m; + O[0].deriv_lvl = 0; + memset(O[0].deriv_ind,0,12*sizeof(int)); + allnodes[thisnode].children[0] = mk_deriv_node(O[0], allnodes, made); + O[1].A = node.A; + O[1].B = 0; + O[1].C = node.C-1; + O[1].D = 0; + O[1].m = node.m+1; + O[1].deriv_lvl = 0; + memset(O[1].deriv_ind,0,12*sizeof(int)); + allnodes[thisnode].children[1] = mk_deriv_node(O[1], allnodes, made); + if(node.C>1){ + O[2].A = node.A; + O[2].B = 0; + O[2].C = node.C-2; + O[2].D = 0; + O[2].m = node.m; + O[2].deriv_lvl = 0; + memset(O[2].deriv_ind,0,12*sizeof(int)); + allnodes[thisnode].children[2] = mk_deriv_node(O[2], allnodes, made); + O[3].A = node.A; + O[3].B = 0; + O[3].C = node.C-2; + O[3].D = 0; + O[3].m = node.m+1; + O[3].deriv_lvl = 0; + memset(O[3].deriv_ind,0,12*sizeof(int)); + allnodes[thisnode].children[3] = mk_deriv_node(O[3], allnodes, made); + } + } + } + } + + return thisnode; + +} + + + +/* Make hrr_nodes[rent] a parent of hrr_nodes[n] and proceed recursively */ + +void mark_dhrr_parents(int n, class *allnodes, int rent) +{ + int i; + int *tmp; + + /* handle case where it's in the parent list already */ + for(i=allnodes[n].num_parents-1; i>=allnodes[n].parents_counter; i--) + if(rent==allnodes[n].parents[i]) return; + + /* if the parent rent is not in the list - add it to the list! */ + i = --allnodes[n].parents_counter; + allnodes[n].parents[i] = rent; + /* hits from all of the parents has been received - schedule it for computation and mark all of its children */ + if (i == 0 && (allnodes[n].B != 0 || allnodes[n].D != 0)) { + allnodes[n].llink = -1; + allnodes[n].rlink = first_hrr_to_compute; + allnodes[first_hrr_to_compute].llink = n; + first_hrr_to_compute = n; + + for(i=0; i<8; i++) + if(allnodes[n].children[i]>0) + mark_dhrr_parents(allnodes[n].children[i], allnodes, n); + } + return; +} + + +/* Make vrr_nodes[rent] a parent of vrr_nodes[n] and proceed recursively */ + +void mark_vrr_parents(int n, class *allnodes, int rent) +{ + int i; + int *tmp; + + /* handle case where it's in there already */ + for(i=allnodes[n].num_parents-1; i>=allnodes[n].parents_counter; i--) + if(rent==allnodes[n].parents[i]) return; + + + /* if the parent rent is not in the list - add it to the list! */ + i = --allnodes[n].parents_counter; + allnodes[n].parents[i] = rent; + /* hits from all of the parents has been received - schedule it for computation and mark all of its children */ + if (i == 0) { + allnodes[n].llink = -1; + allnodes[n].rlink = first_vrr_to_compute; + allnodes[first_vrr_to_compute].llink = n; + first_vrr_to_compute = n; + + for(i=0; i<5; i++) + if(allnodes[n].children[i]>0) + mark_vrr_parents(allnodes[n].children[i], allnodes, n); + + } + return; +} + + +void mark_parents(int n, class *allnodes, int rent) +{ + int i; + int *tmp; + + /* handle case where it's in there already */ + for(i=allnodes[n].num_parents-1; i>=allnodes[n].parents_counter; i--) + if(rent==allnodes[n].parents[i]) return; + + + /* if the parent rent is not in the list - add it to the list! */ + i = --allnodes[n].parents_counter; + allnodes[n].parents[i] = rent; + /* hits from all of the parents has been received - schedule it for computation and mark all of its children */ + if (i == 0) { + allnodes[n].llink = -1; + allnodes[n].rlink = first_vrr_to_compute; + allnodes[first_vrr_to_compute].llink = n; + first_vrr_to_compute = n; + + for(i=0; i<5; i++) + if(allnodes[n].children[i]>0) + mark_vrr_parents(allnodes[n].children[i], allnodes, n); + + } + return; +} + + + +/* This functions controls memory placement of computed classes on the CINTS stack */ + +int alloc_mem_dhrr(class *nodes) +{ + int i, j, k, l; + int size; + int child; + int free_it; + + j = first_hrr_to_compute; + do{ + /* Node to compute */ + if (nodes[j].marked == 0) { + nodes[j].marked = 1; /* sign that it has been passed */ + nodes[j].pointer = get_mem(nodes[j].size); /* Allocate memory for it on a CINTS-provided stack */ + } + + /* Figure out which children can be freed, + i.e. which children are not targets and have all parents marked */ + for(k=0; k<8; k++){ + child = nodes[j].children[k]; + if(child>0) + if (nodes[child].target == 0) { + free_it = 1; + for(l=0; l0){ + free_it = 1; + for(l=0; l +#include +#include +#include + +extern FILE *outfile, *deriv_header; +extern LibderivParams_t Params; + +extern void punt(char *); + +void emit_deriv_build() +{ + int new_am = Params.new_am; + int old_am = Params.old_am; + int am_to_inline = Params.max_am_to_inline_deriv_worker; + + FILE *code; + int p,q,r,s; + int ax,ay,az,bx,by,bz,cx,cy,cz,dx,dy,dz; + int i,j,nj,i_i0,i_i1; + int k,l,nl,k_i0,k_i1; + int i0_step,i1_step; + int a, b; + int flag; + int am_in[2]; + int class_size; + int la, lb; + int ld, lc, ld_max; + int xyz; + int current_highest_am, to_inline; + int errcod; + char code_name[] = "deriv_build_X0_s.cc"; + char function_name[] = "deriv_build_A0_s"; + + for(la=0;la<=new_am+DERIV_LVL-1;la++) { + + /* Is this function to be made inline */ + current_highest_am = la; + to_inline = (current_highest_am <= am_to_inline) ? 1 : 0; + + function_name[15] = am_letter[la]; + code_name[15] = am_letter[la]; + + /*--------------- + DR on center A + ---------------*/ + + function_name[12] = 'A'; + code_name[12] = 'A'; + + /*--- vp = d(vp)/dai ---*/ + for(xyz = 0; xyz < 3; xyz++) { + function_name[13] = cart_comp[xyz]; + code_name[13] = cart_comp[xyz]; + code = fopen(code_name,"w"); + + /* include the function into the deriv_header.h */ + if (to_inline) + fprintf(deriv_header,"#ifndef INLINE_DERIV_WORKER\n"); + fprintf(deriv_header,"void %s(prim_data *, const int, double *, const double *, const double *);\n", + function_name); + if (to_inline) + fprintf(deriv_header,"#endif\n"); + + fprintf(code,"#include \n"); + fprintf(code,"#include \"libderiv.h\"\n\n"); + fprintf(code,"void %s(prim_data *Data, const int bcd_num, double *vp, const double *I0, const double *I1)\n{\n",function_name); + fprintf(code," const double twotzeta = Data->twozeta_a;\n"); + fprintf(code," const double *i0, *i1;\n"); + fprintf(code," int bcd;\n\n"); + + i0_step = (la+2)*(la+3)/2; + i1_step = la*(la+1)/2; + + for(p = 0; p <= la; p++) { + ax = la - p; + for(q = 0; q <= p; q++) { + ay = p - q; + az = q; + + if (xyz == 0) { /* build along x */ + i_i0 = iop1(p)-p+q-1; + if (i_i0) + fprintf(code," i0 = I0 + %d*bcd_num;\n",i_i0); + else + fprintf(code," i0 = I0;\n"); + if (ax) { + i_i1 = iop1(p)-p+q-1; + if (i_i1) + fprintf(code," i1 = I1 + %d*bcd_num;\n",i_i1); + else + fprintf(code," i1 = I1;\n"); + } + fprintf(code," for(bcd=0;bcd\n"); + fprintf(code,"#include \"libderiv.h\"\n\n"); + fprintf(code,"void %s(prim_data *Data, const int a_num, const int cd_num, double *vp, const double *I0, const double *I1)\n{\n", + function_name); + fprintf(code," const double twotzeta = Data->twozeta_b;\n"); + fprintf(code," const double *i0, *i1;\n"); + fprintf(code," int a,cd;\n\n"); + i0_step = (lb+2)*(lb+3)/2; + i1_step = lb*(lb+1)/2; + + fprintf(code," for(a=0;a\n"); + fprintf(code,"#include \"libderiv.h\"\n\n"); + fprintf(code,"void %s(prim_data *Data, const int ab_num, const int d_num, double *vp, const double *I0, const double *I1)\n{\n", + function_name); + fprintf(code," const double twotzeta = Data->twozeta_c;\n"); + fprintf(code," const double *i0, *i1;\n"); + fprintf(code," int ab,d;\n\n"); + i0_step = (lc+2)*(lc+3)/2; + i1_step = lc*(lc+1)/2; + + fprintf(code," for(ab=0;ab\n"); + fprintf(code,"#include \"libderiv.h\"\n\n"); + fprintf(code,"void %s(prim_data *Data, const int abc_num, double *vp, const double *I0, const double *I1)\n{\n", + function_name); + fprintf(code," const double twotzeta = Data->twozeta_d;\n"); + fprintf(code," const double *i0, *i1;\n"); + fprintf(code," int abc;\n\n"); + i0_step = (ld+2)*(ld+3)/2; + i1_step = ld*(ld+1)/2; + + fprintf(code," for(abc=0;abc +#include +#include +#include + +extern FILE *outfile, *deriv_header; +extern LibderivParams_t Params; + +extern void punt(char *); + +void emit_deriv_build_macro() +{ + int new_am = Params.new_am; + int old_am = Params.old_am; + int am_to_inline = Params.max_am_to_inline_deriv_worker; + + FILE *code; + int p,q,r,s; + int ax,ay,az,bx,by,bz,cx,cy,cz,dx,dy,dz; + int i,j,nj,i_i0,i_i1; + int k,l,nl,k_i0,k_i1; + int i0_step,i1_step; + int a, b; + int flag; + int am_in[2]; + int class_size; + int la, lb; + int ld, lc, ld_max; + int xyz; + int current_highest_am, to_inline; + int errcod; + char code_name[] = "deriv_build_X0_s.h"; + char function_name[] = "deriv_build_A0_s"; + + for(la=0;la<=new_am+DERIV_LVL-1;la++) { + + /* Is this function to be made inline */ + current_highest_am = la; + to_inline = (current_highest_am <= am_to_inline) ? 1 : 0; + + if (!to_inline) + continue; + + function_name[15] = am_letter[la]; + code_name[15] = am_letter[la]; + + /*--------------- + DR on center A + ---------------*/ + + function_name[12] = 'A'; + code_name[12] = 'A'; + + /*--- vp = d(vp)/dai ---*/ + for(xyz = 0; xyz < 3; xyz++) { + function_name[13] = cart_comp[xyz]; + code_name[13] = cart_comp[xyz]; + code = fopen(code_name,"w"); + + fprintf(code,"#ifndef _libderiv_%s\n",function_name); + fprintf(code,"#define _libderiv_%s\n\n",function_name); + fprintf(code,"#define %s(Data, bcd_num, vp, I0, I1)\\\n{\\\n",function_name); + fprintf(code," const double twotzeta = Data->twozeta_a;\\\n"); + fprintf(code," const double *i0, *i1;\\\n"); + fprintf(code," double *target = (vp);\\\n"); + fprintf(code," int bcd;\\\n\\\n"); + + i0_step = (la+2)*(la+3)/2; + i1_step = la*(la+1)/2; + + for(p = 0; p <= la; p++) { + ax = la - p; + for(q = 0; q <= p; q++) { + ay = p - q; + az = q; + + if (xyz == 0) { /* build along x */ + i_i0 = io(p)-p+q-1; + if (i_i0) + fprintf(code," i0 = I0 + %d*bcd_num;\\\n",i_i0); + else + fprintf(code," i0 = I0;\\\n"); + if (ax) { + i_i1 = io(p)-p+q-1; + if (i_i1) + fprintf(code," i1 = I1 + %d*bcd_num;\\\n",i_i1); + else + fprintf(code," i1 = I1;\\\n"); + } + fprintf(code," for(bcd=0;bcdtwozeta_b;\\\n"); + fprintf(code," const double *i0, *i1;\\\n"); + fprintf(code," double *target = (vp);\\\n"); + fprintf(code," double *II0 = (I0);\\\n"); + fprintf(code," double *II1 = (I1);\\\n"); + fprintf(code," int a,cd;\\\n\\\n"); + i0_step = (lb+2)*(lb+3)/2; + i1_step = lb*(lb+1)/2; + + fprintf(code," for(a=0;atwozeta_c;\\\n"); + fprintf(code," const double *i0, *i1;\\\n"); + fprintf(code," double *target = (vp);\\\n"); + fprintf(code," double *II0 = (I0);\\\n"); + fprintf(code," double *II1 = (I1);\\\n"); + fprintf(code," int ab,d;\\\n\\\n"); + i0_step = (lc+2)*(lc+3)/2; + i1_step = lc*(lc+1)/2; + + fprintf(code," for(ab=0;abtwozeta_d;\\\n"); + fprintf(code," double *target = (vp);\\\n"); + fprintf(code," double *II0 = (I0);\\\n"); + fprintf(code," double *II1 = (I1);\\\n"); + fprintf(code," int abc;\\\n\\\n"); + i0_step = (ld+2)*(ld+3)/2; + i1_step = ld*(ld+1)/2; + + fprintf(code," for(abc=0;abc +#include +#include +#include +#define MAXALLOC 10000 + +int free_block[MAXALLOC]; /* Marks of free-occupied blocks */ +int block_length[MAXALLOC]; /* Keeps sizes of all blocks */ +int last_free; /* Number of the last free block */ +int max_mem; /* Amount of memory used by classes up to this point */ +int mem_top; /* Total memory allocated up to this point */ + +/* initialize memory stack */ +void init_mem(int memory) +{ + last_free = 1; + memset(free_block,0,MAXALLOC*sizeof(int)); /* All blocks are free */ + memset(block_length,0,MAXALLOC*sizeof(int)); /* All of them are zero in length ... */ + block_length[0] = memory; /* except for the first one */ + max_mem = 0; + mem_top = memory; +} + +/* add memory */ +void add_mem(int memory) +{ + int i; + int addto = 0; + int himem = 0; + + mem_top += memory; + /* Find the last free block and add all this memory to it */ + for(i=0; i himem){ + himem = free_block[i]; + addto = i; + } + } +#if 0 + printf("adding %d to memory\n\tnew top = %d\n", memory, + free_block[addto]+block_length[addto]+memory); +#endif + block_length[addto] = block_length[addto]+memory; +} + +/* Find a block of the requested size */ +int get_mem(int size) +{ + int i, j; + +/* try to find one that fits exactly */ + for(i=last_free-1; i>=0; i--){ + if(block_length[i] == size){ + j = free_block[i]; + if(free_block[i]+block_length[i]==mem_top) add_mem(500); + use(i, size); + return j; + } + } + +/* ok, try to find a bigger one that will work */ + for(i=last_free-1; i>=0; i--){ + if(block_length[i] > size){ + j = free_block[i]; + use(i, size); + return j; + } + } + + +/* last resort, expand memory */ + add_mem(1000); + return get_mem(size); + +} + + +void use(int n, int s) +{ + int i; +#if 0 + printf("issuing %d doubles starting at %d out of free block %d\n", + s, free_block[n], n); + printf("last_free = %d\n", last_free); +#endif + if(s==block_length[n]){ + for(i=n; imax_mem) max_mem = free_block[n]; + } + else exit(1); + +} + +void free_mem(int n, int size) +{ + int i, j; + + free_block[last_free] = n; + block_length[last_free] = size; + last_free++; + + consolidate(); + +} + +void consolidate() +{ + int i, j; + int right_bound_i; + int done = 1; + + do { + done = 1; + for(i=0; i +#include +#include +#include +#include +#include +#include + +/* Global data */ +FILE *outfile, *vrr_header, *hrr_header, *libint_header, *init_code; +char *real_type; /*--- C type for real numbers ---*/ +int libint_stack_size[MAX_AM/2+1]; +LibintParams_t Params; + +void punt(); +extern void emit_vrr_build(); +extern void emit_vrr_build_macro(); +extern void emit_order(); +extern void emit_hrr_build(); +extern void emit_hrr_build_macro(); + +int main() +{ + int i,j,k,l,f; + int j_min, j_max, k_min, k_max, l_min, l_max; + int errcod; + int old_am = 0; + int new_am, opt_am; + int max_class_size = DEFAULT_MAX_CLASS_SIZE; + int long_double = 0; /*--- Whether to use long doubles ---*/ + int stack_size; + + /*------------------------------- + Initialize files and libraries + -------------------------------*/ + outfile = fopen("./output.dat", "w"); + vrr_header = fopen("./vrr_header.h","w"); + hrr_header = fopen("./hrr_header.h","w"); + libint_header = fopen("./libint.h","w"); + init_code = fopen("./init_libint.cc","w"); + + new_am = LIBINT_MAX_AM; + if (new_am <= 0) + punt(" MAX_AM must be positive."); + if (new_am > MAX_AM/2) + punt(" Maximum MAX_AM exceeded. Contact the program author."); + + opt_am = LIBINT_OPT_AM; + if (opt_am < 2) + opt_am = DEFAULT_OPT_AM; + if (opt_am > new_am) opt_am = new_am; + + max_class_size = LIBINT_MAX_CLASS_SIZE; + if (max_class_size < 10) + punt(" MAX_CLASS_SIZE cannot be smaller than 10."); + + long_double = LONG_DOUBLE; + if (long_double) { + i = strlen("long double") + 1; + real_type = (char *) malloc(i*sizeof(char)); + sprintf(real_type,"long double"); + } + else { + i = strlen("double") + 1; + real_type = (char *) malloc(i*sizeof(char)); + sprintf(real_type,"double"); + } + + /*------------- + Init globals + -------------*/ + for(l=0;l<=new_am;l++) + libint_stack_size[l] = 1; /* 1 is a safe value and ensures that int_stack is allocated */ + Params.new_am = 2*new_am; + Params.old_am = 0; + Params.opt_am = 2*opt_am; + Params.max_class_size = max_class_size; + Params.max_am_to_inline_vrr_worker = -1; + Params.max_am_manager_to_inline_vrr_worker = -1; + Params.max_am_to_inline_hrr_worker = -1; + Params.max_am_manager_to_inline_hrr_worker = -1; + Params.max_am_to_inline_vrr_manager = -1; + + /* Setting up init_libint.c, header.h */ + fprintf(init_code,"#include \n"); + fprintf(init_code,"#include \n"); + fprintf(init_code,"#include \"libint.h\"\n"); + fprintf(init_code,"#include \"hrr_header.h\"\n\n"); + fprintf(init_code,"extern \"C\" {\n"); + fprintf(init_code,"REALTYPE *(*build_eri[%d][%d][%d][%d])(Libint_t *, int);\n",new_am+1,new_am+1,new_am+1,new_am+1); + fprintf(init_code,"int libint_stack_size[%d];\n\n",new_am+1); + fprintf(init_code,"/* This function initializes a matrix of pointers to routines */\n"); + fprintf(init_code,"/* for computing ERI classes up to (%cs|%cs) - the base of the library */\n\n", + am_letter[2*new_am],am_letter[2*new_am]); + fprintf(init_code,"void init_libint_base()\n{\n"); + + /* Declare generic build routines */ + fprintf(vrr_header,"extern \"C\" REALTYPE *vrr_build_xxxx(int am[2], prim_data *, REALTYPE *, const REALTYPE *,"); + fprintf(vrr_header,"const REALTYPE *, const REALTYPE *, const REALTYPE *, const REALTYPE *);\n\n"); + + emit_order(); + emit_vrr_build(); + emit_vrr_build_macro(); + emit_hrr_build(); + emit_hrr_build_macro(); + + /* put computed stack sizes for each angular momentum level into init_libint_base() */ + for(l=0;l<=new_am;l++) + fprintf(init_code,"\n libint_stack_size[%d] = %d;",l,libint_stack_size[l]); + + fprintf(init_code,"\n}\n"); + fprintf(init_code,"/* These functions initialize library objects */\n"); + fprintf(init_code,"/* Library objects operate independently of each other */\n"); + fprintf(init_code,"int init_libint(Libint_t *libint, int max_am, int max_num_prim_quartets)\n{\n"); + fprintf(init_code," int memory = 0;\n\n"); + fprintf(init_code," if (max_am >= LIBINT_MAX_AM) return -1;\n"); + fprintf(init_code," libint->int_stack = (REALTYPE *) malloc(libint_stack_size[max_am]*sizeof(REALTYPE));\n"); + fprintf(init_code," memory += libint_stack_size[max_am];\n"); + fprintf(init_code," libint->PrimQuartet = (prim_data *) malloc(max_num_prim_quartets*sizeof(prim_data));\n"); + fprintf(init_code," memory += max_num_prim_quartets*sizeof(prim_data)/sizeof(REALTYPE);\n"); + fprintf(init_code," return memory;\n}\n\n"); + fprintf(init_code,"void free_libint(Libint_t *libint)\n{\n"); + fprintf(init_code," if (libint->int_stack != NULL) {\n"); + fprintf(init_code," free(libint->int_stack);\n"); + fprintf(init_code," libint->int_stack = NULL;\n"); + fprintf(init_code," }\n"); + fprintf(init_code," if (libint->PrimQuartet != NULL) {\n"); + fprintf(init_code," free(libint->PrimQuartet);\n"); + fprintf(init_code," libint->PrimQuartet = NULL;\n"); + fprintf(init_code," }\n\n"); + fprintf(init_code," return;\n}\n\n"); + fprintf(init_code,"int libint_storage_required(int max_am, int max_num_prim_quartets)\n{\n"); + fprintf(init_code," int memory = 0;\n\n"); + fprintf(init_code," if (max_am >= LIBINT_MAX_AM) return -1;\n"); + fprintf(init_code," memory += libint_stack_size[max_am];\n"); + fprintf(init_code," memory += max_num_prim_quartets*sizeof(prim_data)/sizeof(REALTYPE);\n"); + fprintf(init_code," return memory;\n}\n\n"); + fprintf(init_code,"}\n"); /* end of extern "C" */ + fclose(init_code); + fclose(vrr_header); + fclose(hrr_header); + + /* Setting up libint.h */ + fprintf(libint_header,"#ifndef _psi3_libint_h\n"); + fprintf(libint_header,"#define _psi3_libint_h\n\n"); + fprintf(libint_header,"/* Maximum angular momentum of functions in a basis set plus 1 */\n"); + fprintf(libint_header,"#define REALTYPE %s\n",real_type); + if (long_double) + fprintf(libint_header,"#define NONDOUBLE_INTS\n"); + fprintf(libint_header,"#define LIBINT_MAX_AM %d\n",1+new_am); + fprintf(libint_header,"#define LIBINT_OPT_AM %d\n",1+opt_am); + fprintf(libint_header,"typedef struct pdata{\n"); + fprintf(libint_header," REALTYPE F[%d];\n",4*new_am+1); + fprintf(libint_header," REALTYPE U[6][3];\n"); + fprintf(libint_header," REALTYPE twozeta_a;\n"); + fprintf(libint_header," REALTYPE twozeta_b;\n"); + fprintf(libint_header," REALTYPE twozeta_c;\n"); + fprintf(libint_header," REALTYPE twozeta_d;\n"); + fprintf(libint_header," REALTYPE oo2z;\n"); + fprintf(libint_header," REALTYPE oo2n;\n"); + fprintf(libint_header," REALTYPE oo2zn;\n"); + fprintf(libint_header," REALTYPE poz;\n"); + fprintf(libint_header," REALTYPE pon;\n"); + fprintf(libint_header," REALTYPE oo2p;\n"); + fprintf(libint_header," REALTYPE ss_r12_ss;\n"); + fprintf(libint_header," } prim_data;\n\n"); + fprintf(libint_header,"typedef struct {\n"); + fprintf(libint_header," REALTYPE *int_stack;\n"); + fprintf(libint_header," prim_data *PrimQuartet;\n"); + fprintf(libint_header," REALTYPE AB[3];\n"); + fprintf(libint_header," REALTYPE CD[3];\n"); + fprintf(libint_header," REALTYPE *vrr_classes[%d][%d];\n",1+2*new_am,1+2*new_am); + fprintf(libint_header," REALTYPE *vrr_stack;\n"); + fprintf(libint_header," } Libint_t;\n\n"); + fprintf(libint_header,"#ifdef __cplusplus\n"); + fprintf(libint_header,"extern \"C\" {\n"); + fprintf(libint_header,"#endif\n"); + fprintf(libint_header,"extern REALTYPE *(*build_eri[%d][%d][%d][%d])(Libint_t *, int);\n", + new_am+1,new_am+1,new_am+1,new_am+1); + fprintf(libint_header,"void init_libint_base();\n"); + fprintf(libint_header,"int init_libint(Libint_t *, int max_am, int max_num_prim_comb);\n"); + fprintf(libint_header,"void free_libint(Libint_t *);\n"); + fprintf(libint_header,"int libint_storage_required(int max_am, int max_num_prim_comb);\n"); + fprintf(libint_header,"#ifdef __cplusplus\n"); + fprintf(libint_header,"}\n"); + fprintf(libint_header,"#endif\n\n"); + fprintf(libint_header,"#endif\n"); + fclose(libint_header); + fclose(outfile); + exit(0); +} + + +void punt(char* str) +{ + printf("%s",str); + exit(1); +} + + diff --git a/src/bin/libint/build_libint.h b/src/bin/libint/build_libint.h new file mode 100644 index 0000000..aa78187 --- /dev/null +++ b/src/bin/libint/build_libint.h @@ -0,0 +1,38 @@ +#define MAX_AM 22 +#define DEFAULT_NEW_AM 8 +#define DEFAULT_OPT_AM 8 +#define DEFAULT_MAX_CLASS_SIZE 785 + +typedef struct { + + /* Twice the maximum AM for which manager routines need to be generated */ + int new_am; + + /* Twice the maximum AM for which VRR workers need to be generated */ + int opt_am; + + /* Twice the AM for which manager routines are already + generated and stored in an existing library */ + int old_am; + + /* Max number of integrals to be processed in one VRR worker. If a class + is larger than this then split the worker into several. */ + int max_class_size; + + /* The maximum AM for which VRR workers will be made inline functions */ + int max_am_to_inline_vrr_worker; + + /* The maximum AM of the VRR managers which will inline VRR workers */ + int max_am_manager_to_inline_vrr_worker; + + /* The maximum AM for which HRR workers will be made inline functions */ + int max_am_to_inline_hrr_worker; + + /* The maximum AM of the HRR managers which will inline HRR workers */ + int max_am_manager_to_inline_hrr_worker; + + /* The maximum AM for which VRR managers will be inlined into HRR managers */ + int max_am_to_inline_vrr_manager; + +} LibintParams_t; + diff --git a/src/bin/libint/emit_hrr_build.c b/src/bin/libint/emit_hrr_build.c new file mode 100644 index 0000000..cc19820 --- /dev/null +++ b/src/bin/libint/emit_hrr_build.c @@ -0,0 +1,354 @@ +#include +#include +#include +#include +#include + +extern FILE *outfile, *hrr_header; +extern LibintParams_t Params; + +extern void punt(char *); + +void emit_hrr_build() +{ + int new_am = Params.new_am; + int max_class_size = Params.max_class_size; + int am_to_inline = Params.max_am_to_inline_hrr_worker; + + FILE *code; + int p,q,r,s; + int ax,ay,az,bx,by,bz,cx,cy,cz,dx,dy,dz; + int t0, t1, t2, t3, t4; + int i,j,nj,i_i0,i_i1; + int k,l,nl,k_i0,k_i1; + int i0_step,i1_step; + int a, b; + int flag; + int am_in[2]; + int am[2][3]; + int current_highest_am, to_inline; + int xyz; + int class_size; + int split; + int la, lb; + int ld, lc, ld_max; + int curr_count,curr_subfunction; + int num_subfunctions, subbatch_length; + int FLOP_counter; + int f; + char code_name[20]; + char function_name[18]; + char **subfunction_name; + + + for(lc=0;lc<=new_am;lc++) { + ld_max = lc/2 + 1; + if (ld_max > lc) + ld_max = lc; + for(ld=1;ld<=ld_max;ld++) { + + /*----------------------- + HRR on centers C and D + -----------------------*/ + + am_in[0] = lc-ld; + am_in[1] = ld; + + /* Is this function to be made inline */ + current_highest_am = (am_in[0] > am_in[1]) ? am_in[0] : am_in[1]; + to_inline = (current_highest_am <= am_to_inline) ? 1 : 0; + + class_size = ((am_in[0]+1)*(am_in[0]+2)*(am_in[1]+1)*(am_in[1]+2))/4; + + if (to_inline) + fprintf(hrr_header, "#ifndef INLINE_HRR_WORKER\n"); + fprintf(hrr_header,"void hrr3_build_%c%c(const REALTYPE *, REALTYPE *, REALTYPE *, REALTYPE *, int);\n", + am_letter[am_in[0]],am_letter[am_in[1]]); + if (to_inline) + fprintf(hrr_header, "#endif\n"); + /* Decide if the routine has to be split into several routines producing "subbatches" */ + if (class_size > max_class_size) { + split = 1; + num_subfunctions = ceil((double)class_size/max_class_size); + subbatch_length = 1 + class_size/num_subfunctions; + } + else { + split = 0; + subbatch_length = class_size; + } + + sprintf(function_name,"hrr3_build_%c%c",am_letter[am_in[0]],am_letter[am_in[1]]); + if (split) { + subfunction_name = (char **) malloc (num_subfunctions*sizeof(char *)); + for(i=0;i max_class_size) { + split = 1; + num_subfunctions = ceil((double)class_size/max_class_size); + subbatch_length = 1 + class_size/num_subfunctions; + } + else { + split = 0; + subbatch_length = class_size; + } + + sprintf(function_name,"hrr1_build_%c%c",am_letter[am_in[0]],am_letter[am_in[1]]); + if (split) { + subfunction_name = (char **) malloc (num_subfunctions*sizeof(char *)); + for(i=0;i +#include +#include +#include + +extern FILE *outfile, *hrr_header; +extern LibintParams_t Params; + +extern void punt(char *); + +void emit_hrr_build_macro() +{ + int new_am = Params.new_am; + int max_class_size = Params.max_class_size; + int am_to_inline = Params.max_am_to_inline_hrr_worker; + + FILE *code; + int p,q,r,s; + int ax,ay,az,bx,by,bz,cx,cy,cz,dx,dy,dz; + int t0, t1, t2, t3, t4; + int i,j,nj,i_i0,i_i1; + int k,l,nl,k_i0,k_i1; + int i0_step,i1_step; + int a, b; + int flag; + int am_in[2]; + int am[2][3]; + int current_highest_am, to_inline; + int xyz; + int class_size; + int split; + int la, lb; + int ld, lc, ld_max; + int curr_count,curr_subfunction; + int num_subfunctions, subbatch_length; + int FLOP_counter; + int f; + char code_name[20]; + char function_name[18]; + char **subfunction_name; + + + for(lc=0;lc<=new_am;lc++) { + ld_max = lc/2 + 1; + if (ld_max > lc) + ld_max = lc; + for(ld=1;ld<=ld_max;ld++) { + + /*----------------------- + HRR on centers C and D + -----------------------*/ + + am_in[0] = lc-ld; + am_in[1] = ld; + + /* Is this function to be made inline */ + current_highest_am = (am_in[0] > am_in[1]) ? am_in[0] : am_in[1]; + to_inline = (current_highest_am <= am_to_inline) ? 1 : 0; + if (!to_inline) + continue; + + class_size = ((am_in[0]+1)*(am_in[0]+2)*(am_in[1]+1)*(am_in[1]+2))/4; + + /* If the routine has to be split into several - user probably doesn't know what he/she is doing */ + if (class_size > max_class_size) + punt("MAX_CLASS_SIZE is too small for the given inlining threshold"); + else { + split = 0; + } + + sprintf(function_name,"hrr3_build_%c%c",am_letter[am_in[0]],am_letter[am_in[1]]); + sprintf(code_name,"%s.h",function_name); + code = fopen(code_name,"w"); + + fprintf(code,"#ifndef _libint_%s\n",function_name); + fprintf(code,"#define _libint_%s\n",function_name); + fprintf(code," /* These machine-generated functions compute a quartet of |%c%c) integrals */\n\n", + am_letter[am_in[0]],am_letter[am_in[1]]); + fprintf(code,"#define %s(CD, vp, I0, I1, ab_num)\\\n{\\\n", + function_name); + fprintf(code," const REALTYPE CD0 = CD[0];\\\n"); + fprintf(code," const REALTYPE CD1 = CD[1];\\\n"); + fprintf(code," const REALTYPE CD2 = CD[2];\\\n"); + fprintf(code," int ab;\\\n"); + fprintf(code," REALTYPE *target = (vp);\\\n"); + fprintf(code," REALTYPE *i0 = (I0);\\\n"); + fprintf(code," REALTYPE *i1 = (I1);\\\n\\\n"); + + nl = (am_in[1]*(am_in[1]+1))/2; + i0_step = (am_in[0]+2)*(am_in[0]+3)*nl/2; + i1_step = (am_in[0]+1)*(am_in[0]+2)*nl/2; + fprintf(code," for(ab=0;ab +#include +#include +#include +#include +#include +#define MAXNODE 20000 +#define NONODE -1000000 +#define SSSSNODE -1111 + +static int last_hrr_node = 0; /* Global pointer to the last node on the HRR stack */ +static int last_vrr_node = 0; /* Global pointer to the last node on the VRR stack */ + +extern FILE *outfile, *hrr_header, *init_code; +extern int libint_stack_size[MAX_AM/2+1]; +extern LibintParams_t Params; + +typedef struct hrr_node{ + int A, B, C, D; /* Angular momenta on centers A and C */ + int size; /* Class size in double words */ + int pointer; + int children[2]; /* Up to 2 children of the class */ + int parents_counter; + int num_parents; /* Number of parents */ + int parents[5]; /* Pointers to parents */ + int llink; /* Pointer to a class computed right before computing this one */ + int rlink; /* Pointer to a class to be computed after this one is */ + int marked; /* Flag indicating that this node has been computed */ + int target; /* Flag indicating that this node is among targets */ + } hrr_class; + +typedef struct vrr_node{ + int A, C; /* Angular momenta on centers A and C */ + int m; /* Auxiliary index */ + int size; /* Class size in double words */ + int pointer; + int children[5]; /* Up to 5 children of the class */ + int parents_counter; + int num_parents; /* Number of parents */ + int parents[9]; /* Pointers to parents */ + int llink; /* Pointer to a class computed right before computing this one */ + int rlink; /* Pointer to a class to be computed after this one is */ + int marked; + int target; + } vrr_class; + + +static int first_hrr_to_compute = 0; /* Number of the first class to be computed + (pointer to the beginning of the linked list) */ +static int first_vrr_to_compute = 0; /* Number of the first class to be computed + (pointer to the beginning of the linked list) */ + +static int hrr_hash_table[MAX_AM+1][MAX_AM+1][MAX_AM+1][MAX_AM+1]; +static int vrr_hash_table[MAX_AM+1][MAX_AM+1][2*MAX_AM+1]; + + +extern void punt (char*); +static int mk_hrr_node(hrr_class node, hrr_class *allnodes, int new); +static int mk_vrr_node(vrr_class node, vrr_class *allnodes, int new); +static void mark_hrr_parents(int n, hrr_class *allnodes, int rent); +static void mark_vrr_parents(int n, vrr_class *allnodes, int rent); +static int alloc_mem_hrr(hrr_class *nodes); +static int alloc_mem_vrr(vrr_class *nodes); + +void emit_order() +{ + int old_am = Params.old_am; + int new_am = Params.new_am; + int opt_am = Params.opt_am; + int am_to_inline_into_hrr = Params.max_am_to_inline_vrr_manager; + int am_to_inline_vrr = Params.max_am_manager_to_inline_vrr_worker; + int am_to_inline_hrr = Params.max_am_manager_to_inline_hrr_worker; + int to_inline_into_hrr, to_inline_vrr, to_inline_hrr; + + int i, j, k, l; + int la, lc, lc_min, ld, ld_max, ld_min; + int lb, lb_min, lb_max; + int current_highest_am, max_node_am; + int base_mem, hrr_mem, vrr_mem; + hrr_class hrr_nodes[MAXNODE]; /* Stack of HRR nodes */ + vrr_class vrr_nodes[MAXNODE]; /* Stack of VRR nodes */ + int target_data; + int done; + int max_stack_size = 0; + int num_vrr_targets; + int target_vrr_nodes[MAX_AM*MAX_AM]; + char hrr_code_name[] = "hrr_order_0000.cc"; + char hrr_function_name[] = "hrr_order_0000"; + char vrr_code_name[] = "vrr_order_0000.cc"; + char vrr_function_name[] = "vrr_order_0000"; + char inline_vrr_list_name[] = "inline_vrr_order_0000.h"; + char inline_hrr_list_name[] = "inline_hrr_order_0000.h"; + FILE *hrr_code, *vrr_code, *inline_vrr_list, *inline_hrr_list; + + for(la=0;la<=new_am;la++) { + lb_max = la/2; + lb_min = (la <= new_am/2) ? 0 : la - new_am/2; + lc_min = (la == 0) ? 1 : la; + for(lb=lb_min;lb<=lb_max;lb++) { + for(lc=lc_min;lc<=new_am;lc++) { + ld_max = lc/2; + ld_min = (lc <= new_am/2) ? 0 : lc - new_am/2; + for(ld=ld_min;ld<=ld_max;ld++) { + + current_highest_am = (la-lb > lb) ? la-lb : lb; + current_highest_am = (current_highest_am > lc-ld) ? current_highest_am : lc-ld; + current_highest_am = (current_highest_am > ld) ? current_highest_am : ld; + to_inline_into_hrr = (current_highest_am <= am_to_inline_into_hrr) ? 1 : 0; + to_inline_vrr = (current_highest_am <= am_to_inline_vrr) ? 1 : 0; + to_inline_hrr = (current_highest_am <= am_to_inline_hrr) ? 1 : 0; + + /*--------------------------------------------------------------- + Form code and function names for HRR and VRR ordering routines + ---------------------------------------------------------------*/ + sprintf(hrr_function_name,"hrr_order_%c%c%c%c", + am_letter[la-lb],am_letter[lb], + am_letter[lc-ld],am_letter[ld]); + sprintf(vrr_function_name,"vrr_order_%c%c%c%c", + am_letter[la-lb],am_letter[lb], + am_letter[lc-ld],am_letter[ld]); + sprintf(hrr_code_name,"%s.cc",hrr_function_name); + if (to_inline_into_hrr) + sprintf(vrr_code_name,"%s.h",vrr_function_name); + else + sprintf(vrr_code_name,"%s.cc",vrr_function_name); + sprintf(inline_vrr_list_name,"inline_vrr_order_%c%c%c%c.h", + am_letter[la-lb],am_letter[lb], + am_letter[lc-ld],am_letter[ld]); + sprintf(inline_hrr_list_name,"inline_hrr_order_%c%c%c%c.h", + am_letter[la-lb],am_letter[lb], + am_letter[lc-ld],am_letter[ld]); + hrr_code = fopen(hrr_code_name,"w"); + vrr_code = fopen(vrr_code_name,"w"); + inline_vrr_list = fopen(inline_vrr_list_name,"w"); + inline_hrr_list = fopen(inline_hrr_list_name,"w"); + + /*----------------------------------- + Write the overhead to the HRR code + -----------------------------------*/ + fprintf(hrr_code,"#include \n"); + fprintf(hrr_code,"#include \n"); + fprintf(hrr_code,"#include \"libint.h\"\n"); + if (to_inline_hrr) { + fprintf(hrr_code,"#define INLINE_HRR_WORKER\n"); + fprintf(hrr_code,"#include \"%s\"\n",inline_hrr_list_name); + } + fprintf(hrr_code,"#include \"hrr_header.h\"\n\n"); + if (to_inline_into_hrr) + fprintf(hrr_code,"#include \"%s\"\n",vrr_code_name); + else + fprintf(hrr_code,"extern void vrr_order_%c%c%c%c(Libint_t*, prim_data*);\n\n", + am_letter[la-lb],am_letter[lb],am_letter[lc-ld],am_letter[ld]); + fprintf(hrr_code," /* Computes quartets of (%c%c|%c%c) integrals */\n\n", + am_letter[la-lb],am_letter[lb],am_letter[lc-ld],am_letter[ld]); + fprintf(hrr_code,"REALTYPE *%s(Libint_t *Libint, int num_prim_comb)\n{\n",hrr_function_name); + fprintf(hrr_code," prim_data *Data = Libint->PrimQuartet;\n"); + fprintf(hrr_code," REALTYPE *int_stack = Libint->int_stack;\n"); + fprintf(hrr_code," int i;\n\n"); + + /*------------------------------------------------------------- + Include the function into the hrr_header.h and init_libint.c + -------------------------------------------------------------*/ + fprintf(hrr_header,"REALTYPE *%s(Libint_t *, int);\n",hrr_function_name); + fprintf(init_code," build_eri[%d][%d][%d][%d] = %s;\n",la-lb,lb,lc-ld,ld,hrr_function_name); + + /*----------------------------------- + Write the overhead to the VRR code + -----------------------------------*/ + fprintf(vrr_code,"#include \n"); + fprintf(vrr_code,"#include \"libint.h\"\n"); + if (to_inline_vrr) { + fprintf(vrr_code,"#define INLINE_VRR_WORKER\n"); + fprintf(vrr_code,"#include \"%s\"\n",inline_vrr_list_name); + } + fprintf(vrr_code,"#include \"vrr_header.h\"\n\n"); + fprintf(vrr_code," /* Computes quartets necessary to compute (%c%c|%c%c) integrals */\n\n", + am_letter[la-lb],am_letter[lb],am_letter[lc-ld],am_letter[ld]); + if (to_inline_into_hrr) + fprintf(vrr_code,"inline "); + fprintf(vrr_code,"void %s(Libint_t * Libint, prim_data *Data)\n{\n",vrr_function_name); + + /*---------------------------- + Zero out the hashing tables + ----------------------------*/ + for(i=0;i<=MAX_AM;i++) + for(j=0;j<=MAX_AM;j++) { + memset(vrr_hash_table[i][j],0,(2*MAX_AM+1)*sizeof(int)); + for(k=0;k<=MAX_AM;k++) + memset(hrr_hash_table[i][j][k],0,(MAX_AM+1)*sizeof(int)); + } + + + + /* (a b|c d) */ + hrr_nodes[0].A = la-lb; + hrr_nodes[0].B = lb; + hrr_nodes[0].C = lc-ld; + hrr_nodes[0].D = ld; + hrr_nodes[0].llink = -1; + hrr_nodes[0].rlink = -1; + first_hrr_to_compute = 0; + last_hrr_node = 0; + mk_hrr_node(hrr_nodes[0], hrr_nodes, 0); + hrr_nodes[0].target = 1; + + /*------------------------------------------- + Traverse the graph starting at each target + -------------------------------------------*/ + for(k=0; k<2; k++) + if(hrr_nodes[0].children[k]>0) + mark_hrr_parents(hrr_nodes[0].children[k], hrr_nodes, 0); + + /*----------------------------------------------------------------- + Empirical rule as with what heap size to start memory allocation + -----------------------------------------------------------------*/ + init_mem(1); + + /*--------------------------------------------------------------- + Allocate and zero out space for classes to be generated by VRR + ---------------------------------------------------------------*/ + for(i=last_hrr_node-1;i>=0;i--) { + if (hrr_nodes[i].B == 0 && hrr_nodes[i].D == 0) { + hrr_nodes[i].marked = 1; + hrr_nodes[i].pointer = get_mem(hrr_nodes[i].size); + fprintf(hrr_code," Libint->vrr_classes[%d][%d] = int_stack + %d;\n", + hrr_nodes[i].A,hrr_nodes[i].C,hrr_nodes[i].pointer); + } + } + base_mem = get_total_memory(); + fprintf(hrr_code," memset(int_stack,0,%d*sizeof(REALTYPE));\n\n",base_mem); + fprintf(hrr_code," Libint->vrr_stack = int_stack + %d;\n",base_mem); + + /*---------------------------- + Build the HRR call sequence + ----------------------------*/ + target_data = alloc_mem_hrr(hrr_nodes); + hrr_mem = get_total_memory(); + if (max_stack_size < hrr_mem) + max_stack_size = hrr_mem; + fprintf(hrr_code," for(i=0;iCD,int_stack+%d,int_stack+%d,", + am_letter[hrr_nodes[j].C], am_letter[hrr_nodes[j].D], hrr_nodes[j].pointer, + hrr_nodes[hrr_nodes[j].children[0]].pointer); + fprintf(hrr_code, "int_stack+%d,%d);\n", hrr_nodes[hrr_nodes[j].children[1]].pointer, + io(1+hrr_nodes[j].A)*io(1+hrr_nodes[j].B)); + /* Add this function to the list of inlined functions if necessary */ + max_node_am = (hrr_nodes[j].C > hrr_nodes[j].D) ? hrr_nodes[j].C : hrr_nodes[j].D; + if (to_inline_hrr && max_node_am <= Params.max_am_to_inline_hrr_worker) + fprintf(inline_hrr_list,"#include \"hrr3_build_%c%c.h\"\n", am_letter[hrr_nodes[j].C], am_letter[hrr_nodes[j].D]); + } + else if (hrr_nodes[j].B != 0) { + fprintf(hrr_code, " hrr1_build_%c%c(Libint->AB,int_stack+%d,int_stack+%d,", + am_letter[hrr_nodes[j].A], am_letter[hrr_nodes[j].B], hrr_nodes[j].pointer, + hrr_nodes[hrr_nodes[j].children[0]].pointer); + fprintf(hrr_code, "int_stack+%d,%d);\n", hrr_nodes[hrr_nodes[j].children[1]].pointer, + io(1+hrr_nodes[j].C)*io(1+hrr_nodes[j].D)); + /* Add this function to the list of inlined functions if necessary */ + max_node_am = (hrr_nodes[j].A > hrr_nodes[j].B) ? hrr_nodes[j].A : hrr_nodes[j].B; + if (to_inline_hrr && max_node_am <= Params.max_am_to_inline_hrr_worker) + fprintf(inline_hrr_list,"#include \"hrr1_build_%c%c.h\"\n", am_letter[hrr_nodes[j].A], am_letter[hrr_nodes[j].B]); + } + j = hrr_nodes[j].rlink; + } while (j != -1); + fprintf(hrr_code," return int_stack+%d;}\n",target_data); + fclose(hrr_code); + fclose(inline_hrr_list); + printf("Done with %s\n",hrr_code_name); + for(i=0;i0){ + mark_vrr_parents(vrr_nodes[j].children[k], vrr_nodes, j); + } + } + } + + /*----------------------------------------------------------------- + Empirical rule as with what size heap to start memory allocation + -----------------------------------------------------------------*/ + init_mem(1); + + + /* Build the call sequence */ + target_data = alloc_mem_vrr(vrr_nodes); + vrr_mem = base_mem + get_total_memory(); + if (max_stack_size < vrr_mem) + max_stack_size = vrr_mem; + fprintf(vrr_code," REALTYPE *vrr_stack = Libint->vrr_stack;\n"); + fprintf(vrr_code," REALTYPE *tmp, *target_ptr;\n int i, am[2];\n"); + + j = first_vrr_to_compute; + do { + if (vrr_nodes[j].A <= opt_am && vrr_nodes[j].C <= opt_am) { + fprintf(vrr_code, " _BUILD_%c0%c0(Data,", am_letter[vrr_nodes[j].A], am_letter[vrr_nodes[j].C]); + /* Add this function to the list of inlined functions if necessary */ + max_node_am = (vrr_nodes[j].A > vrr_nodes[j].C) ? vrr_nodes[j].A : vrr_nodes[j].C; + if (to_inline_vrr && max_node_am <= Params.max_am_to_inline_vrr_worker) + fprintf(inline_vrr_list,"#include \"build_%c0%c0.h\"\n", am_letter[vrr_nodes[j].A], am_letter[vrr_nodes[j].C]); + } + else { + fprintf(vrr_code, " am[0] = %d; am[1] = %d;\n", vrr_nodes[j].A, vrr_nodes[j].C); + fprintf(vrr_code, " vrr_build_xxxx(am,Data,"); + } + fprintf(vrr_code, "vrr_stack+%d", vrr_nodes[j].pointer); + for(k=0; k<5; k++){ + if(vrr_nodes[j].children[k] > 0) + fprintf(vrr_code, ", vrr_stack+%d", vrr_nodes[vrr_nodes[j].children[k]].pointer); + else if (vrr_nodes[j].children[k] == NONODE) + fprintf(vrr_code, ", NULL"); + else + fprintf(vrr_code, ", Data->F+%d", (-1)*vrr_nodes[j].children[k]); + } + fprintf(vrr_code, ");\n"); + if (vrr_nodes[j].target == 1) { + fprintf(vrr_code, " tmp = vrr_stack + %d;\n", vrr_nodes[j].pointer); + fprintf(vrr_code, " target_ptr = Libint->vrr_classes[%d][%d];\n",vrr_nodes[j].A,vrr_nodes[j].C); + fprintf(vrr_code, " for(i=0;i<%d;i++)\n",(vrr_nodes[j].A+1)*(vrr_nodes[j].A+2)*(vrr_nodes[j].C+1)*(vrr_nodes[j].C+2)/4); + fprintf(vrr_code, " target_ptr[i] += tmp[i];\n"); + } + j = vrr_nodes[j].rlink; + } while (j != -1); + fprintf(vrr_code, "\n}\n\n"); + fclose(vrr_code); + fclose(inline_vrr_list); + printf("Done with %s\n",vrr_code_name); + for(i=0;i1){ + O[2].A = node.A-2; + O[2].C = node.C; + O[2].m = node.m; + allnodes[thisnode].children[2] = + mk_vrr_node(O[2], allnodes, made); + O[3].A = node.A-2; + O[3].C = node.C; + O[3].m = node.m+1; + allnodes[thisnode].children[3] = + mk_vrr_node(O[3], allnodes, made); + } + if(node.C){ + O[4].A = node.A-1; + O[4].C = node.C-1; + O[4].m = node.m+1; + allnodes[thisnode].children[4] = + mk_vrr_node(O[4], allnodes, made); + } + } + else if(node.C){ + O[0].A = node.A; + O[0].C = node.C-1; + O[0].m = node.m; + allnodes[thisnode].children[0] = + mk_vrr_node(O[0], allnodes, made); + O[1].A = node.A; + O[1].C = node.C-1; + O[1].m = node.m+1; + allnodes[thisnode].children[1] = + mk_vrr_node(O[1], allnodes, made); + if(node.C>1){ + O[2].A = node.A; + O[2].C = node.C-2; + O[2].m = node.m; + allnodes[thisnode].children[2] = + mk_vrr_node(O[2], allnodes, made); + O[3].A = node.A; + O[3].C = node.C-2; + O[3].m = node.m+1; + allnodes[thisnode].children[3] = + mk_vrr_node(O[3], allnodes, made); + } + } + } + + return thisnode; + +} + + +/* Make hrr_nodes[rent] a parent of hrr_nodes[n] and proceed recursively */ + +void mark_hrr_parents(int n, hrr_class *allnodes, int rent) +{ + int i; + int *tmp; + + /* handle case where it's in the parent list already */ + for(i=allnodes[n].num_parents-1; i>=allnodes[n].parents_counter; i--) + if(rent==allnodes[n].parents[i]) return; + + /* if the parent rent is not in the list - add it to the list! */ + i = --allnodes[n].parents_counter; + allnodes[n].parents[i] = rent; + /* hits from all of the parents has been received - schedule it for computation and mark all of its children */ + if (i == 0 && (allnodes[n].B != 0 || allnodes[n].D != 0)) { + allnodes[n].llink = -1; + allnodes[n].rlink = first_hrr_to_compute; + allnodes[first_hrr_to_compute].llink = n; + first_hrr_to_compute = n; + + for(i=0; i<2; i++) + if(allnodes[n].children[i]>0) + mark_hrr_parents(allnodes[n].children[i], allnodes, n); + } + return; +} + + +/* Make vrr_nodes[rent] a parent of vrr_nodes[n] and proceed recursively */ + +void mark_vrr_parents(int n, vrr_class *allnodes, int rent) +{ + int i; + int *tmp; + + /* handle case where it's in there already */ + for(i=allnodes[n].num_parents-1; i>=allnodes[n].parents_counter; i--) + if(rent==allnodes[n].parents[i]) return; + + + /* if the parent rent is not in the list - add it to the list! */ + i = --allnodes[n].parents_counter; + allnodes[n].parents[i] = rent; + /* hits from all of the parents has been received - schedule it for computation and mark all of its children */ + if (i == 0) { + allnodes[n].llink = -1; + allnodes[n].rlink = first_vrr_to_compute; + allnodes[first_vrr_to_compute].llink = n; + first_vrr_to_compute = n; + + for(i=0; i<5; i++) + if(allnodes[n].children[i]>0) + mark_vrr_parents(allnodes[n].children[i], allnodes, n); + + } + return; +} + + + +/* This functions controls memory placement of computed classes on the CINTS stack */ + +int alloc_mem_hrr(hrr_class *nodes) +{ + int i, j, k, l; + int size; + int child; + int free_it; + + j = first_hrr_to_compute; + do{ + /* Node to compute */ + if (nodes[j].marked == 0) { + nodes[j].marked = 1; /* sign that it has been passed */ + nodes[j].pointer = get_mem(nodes[j].size); /* Allocate memory for it on a CINTS-provided stack */ + } + + /* Figure out which children can be freed, + i.e. which children are not targets and have all parents marked */ + for(k=0; k<2; k++){ + child = nodes[j].children[k]; + if(child>0) + if (nodes[child].target == 0) { + free_it = 1; + for(l=0; l0){ + free_it = 1; + for(l=0; l +#include +#include +#include +#include +#include + +extern FILE *outfile, *vrr_header; +extern void punt(char *); +extern LibintParams_t Params; + +static void declare_localv(); +static void define_localv(); + +static char **k1, **k2, **k3; + +void emit_vrr_build() +{ + int old_am = Params.old_am; + int new_am = Params.opt_am; + int max_class_size = Params.max_class_size; + int am_to_inline = Params.max_am_to_inline_vrr_worker; + + FILE *code; + int i, j, k, l, f; + int a, b; + int flag; + int am[2][3]; + int am_in[2]; + int current_highest_am, to_inline; + int nflip = 0; + int t1, t2, t3, t4; + int class_size; + int type; + int max1 = 0; + int max2 = 0; + int foo; + int la, lc, lc_min, lc_max; + int k1max, k2max, k3max; + int split,num_subfunctions,subbatch_length; + int curr_count,curr_subfunction; + int FLOP_counter; + static char *k4[] = {"lpoz","lpon"}; + static const char *k1_suff = "o2z"; + static const char *k2_suff = "o2zn"; + static const char *k3_suff = "o2n"; + char *code_name; + char *function_name; + char **subfunction_name; + + k1 = (char **) malloc((new_am)*sizeof(char *)); + k2 = (char **) malloc((new_am)*sizeof(char *)); + k3 = (char **) malloc((new_am)*sizeof(char *)); + for(i=1;i<=new_am;i++) { + j = strlen((void *)number[i]); + k1[i-1] = (char*) malloc((4+j)*sizeof(char)); + k2[i-1] = (char*) malloc((5+j)*sizeof(char)); + k3[i-1] = (char*) malloc((4+j)*sizeof(char)); + strcpy(k1[i-1],(void *)number[i]); + strcpy(k2[i-1],(void *)number[i]); + strcpy(k3[i-1],(void *)number[i]); + strcat(k1[i-1],(void *)k1_suff); + strcat(k2[i-1],(void *)k2_suff); + strcat(k3[i-1],(void *)k3_suff); + } + code_name = (char *) malloc(sizeof(char)*21); + function_name = (char *) malloc(sizeof(char)*18); + + for(la=0;la<=new_am;la++) { + lc_min = (la >= old_am + 1) ? 0 : old_am + 1; + lc_max = new_am; + for(lc=lc_min;lc<=lc_max;lc++) { + + /* Is this function to be made inline */ + current_highest_am = (la > lc) ? la : lc; + to_inline = (current_highest_am <= am_to_inline) ? 1 : 0; + + fprintf(outfile," AM_a = %c AM_c = %c\n",am_letter[la],am_letter[lc]); + am_in[0] = la; + am_in[1] = lc; + if (la == 0) { + a = 1; + k2max = la; + k3max = lc - 1; + } + else { + a = 0; + k2max = lc; + k1max = la - 1; + } + foo = 5; + if(a==0) foo = 4; + + class_size = ((am_in[a]+1)*(am_in[a]+2)*(am_in[a^1]+1)*(am_in[a^1]+2))/4; + + fprintf(vrr_header,"#define _BUILD_%c0%c0(Data,vp,i0,i1,i2,i3,i4) {",am_letter[la],am_letter[lc]); + /* Decide if the routine has to be split into several routines producing "subbatches" */ + if (class_size > max_class_size) { + split = 1; + num_subfunctions = ceil((double)class_size/max_class_size); + subbatch_length = 1 + class_size/num_subfunctions; + fprintf(vrr_header," tmp = _build_%c0%c0_0(Data,vp,i0,i1,i2,i3,i4); \\\n",am_letter[la],am_letter[lc]); + for(f=1;fam[a][b]+1) ? max1 : am[a][b]+1; + am[a][b] = am[a][b] + 1; + am_in[a] = am_in[a] + 1; + FLOP_counter += 4; + } + if(am[a^1][b]){ + am[a^1][b] = am[a^1][b] - 1; + am_in[a^1] = am_in[a^1] - 1; + t4 = hash(am,am_in); + fprintf(code, "\n + (%s)*I4[%d]", k2[am[a^1][b]], t4); + max2 = (max2>am[a^1][b]+1) ? max2 : am[a^1][b]+1; + am[a^1][b] = am[a^1][b] + 1; + am_in[a^1] = am_in[a^1] + 1; + FLOP_counter += 2; + } + fprintf(code, ";\n"); + am[a][b] = am[a][b] + 1; + am_in[a] = am_in[a] + 1; + + t1++; + curr_count++; + if (split == 1 && curr_count == subbatch_length) { + curr_count = 0; + curr_subfunction++; + fprintf(code,"return vp;\n}\n\n"); + fprintf(code,"REALTYPE *%s(prim_data *Data, REALTYPE *vp, const REALTYPE *I0, const REALTYPE *I1, const REALTYPE *I2, const REALTYPE *I3, const REALTYPE *I4)\n{\n", + subfunction_name[curr_subfunction]); + declare_localv(a,k1max,k2max,k3max,code); + define_localv(a,foo,k1max,k2max,k3max,code); + fprintf(code,"\n"); + } + } + } + } + } + if (split == 1) + fprintf(code,"return vp;\n}\n"); + else + fprintf(code,"\n}\n"); + fprintf(code,"/* Total number of FLOPs = %d */\n",FLOP_counter); + fclose(code); + if (split == 1) { + for(i=0;ipoz;\n REALTYPE lpon = Data->pon;\n"); + for(i=0;ioo2zn;\n",k2[i],(double)(i+1)); + if(a==0) + for(i=0;ioo2z;\n",k1[i],(double)(i+1)); + else + for(i=0;ioo2n;\n",k3[i],(double)(i+1)); + fprintf(code," U%d0 = Data->U[%d][0];\n", a*2, a*2); + fprintf(code," U%d1 = Data->U[%d][1];\n", a*2, a*2); + fprintf(code," U%d2 = Data->U[%d][2];\n", a*2, a*2); + fprintf(code," U%d0 = Data->U[%d][0];\n", foo, foo); + fprintf(code," U%d1 = Data->U[%d][1];\n", foo, foo); + fprintf(code," U%d2 = Data->U[%d][2];\n\n", foo, foo); + +} diff --git a/src/bin/libint/emit_vrr_build_macro.c b/src/bin/libint/emit_vrr_build_macro.c new file mode 100644 index 0000000..24b43e1 --- /dev/null +++ b/src/bin/libint/emit_vrr_build_macro.c @@ -0,0 +1,245 @@ +#include +#include +#include +#include +#include +#include + +extern FILE *outfile, *vrr_header; +extern void punt(char *); +extern LibintParams_t Params; + +static void declare_localv(); +static void define_localv(); + +static char **k1, **k2, **k3; + +void emit_vrr_build_macro() +{ + int old_am = Params.old_am; + int new_am = Params.opt_am; + int max_class_size = Params.max_class_size; + int am_to_inline = Params.max_am_to_inline_vrr_worker; + + FILE *code; + int i, j, k, l, f; + int a, b; + int flag; + int am[2][3]; + int am_in[2]; + int current_highest_am, to_inline; + int nflip = 0; + int t1, t2, t3, t4; + int class_size; + int type; + int max1 = 0; + int max2 = 0; + int foo; + int la, lc, lc_min, lc_max; + int k1max, k2max, k3max; + int split,num_subfunctions,subbatch_length; + int curr_count,curr_subfunction; + int FLOP_counter; + static char *k4[] = {"lpoz","lpon"}; + static const char *k1_suff = "o2z"; + static const char *k2_suff = "o2zn"; + static const char *k3_suff = "o2n"; + char *code_name; + char *function_name; + char **subfunction_name; + char *cpcommand; + int errcod; + + k1 = (char **) malloc((new_am)*sizeof(char *)); + k2 = (char **) malloc((new_am)*sizeof(char *)); + k3 = (char **) malloc((new_am)*sizeof(char *)); + for(i=1;i<=new_am;i++) { + j = strlen((void *)number[i]); + k1[i-1] = (char*) malloc((4+j)*sizeof(char)); + k2[i-1] = (char*) malloc((5+j)*sizeof(char)); + k3[i-1] = (char*) malloc((4+j)*sizeof(char)); + strcpy(k1[i-1],(void *)number[i]); + strcpy(k2[i-1],(void *)number[i]); + strcpy(k3[i-1],(void *)number[i]); + strcat(k1[i-1],(void *)k1_suff); + strcat(k2[i-1],(void *)k2_suff); + strcat(k3[i-1],(void *)k3_suff); + } + code_name = (char *) malloc(sizeof(char)*21); + cpcommand = (char *) malloc(sizeof(char)*50); + function_name = (char *) malloc(sizeof(char)*18); + + for(la=0;la<=new_am;la++) { + lc_min = (la >= old_am + 1) ? 0 : old_am + 1; + lc_max = new_am; + for(lc=lc_min;lc<=lc_max;lc++) { + + /* Is this function to be made inline */ + current_highest_am = (la > lc) ? la : lc; + to_inline = (current_highest_am <= am_to_inline) ? 1 : 0; + if (!to_inline) + continue; + + fprintf(outfile," AM_a = %c AM_c = %c\n",am_letter[la],am_letter[lc]); + am_in[0] = la; + am_in[1] = lc; + if (la == 0) { + a = 1; + k2max = la; + k3max = lc - 1; + } + else { + a = 0; + k2max = lc; + k1max = la - 1; + } + foo = 5; + if(a==0) foo = 4; + + class_size = ((am_in[a]+1)*(am_in[a]+2)*(am_in[a^1]+1)*(am_in[a^1]+2))/4; + + /* If the routine has to be split AND inlined - the user probably doesn't know what he/she is doing */ + if (class_size > max_class_size) + punt("MAX_CLASS_SIZE is too small with the given inlining thresholds"); + else { + split = 0; + } + + if(a==0) foo = 4; + + sprintf(function_name,"build_%c0%c0",am_letter[la],am_letter[lc]); + sprintf(code_name,"build_%c0%c0.h",am_letter[la],am_letter[lc]); + code = fopen(code_name,"w"); + + /*target + |I0[],I1[] + | |I2[],I3[] + | | | I4[] + | | | | */ + t1 = t2 = t3 = t4 = 0; + + /* print local variable declarations */ + + fprintf(code,"#ifndef _libint_%s\n",function_name); + fprintf(code,"#define _libint_%s\n",function_name); + fprintf(code," /* These machine-generated functions compute a quartet of (%cs|%cs) integrals */\n\n",am_letter[la],am_letter[lc]); + + fprintf(code,"#define _%s(Data, vp, I0, I1, I2, I3, I4)\\\n{\\\n",function_name); + declare_localv(a,k1max,k2max,k3max,code); + define_localv(a,foo,k1max,k2max,k3max,code); + fprintf(code,"\\\n"); + + FLOP_counter = 0; + + for(i = 0; i <= am_in[0]; i++){ + am[0][0] = am_in[0] - i; + for(j = 0; j <= i; j++){ + am[0][1] = i - j; + am[0][2] = j; + + for(k = 0; k <= am_in[1]; k++){ + am[1][0] = am_in[1] - k; + for(l = 0; l <= k; l++){ + am[1][1] = k - l; + am[1][2] = l; + + if(am[a][2]) b = 2; + if(am[a][1]) b = 1; + if(am[a][0]) b = 0; + + + am[a][b] = am[a][b] - 1; + am_in[a] = am_in[a] - 1; + t2 = hash(am,am_in); + fprintf(code, "*(target++) = U%d%d*i0[%d] + U%d%d*i1[%d]", + a*2, b, t2, foo, b , t2); + FLOP_counter += 3; + if(am[a][b]){ + am[a][b] = am[a][b] - 1; + am_in[a] = am_in[a] - 1; + t3 = hash(am,am_in); + fprintf(code, "\\\n + (%s)*(i2[%d] - (%s)*i3[%d])", + (a==0 ? k1[am[a][b]] : k3[am[a][b]]), + t3, (k4[a]), t3); + max1 = (max1>am[a][b]+1) ? max1 : am[a][b]+1; + am[a][b] = am[a][b] + 1; + am_in[a] = am_in[a] + 1; + FLOP_counter += 4; + } + if(am[a^1][b]){ + am[a^1][b] = am[a^1][b] - 1; + am_in[a^1] = am_in[a^1] - 1; + t4 = hash(am,am_in); + fprintf(code, "\\\n + (%s)*i4[%d]", k2[am[a^1][b]], t4); + max2 = (max2>am[a^1][b]+1) ? max2 : am[a^1][b]+1; + am[a^1][b] = am[a^1][b] + 1; + am_in[a^1] = am_in[a^1] + 1; + FLOP_counter += 2; + } + fprintf(code, ";\\\n"); + am[a][b] = am[a][b] + 1; + am_in[a] = am_in[a] + 1; + + t1++; + curr_count++; + } + } + } + } + fprintf(code,"\\\n}\n"); + fprintf(code,"\n#endif\n"); /* end of #ifndef _libint_.... */ + fprintf(code,"/* Total number of FLOPs = %d */\n",FLOP_counter); + fclose(code); + printf("Done with %s\n",code_name); + } + } + free(function_name); + free(code_name); + + return; +} + + +void declare_localv(int a, int k1max, int k2max, int k3max, FILE *code) +{ + int i; + + fprintf(code," REALTYPE U00, U01, U02, U10, U11, U12, U20, U21, U22;\\\n"); + fprintf(code," REALTYPE U30, U31, U32, U40, U41, U42, U50, U51, U52;\\\n"); + fprintf(code," REALTYPE lpoz = Data->poz;\\\n REALTYPE lpon = Data->pon;\\\n"); + for(i=0;ioo2zn;\\\n",k2[i],(double)(i+1)); + if(a==0) + for(i=0;ioo2z;\\\n",k1[i],(double)(i+1)); + else + for(i=0;ioo2n;\\\n",k3[i],(double)(i+1)); + fprintf(code," U%d0 = Data->U[%d][0];\\\n", a*2, a*2); + fprintf(code," U%d1 = Data->U[%d][1];\\\n", a*2, a*2); + fprintf(code," U%d2 = Data->U[%d][2];\\\n", a*2, a*2); + fprintf(code," U%d0 = Data->U[%d][0];\\\n", foo, foo); + fprintf(code," U%d1 = Data->U[%d][1];\\\n", foo, foo); + fprintf(code," U%d2 = Data->U[%d][2];\\\n\\\n", foo, foo); + +} diff --git a/src/bin/libint/mem_man.c b/src/bin/libint/mem_man.c new file mode 100644 index 0000000..2376227 --- /dev/null +++ b/src/bin/libint/mem_man.c @@ -0,0 +1,149 @@ +#include +#include +#include +#include +#define MAXALLOC 100000 + +int free_block[MAXALLOC]; /* Marks of free-occupied blocks */ +int block_length[MAXALLOC]; /* Keeps sizes of all blocks */ +int last_free; /* Number of the last free block */ +int max_mem; /* Amount of memory used by classes up to this point */ +int mem_top; /* Total memory allocated up to this point */ + +/* initialize memory stack */ +void init_mem(int memory) +{ + last_free = 1; + memset(free_block,0,MAXALLOC*sizeof(int)); /* All blocks are free */ + memset(block_length,0,MAXALLOC*sizeof(int)); /* All of them are zero in length ... */ + block_length[0] = memory; /* except for the first one */ + max_mem = 0; + mem_top = memory; +} + +/* add memory */ +void add_mem(int memory) +{ + int i; + int addto = 0; + int himem = 0; + + mem_top += memory; + /* Find the last free block and add all this memory to it */ + for(i=0; i himem){ + himem = free_block[i]; + addto = i; + } + } +#if 0 + printf("adding %d to memory\n\tnew top = %d\n", memory, + free_block[addto]+block_length[addto]+memory); +#endif + block_length[addto] = block_length[addto]+memory; +} + +/* Find a block of the requested size */ +int get_mem(int size) +{ + int i, j; + +/* try to find one that fits exactly */ + for(i=last_free-1; i>=0; i--){ + if(block_length[i] == size){ + j = free_block[i]; + if(free_block[i]+block_length[i]==mem_top) add_mem(500); + use(i, size); + return j; + } + } + +/* ok, try to find a bigger one that will work */ + for(i=last_free-1; i>=0; i--){ + if(block_length[i] > size){ + j = free_block[i]; + use(i, size); + return j; + } + } + + +/* last resort, expand memory */ + add_mem(1000); + return get_mem(size); + +} + + +void use(int n, int s) +{ + int i; +#if 0 + printf("issuing %d doubles starting at %d out of free block %d\n", + s, free_block[n], n); + printf("last_free = %d\n", last_free); +#endif + if(s==block_length[n]){ + for(i=n; imax_mem) max_mem = free_block[n]; + } + else exit(1); + +} + +void free_mem(int n, int size) +{ + int i, j; + + free_block[last_free] = n; + block_length[last_free] = size; + last_free++; + + consolidate(); + +} + +void consolidate() +{ + int i, j; + int right_bound_i; + int done = 1; + + do { + done = 1; + for(i=0; i +#include +#include +#include +#include + +FILE *outfile, *vrr_header, *hrr_header, *libr12_header, *init_code; +int libr12_stack_size[MAX_AM/2+1]; +Libr12Params_t Params; + +void punt(char *); +extern void emit_vrr_r_build(); +extern void emit_vrr_t1_build(); +extern void emit_vrr_t2_build(); +extern void emit_grt_order(); +extern void emit_gr_order(); +extern void emit_hrr_t_build(); + +int main() +{ + int i,j,k,l,f; + int j_min, j_max, k_min, k_max, l_min, l_max; + int errcod; + int new_am, opt_am; + int class_size; + int num_subfunctions; + int max_class_size = DEFAULT_MAX_CLASS_SIZE; + + /*------------------------------- + Initialize files and libraries + -------------------------------*/ + outfile = fopen("./output.dat", "w"); + hrr_header = fopen("./r12_hrr_header.h","w"); + vrr_header = fopen("./r12_vrr_header.h","w"); + libr12_header = fopen("./libr12.h","w"); + init_code = fopen("./init_libr12.cc","w"); + + /*---------------------------------------- + Getting the new_am from user and making + sure it is consistent with libint.h + ----------------------------------------*/ + new_am = LIBR12_MAX_AM; + if (new_am <= 0) + punt(" MAX_AM must be positive."); + if (new_am > LIBINT_MAX_AM - DERIV_LVL) + punt(" MAX_AM is greater installed libint.a allows.\n Recompile libint.a with greater MAX_AM."); + + opt_am = LIBR12_OPT_AM; + if (opt_am < 2) + opt_am = DEFAULT_OPT_AM; + if (opt_am > new_am) opt_am = new_am; + + max_class_size = LIBR12_MAX_CLASS_SIZE; + if (max_class_size < 10) + punt(" MAX_CLASS_SIZE cannot be smaller than 10."); + + /*------------- + Init globals + -------------*/ + for(l=0;l<=new_am;l++) + libr12_stack_size[l] = 0; + Params.new_am = new_am*2; + Params.old_am = 0; + Params.opt_am = opt_am*2; + Params.max_class_size = max_class_size; + + /* Setting up init_libr12.c, header.h */ + fprintf(init_code,"#include \n"); + fprintf(init_code,"#include \n"); + fprintf(init_code,"#include \"libr12.h\"\n"); + fprintf(init_code,"#include \"r12_hrr_header.h\"\n\n"); + fprintf(init_code,"extern \"C\" {\n"); + fprintf(init_code,"void (*build_r12_gr[%d][%d][%d][%d])(Libr12_t *, int);\n",new_am+1,new_am+1,new_am+1,new_am+1); + fprintf(init_code,"void (*build_r12_grt[%d][%d][%d][%d])(Libr12_t *, int);\n",new_am+1,new_am+1,new_am+1,new_am+1); + fprintf(init_code,"int libr12_stack_size[%d];\n",new_am+1); + fprintf(init_code,"/* This function initializes a matrix of pointers to routines */\n"); + fprintf(init_code,"/* for computing integral classes up to (%c%c|%c%c) */\n\n", + am_letter[new_am],am_letter[new_am],am_letter[new_am],am_letter[new_am]); + fprintf(init_code,"void init_libr12_base()\n{\n"); + + /* Declare generic build routines */ + fprintf(vrr_header,"extern \"C\" REALTYPE *r_vrr_build_xxxx(int am[2], prim_data *, REALTYPE *, const REALTYPE *,"); + fprintf(vrr_header," const REALTYPE *, REALTYPE *, const REALTYPE *, const REALTYPE *, const REALTYPE *);\n"); + fprintf(vrr_header,"extern \"C\" REALTYPE *t1_vrr_build_xxxx(int am[2], prim_data *, contr_data *, REALTYPE *,"); + fprintf(vrr_header," REALTYPE *, const REALTYPE *, const REALTYPE *, const REALTYPE *, const REALTYPE *);\n"); + fprintf(vrr_header,"extern \"C\" REALTYPE *t2_vrr_build_xxxx(int am[2], prim_data *, contr_data *, REALTYPE *,"); + fprintf(vrr_header," REALTYPE *, const REALTYPE *, const REALTYPE *, const REALTYPE *, const REALTYPE *);\n"); + +/* emit_gr_order(0,new_am); */ + emit_grt_order(); + emit_hrr_t_build(); + /*--- VRR build routines are optimized for classes up to opt_am/2 ---*/ + emit_vrr_r_build(); + emit_vrr_t1_build(); + emit_vrr_t2_build(); + + /* put computed stack sizes for each angular momentum level into init_libderiv_base() */ + for(l=0;l<=new_am;l++) + fprintf(init_code,"\n libr12_stack_size[%d] = %d;",l,libr12_stack_size[l]); + + fprintf(init_code,"\n}\n\n"); + fprintf(init_code,"/* These functions initialize library objects */\n"); + fprintf(init_code,"/* Library objects operate independently of each other */\n"); + fprintf(init_code,"int init_libr12(Libr12_t *libr12, int max_am, int max_num_prim_quartets)\n{\n"); + fprintf(init_code," int memory = 0;\n\n"); + fprintf(init_code," if (max_am >= LIBR12_MAX_AM) return -1;\n"); + fprintf(init_code," libr12->int_stack = (REALTYPE *) malloc(libr12_stack_size[max_am]*sizeof(REALTYPE));\n"); + fprintf(init_code," memory += libr12_stack_size[max_am];\n"); + fprintf(init_code," libr12->PrimQuartet = (prim_data *) malloc(max_num_prim_quartets*sizeof(prim_data));\n"); + fprintf(init_code," memory += max_num_prim_quartets*sizeof(prim_data)/sizeof(REALTYPE);\n"); + fprintf(init_code," return memory;\n}\n\n"); + fprintf(init_code,"void free_libr12(Libr12_t *libr12)\n{\n"); + fprintf(init_code," if (libr12->int_stack != NULL) {\n"); + fprintf(init_code," free(libr12->int_stack);\n"); + fprintf(init_code," libr12->int_stack = NULL;\n"); + fprintf(init_code," }\n"); + fprintf(init_code," if (libr12->PrimQuartet != NULL) {\n"); + fprintf(init_code," free(libr12->PrimQuartet);\n"); + fprintf(init_code," libr12->PrimQuartet = NULL;\n"); + fprintf(init_code," }\n\n"); + fprintf(init_code," return;\n}\n\n"); + fprintf(init_code,"int libr12_storage_required(int max_am, int max_num_prim_quartets)\n{\n"); + fprintf(init_code," int memory = 0;\n\n"); + fprintf(init_code," if (max_am >= LIBR12_MAX_AM) return -1;\n"); + fprintf(init_code," memory += libr12_stack_size[max_am];\n"); + fprintf(init_code," memory += max_num_prim_quartets*sizeof(prim_data)/sizeof(REALTYPE);\n"); + fprintf(init_code," return memory;\n}\n"); + fprintf(init_code,"}\n"); /* end of extern "C" */ + fclose(init_code); + fclose(hrr_header); + fclose(vrr_header); + + /* Setting up libr12.h */ + fprintf(libr12_header,"#ifndef _psi3_libr12_h\n"); + fprintf(libr12_header,"#define _psi3_libr12_h\n\n"); + fprintf(libr12_header,"#include \n"); + fprintf(libr12_header,"/* Maximum angular momentum of functions in a basis set plus 1 */\n"); + fprintf(libr12_header,"#define LIBR12_MAX_AM %d\n",1+new_am); + fprintf(libr12_header,"#define LIBR12_OPT_AM %d\n",1+opt_am); + fprintf(libr12_header,"#define NUM_TE_TYPES 4\n\n"); + fprintf(libr12_header,"typedef struct {\n"); + fprintf(libr12_header," REALTYPE AB[3];\n"); + fprintf(libr12_header," REALTYPE CD[3];\n"); + fprintf(libr12_header," REALTYPE AC[3];\n"); + fprintf(libr12_header," REALTYPE ABdotAC, CDdotCA;\n"); + fprintf(libr12_header," } contr_data;\n\n"); + fprintf(libr12_header,"typedef struct {\n"); + fprintf(libr12_header," REALTYPE *int_stack;\n"); + fprintf(libr12_header," prim_data *PrimQuartet;\n"); + fprintf(libr12_header," contr_data ShellQuartet;\n"); + fprintf(libr12_header," REALTYPE *te_ptr[NUM_TE_TYPES];\n"); + fprintf(libr12_header," REALTYPE *t1vrr_classes[%d][%d];\n",1+2*new_am,1+2*new_am); + fprintf(libr12_header," REALTYPE *t2vrr_classes[%d][%d];\n",1+2*new_am,1+2*new_am); + fprintf(libr12_header," REALTYPE *rvrr_classes[%d][%d];\n",1+2*new_am,1+2*new_am); + fprintf(libr12_header," REALTYPE *gvrr_classes[%d][%d];\n",2+2*new_am,2+2*new_am); + fprintf(libr12_header," REALTYPE *r12vrr_stack;\n\n"); + fprintf(libr12_header," } Libr12_t;\n\n"); + fprintf(libr12_header,"#ifdef __cplusplus\n"); + fprintf(libr12_header,"extern \"C\" {\n"); + fprintf(libr12_header,"#endif\n"); + fprintf(libr12_header,"extern void (*build_r12_gr[%d][%d][%d][%d])(Libr12_t *, int);\n",new_am+1,new_am+1,new_am+1,new_am+1); + fprintf(libr12_header,"extern void (*build_r12_grt[%d][%d][%d][%d])(Libr12_t *, int);\n",new_am+1,new_am+1,new_am+1,new_am+1); + fprintf(libr12_header,"void init_libr12_base();\n\n"); + fprintf(libr12_header,"int init_libr12(Libr12_t *, int max_am, int max_num_prim_quartets);\n"); + fprintf(libr12_header,"void free_libr12(Libr12_t *);\n"); + fprintf(libr12_header,"int libr12_storage_required(int max_am, int max_num_prim_quartets);\n\n"); + fprintf(libr12_header,"#ifdef __cplusplus\n"); + fprintf(libr12_header,"}\n"); + fprintf(libr12_header,"#endif\n\n"); + fprintf(libr12_header,"#endif\n"); + fclose(libr12_header); + fclose(outfile); + exit(0); +} + + +void punt(char* str) +{ + printf("%s",str); + exit(1); +} + + diff --git a/src/bin/libr12/build_libr12.h b/src/bin/libr12/build_libr12.h new file mode 100644 index 0000000..a94d029 --- /dev/null +++ b/src/bin/libr12/build_libr12.h @@ -0,0 +1,28 @@ +/*------------------------------------------------------------------------- + This is not real DERIV_LVL, it is just a constant that reflects the fact + that t-integrals require incremented angular momentum (effectively, + derivatives of ERIs). + -------------------------------------------------------------------------*/ +#define MAX_AM 20 +#define DERIV_LVL 1 +#define DEFAULT_NEW_AM 6 +#define DEFAULT_OPT_AM 6 +#define DEFAULT_MAX_CLASS_SIZE 785 + +typedef struct { + + /* Twice the maximum AM for which manager routines need to be generated */ + int new_am; + + /* Twice the maximum AM for which workers need to be generated */ + int opt_am; + + /* Twice the AM for which manager routines are already + generated and stored in an existing library */ + int old_am; + + /* Max number of integrals to be processed in one worker. If a class + is larger than this then split the worker into several. */ + int max_class_size; + +} Libr12Params_t; diff --git a/src/bin/libr12/emit_gr_order.c b/src/bin/libr12/emit_gr_order.c new file mode 100644 index 0000000..888533c --- /dev/null +++ b/src/bin/libr12/emit_gr_order.c @@ -0,0 +1,1194 @@ +/*------------------------------------------------------------------------------------------------------ + Builds a library of functions-calls for applying HRR and VRR + ------------------------------------------------------------------------------------------------------*/ + +#include +#include +#include +#include "mem_man.h" +#include +#include +#define MAXNODE 3000 +#define NONODE -1000000 +#define SSR12SSNODE -1111 /* This is a special node - (ss||ss) */ +#define NUMPARENTS 21 +#define NUMCHILDREN 6 +#define NUMGRTTYPES 4 /* There are 4 types classes to be evaluated - ERIs (g), r12 (r), [r12,t1] (t1), [r12,t2] (t2) */ +#define MOFFSET 11 /* This is to take care of a paossibility that class 0 will be someone's child. Otherwise + it would be confused with (ss|ss)^0 */ + +static int last_hrr_node = 0; /* Global pointer to the last node on the HRR stack */ +static int last_vrr_node = 0; /* Global pointer to the last node on the VRR stack */ + +extern FILE *outfile, *hrr_header, *init_code; +extern int libr12_stack_size[MAX_AM/2+1]; +extern Libr12Params_t Params; + +typedef struct node{ + int A, B, C, D; /* Angular momenta on centers A and C */ + int m; + int grt_type; /* Type of the class - 0 = ERI (g), 1 = r12 (r), 2 = [r12,t1] (t1), 3 = [r12,t2] (t2) */ + int size; /* Class size in double words */ + int pointer; + int children[NUMCHILDREN]; /* Up to 8 children of the class */ + int parents_counter; + int num_parents; /* Number of parents */ + int parents[NUMPARENTS]; /* Pointers to parents */ + int llink; /* Pointer to a class computed right before computing this one */ + int rlink; /* Pointer to a class to be computed after this one is */ + int marked; /* Flag indicating that this node has been computed */ + int target; /* Flag indicating that this node is among targets */ + } class; + +static int first_hrr_to_compute = 0; /* Number of the first class to be computed + (pointer to the beginning of the linked list) */ +static int first_vrr_to_compute = 0; /* Number of the first class to be computed + (pointer to the beginning of the linked list) */ + +/*--- This is the maximum ang. momentum allowed for any (intermediate) classes ---*/ +#define LMAX_AM LIBINT_MAX_AM+1 +static int hrr_hash_table[NUMGRTTYPES][2*LMAX_AM][2*LMAX_AM][2*LMAX_AM][2*LMAX_AM]; +static int vrr_hash_table[NUMGRTTYPES][2*LMAX_AM][2*LMAX_AM][4*LMAX_AM]; + +extern void punt(char *); +static int mk_hrr_node(class node, class *allnodes, int new); +static int mk_vrr_node(class node, class *allnodes, int new); +static void mark_hrr_parents(int n, class *allnodes, int rent); +static void mark_vrr_parents(int n, class *allnodes, int rent); +static int alloc_mem_hrr(class *nodes); +static int alloc_mem_vrr(class *nodes); + +int emit_grt_order() +{ + int old_am = Params.old_am; + int new_am = Params.new_am; + int opt_am = Params.opt_am; + + int i, j, k, l; + int la, lc, lc_min, ld, ld_max, ld_min; + int lb, lb_min, lb_max; + int current_highest_am; + int base_mem, hrr_mem, vrr_mem; + int child0, child1, child; + int num_children; + int offset; + class nodes[MAXNODE]; /* Stack of nodes */ + class *hrr_nodes = &(nodes[0]); + class *vrr_nodes; + int target_data; + int done; + int max_stack_size = 0; + int target_hrr_nodes[NUMGRTTYPES]; /* Array of unique targets on the HRR graph */ + int num_hrr_targets; + int target_vrr_nodes[1000]; + int num_vrr_targets; + const char am_letter[] = "0pdfghiklmnoqrtuvwxyz"; + char hrr_code_name[] = "hrr_grt_order_0000.cc"; + char hrr_function_name[] = "hrr_grt_order_0000"; + char vrr_code_name[] = "vrr_grt_order_0000.cc"; + char vrr_function_name[] = "vrr_grt_order_0000"; + FILE *hrr_code, *vrr_code; + static int io[] = {1,3,6,10,15,21,28,36,45,55,66,78,91,105,120,136,153,171,190,210}; + + + for(la=0;la<=new_am;la++) { + lb_max = la/2; + lb_min = (la <= new_am/2) ? 0 : la - new_am/2; + lc_min = la; + for(lb=lb_min;lb<=lb_max;lb++) { + for(lc=lc_min;lc<=new_am;lc++) { + ld_max = lc/2; + ld_min = (lc <= new_am/2) ? 0 : lc - new_am/2; + for(ld=ld_min;ld<=ld_max;ld++) { + + current_highest_am = (la-lb > lb) ? la-lb : lb; + current_highest_am = (current_highest_am > lc-ld) ? current_highest_am : lc-ld; + current_highest_am = (current_highest_am > ld) ? current_highest_am : ld; + + /*--------------------------------------------------------------- + Form code and function names for HRR and VRR ordering routines + ---------------------------------------------------------------*/ + hrr_function_name[14] = am_letter[la-lb]; + hrr_function_name[15] = am_letter[lb]; + hrr_function_name[16] = am_letter[lc-ld]; + hrr_function_name[17] = am_letter[ld]; + vrr_function_name[14] = am_letter[la-lb]; + vrr_function_name[15] = am_letter[lb]; + vrr_function_name[16] = am_letter[lc-ld]; + vrr_function_name[17] = am_letter[ld]; + hrr_code_name[14] = am_letter[la-lb]; + hrr_code_name[15] = am_letter[lb]; + hrr_code_name[16] = am_letter[lc-ld]; + hrr_code_name[17] = am_letter[ld]; + hrr_code = fopen(hrr_code_name,"w"); + vrr_code_name[14] = am_letter[la-lb]; + vrr_code_name[15] = am_letter[lb]; + vrr_code_name[16] = am_letter[lc-ld]; + vrr_code_name[17] = am_letter[ld]; + vrr_code = fopen(vrr_code_name,"w"); + + /*----------------------------------- + Write the overhead to the HRR code + -----------------------------------*/ + fprintf(hrr_code,"#include \n"); + fprintf(hrr_code,"#include \n"); + fprintf(hrr_code,"#include \n"); + fprintf(hrr_code,"#include \"libr12.h\"\n"); + fprintf(hrr_code,"#include \n\n"); + fprintf(hrr_code,"#include \"r12_hrr_header.h\"\n\n"); + fprintf(hrr_code,"extern void %s(Libr12_t *, prim_data *);\n\n",vrr_function_name); + fprintf(hrr_code," /* Computes (%c%c|%c%c) integrals for linear R12-methods */\n\n", + am_letter[la-lb],am_letter[lb],am_letter[lc-ld],am_letter[ld]); + fprintf(hrr_code,"void %s(Libr12_t *Libr12, int num_prim_comb)\n{\n",hrr_function_name); + fprintf(hrr_code," prim_data *Data = Libr12->PrimQuartet;\n"); + fprintf(hrr_code," REALTYPE *int_stack = Libr12->int_stack;\n"); + fprintf(hrr_code," int i,j;\n REALTYPE tmp, *target;\n\n"); + + /*-------------------------------------------------------------- + Include the function into the hrr_header.h and init_libint.cc + --------------------------------------------------------------*/ + fprintf(hrr_header,"void %s(Libr12_t *, int);\n",hrr_function_name); + fprintf(init_code," build_r12_grt[%d][%d][%d][%d] = %s;\n",la-lb,lb,lc-ld,ld,hrr_function_name); + + /*----------------------------------- + Write the overhead to the VRR code + -----------------------------------*/ + fprintf(vrr_code,"#include \n"); + fprintf(vrr_code,"#include \n"); + fprintf(vrr_code,"#include \"libr12.h\"\n"); + fprintf(vrr_code,"#include \n"); + fprintf(vrr_code,"#include \"r12_vrr_header.h\"\n\n"); + fprintf(vrr_code,"void %s(Libr12_t *Libr12, prim_data *Data)\n{\n",vrr_function_name); + + + /*-------------------------------------------------- + Starting at the target node(s) set up an HRR graph. + --------------------------------------------------*/ + + last_hrr_node = 0; + num_hrr_targets=0; + for(i=0;i= 0) + hrr_nodes[k].target = 1; + } + + /*------------------------------------------- + Traverse the graph starting at each target + -------------------------------------------*/ + for(i=0;i= 0){ + mark_hrr_parents(hrr_nodes[j].children[k], hrr_nodes, j); + } + } + + + init_mem(1); + + /*--------------------------------------------------------------- + Allocate and zero out space for classes to be generated by VRR + Those do not include (ss|ss) and (ss||ss) + ---------------------------------------------------------------*/ + for(i=last_hrr_node-1;i>=0;i--) + if (hrr_nodes[i].B == 0 && hrr_nodes[i].D == 0) { + hrr_nodes[i].marked = 1; + /*--- do not allocate space for (ss|ss) and (ss||ss) ---*/ + if (hrr_nodes[i].A == 0 && hrr_nodes[i].C == 0 && + (hrr_nodes[i].grt_type == 0 || hrr_nodes[i].grt_type == 1)) + continue; + hrr_nodes[i].pointer = get_mem(hrr_nodes[i].size); + fprintf(hrr_code," Libr12->"); + switch(hrr_nodes[i].grt_type) { + case 0: + fprintf(hrr_code,"gvrr_classes"); + break; + case 1: + fprintf(hrr_code,"rvrr_classes"); + break; + case 2: + fprintf(hrr_code,"t1vrr_classes"); + break; + case 3: + fprintf(hrr_code,"t2vrr_classes"); + break; + } + fprintf(hrr_code,"[%d][%d] = int_stack + %d;\n", + hrr_nodes[i].A,hrr_nodes[i].C,hrr_nodes[i].pointer); + } + base_mem = get_total_memory(); + fprintf(hrr_code," memset(int_stack,0,%d*sizeof(REALTYPE));\n\n",base_mem); + fprintf(hrr_code," Libr12->r12vrr_stack = int_stack + %d;\n",base_mem); + + + + /*---------------------------- + Build the HRR call sequence + ----------------------------*/ + if (lb != 0 || ld != 0) { + target_data = alloc_mem_hrr(hrr_nodes); + } + + + hrr_mem = get_total_memory(); + if (max_stack_size < hrr_mem) + max_stack_size = hrr_mem; + fprintf(hrr_code," for(i=0;i 0) + do { + fprintf(hrr_code, " /*--- compute (%c%c|", + am_letter[hrr_nodes[j].A],am_letter[hrr_nodes[j].B]); + switch (hrr_nodes[j].grt_type) { + case 0: + break; + case 1: + fprintf(hrr_code,"|"); + break; + case 2: + fprintf(hrr_code,"[r12,T1]|"); + break; + case 3: + fprintf(hrr_code,"[r12,T2]|"); + break; + } + fprintf(hrr_code,"%c%c) ---*/\n", + am_letter[hrr_nodes[j].C],am_letter[hrr_nodes[j].D]); + + + if (hrr_nodes[j].B > 0 || hrr_nodes[j].D > 0) { + /*--- compute the number of children ---*/ + num_children = 0; + for(i=0;i= 0) + num_children++; + + if (hrr_nodes[j].B == 0 && hrr_nodes[j].D != 0) { + if (hrr_nodes[j].grt_type == 3) + fprintf(hrr_code, " t2hrr3_build_%c%c(Libr12->ShellQuartet.CD,Libr12->ShellQuartet.AC,int_stack+%d,", + am_letter[hrr_nodes[j].C], am_letter[hrr_nodes[j].D], hrr_nodes[j].pointer); + else + fprintf(hrr_code, " hrr3_build_%c%c(Libr12->ShellQuartet.CD,int_stack+%d,", + am_letter[hrr_nodes[j].C], am_letter[hrr_nodes[j].D], hrr_nodes[j].pointer); + } + else if (hrr_nodes[j].B != 0) { + if (hrr_nodes[j].grt_type == 2) + fprintf(hrr_code, " t1hrr1_build_%c%c(Libr12->ShellQuartet.AB,Libr12->ShellQuartet.AC,int_stack+%d,", + am_letter[hrr_nodes[j].A], am_letter[hrr_nodes[j].B], hrr_nodes[j].pointer); + else + fprintf(hrr_code, " hrr1_build_%c%c(Libr12->ShellQuartet.AB,int_stack+%d,", + am_letter[hrr_nodes[j].A], am_letter[hrr_nodes[j].B], hrr_nodes[j].pointer); + } + + for(i=0;i= 0) { + child = hrr_nodes[j].children[i]; + fprintf(hrr_code, " int_stack+%d,", hrr_nodes[child].pointer); + } + + if (hrr_nodes[j].B == 0 && hrr_nodes[j].D != 0) { + if (hrr_nodes[j].grt_type == 3) + fprintf(hrr_code, " %d, %d);\n", hrr_nodes[j].A,hrr_nodes[j].B); + else + fprintf(hrr_code, " %d);\n", io[hrr_nodes[j].A]*io[hrr_nodes[j].B]); + } + else if (hrr_nodes[j].B != 0) { + if (hrr_nodes[j].grt_type == 2) + fprintf(hrr_code, " %d, %d);\n", hrr_nodes[j].C,hrr_nodes[j].D); + else + fprintf(hrr_code, " %d);\n", io[hrr_nodes[j].C]*io[hrr_nodes[j].D]); + } + } + + /* Pass the "target" quartets to CINTS */ + if (hrr_nodes[j].target) { + fprintf(hrr_code," Libr12->te_ptr[%d] = int_stack + %d;\n",hrr_nodes[j].grt_type,hrr_nodes[j].pointer); + } + j = hrr_nodes[j].rlink; + } while (j != -1); + + fprintf(hrr_code,"\n}\n"); + fclose(hrr_code); + printf("Done with %s\n",hrr_code_name); + for(i=0;i= 0) + vrr_nodes[k].target = 1; + } + /*--- Now find the true targets (nodes with 0 parents) ---*/ + num_vrr_targets = 0; + for(i=0;i 0) { + vrr_nodes[target_vrr_nodes[num_vrr_targets-1]].llink = i; + vrr_nodes[i].rlink = target_vrr_nodes[num_vrr_targets-1]; + vrr_nodes[i].llink = -1; + } + else { + vrr_nodes[i].rlink = -1; + vrr_nodes[i].llink = -1; + } + num_vrr_targets++; + } + first_vrr_to_compute = target_vrr_nodes[num_vrr_targets-1]; + + /* Traverse the graph starting at each target */ + for(i=0;i= 0){ + mark_vrr_parents(vrr_nodes[j].children[k], vrr_nodes, j); + } + } + } + + init_mem(1); + + /* Build the call sequence */ + target_data = alloc_mem_vrr(vrr_nodes); + vrr_mem = base_mem + get_total_memory(); + if (max_stack_size < vrr_mem) + max_stack_size = vrr_mem; + fprintf(vrr_code," REALTYPE *r12vrr_stack = Libr12->r12vrr_stack;\n"); + fprintf(vrr_code," REALTYPE *tmp, *target_ptr;\n int i, am[2];\n\n"); + + j = first_vrr_to_compute; + do { + fprintf(vrr_code, " /*--- compute (%c%c|", + am_letter[vrr_nodes[j].A],am_letter[vrr_nodes[j].B]); + switch (vrr_nodes[j].grt_type) { + case 0: + break; + case 1: + fprintf(vrr_code,"|"); + break; + case 2: + fprintf(vrr_code,"[r12,T1]|"); + break; + case 3: + fprintf(vrr_code,"[r12,T2]|"); + break; + } + fprintf(vrr_code,"%c%c)^%d ---*/\n", + am_letter[vrr_nodes[j].C],am_letter[vrr_nodes[j].D],vrr_nodes[j].m); + + /*--------------------------------------------------------- + Decide which routine to use to compute the current class + ---------------------------------------------------------*/ + switch (vrr_nodes[j].grt_type) { + case 0: + if (vrr_nodes[j].A <= LIBINT_OPT_AM && vrr_nodes[j].C <= LIBINT_OPT_AM) + fprintf(vrr_code, " _BUILD_%c0%c0(Data,", am_letter[vrr_nodes[j].A], am_letter[vrr_nodes[j].C]); + else { + fprintf(vrr_code, " am[0] = %d; am[1] = %d;\n", vrr_nodes[j].A, vrr_nodes[j].C); + fprintf(vrr_code, " vrr_build_xxxx(am,Data,"); + } + break; + case 1: + if (vrr_nodes[j].A <= opt_am && vrr_nodes[j].C <= opt_am) + fprintf(vrr_code, " _R_BUILD_%c0%c0(Data,", am_letter[vrr_nodes[j].A], am_letter[vrr_nodes[j].C]); + else { + fprintf(vrr_code, " am[0] = %d; am[1] = %d;\n", vrr_nodes[j].A, vrr_nodes[j].C); + fprintf(vrr_code, " r_vrr_build_xxxx(am,Data,"); + } + break; + case 2: + if (vrr_nodes[j].A <= opt_am && vrr_nodes[j].C <= opt_am) + fprintf(vrr_code, " _T1_BUILD_%c0%c0(Data,", am_letter[vrr_nodes[j].A], am_letter[vrr_nodes[j].C]); + else { + fprintf(vrr_code, " am[0] = %d; am[1] = %d;\n", vrr_nodes[j].A, vrr_nodes[j].C); + fprintf(vrr_code, " t1_vrr_build_xxxx(am,Data,"); + } + break; + case 3: + if (vrr_nodes[j].A <= opt_am && vrr_nodes[j].C <= opt_am) + fprintf(vrr_code, " _T2_BUILD_%c0%c0(Data,", am_letter[vrr_nodes[j].A], am_letter[vrr_nodes[j].C]); + else { + fprintf(vrr_code, " am[0] = %d; am[1] = %d;\n", vrr_nodes[j].A, vrr_nodes[j].C); + fprintf(vrr_code, " t2_vrr_build_xxxx(am,Data,"); + } + break; + } + switch (vrr_nodes[j].grt_type) { + case 2: + fprintf(vrr_code,"&(Libr12->ShellQuartet),"); + break; + case 3: + fprintf(vrr_code,"&(Libr12->ShellQuartet),"); + break; + } + fprintf(vrr_code, "r12vrr_stack+%d", vrr_nodes[j].pointer); + num_children = (vrr_nodes[j].grt_type == 1) ? 6 : 5; + for(k=0; k= 0) /*--- this child is a "real" class ---*/ + fprintf(vrr_code, ", r12vrr_stack+%d", vrr_nodes[vrr_nodes[j].children[k]].pointer); + else if (vrr_nodes[j].children[k] == NONODE) /*--- this child is a no-class ---*/ + fprintf(vrr_code, ", NULL"); + else if (vrr_nodes[j].children[k] == SSR12SSNODE) /*--- this is a (ss||ss) ---*/ + fprintf(vrr_code, ", &(Data->ss_r12_ss)"); + else /*--- this is a (ss|ss)^m ---*/ + fprintf(vrr_code, ", Data->F+%d", (-1)*(vrr_nodes[j].children[k] + MOFFSET)); + } + fprintf(vrr_code, ");\n"); + + /*----------------------------------------------- + If this derivative class is one of the targets + copy it to a location pointed by deriv_classes + to be used by the calling hrr_order routine + -----------------------------------------------*/ + if (vrr_nodes[j].target == 1) { + fprintf(vrr_code, " tmp = r12vrr_stack + %d;\n", vrr_nodes[j].pointer); + fprintf(vrr_code, " target_ptr = Libr12->"); + switch (vrr_nodes[j].grt_type) { + case 0: + fprintf(vrr_code,"g"); + break; + case 1: + fprintf(vrr_code,"r"); + break; + case 2: + fprintf(vrr_code,"t1"); + break; + case 3: + fprintf(vrr_code,"t2"); + break; + } + fprintf(vrr_code,"vrr_classes[%d][%d];\n", + vrr_nodes[j].A,vrr_nodes[j].C); + fprintf(vrr_code, " for(i=0;i<%d;i++)\n",vrr_nodes[j].size); + fprintf(vrr_code, " target_ptr[i] += tmp[i];\n\n"); + } + else + fprintf(vrr_code, "\n"); + + j = vrr_nodes[j].rlink; + } while (j != -1); + fprintf(vrr_code, "\n}\n\n"); + fclose(vrr_code); + printf("Done with %s\n",vrr_code_name); + for(i=0;i= MAXNODE) { + printf(" Maximum stack size is reached. Change MAXNODE and recompile.\n\n"); + exit(1); + } + } + + /* If the parent class wasn't on stack already (!new) - increase the parent counter */ + if(!new){ + allnodes[thisnode].num_parents++; + allnodes[thisnode].parents_counter++; + if (allnodes[thisnode].num_parents > NUMPARENTS) { + printf("Number of parents exceeds the limit\n"); + exit(1); + } + } + + + /* now make all child nodes */ + if (!made) { + if(node.B){ + O[0].A = node.A+1; + O[0].B = node.B-1; + O[0].C = node.C; + O[0].D = node.D; + O[0].m = node.m; + O[0].grt_type = node.grt_type; + allnodes[thisnode].children[0] = mk_hrr_node(O[0], allnodes, made); + O[1].A = node.A; + O[1].B = node.B-1; + O[1].C = node.C; + O[1].D = node.D; + O[1].m = node.m; + O[1].grt_type = node.grt_type; + allnodes[thisnode].children[1] = mk_hrr_node(O[1], allnodes, made); + /* Special case - [r12.T1] */ + if (node.grt_type == 2) { + O[2].A = node.A+1; + O[2].B = node.B-1; + O[2].C = node.C; + O[2].D = node.D; + O[2].m = node.m; + O[2].grt_type = 0; + allnodes[thisnode].children[2] = mk_hrr_node(O[2], allnodes, made); + O[3].A = node.A; + O[3].B = node.B-1; + O[3].C = node.C+1; + O[3].D = node.D; + O[3].m = node.m; + O[3].grt_type = 0; + allnodes[thisnode].children[3] = mk_hrr_node(O[3], allnodes, made); + O[4].A = node.A; + O[4].B = node.B-1; + O[4].C = node.C; + O[4].D = node.D; + O[4].m = node.m; + O[4].grt_type = 0; + allnodes[thisnode].children[4] = mk_hrr_node(O[4], allnodes, made); + } + } + else if(node.D){ + O[0].A = node.A; + O[0].B = node.B; + O[0].C = node.C+1; + O[0].D = node.D-1; + O[0].m = node.m; + O[0].grt_type = node.grt_type; + allnodes[thisnode].children[0] = mk_hrr_node(O[0], allnodes, made); + O[1].A = node.A; + O[1].B = node.B; + O[1].C = node.C; + O[1].D = node.D-1; + O[1].m = node.m; + O[1].grt_type = node.grt_type; + allnodes[thisnode].children[1] = mk_hrr_node(O[1], allnodes, made); + /* Special case - [r12.T2] */ + if (node.grt_type == 3) { + O[2].A = node.A; + O[2].B = node.B; + O[2].C = node.C+1; + O[2].D = node.D-1; + O[2].m = node.m; + O[2].grt_type = 0; + allnodes[thisnode].children[2] = mk_hrr_node(O[2], allnodes, made); + O[3].A = node.A+1; + O[3].B = node.B; + O[3].C = node.C; + O[3].D = node.D-1; + O[3].m = node.m; + O[3].grt_type = 0; + allnodes[thisnode].children[3] = mk_hrr_node(O[3], allnodes, made); + O[4].A = node.A; + O[4].B = node.B; + O[4].C = node.C; + O[4].D = node.D-1; + O[4].m = node.m; + O[4].grt_type = 0; + allnodes[thisnode].children[4] = mk_hrr_node(O[4], allnodes, made); + } + } + } + + return thisnode; + +} + + + +/* Recursive function that builds a hybrid VRR subgraph given the parent */ + +int mk_vrr_node(class node, class *allnodes, int new) +{ + + int i, j, k, l; + class O[NUMCHILDREN]; + int subnodes = 0; + int thisnode; + int made = 0; + static int io[] = {1,3,6,10,15,21,28,36,45,55,66,78,91,105,120,136,153,171,190,210}; + + /* If it's not a derivative class - do some checks to see if need to proceed */ + if (node.grt_type == 0 && node.A + node.B + node.C + node.D == 0) + return (-1)*node.m - MOFFSET; + else if (node.grt_type == 1 && node.A + node.B + node.C + node.D == 0) + return SSR12SSNODE; + + /* Search for the parent node on stack + If it's not there - we'll add it to the end of the stack */ + thisnode = last_vrr_node; + /* it's already placed on the stack allnodes - make sure children don't get created again (made = 1) */ + if (vrr_hash_table[node.grt_type][node.A][node.C][node.m]) { + i = vrr_hash_table[node.grt_type][node.A][node.C][node.m] - 1; + thisnode = i; + made = 1; + } + + /* it's not computed, add it, and make it the first to compute! */ + if(!made){ + allnodes[thisnode].A = node.A; + allnodes[thisnode].B = node.B; + allnodes[thisnode].C = node.C; + allnodes[thisnode].D = node.D; + allnodes[thisnode].m = node.m; + allnodes[thisnode].grt_type = node.grt_type; + vrr_hash_table[node.grt_type][node.A][node.C][node.m] = thisnode + 1; + allnodes[thisnode].num_parents = 0; + allnodes[thisnode].parents_counter = 0; + allnodes[thisnode].marked = 0; + allnodes[thisnode].target = 0; + allnodes[thisnode].pointer = 0; + memset(allnodes[thisnode].parents,0,NUMPARENTS*sizeof(int)); + for(i=0;i= MAXNODE) { + printf(" Maximum stack size is reached. Change MAXNODE and recompile.\n\n"); + exit(1); + } + } + + /* If the parent class wasn't on stack already (!new) - increase the parent counter */ + if(!new){ + allnodes[thisnode].num_parents++; + allnodes[thisnode].parents_counter++; + if (allnodes[thisnode].num_parents > NUMPARENTS) { + printf("Number of parents exceeds the limit\n"); + exit(1); + } + } + + + /* now make all child nodes */ + if (!made) { + /* regular ERI */ + if (node.grt_type == 0) { + if(node.A){ /*--- (a0|c0 ---*/ + O[0].A = node.A-1; + O[0].B = 0; + O[0].C = node.C; + O[0].D = 0; + O[0].m = node.m; + O[0].grt_type = 0; + allnodes[thisnode].children[0] = mk_vrr_node(O[0], allnodes, made); + O[1].A = node.A-1; + O[1].B = 0; + O[1].C = node.C; + O[1].D = 0; + O[1].m = node.m+1; + O[1].grt_type = 0; + allnodes[thisnode].children[1] = mk_vrr_node(O[1], allnodes, made); + if(node.A>1){ + O[2].A = node.A-2; + O[2].B = 0; + O[2].C = node.C; + O[2].D = 0; + O[2].m = node.m; + O[2].grt_type = 0; + allnodes[thisnode].children[2] = mk_vrr_node(O[2], allnodes, made); + O[3].A = node.A-2; + O[3].B = 0; + O[3].C = node.C; + O[3].D = 0; + O[3].m = node.m+1; + O[3].grt_type = 0; + allnodes[thisnode].children[3] = mk_vrr_node(O[3], allnodes, made); + } + if(node.C){ + O[4].A = node.A-1; + O[4].B = 0; + O[4].C = node.C-1; + O[4].D = 0; + O[4].m = node.m+1; + O[4].grt_type = 0; + allnodes[thisnode].children[4] = mk_vrr_node(O[4], allnodes, made); + } + } + else if(node.C){ /*--- (00|c0) ---*/ + O[0].A = node.A; + O[0].B = 0; + O[0].C = node.C-1; + O[0].D = 0; + O[0].m = node.m; + O[0].grt_type = 0; + allnodes[thisnode].children[0] = mk_vrr_node(O[0], allnodes, made); + O[1].A = node.A; + O[1].B = 0; + O[1].C = node.C-1; + O[1].D = 0; + O[1].m = node.m+1; + O[1].grt_type = 0; + allnodes[thisnode].children[1] = mk_vrr_node(O[1], allnodes, made); + if(node.C>1){ + O[2].A = node.A; + O[2].B = 0; + O[2].C = node.C-2; + O[2].D = 0; + O[2].m = node.m; + O[2].grt_type = 0; + allnodes[thisnode].children[2] = mk_vrr_node(O[2], allnodes, made); + O[3].A = node.A; + O[3].B = 0; + O[3].C = node.C-2; + O[3].D = 0; + O[3].m = node.m+1; + O[3].grt_type = 0; + allnodes[thisnode].children[3] = mk_vrr_node(O[3], allnodes, made); + } + } + } + /* Integral of r12 */ + else if (node.grt_type == 1) { + if(node.A){ /*--- (a0||c0) ---*/ + O[0].A = node.A-1; + O[0].B = 0; + O[0].C = node.C; + O[0].D = 0; + O[0].m = 0; + O[0].grt_type = 1; + allnodes[thisnode].children[0] = mk_vrr_node(O[0], allnodes, made); + if (node.A > 1) { + O[1].A = node.A-2; + O[1].B = 0; + O[1].C = node.C; + O[1].D = 0; + O[1].m = 0; + O[1].grt_type = 1; + allnodes[thisnode].children[1] = mk_vrr_node(O[1], allnodes, made); + } + O[2].A = node.A; + O[2].B = 0; + O[2].C = node.C; + O[2].D = 0; + O[2].m = 0; + O[2].grt_type = 0; + allnodes[thisnode].children[2] = mk_vrr_node(O[2], allnodes, made); + O[3].A = node.A-1; + O[3].B = 0; + O[3].C = node.C; + O[3].D = 0; + O[3].m = 0; + O[3].grt_type = 0; + allnodes[thisnode].children[3] = mk_vrr_node(O[3], allnodes, made); + if (node.A > 1) { + O[4].A = node.A-2; + O[4].B = 0; + O[4].C = node.C; + O[4].D = 0; + O[4].m = 0; + O[4].grt_type = 0; + allnodes[thisnode].children[4] = mk_vrr_node(O[4], allnodes, made); + } + if(node.C){ + O[5].A = node.A-1; + O[5].B = 0; + O[5].C = node.C-1; + O[5].D = 0; + O[5].m = 0; + O[5].grt_type = 0; + allnodes[thisnode].children[5] = mk_vrr_node(O[5], allnodes, made); + } + } + else if (node.C){ /*--- (00||c0) ---*/ + O[0].A = node.A; + O[0].B = 0; + O[0].C = node.C-1; + O[0].D = 0; + O[0].m = 0; + O[0].grt_type = 1; + allnodes[thisnode].children[0] = mk_vrr_node(O[0], allnodes, made); + if (node.C > 1) { + O[1].A = node.A; + O[1].B = 0; + O[1].C = node.C-2; + O[1].D = 0; + O[1].m = 0; + O[1].grt_type = 1; + allnodes[thisnode].children[1] = mk_vrr_node(O[1], allnodes, made); + } + O[2].A = node.A; + O[2].B = 0; + O[2].C = node.C; + O[2].D = 0; + O[2].m = 0; + O[2].grt_type = 0; + allnodes[thisnode].children[2] = mk_vrr_node(O[2], allnodes, made); + O[3].A = node.A; + O[3].B = 0; + O[3].C = node.C-1; + O[3].D = 0; + O[3].m = 0; + O[3].grt_type = 0; + allnodes[thisnode].children[3] = mk_vrr_node(O[3], allnodes, made); + if(node.C > 1){ + O[4].A = node.A; + O[4].B = 0; + O[4].C = node.C-2; + O[4].D = 0; + O[4].m = 0; + O[4].grt_type = 0; + allnodes[thisnode].children[4] = mk_vrr_node(O[4], allnodes, made); + } + } + } + /*--- Integral of [r12,T1] ---*/ + else if (node.grt_type == 2) { + O[0].A = node.A; + O[0].B = 0; + O[0].C = node.C; + O[0].D = 0; + O[0].m = 0; + O[0].grt_type = 0; + allnodes[thisnode].children[0] = mk_vrr_node(O[0], allnodes, made); + O[1].A = node.A+1; + O[1].B = 0; + O[1].C = node.C; + O[1].D = 0; + O[1].m = 0; + O[1].grt_type = 0; + allnodes[thisnode].children[1] = mk_vrr_node(O[1], allnodes, made); + O[2].A = node.A; + O[2].B = 0; + O[2].C = node.C+1; + O[2].D = 0; + O[2].m = 0; + O[2].grt_type = 0; + allnodes[thisnode].children[2] = mk_vrr_node(O[2], allnodes, made); + if (node.A) { + O[3].A = node.A-1; + O[3].B = 0; + O[3].C = node.C+1; + O[3].D = 0; + O[3].m = 0; + O[3].grt_type = 0; + allnodes[thisnode].children[3] = mk_vrr_node(O[3], allnodes, made); + O[4].A = node.A-1; + O[4].B = 0; + O[4].C = node.C; + O[4].D = 0; + O[4].m = 0; + O[4].grt_type = 0; + allnodes[thisnode].children[4] = mk_vrr_node(O[4], allnodes, made); + } + } + /*--- Integrals of [r12,T2] ---*/ + else if (node.grt_type == 3) { + O[0].A = node.A; + O[0].B = 0; + O[0].C = node.C; + O[0].D = 0; + O[0].m = 0; + O[0].grt_type = 0; + allnodes[thisnode].children[0] = mk_vrr_node(O[0], allnodes, made); + O[1].A = node.A; + O[1].B = 0; + O[1].C = node.C+1; + O[1].D = 0; + O[1].m = 0; + O[1].grt_type = 0; + allnodes[thisnode].children[1] = mk_vrr_node(O[1], allnodes, made); + O[2].A = node.A+1; + O[2].B = 0; + O[2].C = node.C; + O[2].D = 0; + O[2].m = 0; + O[2].grt_type = 0; + allnodes[thisnode].children[2] = mk_vrr_node(O[2], allnodes, made); + if (node.C > 0) { + O[3].A = node.A+1; + O[3].B = 0; + O[3].C = node.C-1; + O[3].D = 0; + O[3].m = 0; + O[3].grt_type = 0; + allnodes[thisnode].children[3] = mk_vrr_node(O[3], allnodes, made); + O[4].A = node.A; + O[4].B = 0; + O[4].C = node.C-1; + O[4].D = 0; + O[4].m = 0; + O[4].grt_type = 0; + allnodes[thisnode].children[4] = mk_vrr_node(O[4], allnodes, made); + } + } + } + + return thisnode; + +} + + + + +/* Make hrr_nodes[rent] a parent of hrr_nodes[n] and proceed recursively */ + +void mark_hrr_parents(int n, class *allnodes, int rent) +{ + int i; + int *tmp; + + /* handle case where it's in the parent list already */ + for(i=allnodes[n].num_parents-1; i>=allnodes[n].parents_counter; i--) + if(rent==allnodes[n].parents[i]) return; + + /* if the parent rent is not in the list - add it to the list! */ + i = --allnodes[n].parents_counter; + allnodes[n].parents[i] = rent; + /* hits from all of the parents has been received - schedule it for computation and mark all of its children */ + if (i == 0 && (allnodes[n].B != 0 || allnodes[n].D != 0)) { + /*--- take it out of the list if it's in there already ---*/ + if (allnodes[n].llink != -1) { + allnodes[allnodes[n].llink].rlink = allnodes[n].rlink; + } + if (allnodes[n].rlink != -1) { + allnodes[allnodes[n].rlink].llink = allnodes[n].llink; + } + /*--- put it in the beginning ---*/ + allnodes[n].llink = -1; + allnodes[n].rlink = first_hrr_to_compute; + allnodes[first_hrr_to_compute].llink = n; + first_hrr_to_compute = n; + + for(i=0; i= 0) + mark_hrr_parents(allnodes[n].children[i], allnodes, n); + } + return; +} + + +/* Make vrr_nodes[rent] a parent of vrr_nodes[n] and proceed recursively */ + +void mark_vrr_parents(int n, class *allnodes, int rent) +{ + int i; + int *tmp; + + /* handle case where it's in there already */ + for(i=allnodes[n].num_parents-1; i>=allnodes[n].parents_counter; i--) + if(rent==allnodes[n].parents[i]) return; + + + /* if the parent rent is not in the list - add it to the list! */ + i = --allnodes[n].parents_counter; + allnodes[n].parents[i] = rent; + /* hits from all of the parents has been received - schedule it for computation and mark all of its children */ + if (i == 0) { + /*--- take it out of the list if it's in there already ---*/ + if (allnodes[n].llink != -1) { + allnodes[allnodes[n].llink].rlink = allnodes[n].rlink; + } + if (allnodes[n].rlink != -1) { + allnodes[allnodes[n].rlink].llink = allnodes[n].llink; + } + /*--- put it in the beginning ---*/ + allnodes[n].llink = -1; + allnodes[n].rlink = first_vrr_to_compute; + if (first_vrr_to_compute >= 0) + allnodes[first_vrr_to_compute].llink = n; + first_vrr_to_compute = n; + + for(i=0; i= 0) + mark_vrr_parents(allnodes[n].children[i], allnodes, n); + + } + return; +} + + + +/* This functions controls memory placement of computed classes on the CINTS stack */ + +int alloc_mem_hrr(class *nodes) +{ + int i, j, k, l; + int size; + int child; + int free_it; + static int io[] = {1,3,6,10,15,21,28,36,45,55,66,78,91,105,120,136,153,171,190,210}; + + j = first_hrr_to_compute; + do{ + /* Node to compute */ + if (nodes[j].marked == 0) { + nodes[j].marked = 1; /* sign that it has been passed */ + nodes[j].pointer = get_mem(nodes[j].size); /* Allocate memory for it on a CINTS-provided stack */ + } + + /* Figure out which children can be freed, + i.e. which children are not targets and have all parents marked */ + for(k=0; k= 0) + if (nodes[child].target == 0) { + free_it = 1; + for(l=0; l= 0){ + free_it = 1; + for(l=0; l +#include +#include +#include +#include +#include +#include +#define MAXNODE 20000 +#define NONODE -1000000 +#define SSR12SSNODE -1111 /* This is a special node - (ss||ss) */ +#define NUMPARENTS 21 +#define NUMCHILDREN 6 +#define NUMGRTTYPES 4 /* There are 4 types classes to be evaluated - ERIs (g), r12 (r), [r12,t1] (t1), [r12,t2] (t2) */ +#define MOFFSET 11 /* This is to take care of a paossibility that class 0 will be someone's child. Otherwise + it would be confused with (ss|ss)^0 */ + +static int last_hrr_node = 0; /* Global pointer to the last node on the HRR stack */ +static int last_vrr_node = 0; /* Global pointer to the last node on the VRR stack */ + +extern FILE *outfile, *hrr_header, *init_code; +extern int libr12_stack_size[MAX_AM/2+1]; +extern Libr12Params_t Params; + +typedef struct node{ + int A, B, C, D; /* Angular momenta on centers A and C */ + int m; + int grt_type; /* Type of the class - 0 = ERI (g), 1 = r12 (r), 2 = [r12,t1] (t1), 3 = [r12,t2] (t2) */ + int size; /* Class size in double words */ + int pointer; + int children[NUMCHILDREN]; /* Up to 8 children of the class */ + int parents_counter; + int num_parents; /* Number of parents */ + int parents[NUMPARENTS]; /* Pointers to parents */ + int llink; /* Pointer to a class computed right before computing this one */ + int rlink; /* Pointer to a class to be computed after this one is */ + int marked; /* Flag indicating that this node has been computed */ + int target; /* Flag indicating that this node is among targets */ + } class; + +static int first_hrr_to_compute = 0; /* Number of the first class to be computed + (pointer to the beginning of the linked list) */ +static int first_vrr_to_compute = 0; /* Number of the first class to be computed + (pointer to the beginning of the linked list) */ + +/*--- This is the maximum ang. momentum allowed for any (intermediate) classes ---*/ +#define LMAX_AM LIBINT_MAX_AM+1 +static int hrr_hash_table[NUMGRTTYPES][2*LMAX_AM][2*LMAX_AM][2*LMAX_AM][2*LMAX_AM]; +static int vrr_hash_table[NUMGRTTYPES][2*LMAX_AM][2*LMAX_AM][4*LMAX_AM]; + +extern void punt(char *); +static int mk_hrr_node(class node, class *allnodes, int new); +static int mk_vrr_node(class node, class *allnodes, int new); +static void mark_hrr_parents(int n, class *allnodes, int rent); +static void mark_vrr_parents(int n, class *allnodes, int rent); +static int alloc_mem_hrr(class *nodes); +static int alloc_mem_vrr(class *nodes); + +int emit_grt_order() +{ + int old_am = Params.old_am; + int new_am = Params.new_am; + int opt_am = Params.opt_am; + + int i, j, k, l; + int la, lc, lc_min, ld, ld_max, ld_min; + int lb, lb_min, lb_max; + int current_highest_am; + int base_mem, hrr_mem, vrr_mem; + int child0, child1, child; + int num_children; + int offset; + class nodes[MAXNODE]; /* Stack of nodes */ + class *hrr_nodes = &(nodes[0]); + class *vrr_nodes; + int target_data; + int done; + int max_stack_size = 0; + int target_hrr_nodes[NUMGRTTYPES]; /* Array of unique targets on the HRR graph */ + int num_hrr_targets; + int target_vrr_nodes[1000]; + int num_vrr_targets; + const char am_letter[] = "0pdfghiklmnoqrtuvwxyz"; + char hrr_code_name[] = "hrr_grt_order_0000.cc"; + char hrr_function_name[] = "hrr_grt_order_0000"; + char vrr_code_name[] = "vrr_grt_order_0000.cc"; + char vrr_function_name[] = "vrr_grt_order_0000"; + FILE *hrr_code, *vrr_code; + + for(la=0;la<=new_am;la++) { + lb_max = la/2; + lb_min = (la <= new_am/2) ? 0 : la - new_am/2; + lc_min = la; + for(lb=lb_min;lb<=lb_max;lb++) { + for(lc=lc_min;lc<=new_am;lc++) { + ld_max = lc/2; + ld_min = (lc <= new_am/2) ? 0 : lc - new_am/2; + for(ld=ld_min;ld<=ld_max;ld++) { + + current_highest_am = (la-lb > lb) ? la-lb : lb; + current_highest_am = (current_highest_am > lc-ld) ? current_highest_am : lc-ld; + current_highest_am = (current_highest_am > ld) ? current_highest_am : ld; + + /*--------------------------------------------------------------- + Form code and function names for HRR and VRR ordering routines + ---------------------------------------------------------------*/ + hrr_function_name[14] = am_letter[la-lb]; + hrr_function_name[15] = am_letter[lb]; + hrr_function_name[16] = am_letter[lc-ld]; + hrr_function_name[17] = am_letter[ld]; + vrr_function_name[14] = am_letter[la-lb]; + vrr_function_name[15] = am_letter[lb]; + vrr_function_name[16] = am_letter[lc-ld]; + vrr_function_name[17] = am_letter[ld]; + hrr_code_name[14] = am_letter[la-lb]; + hrr_code_name[15] = am_letter[lb]; + hrr_code_name[16] = am_letter[lc-ld]; + hrr_code_name[17] = am_letter[ld]; + hrr_code = fopen(hrr_code_name,"w"); + vrr_code_name[14] = am_letter[la-lb]; + vrr_code_name[15] = am_letter[lb]; + vrr_code_name[16] = am_letter[lc-ld]; + vrr_code_name[17] = am_letter[ld]; + vrr_code = fopen(vrr_code_name,"w"); + + /*----------------------------------- + Write the overhead to the HRR code + -----------------------------------*/ + fprintf(hrr_code,"#include \n"); + fprintf(hrr_code,"#include \n"); + fprintf(hrr_code,"#include \n"); + fprintf(hrr_code,"#include \"libr12.h\"\n"); + fprintf(hrr_code,"#include \n\n"); + fprintf(hrr_code,"#include \"r12_hrr_header.h\"\n\n"); + fprintf(hrr_code,"extern void %s(Libr12_t *, prim_data *);\n\n",vrr_function_name); + fprintf(hrr_code," /* Computes (%c%c|%c%c) integrals for linear R12-methods */\n\n", + am_letter[la-lb],am_letter[lb],am_letter[lc-ld],am_letter[ld]); + fprintf(hrr_code,"void %s(Libr12_t *Libr12, int num_prim_comb)\n{\n",hrr_function_name); + fprintf(hrr_code," prim_data *Data = Libr12->PrimQuartet;\n"); + fprintf(hrr_code," REALTYPE *int_stack = Libr12->int_stack;\n"); + fprintf(hrr_code," int i,j;\n REALTYPE tmp, *target;\n\n"); + + /*-------------------------------------------------------------- + Include the function into the hrr_header.h and init_libint.cc + --------------------------------------------------------------*/ + fprintf(hrr_header,"void %s(Libr12_t *, int);\n",hrr_function_name); + fprintf(init_code," build_r12_grt[%d][%d][%d][%d] = %s;\n",la-lb,lb,lc-ld,ld,hrr_function_name); + + /*----------------------------------- + Write the overhead to the VRR code + -----------------------------------*/ + fprintf(vrr_code,"#include \n"); + fprintf(vrr_code,"#include \n"); + fprintf(vrr_code,"#include \"libr12.h\"\n"); + fprintf(vrr_code,"#include \n"); + fprintf(vrr_code,"#include \"r12_vrr_header.h\"\n\n"); + fprintf(vrr_code,"void %s(Libr12_t *Libr12, prim_data *Data)\n{\n",vrr_function_name); + + + /*-------------------------------------------------- + Starting at the target node(s) set up an HRR graph. + --------------------------------------------------*/ + + last_hrr_node = 0; + num_hrr_targets=0; + for(i=0;i= 0) + hrr_nodes[k].target = 1; + } + + /*------------------------------------------- + Traverse the graph starting at each target + -------------------------------------------*/ + for(i=0;i= 0){ + mark_hrr_parents(hrr_nodes[j].children[k], hrr_nodes, j); + } + } + + + init_mem(1); + + /*--------------------------------------------------------------- + Allocate and zero out space for classes to be generated by VRR + Those do not include (ss|ss) and (ss||ss) + ---------------------------------------------------------------*/ + for(i=last_hrr_node-1;i>=0;i--) + if (hrr_nodes[i].B == 0 && hrr_nodes[i].D == 0) { + hrr_nodes[i].marked = 1; + /*--- do not allocate space for (ss|ss) and (ss||ss) ---*/ + if (hrr_nodes[i].A == 0 && hrr_nodes[i].C == 0 && + (hrr_nodes[i].grt_type == 0 || hrr_nodes[i].grt_type == 1)) + continue; + hrr_nodes[i].pointer = get_mem(hrr_nodes[i].size); + fprintf(hrr_code," Libr12->"); + switch(hrr_nodes[i].grt_type) { + case 0: + fprintf(hrr_code,"gvrr_classes"); + break; + case 1: + fprintf(hrr_code,"rvrr_classes"); + break; + case 2: + fprintf(hrr_code,"t1vrr_classes"); + break; + case 3: + fprintf(hrr_code,"t2vrr_classes"); + break; + } + fprintf(hrr_code,"[%d][%d] = int_stack + %d;\n", + hrr_nodes[i].A,hrr_nodes[i].C,hrr_nodes[i].pointer); + } + base_mem = get_total_memory(); + fprintf(hrr_code," memset(int_stack,0,%d*sizeof(REALTYPE));\n\n",base_mem); + fprintf(hrr_code," Libr12->r12vrr_stack = int_stack + %d;\n",base_mem); + + + + /*---------------------------- + Build the HRR call sequence + ----------------------------*/ + if (lb != 0 || ld != 0) { + target_data = alloc_mem_hrr(hrr_nodes); + } + + + hrr_mem = get_total_memory(); + if (max_stack_size < hrr_mem) + max_stack_size = hrr_mem; + fprintf(hrr_code," for(i=0;i 0) + do { + fprintf(hrr_code, " /*--- compute (%c%c|", + am_letter[hrr_nodes[j].A],am_letter[hrr_nodes[j].B]); + switch (hrr_nodes[j].grt_type) { + case 0: + break; + case 1: + fprintf(hrr_code,"|"); + break; + case 2: + fprintf(hrr_code,"[r12,T1]|"); + break; + case 3: + fprintf(hrr_code,"[r12,T2]|"); + break; + } + fprintf(hrr_code,"%c%c) ---*/\n", + am_letter[hrr_nodes[j].C],am_letter[hrr_nodes[j].D]); + + + if (hrr_nodes[j].B > 0 || hrr_nodes[j].D > 0) { + /*--- compute the number of children ---*/ + num_children = 0; + for(i=0;i= 0) + num_children++; + + if (hrr_nodes[j].B == 0 && hrr_nodes[j].D != 0) { + if (hrr_nodes[j].grt_type == 3) + fprintf(hrr_code, " t2hrr3_build_%c%c(Libr12->ShellQuartet.CD,Libr12->ShellQuartet.AC,int_stack+%d,", + am_letter[hrr_nodes[j].C], am_letter[hrr_nodes[j].D], hrr_nodes[j].pointer); + else + fprintf(hrr_code, " hrr3_build_%c%c(Libr12->ShellQuartet.CD,int_stack+%d,", + am_letter[hrr_nodes[j].C], am_letter[hrr_nodes[j].D], hrr_nodes[j].pointer); + } + else if (hrr_nodes[j].B != 0) { + if (hrr_nodes[j].grt_type == 2) + fprintf(hrr_code, " t1hrr1_build_%c%c(Libr12->ShellQuartet.AB,Libr12->ShellQuartet.AC,int_stack+%d,", + am_letter[hrr_nodes[j].A], am_letter[hrr_nodes[j].B], hrr_nodes[j].pointer); + else + fprintf(hrr_code, " hrr1_build_%c%c(Libr12->ShellQuartet.AB,int_stack+%d,", + am_letter[hrr_nodes[j].A], am_letter[hrr_nodes[j].B], hrr_nodes[j].pointer); + } + + for(i=0;i= 0) { + child = hrr_nodes[j].children[i]; + fprintf(hrr_code, " int_stack+%d,", hrr_nodes[child].pointer); + } + + if (hrr_nodes[j].B == 0 && hrr_nodes[j].D != 0) { + if (hrr_nodes[j].grt_type == 3) + fprintf(hrr_code, " %d, %d);\n", hrr_nodes[j].A,hrr_nodes[j].B); + else + fprintf(hrr_code, " %d);\n", io(1+hrr_nodes[j].A)*io(1+hrr_nodes[j].B)); + } + else if (hrr_nodes[j].B != 0) { + if (hrr_nodes[j].grt_type == 2) + fprintf(hrr_code, " %d, %d);\n", hrr_nodes[j].C,hrr_nodes[j].D); + else + fprintf(hrr_code, " %d);\n", io(1+hrr_nodes[j].C)*io(1+hrr_nodes[j].D)); + } + } + + /* Pass the "target" quartets to CINTS */ + if (hrr_nodes[j].target) { + fprintf(hrr_code," Libr12->te_ptr[%d] = int_stack + %d;\n",hrr_nodes[j].grt_type,hrr_nodes[j].pointer); + } + j = hrr_nodes[j].rlink; + } while (j != -1); + + fprintf(hrr_code,"\n}\n"); + fclose(hrr_code); + printf("Done with %s\n",hrr_code_name); + for(i=0;i= 0) + vrr_nodes[k].target = 1; + } + /*--- Now find the true targets (nodes with 0 parents) ---*/ + num_vrr_targets = 0; + for(i=0;i 0) { + vrr_nodes[target_vrr_nodes[num_vrr_targets-1]].llink = i; + vrr_nodes[i].rlink = target_vrr_nodes[num_vrr_targets-1]; + vrr_nodes[i].llink = -1; + } + else { + vrr_nodes[i].rlink = -1; + vrr_nodes[i].llink = -1; + } + num_vrr_targets++; + } + first_vrr_to_compute = target_vrr_nodes[num_vrr_targets-1]; + + /* Traverse the graph starting at each target */ + for(i=0;i= 0){ + mark_vrr_parents(vrr_nodes[j].children[k], vrr_nodes, j); + } + } + } + + init_mem(1); + + /* Build the call sequence */ + target_data = alloc_mem_vrr(vrr_nodes); + vrr_mem = base_mem + get_total_memory(); + if (max_stack_size < vrr_mem) + max_stack_size = vrr_mem; + fprintf(vrr_code," REALTYPE *r12vrr_stack = Libr12->r12vrr_stack;\n"); + fprintf(vrr_code," REALTYPE *tmp, *target_ptr;\n int i, am[2];\n\n"); + + j = first_vrr_to_compute; + do { + fprintf(vrr_code, " /*--- compute (%c%c|", + am_letter[vrr_nodes[j].A],am_letter[vrr_nodes[j].B]); + switch (vrr_nodes[j].grt_type) { + case 0: + break; + case 1: + fprintf(vrr_code,"|"); + break; + case 2: + fprintf(vrr_code,"[r12,T1]|"); + break; + case 3: + fprintf(vrr_code,"[r12,T2]|"); + break; + } + fprintf(vrr_code,"%c%c)^%d ---*/\n", + am_letter[vrr_nodes[j].C],am_letter[vrr_nodes[j].D],vrr_nodes[j].m); + + /*--------------------------------------------------------- + Decide which routine to use to compute the current class + ---------------------------------------------------------*/ + switch (vrr_nodes[j].grt_type) { + case 0: + if (vrr_nodes[j].A <= LIBINT_OPT_AM && vrr_nodes[j].C <= LIBINT_OPT_AM) + fprintf(vrr_code, " _BUILD_%c0%c0(Data,", am_letter[vrr_nodes[j].A], am_letter[vrr_nodes[j].C]); + else { + fprintf(vrr_code, " am[0] = %d; am[1] = %d;\n", vrr_nodes[j].A, vrr_nodes[j].C); + fprintf(vrr_code, " vrr_build_xxxx(am,Data,"); + } + break; + case 1: + if (vrr_nodes[j].A <= opt_am && vrr_nodes[j].C <= opt_am) + fprintf(vrr_code, " _R_BUILD_%c0%c0(Data,", am_letter[vrr_nodes[j].A], am_letter[vrr_nodes[j].C]); + else { + fprintf(vrr_code, " am[0] = %d; am[1] = %d;\n", vrr_nodes[j].A, vrr_nodes[j].C); + fprintf(vrr_code, " r_vrr_build_xxxx(am,Data,"); + } + break; + case 2: + if (vrr_nodes[j].A <= opt_am && vrr_nodes[j].C <= opt_am) + fprintf(vrr_code, " _T1_BUILD_%c0%c0(Data,", am_letter[vrr_nodes[j].A], am_letter[vrr_nodes[j].C]); + else { + fprintf(vrr_code, " am[0] = %d; am[1] = %d;\n", vrr_nodes[j].A, vrr_nodes[j].C); + fprintf(vrr_code, " t1_vrr_build_xxxx(am,Data,"); + } + break; + case 3: + if (vrr_nodes[j].A <= opt_am && vrr_nodes[j].C <= opt_am) + fprintf(vrr_code, " _T2_BUILD_%c0%c0(Data,", am_letter[vrr_nodes[j].A], am_letter[vrr_nodes[j].C]); + else { + fprintf(vrr_code, " am[0] = %d; am[1] = %d;\n", vrr_nodes[j].A, vrr_nodes[j].C); + fprintf(vrr_code, " t2_vrr_build_xxxx(am,Data,"); + } + break; + } + switch (vrr_nodes[j].grt_type) { + case 2: + fprintf(vrr_code,"&(Libr12->ShellQuartet),"); + break; + case 3: + fprintf(vrr_code,"&(Libr12->ShellQuartet),"); + break; + } + fprintf(vrr_code, "r12vrr_stack+%d", vrr_nodes[j].pointer); + num_children = (vrr_nodes[j].grt_type == 1) ? 6 : 5; + for(k=0; k= 0) /*--- this child is a "real" class ---*/ + fprintf(vrr_code, ", r12vrr_stack+%d", vrr_nodes[vrr_nodes[j].children[k]].pointer); + else if (vrr_nodes[j].children[k] == NONODE) /*--- this child is a no-class ---*/ + fprintf(vrr_code, ", NULL"); + else if (vrr_nodes[j].children[k] == SSR12SSNODE) /*--- this is a (ss||ss) ---*/ + fprintf(vrr_code, ", &(Data->ss_r12_ss)"); + else /*--- this is a (ss|ss)^m ---*/ + fprintf(vrr_code, ", Data->F+%d", (-1)*(vrr_nodes[j].children[k] + MOFFSET)); + } + fprintf(vrr_code, ");\n"); + + /*----------------------------------------------- + If this derivative class is one of the targets + copy it to a location pointed by deriv_classes + to be used by the calling hrr_order routine + -----------------------------------------------*/ + if (vrr_nodes[j].target == 1) { + fprintf(vrr_code, " tmp = r12vrr_stack + %d;\n", vrr_nodes[j].pointer); + fprintf(vrr_code, " target_ptr = Libr12->"); + switch (vrr_nodes[j].grt_type) { + case 0: + fprintf(vrr_code,"g"); + break; + case 1: + fprintf(vrr_code,"r"); + break; + case 2: + fprintf(vrr_code,"t1"); + break; + case 3: + fprintf(vrr_code,"t2"); + break; + } + fprintf(vrr_code,"vrr_classes[%d][%d];\n", + vrr_nodes[j].A,vrr_nodes[j].C); + fprintf(vrr_code, " for(i=0;i<%d;i++)\n",vrr_nodes[j].size); + fprintf(vrr_code, " target_ptr[i] += tmp[i];\n\n"); + } + else + fprintf(vrr_code, "\n"); + + j = vrr_nodes[j].rlink; + } while (j != -1); + fprintf(vrr_code, "\n}\n\n"); + fclose(vrr_code); + printf("Done with %s\n",vrr_code_name); + for(i=0;i= MAXNODE) { + printf(" Maximum stack size is reached. Change MAXNODE and recompile.\n\n"); + exit(1); + } + } + + /* If the parent class wasn't on stack already (!new) - increase the parent counter */ + if(!new){ + allnodes[thisnode].num_parents++; + allnodes[thisnode].parents_counter++; + if (allnodes[thisnode].num_parents > NUMPARENTS) { + printf("Number of parents exceeds the limit\n"); + exit(1); + } + } + + + /* now make all child nodes */ + if (!made) { + if(node.B){ + O[0].A = node.A+1; + O[0].B = node.B-1; + O[0].C = node.C; + O[0].D = node.D; + O[0].m = node.m; + O[0].grt_type = node.grt_type; + allnodes[thisnode].children[0] = mk_hrr_node(O[0], allnodes, made); + O[1].A = node.A; + O[1].B = node.B-1; + O[1].C = node.C; + O[1].D = node.D; + O[1].m = node.m; + O[1].grt_type = node.grt_type; + allnodes[thisnode].children[1] = mk_hrr_node(O[1], allnodes, made); + /* Special case - [r12.T1] */ + if (node.grt_type == 2) { + O[2].A = node.A+1; + O[2].B = node.B-1; + O[2].C = node.C; + O[2].D = node.D; + O[2].m = node.m; + O[2].grt_type = 0; + allnodes[thisnode].children[2] = mk_hrr_node(O[2], allnodes, made); + O[3].A = node.A; + O[3].B = node.B-1; + O[3].C = node.C+1; + O[3].D = node.D; + O[3].m = node.m; + O[3].grt_type = 0; + allnodes[thisnode].children[3] = mk_hrr_node(O[3], allnodes, made); + O[4].A = node.A; + O[4].B = node.B-1; + O[4].C = node.C; + O[4].D = node.D; + O[4].m = node.m; + O[4].grt_type = 0; + allnodes[thisnode].children[4] = mk_hrr_node(O[4], allnodes, made); + } + } + else if(node.D){ + O[0].A = node.A; + O[0].B = node.B; + O[0].C = node.C+1; + O[0].D = node.D-1; + O[0].m = node.m; + O[0].grt_type = node.grt_type; + allnodes[thisnode].children[0] = mk_hrr_node(O[0], allnodes, made); + O[1].A = node.A; + O[1].B = node.B; + O[1].C = node.C; + O[1].D = node.D-1; + O[1].m = node.m; + O[1].grt_type = node.grt_type; + allnodes[thisnode].children[1] = mk_hrr_node(O[1], allnodes, made); + /* Special case - [r12.T2] */ + if (node.grt_type == 3) { + O[2].A = node.A; + O[2].B = node.B; + O[2].C = node.C+1; + O[2].D = node.D-1; + O[2].m = node.m; + O[2].grt_type = 0; + allnodes[thisnode].children[2] = mk_hrr_node(O[2], allnodes, made); + O[3].A = node.A+1; + O[3].B = node.B; + O[3].C = node.C; + O[3].D = node.D-1; + O[3].m = node.m; + O[3].grt_type = 0; + allnodes[thisnode].children[3] = mk_hrr_node(O[3], allnodes, made); + O[4].A = node.A; + O[4].B = node.B; + O[4].C = node.C; + O[4].D = node.D-1; + O[4].m = node.m; + O[4].grt_type = 0; + allnodes[thisnode].children[4] = mk_hrr_node(O[4], allnodes, made); + } + } + } + + return thisnode; + +} + + + +/* Recursive function that builds a hybrid VRR subgraph given the parent */ + +int mk_vrr_node(class node, class *allnodes, int new) +{ + + int i, j, k, l; + class O[NUMCHILDREN]; + int subnodes = 0; + int thisnode; + int made = 0; + + /* If it's not a derivative class - do some checks to see if need to proceed */ + if (node.grt_type == 0 && node.A + node.B + node.C + node.D == 0) + return (-1)*node.m - MOFFSET; + else if (node.grt_type == 1 && node.A + node.B + node.C + node.D == 0) + return SSR12SSNODE; + + /* Search for the parent node on stack + If it's not there - we'll add it to the end of the stack */ + thisnode = last_vrr_node; + /* it's already placed on the stack allnodes - make sure children don't get created again (made = 1) */ + if (vrr_hash_table[node.grt_type][node.A][node.C][node.m]) { + i = vrr_hash_table[node.grt_type][node.A][node.C][node.m] - 1; + thisnode = i; + made = 1; + } + + /* it's not computed, add it, and make it the first to compute! */ + if(!made){ + allnodes[thisnode].A = node.A; + allnodes[thisnode].B = node.B; + allnodes[thisnode].C = node.C; + allnodes[thisnode].D = node.D; + allnodes[thisnode].m = node.m; + allnodes[thisnode].grt_type = node.grt_type; + vrr_hash_table[node.grt_type][node.A][node.C][node.m] = thisnode + 1; + allnodes[thisnode].num_parents = 0; + allnodes[thisnode].parents_counter = 0; + allnodes[thisnode].marked = 0; + allnodes[thisnode].target = 0; + allnodes[thisnode].pointer = 0; + memset(allnodes[thisnode].parents,0,NUMPARENTS*sizeof(int)); + for(i=0;i= MAXNODE) { + printf(" Maximum stack size is reached. Change MAXNODE and recompile.\n\n"); + exit(1); + } + } + + /* If the parent class wasn't on stack already (!new) - increase the parent counter */ + if(!new){ + allnodes[thisnode].num_parents++; + allnodes[thisnode].parents_counter++; + if (allnodes[thisnode].num_parents > NUMPARENTS) { + printf("Number of parents exceeds the limit\n"); + exit(1); + } + } + + + /* now make all child nodes */ + if (!made) { + /* regular ERI */ + if (node.grt_type == 0) { + if(node.A){ /*--- (a0|c0 ---*/ + O[0].A = node.A-1; + O[0].B = 0; + O[0].C = node.C; + O[0].D = 0; + O[0].m = node.m; + O[0].grt_type = 0; + allnodes[thisnode].children[0] = mk_vrr_node(O[0], allnodes, made); + O[1].A = node.A-1; + O[1].B = 0; + O[1].C = node.C; + O[1].D = 0; + O[1].m = node.m+1; + O[1].grt_type = 0; + allnodes[thisnode].children[1] = mk_vrr_node(O[1], allnodes, made); + if(node.A>1){ + O[2].A = node.A-2; + O[2].B = 0; + O[2].C = node.C; + O[2].D = 0; + O[2].m = node.m; + O[2].grt_type = 0; + allnodes[thisnode].children[2] = mk_vrr_node(O[2], allnodes, made); + O[3].A = node.A-2; + O[3].B = 0; + O[3].C = node.C; + O[3].D = 0; + O[3].m = node.m+1; + O[3].grt_type = 0; + allnodes[thisnode].children[3] = mk_vrr_node(O[3], allnodes, made); + } + if(node.C){ + O[4].A = node.A-1; + O[4].B = 0; + O[4].C = node.C-1; + O[4].D = 0; + O[4].m = node.m+1; + O[4].grt_type = 0; + allnodes[thisnode].children[4] = mk_vrr_node(O[4], allnodes, made); + } + } + else if(node.C){ /*--- (00|c0) ---*/ + O[0].A = node.A; + O[0].B = 0; + O[0].C = node.C-1; + O[0].D = 0; + O[0].m = node.m; + O[0].grt_type = 0; + allnodes[thisnode].children[0] = mk_vrr_node(O[0], allnodes, made); + O[1].A = node.A; + O[1].B = 0; + O[1].C = node.C-1; + O[1].D = 0; + O[1].m = node.m+1; + O[1].grt_type = 0; + allnodes[thisnode].children[1] = mk_vrr_node(O[1], allnodes, made); + if(node.C>1){ + O[2].A = node.A; + O[2].B = 0; + O[2].C = node.C-2; + O[2].D = 0; + O[2].m = node.m; + O[2].grt_type = 0; + allnodes[thisnode].children[2] = mk_vrr_node(O[2], allnodes, made); + O[3].A = node.A; + O[3].B = 0; + O[3].C = node.C-2; + O[3].D = 0; + O[3].m = node.m+1; + O[3].grt_type = 0; + allnodes[thisnode].children[3] = mk_vrr_node(O[3], allnodes, made); + } + } + } + /* Integral of r12 */ + else if (node.grt_type == 1) { + if(node.A){ /*--- (a0||c0) ---*/ + O[0].A = node.A-1; + O[0].B = 0; + O[0].C = node.C; + O[0].D = 0; + O[0].m = 0; + O[0].grt_type = 1; + allnodes[thisnode].children[0] = mk_vrr_node(O[0], allnodes, made); + if (node.A > 1) { + O[1].A = node.A-2; + O[1].B = 0; + O[1].C = node.C; + O[1].D = 0; + O[1].m = 0; + O[1].grt_type = 1; + allnodes[thisnode].children[1] = mk_vrr_node(O[1], allnodes, made); + } + O[2].A = node.A; + O[2].B = 0; + O[2].C = node.C; + O[2].D = 0; + O[2].m = 0; + O[2].grt_type = 0; + allnodes[thisnode].children[2] = mk_vrr_node(O[2], allnodes, made); + O[3].A = node.A-1; + O[3].B = 0; + O[3].C = node.C; + O[3].D = 0; + O[3].m = 0; + O[3].grt_type = 0; + allnodes[thisnode].children[3] = mk_vrr_node(O[3], allnodes, made); + if (node.A > 1) { + O[4].A = node.A-2; + O[4].B = 0; + O[4].C = node.C; + O[4].D = 0; + O[4].m = 0; + O[4].grt_type = 0; + allnodes[thisnode].children[4] = mk_vrr_node(O[4], allnodes, made); + } + if(node.C){ + O[5].A = node.A-1; + O[5].B = 0; + O[5].C = node.C-1; + O[5].D = 0; + O[5].m = 0; + O[5].grt_type = 0; + allnodes[thisnode].children[5] = mk_vrr_node(O[5], allnodes, made); + } + } + else if (node.C){ /*--- (00||c0) ---*/ + O[0].A = node.A; + O[0].B = 0; + O[0].C = node.C-1; + O[0].D = 0; + O[0].m = 0; + O[0].grt_type = 1; + allnodes[thisnode].children[0] = mk_vrr_node(O[0], allnodes, made); + if (node.C > 1) { + O[1].A = node.A; + O[1].B = 0; + O[1].C = node.C-2; + O[1].D = 0; + O[1].m = 0; + O[1].grt_type = 1; + allnodes[thisnode].children[1] = mk_vrr_node(O[1], allnodes, made); + } + O[2].A = node.A; + O[2].B = 0; + O[2].C = node.C; + O[2].D = 0; + O[2].m = 0; + O[2].grt_type = 0; + allnodes[thisnode].children[2] = mk_vrr_node(O[2], allnodes, made); + O[3].A = node.A; + O[3].B = 0; + O[3].C = node.C-1; + O[3].D = 0; + O[3].m = 0; + O[3].grt_type = 0; + allnodes[thisnode].children[3] = mk_vrr_node(O[3], allnodes, made); + if(node.C > 1){ + O[4].A = node.A; + O[4].B = 0; + O[4].C = node.C-2; + O[4].D = 0; + O[4].m = 0; + O[4].grt_type = 0; + allnodes[thisnode].children[4] = mk_vrr_node(O[4], allnodes, made); + } + } + } + /*--- Integral of [r12,T1] ---*/ + else if (node.grt_type == 2) { + O[0].A = node.A; + O[0].B = 0; + O[0].C = node.C; + O[0].D = 0; + O[0].m = 0; + O[0].grt_type = 0; + allnodes[thisnode].children[0] = mk_vrr_node(O[0], allnodes, made); + O[1].A = node.A+1; + O[1].B = 0; + O[1].C = node.C; + O[1].D = 0; + O[1].m = 0; + O[1].grt_type = 0; + allnodes[thisnode].children[1] = mk_vrr_node(O[1], allnodes, made); + O[2].A = node.A; + O[2].B = 0; + O[2].C = node.C+1; + O[2].D = 0; + O[2].m = 0; + O[2].grt_type = 0; + allnodes[thisnode].children[2] = mk_vrr_node(O[2], allnodes, made); + if (node.A) { + O[3].A = node.A-1; + O[3].B = 0; + O[3].C = node.C+1; + O[3].D = 0; + O[3].m = 0; + O[3].grt_type = 0; + allnodes[thisnode].children[3] = mk_vrr_node(O[3], allnodes, made); + O[4].A = node.A-1; + O[4].B = 0; + O[4].C = node.C; + O[4].D = 0; + O[4].m = 0; + O[4].grt_type = 0; + allnodes[thisnode].children[4] = mk_vrr_node(O[4], allnodes, made); + } + } + /*--- Integrals of [r12,T2] ---*/ + else if (node.grt_type == 3) { + O[0].A = node.A; + O[0].B = 0; + O[0].C = node.C; + O[0].D = 0; + O[0].m = 0; + O[0].grt_type = 0; + allnodes[thisnode].children[0] = mk_vrr_node(O[0], allnodes, made); + O[1].A = node.A; + O[1].B = 0; + O[1].C = node.C+1; + O[1].D = 0; + O[1].m = 0; + O[1].grt_type = 0; + allnodes[thisnode].children[1] = mk_vrr_node(O[1], allnodes, made); + O[2].A = node.A+1; + O[2].B = 0; + O[2].C = node.C; + O[2].D = 0; + O[2].m = 0; + O[2].grt_type = 0; + allnodes[thisnode].children[2] = mk_vrr_node(O[2], allnodes, made); + if (node.C > 0) { + O[3].A = node.A+1; + O[3].B = 0; + O[3].C = node.C-1; + O[3].D = 0; + O[3].m = 0; + O[3].grt_type = 0; + allnodes[thisnode].children[3] = mk_vrr_node(O[3], allnodes, made); + O[4].A = node.A; + O[4].B = 0; + O[4].C = node.C-1; + O[4].D = 0; + O[4].m = 0; + O[4].grt_type = 0; + allnodes[thisnode].children[4] = mk_vrr_node(O[4], allnodes, made); + } + } + } + + return thisnode; + +} + + + + +/* Make hrr_nodes[rent] a parent of hrr_nodes[n] and proceed recursively */ + +void mark_hrr_parents(int n, class *allnodes, int rent) +{ + int i; + int *tmp; + + /* handle case where it's in the parent list already */ + for(i=allnodes[n].num_parents-1; i>=allnodes[n].parents_counter; i--) + if(rent==allnodes[n].parents[i]) return; + + /* if the parent rent is not in the list - add it to the list! */ + i = --allnodes[n].parents_counter; + allnodes[n].parents[i] = rent; + /* hits from all of the parents has been received - schedule it for computation and mark all of its children */ + if (i == 0 && (allnodes[n].B != 0 || allnodes[n].D != 0)) { + /*--- take it out of the list if it's in there already ---*/ + if (allnodes[n].llink != -1) { + allnodes[allnodes[n].llink].rlink = allnodes[n].rlink; + } + if (allnodes[n].rlink != -1) { + allnodes[allnodes[n].rlink].llink = allnodes[n].llink; + } + /*--- put it in the beginning ---*/ + allnodes[n].llink = -1; + allnodes[n].rlink = first_hrr_to_compute; + allnodes[first_hrr_to_compute].llink = n; + first_hrr_to_compute = n; + + for(i=0; i= 0) + mark_hrr_parents(allnodes[n].children[i], allnodes, n); + } + return; +} + + +/* Make vrr_nodes[rent] a parent of vrr_nodes[n] and proceed recursively */ + +void mark_vrr_parents(int n, class *allnodes, int rent) +{ + int i; + int *tmp; + + /* handle case where it's in there already */ + for(i=allnodes[n].num_parents-1; i>=allnodes[n].parents_counter; i--) + if(rent==allnodes[n].parents[i]) return; + + + /* if the parent rent is not in the list - add it to the list! */ + i = --allnodes[n].parents_counter; + allnodes[n].parents[i] = rent; + /* hits from all of the parents has been received - schedule it for computation and mark all of its children */ + if (i == 0) { + /*--- take it out of the list if it's in there already ---*/ + if (allnodes[n].llink != -1) { + allnodes[allnodes[n].llink].rlink = allnodes[n].rlink; + } + if (allnodes[n].rlink != -1) { + allnodes[allnodes[n].rlink].llink = allnodes[n].llink; + } + /*--- put it in the beginning ---*/ + allnodes[n].llink = -1; + allnodes[n].rlink = first_vrr_to_compute; + if (first_vrr_to_compute >= 0) + allnodes[first_vrr_to_compute].llink = n; + first_vrr_to_compute = n; + + for(i=0; i= 0) + mark_vrr_parents(allnodes[n].children[i], allnodes, n); + + } + return; +} + + + +/* This functions controls memory placement of computed classes on the CINTS stack */ + +int alloc_mem_hrr(class *nodes) +{ + int i, j, k, l; + int size; + int child; + int free_it; + + j = first_hrr_to_compute; + do{ + /* Node to compute */ + if (nodes[j].marked == 0) { + nodes[j].marked = 1; /* sign that it has been passed */ + nodes[j].pointer = get_mem(nodes[j].size); /* Allocate memory for it on a CINTS-provided stack */ + } + + /* Figure out which children can be freed, + i.e. which children are not targets and have all parents marked */ + for(k=0; k= 0) + if (nodes[child].target == 0) { + free_it = 1; + for(l=0; l= 0){ + free_it = 1; + for(l=0; l +#include +#include +#include +#include + +extern FILE *outfile, *hrr_header; +extern Libr12Params_t Params; + +extern void punt(char *); + +void emit_hrr_t_build() +{ + int new_am = Params.new_am; + int max_class_size = Params.max_class_size; + + FILE *code; + int p,q,r,s; + int ax,ay,az,bx,by,bz,cx,cy,cz,dx,dy,dz; + int t0, t1, t2, t3, t4; + int i,j,nj,i_i0,i_i1; + int k,l,nl,k_i0,k_i1; + int cp1dm1_num,cdm1_num; + int a, b; + int flag; + int am_in[2]; + int am[2][3]; + int xyz; + int class_size; + int split; + int la, lb; + int ld, lc, ld_max; + int curr_count,curr_subfunction; + int num_subfunctions, subbatch_length; + int f; + char code_name[21]; + char function_name[18]; + char **subfunction_name; + + for(lc=0;lc<=new_am;lc++) { + ld_max = (lc+1)/2; + for(ld=1;ld<=ld_max;ld++) { + + /*----------------------- + HRR on centers C and D + -----------------------*/ + + am_in[0] = lc-ld; + am_in[1] = ld; + + class_size = ((am_in[0]+1)*(am_in[0]+2)*(am_in[1]+1)*(am_in[1]+2))/4; + nl = (am_in[1]*(am_in[1]+1))/2; + cp1dm1_num = (am_in[0]+2)*(am_in[0]+3)*nl/2; + cdm1_num = (am_in[0]+1)*(am_in[0]+2)*nl/2; + + /* Decide if the routine has to be split into several routines producing "subbatches" */ + if (class_size > max_class_size) { + split = 1; + num_subfunctions = ceil((double)class_size/max_class_size); + subbatch_length = 1 + class_size/num_subfunctions; + } + else { + split = 0; + } + + sprintf(function_name,"t2hrr3_build_%c%c",am_letter[am_in[0]],am_letter[am_in[1]]); + if (split) { + subfunction_name = (char **) malloc (num_subfunctions*sizeof(char *)); + for(i=0;i\n\n"); + if (split) { + for(i=0;i\n\n"); + + if (split) { + for(i=0;i +#include +#include +#include +#include +#include + +extern FILE *outfile, *vrr_header; +extern Libr12Params_t Params; + +extern void punt(char *); +static void declare_localv(int dec_C, int k1max, int k2max, int k3max, FILE *code); +static void define_localv(int dec_C, int k1max, int k2max, int k3max, FILE *code); + +static char **k1, **k2, **k3; + +void emit_vrr_r_build() +{ + int old_am = Params.old_am; + int new_am = Params.opt_am; + int max_class_size = Params.max_class_size; + + FILE *code; + int i, j, k, l, f; + int dec_C; /* Decrease AM on C */ + int xyz; /* Cartesian direction along which to decrease AM */ + int flag; + int am[2][3]; + int am_in[2]; + int nflip = 0; + int t1, t2, t3, t4; + int class_size; + int type; + int max1 = 0; + int max2 = 0; + int la, lc, lc_min, lc_max; + int k1max, k2max, k3max; + int split,num_subfunctions,subbatch_length; + int curr_count,curr_subfunction; + static const char *k1_suff = "o2z"; + static const char *k2_suff = "o4zn"; + static const char *k3_suff = "o2n"; + char *code_name; + char *function_name; + char **subfunction_name; + + + k1 = (char **) malloc((new_am)*sizeof(char *)); + k2 = (char **) malloc((new_am)*sizeof(char *)); + k3 = (char **) malloc((new_am)*sizeof(char *)); + for(i=1;i<=new_am;i++) { + j = strlen((void *)number[i]); + k1[i-1] = (char*) malloc((4+j)*sizeof(char)); + k2[i-1] = (char*) malloc((5+j)*sizeof(char)); + k3[i-1] = (char*) malloc((4+j)*sizeof(char)); + strcpy(k1[i-1],(void *)number[i]); + strcpy(k2[i-1],(void *)number[i]); + strcpy(k3[i-1],(void *)number[i]); + strcat(k1[i-1],(void *)k1_suff); + strcat(k2[i-1],(void *)k2_suff); + strcat(k3[i-1],(void *)k3_suff); + } + code_name = (char *) malloc(sizeof(char)*21); + function_name = (char *) malloc(sizeof(char)*18); + + for(la=0;la<=new_am;la++) { + lc_min = (la >= old_am + 1) ? 0 : old_am + 1; + lc_max = new_am; + for(lc=lc_min;lc<=lc_max;lc++) { + fprintf(outfile," AM_a = %c AM_c = %c\n",am_letter[la],am_letter[lc]); + am_in[0] = la; + am_in[1] = lc; + if (la == 0) { + dec_C = 1; + k2max = lc - 1; + k3max = lc - 1; + } + else { + dec_C = 0; + k2max = (la-1 > lc) ? la-1 : lc; + k1max = la - 1; + } + + class_size = ((am_in[dec_C]+1)*(am_in[dec_C]+2)*(am_in[dec_C^1]+1)*(am_in[dec_C^1]+2))/4; + + fprintf(vrr_header,"#define _R_BUILD_%c0%c0(Data,vp,i0,i1,i2,i3,i4,i5) {",am_letter[la],am_letter[lc]); + fprintf(outfile," # of integrals in the (%cs|%cs) class - %d\n",am_letter[la],am_letter[lc],class_size); + /* Decide if the routine has to be split into several routines producing "subbatches" */ + if (class_size > max_class_size) { + split = 1; + num_subfunctions = ceil((double)class_size/max_class_size); + subbatch_length = 1 + class_size/num_subfunctions; + fprintf(outfile," Each function for this quartet split into %d sub_functions\n\n",num_subfunctions); + fprintf(vrr_header," tmp = _r_build_%c0%c0_0(Data,vp,i0,i1,i2,i3,i4,i5); \\\n",am_letter[la],am_letter[lc]); + for(f=1;f\n"); + fprintf(code,"#include \"libr12.h\"\n\n"); + + /* These are only used if split == 1 */ + curr_subfunction = 0; + curr_count = 0; + + if (split == 1) { + fprintf(code, + "REALTYPE *%s(prim_data *Data, REALTYPE *vp, const REALTYPE *I0, const REALTYPE *I1, const REALTYPE *I2, const REALTYPE *I3, const REALTYPE *I4, const REALTYPE *I5)\n{\n", + subfunction_name[0]); + } + else + fprintf(code, + "void _%s(prim_data *Data, REALTYPE *vp, const REALTYPE *I0, const REALTYPE *I1, const REALTYPE *I2, const REALTYPE *I3, const REALTYPE *I4, const REALTYPE *I5)\n{\n",function_name); + declare_localv(dec_C,k1max,k2max,k3max,code); + define_localv(dec_C,k1max,k2max,k3max,code); + fprintf(code,"\n"); + + for(i = 0; i <= am_in[0]; i++){ + am[0][0] = am_in[0] - i; + for(j = 0; j <= i; j++){ + am[0][1] = i - j; + am[0][2] = j; + + for(k = 0; k <= am_in[1]; k++){ + am[1][0] = am_in[1] - k; + for(l = 0; l <= k; l++){ + am[1][1] = k - l; + am[1][2] = l; + + if(am[dec_C][2]) xyz = 2; + if(am[dec_C][1]) xyz = 1; + if(am[dec_C][0]) xyz = 0; + + /*----------------------------- + Add (a-10||c0) and (a-10|c0) + -----------------------------*/ + am[dec_C][xyz] = am[dec_C][xyz] - 1; + am_in[dec_C] = am_in[dec_C] - 1; + t2 = hash(am,am_in); + fprintf(code, "*(vp++) = U%d%d*I0[%d] - U1%d*I3[%d]", + dec_C*2, xyz, t2, xyz, t2); + + /*------------ + Add (a0|c0) + ------------*/ + fprintf(code, " + loo2p*I2[%d]", t1); + + /*----------------------------------------- + Add (a-20||c0) and (a-20|c0) if possible + -----------------------------------------*/ + if(am[dec_C][xyz]){ + am[dec_C][xyz] = am[dec_C][xyz] - 1; + am_in[dec_C] = am_in[dec_C] - 1; + t3 = hash(am,am_in); + fprintf(code, "\n + (%s)*I1[%d] - (%s)*I4[%d]", + (dec_C==0 ? k1[am[dec_C][xyz]] : k3[am[dec_C][xyz]]), + t3, (k2[am[dec_C][xyz]]), t3); + am[dec_C][xyz] = am[dec_C][xyz] + 1; + am_in[dec_C] = am_in[dec_C] + 1; + } + + /*---------------------------- + Add (a-10|c-10) if possible + ----------------------------*/ + if(am[dec_C^1][xyz]){ + am[dec_C^1][xyz] = am[dec_C^1][xyz] - 1; + am_in[dec_C^1] = am_in[dec_C^1] - 1; + t4 = hash(am,am_in); + fprintf(code, " - (%s)*I5[%d]", k2[am[dec_C^1][xyz]], t4); + am[dec_C^1][xyz] = am[dec_C^1][xyz] + 1; + am_in[dec_C^1] = am_in[dec_C^1] + 1; + } + fprintf(code, ";\n"); + am[dec_C][xyz] = am[dec_C][xyz] + 1; + am_in[dec_C] = am_in[dec_C] + 1; + + t1++; + curr_count++; + if (split == 1 && curr_count == subbatch_length) { + curr_count = 0; + curr_subfunction++; + fprintf(code,"return vp;\n}\n\n"); + fprintf(code, + "REALTYPE *%s(prim_data *Data, REALTYPE *vp, const REALTYPE *I0, const REALTYPE *I1, const REALTYPE *I2, const REALTYPE *I3, const REALTYPE *I4, const REALTYPE *I5)\n{\n", + subfunction_name[curr_subfunction]); + declare_localv(dec_C,k1max,k2max,k3max,code); + define_localv(dec_C,k1max,k2max,k3max,code); + fprintf(code,"\n"); + } + } + } + } + } + if (split == 1) + fprintf(code,"return vp;\n}\n"); + else + fprintf(code,"\n}\n"); + fclose(code); + if (split == 1) { + for(i=0;ioo2p;\n"); + for(i=0;ioo2z*Data->oo2n;\n",k2[i],(double)(i+1)); + if(dec_C == 0) + for(i=0;ioo2z;\n",k1[i],(double)(i+1)); + else + for(i=0;ioo2n;\n",k3[i],(double)(i+1)); + fprintf(code," U%d0 = Data->U[%d][0];\n", dec_C*2, dec_C*2); + fprintf(code," U%d1 = Data->U[%d][1];\n", dec_C*2, dec_C*2); + fprintf(code," U%d2 = Data->U[%d][2];\n", dec_C*2, dec_C*2); + if (dec_C == 0) { + /* PA_i / 2\eta + QA_i / 2\zeta */ + fprintf(code," U10 = Data->U[0][0]*Data->oo2n + Data->U[1][0]*Data->oo2z;\n"); + fprintf(code," U11 = Data->U[0][1]*Data->oo2n + Data->U[1][1]*Data->oo2z;\n"); + fprintf(code," U12 = Data->U[0][2]*Data->oo2n + Data->U[1][2]*Data->oo2z;\n"); + } + else { + /* QC_i / 2\zeta + PC_i / 2\eta */ + fprintf(code," U10 = Data->U[2][0]*Data->oo2z + Data->U[3][0]*Data->oo2n;\n"); + fprintf(code," U11 = Data->U[2][1]*Data->oo2z + Data->U[3][1]*Data->oo2n;\n"); + fprintf(code," U12 = Data->U[2][2]*Data->oo2z + Data->U[3][2]*Data->oo2n;\n"); + } + + return; +} diff --git a/src/bin/libr12/emit_vrr_t1_build.c b/src/bin/libr12/emit_vrr_t1_build.c new file mode 100644 index 0000000..36f607e --- /dev/null +++ b/src/bin/libr12/emit_vrr_t1_build.c @@ -0,0 +1,252 @@ +#include +#include +#include +#include +#include +#include + +extern FILE *outfile, *vrr_header; +extern Libr12Params_t Params; + +extern void punt(char *); +static void declare_localv(int la, FILE *code); +static void define_localv(int la, FILE *code); + +static char **k1; + +void emit_vrr_t1_build() +{ + int old_am = Params.old_am; + int new_am = Params.opt_am; + int max_class_size = Params.max_class_size; + + FILE *code; + int i, j, k, l, f; + int dec_C; /* Decrease AM on C */ + int xyz; /* Cartesian direction along which to decrease AM */ + int flag; + int am[2][3]; + int am_in[2]; + int nflip = 0; + int t0, t1, t2, t3, t4; + int class_size; + int type; + int max1 = 0; + int max2 = 0; + int la, lc, lc_min, lc_max; + int k1max; + int split,num_subfunctions,subbatch_length; + int curr_count,curr_subfunction; + static const char *k1_suff = "zboz"; + char *code_name; + char *function_name; + char **subfunction_name; + + + k1 = (char **) malloc((new_am)*sizeof(char *)); + for(i=1;i<=new_am;i++) { + j = strlen((void *)number[i]); + k1[i-1] = (char*) malloc((5+j)*sizeof(char)); + strcpy(k1[i-1],(void *)number[i]); + strcat(k1[i-1],(void *)k1_suff); + } + code_name = (char *) malloc(sizeof(char)*21); + function_name = (char *) malloc(sizeof(char)*18); + + for(la=0;la<=new_am;la++) { + lc_min = (la >= old_am + 1) ? 0 : old_am + 1; + if (la == 0 && old_am == 0) + lc_min = 0; + lc_max = new_am; + for(lc=lc_min;lc<=lc_max;lc++) { + am_in[0] = la; + am_in[1] = lc; + + class_size = ((am_in[0]+1)*(am_in[0]+2)*(am_in[1]+1)*(am_in[1]+2))/4; + + fprintf(vrr_header,"#define _T1_BUILD_%c0%c0(Data,ShellData,vp,i0,i1,i2,i3,i4) {",am_letter[la],am_letter[lc]); + fprintf(outfile," # of integrals in the (%cs|%cs) class - %d\n",am_letter[la],am_letter[lc],class_size); + /* Decide if the routine has to be split into several routines producing "subbatches" */ + if (class_size > max_class_size) { + split = 1; + num_subfunctions = ceil((double)class_size/max_class_size); + subbatch_length = 1 + class_size/num_subfunctions; + fprintf(outfile," Each function for this quartet split into %d sub_functions\n\n",num_subfunctions); + fprintf(vrr_header," tmp = _t1_build_%c0%c0_0(Data,ShellData,vp,i0,i1,i2,i3,i4); \\\n",am_letter[la],am_letter[lc]); + for(f=1;f\n"); + fprintf(code,"#include \"libr12.h\"\n\n"); + /* These are only used is split == 1 */ + curr_subfunction = 0; + curr_count = 0; + + if (split == 1) { + fprintf(code,"REALTYPE *%s(prim_data *Data, contr_data *ShellData, REALTYPE *vp, const REALTYPE *I0, const REALTYPE *I1, const REALTYPE *I2, const REALTYPE *I3, const REALTYPE *I4)\n{\n", + subfunction_name[0]); + } + else + fprintf(code,"void _%s(prim_data *Data, contr_data *ShellData, REALTYPE *vp, const REALTYPE *I0, const REALTYPE *I1, const REALTYPE *I2, const REALTYPE *I3, const REALTYPE *I4)\n{\n",function_name); + declare_localv(la,code); + define_localv(la,code); + fprintf(code,"\n"); + + for(i = 0; i <= am_in[0]; i++){ + am[0][0] = am_in[0] - i; + for(j = 0; j <= i; j++){ + am[0][1] = i - j; + am[0][2] = j; + + for(k = 0; k <= am_in[1]; k++){ + am[1][0] = am_in[1] - k; + for(l = 0; l <= k; l++){ + am[1][1] = k - l; + am[1][2] = l; + + /*------------ + Add (a0|c0) + ------------*/ + fprintf(code, "*(vp++) = U0*I0[%d]", t0); + + /*----------------------------- + Add (a+10|c0) and (a0|c+10) + -----------------------------*/ + for(xyz=0;xyz<3;xyz++) { + am[0][xyz] = am[0][xyz] + 1; + am_in[0] = am_in[0] + 1; + t1 = hash(am,am_in); + am[0][xyz] = am[0][xyz] - 1; + am_in[0] = am_in[0] - 1; + + am[1][xyz] = am[1][xyz] + 1; + am_in[1] = am_in[1] + 1; + t2 = hash(am,am_in); + am[1][xyz] = am[1][xyz] - 1; + am_in[1] = am_in[1] - 1; + fprintf(code, "\n - U1%d*(I1[%d] - I2[%d])", + xyz, t1, t2); + } + + /*----------------------------------------- + Add (a-10|c+10) and (a-10|c0) if possible + -----------------------------------------*/ + for(xyz=0;xyz<3;xyz++) { + if(am[0][xyz]){ + am[0][xyz] = am[0][xyz] - 1; + am_in[0] = am_in[0] - 1; + am[1][xyz] = am[1][xyz] + 1; + am_in[1] = am_in[1] + 1; + t3 = hash(am,am_in); + am[1][xyz] = am[1][xyz] - 1; + am_in[1] = am_in[1] - 1; + t4 = hash(am,am_in); + am[0][xyz] = am[0][xyz] + 1; + am_in[0] = am_in[0] + 1; + + fprintf(code, "\n + (%s)*(I3[%d] - AC%d*I4[%d])", + k1[am[0][xyz]-1], t3, xyz, t4); + } + } + fprintf(code,";\n"); + + t0++; + curr_count++; + if (split == 1 && curr_count == subbatch_length) { + curr_count = 0; + curr_subfunction++; + fprintf(code,"return vp;\n}\n\n"); + fprintf(code,"REALTYPE *%s(prim_data *Data, contr_data *ShellData, REALTYPE *vp, const REALTYPE *I0, const REALTYPE *I1, const REALTYPE *I2, const REALTYPE *I3, const REALTYPE *I4)\n{\n", + subfunction_name[curr_subfunction]); + declare_localv(la,code); + define_localv(la,code); + fprintf(code,"\n"); + } + } + } + } + } + if (split == 1) + fprintf(code,"return vp;\n}\n"); + else + fprintf(code,"\n}\n"); + fclose(code); + if (split == 1) { + for(i=0;iAC[0];\n"); + fprintf(code," AC1 = ShellData->AC[1];\n"); + fprintf(code," AC2 = ShellData->AC[2];\n"); + for(i=0;itwozeta_b*Data->oo2z);\n",k1[i],(double)(i+1)); + fprintf(code," U10 = ShellData->AB[0]*(Data->twozeta_a*Data->twozeta_b*Data->oo2z);\n"); + fprintf(code," U11 = ShellData->AB[1]*(Data->twozeta_a*Data->twozeta_b*Data->oo2z);\n"); + fprintf(code," U12 = ShellData->AB[2]*(Data->twozeta_a*Data->twozeta_b*Data->oo2z);\n"); + fprintf(code," U0 = (Data->twozeta_a - Data->twozeta_b*(Data->twozeta_a*ShellData->ABdotAC + %lf))*Data->oo2z;\n",(double)(la+1)); + + return; +} diff --git a/src/bin/libr12/emit_vrr_t2_build.c b/src/bin/libr12/emit_vrr_t2_build.c new file mode 100644 index 0000000..6f0c580 --- /dev/null +++ b/src/bin/libr12/emit_vrr_t2_build.c @@ -0,0 +1,253 @@ +#include +#include +#include +#include +#include +#include + +extern FILE *outfile, *vrr_header; +extern Libr12Params_t Params; + +extern void punt(char *); +static void declare_localv(int lc, FILE *code); +static void define_localv(int lc, FILE *code); + +static char **k1; + +void emit_vrr_t2_build() +{ + int old_am = Params.old_am; + int new_am = Params.opt_am; + int max_class_size = Params.max_class_size; + + FILE *code; + int i, j, k, l, f; + int dec_C; /* Decrease AM on C */ + int xyz; /* Cartesian direction along which to decrease AM */ + int flag; + int am[2][3]; + int am_in[2]; + int nflip = 0; + int t0, t1, t2, t3, t4; + int class_size; + int type; + int max1 = 0; + int max2 = 0; + int la, lc, lc_min, lc_max; + int k1max; + int split,num_subfunctions,subbatch_length; + int curr_count,curr_subfunction; + static const char *k1_suff = "zdon"; + char *code_name; + char *function_name; + char **subfunction_name; + + + k1 = (char **) malloc((new_am)*sizeof(char *)); + for(i=1;i<=new_am;i++) { + j = strlen((void *)number[i]); + k1[i-1] = (char*) malloc((5+j)*sizeof(char)); + strcpy(k1[i-1],(void *)number[i]); + strcat(k1[i-1],(void *)k1_suff); + } + code_name = (char *) malloc(sizeof(char)*21); + function_name = (char *) malloc(sizeof(char)*18); + + for(la=0;la<=new_am;la++) { + lc_min = (la >= old_am + 1) ? 0 : old_am + 1; + if (la == 0 && old_am == 0) + lc_min = 0; + lc_max = new_am; + for(lc=lc_min;lc<=lc_max;lc++) { + am_in[0] = la; + am_in[1] = lc; + + class_size = ((am_in[0]+1)*(am_in[0]+2)*(am_in[1]+1)*(am_in[1]+2))/4; + + fprintf(vrr_header,"#define _T2_BUILD_%c0%c0(Data,ShellData,vp,i0,i1,i2,i3,i4) {",am_letter[la],am_letter[lc]); + fprintf(outfile," # of integrals in the (%cs|%cs) class - %d\n",am_letter[la],am_letter[lc],class_size); + /* Decide if the routine has to be split into several routines producing "subbatches" */ + if (class_size > max_class_size) { + split = 1; + num_subfunctions = ceil((double)class_size/max_class_size); + subbatch_length = 1 + class_size/num_subfunctions; + fprintf(outfile," Each function for this quartet split into %d sub_functions\n\n",num_subfunctions); + fprintf(vrr_header," tmp = _t2_build_%c0%c0_0(Data,ShellData,vp,i0,i1,i2,i3,i4); \\\n",am_letter[la],am_letter[lc]); + for(f=1;f\n"); + fprintf(code,"#include \"libr12.h\"\n\n"); + + /* These are only used if split == 1 */ + curr_subfunction = 0; + curr_count = 0; + + if (split == 1) { + fprintf(code,"REALTYPE *%s(prim_data *Data, contr_data *ShellData, REALTYPE *vp, const REALTYPE *I0, const REALTYPE *I1, const REALTYPE *I2, const REALTYPE *I3, const REALTYPE *I4)\n{\n", + subfunction_name[0]); + } + else + fprintf(code,"void _%s(prim_data *Data, contr_data *ShellData, REALTYPE *vp, const REALTYPE *I0, const REALTYPE *I1, const REALTYPE *I2, const REALTYPE *I3, const REALTYPE *I4)\n{\n",function_name); + declare_localv(lc,code); + define_localv(lc,code); + fprintf(code,"\n"); + + for(i = 0; i <= am_in[0]; i++){ + am[0][0] = am_in[0] - i; + for(j = 0; j <= i; j++){ + am[0][1] = i - j; + am[0][2] = j; + + for(k = 0; k <= am_in[1]; k++){ + am[1][0] = am_in[1] - k; + for(l = 0; l <= k; l++){ + am[1][1] = k - l; + am[1][2] = l; + + /*------------ + Add (a0|c0) + ------------*/ + fprintf(code, "*(vp++) = U0*I0[%d]", t0); + + /*----------------------------- + Add (a0|c+10) and (a+10|c0) + -----------------------------*/ + for(xyz=0;xyz<3;xyz++) { + am[1][xyz] = am[1][xyz] + 1; + am_in[1] = am_in[1] + 1; + t1 = hash(am,am_in); + am[1][xyz] = am[1][xyz] - 1; + am_in[1] = am_in[1] - 1; + + am[0][xyz] = am[0][xyz] + 1; + am_in[0] = am_in[0] + 1; + t2 = hash(am,am_in); + am[0][xyz] = am[0][xyz] - 1; + am_in[0] = am_in[0] - 1; + fprintf(code, "\n - U1%d*(I1[%d] - I2[%d])", + xyz, t1, t2); + } + + /*----------------------------------------- + Add (a+10|c-10) and (a0|c-10) if possible + -----------------------------------------*/ + for(xyz=0;xyz<3;xyz++) { + if(am[1][xyz]){ + am[0][xyz] = am[0][xyz] + 1; + am_in[0] = am_in[0] + 1; + am[1][xyz] = am[1][xyz] - 1; + am_in[1] = am_in[1] - 1; + t3 = hash(am,am_in); + am[0][xyz] = am[0][xyz] - 1; + am_in[0] = am_in[0] - 1; + t4 = hash(am,am_in); + am[1][xyz] = am[1][xyz] + 1; + am_in[1] = am_in[1] + 1; + + fprintf(code, "\n + (%s)*(I3[%d] + AC%d*I4[%d])", + k1[am[1][xyz]-1], t3, xyz, t4); + } + } + fprintf(code,";\n"); + + t0++; + curr_count++; + if (split == 1 && curr_count == subbatch_length) { + curr_count = 0; + curr_subfunction++; + fprintf(code,"return vp;\n}\n\n"); + fprintf(code,"REALTYPE *%s(prim_data *Data, contr_data *ShellData, REALTYPE *vp, const REALTYPE *I0, const REALTYPE *I1, const REALTYPE *I2, const REALTYPE *I3, const REALTYPE *I4)\n{\n", + subfunction_name[curr_subfunction]); + declare_localv(lc,code); + define_localv(lc,code); + fprintf(code,"\n"); + } + } + } + } + } + if (split == 1) + fprintf(code,"return vp;\n}\n"); + else + fprintf(code,"\n}\n"); + fclose(code); + if (split == 1) { + for(i=0;iAC[0];\n"); + fprintf(code," AC1 = ShellData->AC[1];\n"); + fprintf(code," AC2 = ShellData->AC[2];\n"); + for(i=0;itwozeta_d*Data->oo2n);\n",k1[i],(double)(i+1)); + fprintf(code," U10 = ShellData->CD[0]*(Data->twozeta_c*Data->twozeta_d*Data->oo2n);\n"); + fprintf(code," U11 = ShellData->CD[1]*(Data->twozeta_c*Data->twozeta_d*Data->oo2n);\n"); + fprintf(code," U12 = ShellData->CD[2]*(Data->twozeta_c*Data->twozeta_d*Data->oo2n);\n"); + fprintf(code," U0 = (Data->twozeta_c - Data->twozeta_d*(Data->twozeta_c*ShellData->CDdotCA + %lf))*Data->oo2n;\n",(double)(lc+1)); + + return; +} diff --git a/src/bin/libr12/mem_man.c b/src/bin/libr12/mem_man.c new file mode 100644 index 0000000..5f32db0 --- /dev/null +++ b/src/bin/libr12/mem_man.c @@ -0,0 +1,149 @@ +#include +#include +#include +#include +#define MAXALLOC 10000 + +int free_block[MAXALLOC]; /* Marks of free-occupied blocks */ +int block_length[MAXALLOC]; /* Keeps sizes of all blocks */ +int last_free; /* Number of the last free block */ +int max_mem; /* Amount of memory used by classes up to this point */ +int mem_top; /* Total memory allocated up to this point */ + +/* initialize memory stack */ +void init_mem(int memory) +{ + last_free = 1; + memset(free_block,0,MAXALLOC*sizeof(int)); /* All blocks are free */ + memset(block_length,0,MAXALLOC*sizeof(int)); /* All of them are zero in length ... */ + block_length[0] = memory; /* except for the first one */ + max_mem = 0; + mem_top = memory; +} + +/* add memory */ +void add_mem(int memory) +{ + int i; + int addto = 0; + int himem = 0; + + mem_top += memory; + /* Find the last free block and add all this memory to it */ + for(i=0; i himem){ + himem = free_block[i]; + addto = i; + } + } +#if 0 + printf("adding %d to memory\n\tnew top = %d\n", memory, + free_block[addto]+block_length[addto]+memory); +#endif + block_length[addto] = block_length[addto]+memory; +} + +/* Find a block of the requested size */ +int get_mem(int size) +{ + int i, j; + +/* try to find one that fits exactly */ + for(i=last_free-1; i>=0; i--){ + if(block_length[i] == size){ + j = free_block[i]; + if(free_block[i]+block_length[i]==mem_top) add_mem(500); + use(i, size); + return j; + } + } + +/* ok, try to find a bigger one that will work */ + for(i=last_free-1; i>=0; i--){ + if(block_length[i] > size){ + j = free_block[i]; + use(i, size); + return j; + } + } + + +/* last resort, expand memory */ + add_mem(1000); + return get_mem(size); + +} + + +void use(int n, int s) +{ + int i; +#if 0 + printf("issuing %d doubles starting at %d out of free block %d\n", + s, free_block[n], n); + printf("last_free = %d\n", last_free); +#endif + if(s==block_length[n]){ + for(i=n; imax_mem) max_mem = free_block[n]; + } + else exit(1); + +} + +void free_mem(int n, int size) +{ + int i, j; + + free_block[last_free] = n; + block_length[last_free] = size; + last_free++; + + consolidate(); + +} + +void consolidate() +{ + int i, j; + int right_bound_i; + int done = 1; + + do { + done = 1; + for(i=0; i $@ + date >> $@ + +make_libsrcdir: + if test -f "$@"; then \ +$(MAKE) rm_libsrcdir; \ +fi; \ +$(INSTALL) $(INSTALLDIROPT) $(LIBSRCDIR) || exit 1; \ +$(LN_S) $(LIBSRCDIR) $(LIBSRCLINK) || exit 1; \ + echo "Last time the library source directory was created:\c" > $@ + date >> $@ + +$(LIBSRCDIR)/Makefile: make_libsrcdir $(SRCDIR)/Makefile.library + cp -f $(SRCDIR)/Makefile.library $@ + +$(LIBSRCDIR)/$(NAME).h: $(TOPOBJDIR)/src/bin/$(NAME)/$(COMPILER) $(LIBSRCDIR)/Makefile + cd $(LIBSRCLINK); $(TOPOBJDIR)/src/bin/$(NAME)/$(COMPILER) + diff --git a/src/lib/MakeVars.in b/src/lib/MakeVars.in new file mode 100644 index 0000000..4ea76b7 --- /dev/null +++ b/src/lib/MakeVars.in @@ -0,0 +1,112 @@ +# Emacs should use -*- Makefile -*- mode. + +# this is usually overridden +TARGET_TO_MAKE = $(shell basename `pwd`) + +ifndef SRCDIR + SRCDIR = . +endif +SRCTOPDIR = $(SRCDIR)/$(TO_TOPDIR) + +host = @host@ +host_cpu = @host_cpu@ +host_vendor = @host_vendor@ +host_os = @host_os@ + +target = @target@ +target_cpu = @target_cpu@ +target_vendor = @target_vendor@ +target_os = @target_os@ + +LIBINT_VERSION = @LIBINT_VERSION@ +LIBINT_SO_VERSION = @LIBINT_SO_VERSION@ +BUILDID = @BUILDID@ + +# The scratch directory +SCRATCHDIR = @SCRATCHDIR@ +LIBSRCDIR = $(SCRATCHDIR)/$(NAME) +LIBSRCLINK = src + +# The object code suffix +OBJSUF = @OBJSUF@ + +# The library suffix +LIBSUF = @LIBSUF@ + +ENABLESHARED = @ENABLESHARED@ + +ifeq ($(ENABLESHARED),yes) + LIBTOOL = $(SHELL) $(TOPDIR)/libtool + LTLINK = $(LIBTOOL) --mode=link + ifneq ($(BUILDID),) + LTLINKLIBOPTS = -rpath $(libdir) -release $(BUILDID) -version-info $(LIBINT_SO_VERSION) + else + LTLINKLIBOPTS = -rpath $(libdir) -version-info $(LIBINT_SO_VERSION) + endif + LTLINKBINOPTS = + LTCOMP = $(LIBTOOL) --mode=compile + LTINST = $(LIBTOOL) --mode=install + +else + LIBTOOL= + LTLINK = + LTLINKLIBOPTS = + LTLINKBINOPTS = + LTCOMP = + LTINST = +endif + +# The suffix generated by the -M compiler option +CCDEPENDSUF = @CCDEPENDSUF@ +CXXDEPENDSUF = @CXXDEPENDSUF@ +CCDEPENDFLAGS = @CCDEPENDFLAGS@ +CXXDEPENDFLAGS = @CXXDEPENDFLAGS@ + +CC = @CC@ +CXX = @CXX@ + +CCDEPEND = @CC@ +CXXDEPEND = @CXX@ + +AR = @AR@ +ARFLAGS = @ARFLAGS@ + +LD = $(CXX) +LDFLAGS = @LDFLAGS@ + +INSTALL = @INSTALL@ +INSTALLDIROPT = -d -m 0755 +INSTALLLIBOPT = -m 0644 +INSTALLBINOPT = -m 0755 +INSTALLSCRIPTOPT = -m 0755 + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +bindir=@bindir@ +libdir=@libdir@ +includedir=@libintincludedir@ + +RANLIB = @RANLIB@ +COMPRESS = gzip +UNCOMPRESS = gzip -d +LN_S = @LN_S@ + +# first check for generated include files in the machine dependent directories +# and then for include files in the src directory +INCLUDE = -I$(TOPDIR)/src/bin -I$(TOPDIR)/include -I$(SRCTOPDIR)/include -I$(SRCTOPDIR)/src/bin \ + @CPPFLAGS@ +DEFINES = @DEFS@ @EXTRADEFINES@ + +CPPFLAGS = $(DEFINES) $(INCLUDE) + +CFLAGS = @CFLAGS@ +HIGHOPT_CFLAGS = $(CFLAGS) +NOALIAS_CFLAGS = + +CXXFLAGS = @CXXFLAGS@ +HIGHOPT_CXXFLAGS = $(CXXFLAGS) +NOALIAS_CXXFLAGS = $(NOALIAS_CFLAGS) + +SYSLIBS = @LIBS@ + +TARGET_HEADERS = $(HEADERS:%=$(top_objdir)/include/libint/%) diff --git a/src/lib/Makefile b/src/lib/Makefile new file mode 100644 index 0000000..72e84f8 --- /dev/null +++ b/src/lib/Makefile @@ -0,0 +1,80 @@ +TOPDIR=../.. +ifndef SRCDIR + SRCDIR=$(shell pwd) +endif + +-include $(TOPDIR)/Makedirlist + +SUBDIRS = libint +ifeq ($(HAVE_LIBINT_SRC_BIN_LIBR12),yes) +SUBDIRS := $(SUBDIRS) libr12 +endif +ifeq ($(HAVE_LIBINT_SRC_BIN_LIBDERIV),yes) +SUBDIRS := $(SUBDIRS) libderiv +endif + +default:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(JOBS)) || exit 1; \ + done + +ifndef DODEPEND +DODEPENDOPT = "DODEPEND=no" +endif + +install:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) install) || exit 1; \ + done + +install_inc:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) install_inc) || exit 1; \ + done + +install_target:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) install_target) || exit 1; \ + done + +uninstall:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) uninstall) || exit 1; \ + done + +clean:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) clean) || exit 1; \ + done + +oclean:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) oclean) || exit 1; \ + done + +distclean:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) distclean) || exit 1; \ + done + -rm -rf MakeRules MakeSuffixRules MakeVars + +targetclean:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) targetclean) || exit 1; \ + done + +realclean:: + for dir in $(SUBDIRS); \ + do \ + (cd $${dir} && $(MAKE) $(DODEPENDOPT) realclean) || exit 1; \ + done + diff --git a/src/lib/libderiv/Makefile b/src/lib/libderiv/Makefile new file mode 100644 index 0000000..d5f86da --- /dev/null +++ b/src/lib/libderiv/Makefile @@ -0,0 +1,17 @@ +TOPDIR=../../.. +TO_TOPDIR=$(TOPDIR) +ifndef SRCDIR + SRCDIR=$(shell pwd) +endif +TOPOBJDIR = $(shell ls -d `pwd`/$(TOPDIR)) + +NAME = libderiv +TARGET = $(NAME).$(LIBSUF) +COMPILER = build_$(NAME) +INC = libderiv.h + +-include $(TOPDIR)/src/lib/MakeVars +-include $(TOPDIR)/src/lib/MakeRules +include $(SRCDIR)/$(TOPDIR)/lib/MakeRules +include $(SRCDIR)/$(TOPDIR)/lib/MakeSuffixRules + diff --git a/src/lib/libderiv/Makefile.library b/src/lib/libderiv/Makefile.library new file mode 100644 index 0000000..ee152ef --- /dev/null +++ b/src/lib/libderiv/Makefile.library @@ -0,0 +1,51 @@ +include $(TOPDIR)/src/lib/MakeVars +include $(SRCDIR)/$(TO_TOPDIR)/lib/MakeSuffixRules +VPATH = $(SRCDIR) + +NAME = libderiv +TARGET = $(NAME).$(LIBSUF) +TARGET_HEADERS = libderiv.h + +# +# List all generated routines. Do it in a safe way in case the list is too long +# +TRUESRC1 = $(shell echo `ls *.cc`) +LIBOBJ1 = $(TRUESRC1:%.cc=%.$(OBJSUF)) +LIBOBJ = $(LIBOBJ1) + +default:: $(TOPDIR)/lib/$(TARGET) $(TOPDIR)/include/$(NAME)/$(NAME).h + +# this is how static library is made +$(TOPDIR)/lib/$(NAME).a: $(LIBOBJ) + /bin/rm -f $@ + $(AR) $(ARFLAGS) $@ $(LIBOBJ1) + $(RANLIB) $@ + +# this is how shared library is made +$(TOPDIR)/lib/$(NAME).la: $(LIBOBJ) + $(LTLINK) $(CXX) -o $@ $^ $(LTLINKLIBOPTS) + +$(TOPDIR)/include/$(NAME)/$(NAME).h: $(NAME).h + $(INSTALL) $(INSTALLDIROPT) $(TOPDIR)/include/$(NAME) + -$(INSTALL) $(INSTALLLIBOPT) $(TARGET_HEADERS) $(TOPDIR)/include/$(NAME) + +install:: install_inc install_target + +install_inc:: + $(INSTALL) $(INSTALLDIROPT) $(includedir) + -$(INSTALL) $(INSTALLLIBOPT) $(TARGET_HEADERS) $(includedir) + +install_target:: $(TOPDIR)/lib/$(TARGET) + $(INSTALL) $(INSTALLDIROPT) $(libdir) + $(INSTALL) $(INSTALLLIBOPT) $< $(libdir) + +clean:: oclean targetclean + +distclean:: clean + +oclean:: + -rm -rf *.$(OBJSUF) + +targetclean:: + -rm -f $(TOPDIR)/lib/$(TARGET) + diff --git a/src/lib/libint/Makefile b/src/lib/libint/Makefile new file mode 100644 index 0000000..e765d7e --- /dev/null +++ b/src/lib/libint/Makefile @@ -0,0 +1,16 @@ +TOPDIR=../../.. +TO_TOPDIR=$(TOPDIR) +ifndef SRCDIR + SRCDIR=$(shell pwd) +endif +TOPOBJDIR = $(shell ls -d `pwd`/$(TOPDIR)) + +NAME = libint +TARGET = $(NAME).$(LIBSUF) +COMPILER = build_$(NAME) +INC = libint.h vrr_header.h hrr_header.h + +-include $(TOPDIR)/src/lib/MakeVars +-include $(TOPDIR)/src/lib/MakeRules +include $(SRCDIR)/$(TOPDIR)/lib/MakeRules +include $(SRCDIR)/$(TOPDIR)/lib/MakeSuffixRules diff --git a/src/lib/libint/Makefile.library b/src/lib/libint/Makefile.library new file mode 100644 index 0000000..23e2918 --- /dev/null +++ b/src/lib/libint/Makefile.library @@ -0,0 +1,69 @@ +include $(TOPDIR)/src/lib/MakeVars +include $(SRCDIR)/$(TO_TOPDIR)/lib/MakeSuffixRules +VPATH = $(SRCDIR) + +NAME = libint +TARGET = $(NAME).$(LIBSUF) +TARGET_HEADERS = libint.h vrr_header.h hrr_header.h + +# vrr_build.c needs to find libint.h +INCLUDE += -I. + +# +# List all generated routines. Do it in a safe way in case the list is too long +# +TRUESRC1 = $(shell echo `ls vrr_order_*.cc`) +TRUESRC2 = $(shell echo `ls hrr_order_*.cc`) +TRUESRC3 = $(shell echo `ls build_*.cc`) +TRUESRC4 = $(shell echo `ls hrr[1,3]_build_*.cc`) +TRUESRC5 = vrr_build.c +TRUESRC6 = init_libint.cc +LIBOBJ1 = $(TRUESRC1:%.cc=%.$(OBJSUF)) +LIBOBJ2 = $(TRUESRC2:%.cc=%.$(OBJSUF)) +LIBOBJ3 = $(TRUESRC3:%.cc=%.$(OBJSUF)) +LIBOBJ4 = $(TRUESRC4:%.cc=%.$(OBJSUF)) +LIBOBJ5 = $(TRUESRC5:%.c=%.$(OBJSUF)) +LIBOBJ6 = $(TRUESRC6:%.cc=%.$(OBJSUF)) +LIBOBJ = $(LIBOBJ1) $(LIBOBJ2) $(LIBOBJ3) $(LIBOBJ4) $(LIBOBJ5) $(LIBOBJ6) + +default:: $(TOPDIR)/lib/$(TARGET) $(TOPDIR)/include/$(NAME)/$(NAME).h + +# this is how static library is made +$(TOPDIR)/lib/$(NAME).a: $(LIBOBJ) + /bin/rm -f $@ + $(AR) $(ARFLAGS) $@ $(LIBOBJ1) + $(AR) $(ARFLAGS) $@ $(LIBOBJ2) + $(AR) $(ARFLAGS) $@ $(LIBOBJ3) + $(AR) $(ARFLAGS) $@ $(LIBOBJ4) + $(AR) $(ARFLAGS) $@ $(LIBOBJ5) + $(AR) $(ARFLAGS) $@ $(LIBOBJ6) + $(RANLIB) $@ + +# this is how shared library is made +$(TOPDIR)/lib/$(NAME).la: $(LIBOBJ) + $(LTLINK) $(CXX) -o $@ $^ $(LTLINKLIBOPTS) + +$(TOPDIR)/include/$(NAME)/$(NAME).h: $(NAME).h + $(INSTALL) $(INSTALLDIROPT) $(TOPDIR)/include/$(NAME) + -$(INSTALL) $(INSTALLLIBOPT) $(TARGET_HEADERS) $(TOPDIR)/include/$(NAME) + +install:: install_inc install_target + +install_inc:: + $(INSTALL) $(INSTALLDIROPT) $(includedir) + -$(INSTALL) $(INSTALLLIBOPT) $(TARGET_HEADERS) $(includedir) + +install_target:: $(TOPDIR)/lib/$(TARGET) + $(INSTALL) $(INSTALLDIROPT) $(libdir) + $(INSTALL) $(INSTALLLIBOPT) $< $(libdir) + +clean:: oclean targetclean + +distclean:: clean + +oclean:: + -rm -rf *.$(OBJSUF) + +targetclean:: + -rm -f $(TOPDIR)/lib/$(TARGET) + diff --git a/src/lib/libint/vrr_build.c b/src/lib/libint/vrr_build.c new file mode 100644 index 0000000..49a11f8 --- /dev/null +++ b/src/lib/libint/vrr_build.c @@ -0,0 +1,138 @@ +#include +#include +#include +#include + +extern void punt(char *); +static int hash(int a[2][3], int b[2]); + +REALTYPE *vrr_build_xxxx(int am_in[2], prim_data *Data, REALTYPE *vp, const REALTYPE *i0, const REALTYPE *i1, const REALTYPE *i2, + const REALTYPE *i3, const REALTYPE *i4) +{ + int i, j, k, l; + int a; + int flag = 0; + int am[2][3]; + int t1, t2, t3, t4, t2max; + int xyz; + int la, lc; + REALTYPE PA[3], WP[3], loo2zn, loo2z, lpoz, eri; + static int io[] = {0,1,3,6,10,15,21,28,36,45,55,66,78,91,105,120,136,153,171,190,210,231,253,276,300,325,351,378,406,435,465}; + + la = am_in[0]; + lc = am_in[1]; + loo2zn = Data->oo2zn; + if (la == 0) { /*--- Decrement on C ---*/ + a = 1; + t2max = io[lc]; + PA[0] = Data->U[2][0]; + PA[1] = Data->U[2][1]; + PA[2] = Data->U[2][2]; + WP[0] = Data->U[5][0]; + WP[1] = Data->U[5][1]; + WP[2] = Data->U[5][2]; + loo2z = Data->oo2n; + lpoz = Data->pon; + } + else { /*--- Decrement on A ---*/ + a = 0; + t2max = io[la]*io[lc+1]; + PA[0] = Data->U[0][0]; + PA[1] = Data->U[0][1]; + PA[2] = Data->U[0][2]; + WP[0] = Data->U[4][0]; + WP[1] = Data->U[4][1]; + WP[2] = Data->U[4][2]; + loo2z = Data->oo2z; + lpoz = Data->poz; + } + + /*target + |I0[],I1[] + | |I2[],I3[] + | | | I4[] + | | | | */ + t2 = t3 = t4 = 0; + + for(i = 0; i <= la; i++){ + am[0][0] = la - i; + for(j = 0; j <= i; j++){ + am[0][1] = i - j; + am[0][2] = j; + + for(k = 0; k <= lc; k++){ + am[1][0] = lc - k; + for(l = 0; l <= k; l++){ + am[1][1] = k - l; + am[1][2] = l; + + if(am[a][2]) xyz = 2; + if(am[a][1]) xyz = 1; + if(am[a][0]) xyz = 0; + + if (t2 == t2max) { + /*--- reset indices (read Justin Fermann's thesis, pp 36-41 ---*/ + /*--- (a-1,0|c0) ---*/ + am[a][xyz] = am[a][xyz] - 1; + am_in[a] = am_in[a] - 1; + t2 = hash(am,am_in); + + /*--- (a-2,0|c0) ---*/ + if (am_in[a]) { + am[a][xyz] = am[a][xyz] - 1; + am_in[a] = am_in[a] - 1; + t3 = hash(am,am_in); + am[a][xyz] = am[a][xyz] + 1; + am_in[a] = am_in[a] + 1; + } + + /*--- (a-1,0|c-1,0) ---*/ + if (am_in[a^1]) { + am[a^1][0] = am[a^1][0] - 1; + am_in[a^1] = am_in[a^1] - 1; + t4 = hash(am,am_in); + am[a^1][0] = am[a^1][0] + 1; + am_in[a^1] = am_in[a^1] + 1; + } + + am[a][xyz] = am[a][xyz] + 1; + am_in[a] = am_in[a] + 1; + } + eri = PA[xyz]*i0[t2] + WP[xyz]*i1[t2]; + t2++; + if(am[a][xyz] > 1){ + eri += (am[a][xyz]-1)*loo2z*(i2[t3] - lpoz*i3[t3]); + t3++; + } + if(am[a^1][xyz] > 0){ + eri += am[a^1][xyz]*loo2zn*i4[t4]; + t4++; + } + *vp = eri; + vp++; + } + } + } + } + + return vp; +} + + +int hash(int a[2][3], int b[2]) +{ + int c[2] = {0,0}; + int i; + static int io[] = {0,1,3,6,10,15,21,28,36,45,55,66,78,91,105,120,136,153,171,190,210,231,253,276,300,325,351,378,406,435,465}; + + if(b[0]){ + i=b[0]-a[0][0]; + c[0]=i+io[i]-a[0][1]; + } + if(b[1]){ + i=b[1]-a[1][0]; + c[1]=i+io[i]-a[1][1]; + } + + return c[0]*io[b[1]+1]+c[1]; +} diff --git a/src/lib/libr12/Makefile b/src/lib/libr12/Makefile new file mode 100644 index 0000000..1608c6b --- /dev/null +++ b/src/lib/libr12/Makefile @@ -0,0 +1,17 @@ +TOPDIR=../../.. +TO_TOPDIR=$(TOPDIR) +ifndef SRCDIR + SRCDIR=$(shell pwd) +endif +TOPOBJDIR = $(shell ls -d `pwd`/$(TOPDIR)) + +NAME = libr12 +TARGET = $(NAME).$(LIBSUF) +COMPILER = build_$(NAME) +INC = libr12.h + +-include $(TOPDIR)/src/lib/MakeVars +-include $(TOPDIR)/src/lib/MakeRules +include $(SRCDIR)/$(TOPDIR)/lib/MakeRules +include $(SRCDIR)/$(TOPDIR)/lib/MakeSuffixRules + diff --git a/src/lib/libr12/Makefile.library b/src/lib/libr12/Makefile.library new file mode 100644 index 0000000..1510807 --- /dev/null +++ b/src/lib/libr12/Makefile.library @@ -0,0 +1,75 @@ +include $(TOPDIR)/src/lib/MakeVars +include $(SRCDIR)/$(TO_TOPDIR)/lib/MakeSuffixRules +VPATH = $(SRCDIR) + +NAME = libr12 +TARGET = $(NAME).$(LIBSUF) +TARGET_HEADERS = libr12.h + +# _vrr_build.c need to find libr12.h +INCLUDE += -I. + +# +# List all generated routines. Do it in a safe way in case the list is too long +# +TRUESRC1 = $(shell echo `ls vrr_grt_order_*.cc`) +TRUESRC2 = $(shell echo `ls hrr_grt_order_*.cc`) +TRUESRC3 = $(shell echo `ls r_build_*.cc`) +TRUESRC4 = $(shell echo `ls t1_build_*.cc`) +TRUESRC5 = $(shell echo `ls t2_build_*.cc`) +TRUESRC6 = $(shell echo `ls t1hrr1_build_*.cc`) +TRUESRC7 = $(shell echo `ls t2hrr3_build_*.cc`) +TRUESRC8 = init_libr12.c r_vrr_build.c t1_vrr_build.c t2_vrr_build.c +LIBOBJ1 = $(TRUESRC1:%.cc=%.$(OBJSUF)) +LIBOBJ2 = $(TRUESRC2:%.cc=%.$(OBJSUF)) +LIBOBJ3 = $(TRUESRC3:%.cc=%.$(OBJSUF)) +LIBOBJ4 = $(TRUESRC4:%.cc=%.$(OBJSUF)) +LIBOBJ5 = $(TRUESRC5:%.cc=%.$(OBJSUF)) +LIBOBJ6 = $(TRUESRC6:%.cc=%.$(OBJSUF)) +LIBOBJ7 = $(TRUESRC7:%.cc=%.$(OBJSUF)) +LIBOBJ8 = $(TRUESRC8:%.c=%.$(OBJSUF)) +LIBOBJ = $(LIBOBJ1) $(LIBOBJ2) $(LIBOBJ3) $(LIBOBJ4) $(LIBOBJ5) $(LIBOBJ6) $(LIBOBJ7) $(LIBOBJ8) + +default:: $(TOPDIR)/lib/$(TARGET) $(TOPDIR)/include/$(NAME)/$(NAME).h + +# this is how static library is made +$(TOPDIR)/lib/$(NAME).a: $(LIBOBJ) + /bin/rm -f $@ + $(AR) $(ARFLAGS) $@ $(LIBOBJ1) + $(AR) $(ARFLAGS) $@ $(LIBOBJ2) + $(AR) $(ARFLAGS) $@ $(LIBOBJ3) + $(AR) $(ARFLAGS) $@ $(LIBOBJ4) + $(AR) $(ARFLAGS) $@ $(LIBOBJ5) + $(AR) $(ARFLAGS) $@ $(LIBOBJ6) + $(AR) $(ARFLAGS) $@ $(LIBOBJ7) + $(AR) $(ARFLAGS) $@ $(LIBOBJ8) + $(RANLIB) $@ + +# this is how shared library is made +$(TOPDIR)/lib/$(NAME).la: $(LIBOBJ) + $(LTLINK) $(CXX) -o $@ $^ $(LTLINKLIBOPTS) + +$(TOPDIR)/include/$(NAME)/$(NAME).h: $(NAME).h + $(INSTALL) $(INSTALLDIROPT) $(TOPDIR)/include/$(NAME) + -$(INSTALL) $(INSTALLLIBOPT) $(TARGET_HEADERS) $(TOPDIR)/include/$(NAME) + +install:: install_inc install_target + +install_inc:: + $(INSTALL) $(INSTALLDIROPT) $(includedir) + -$(INSTALL) $(INSTALLLIBOPT) $(TARGET_HEADERS) $(includedir) + +install_target:: $(TOPDIR)/lib/$(TARGET) + $(INSTALL) $(INSTALLDIROPT) $(libdir) + $(INSTALL) $(INSTALLLIBOPT) $< $(libdir) + +clean:: oclean targetclean + +distclean:: clean + +oclean:: + -rm -rf *.$(OBJSUF) + +targetclean:: + -rm -f $(TOPDIR)/lib/$(TARGET) + diff --git a/src/lib/libr12/r_vrr_build.c b/src/lib/libr12/r_vrr_build.c new file mode 100644 index 0000000..3f332b0 --- /dev/null +++ b/src/lib/libr12/r_vrr_build.c @@ -0,0 +1,136 @@ +#include +#include +#include +#include +#include "libr12.h" + +extern void punt(char *); +static int hash(int a[2][3], int b[2]); + +REALTYPE *r_vrr_build_xxxx(int am_in[2], prim_data *Data, REALTYPE *vp, const REALTYPE *i0, const REALTYPE *i1, REALTYPE *i2, + const REALTYPE *i3, const REALTYPE *i4, const REALTYPE *i5) +{ + int i, j, k, l; + int a; + int flag = 0; + int am[2][3]; + int t1, t2, t3, t4, t2max; + int xyz; + int la, lc; + REALTYPE PA[3], U1[3], loo4zn, loo2z, loo2p, r12int; + static int io[] = {0,1,3,6,10,15,21,28,36,45,55,66,78,91,105,120,136,153,171,190,210,231,253,276,300,325,351,378,406,435,465}; + + la = am_in[0]; + lc = am_in[1]; + loo4zn = Data->oo2z*Data->oo2n; + loo2p = Data->oo2p; + if (la == 0) { /*--- Decrement on C ---*/ + a = 1; + t2max = io[lc]; + PA[0] = Data->U[2][0]; + PA[1] = Data->U[2][1]; + PA[2] = Data->U[2][2]; + U1[0] = Data->U[2][0]*Data->oo2z + Data->U[3][0]*Data->oo2n; + U1[1] = Data->U[2][1]*Data->oo2z + Data->U[3][1]*Data->oo2n; + U1[2] = Data->U[2][2]*Data->oo2z + Data->U[3][2]*Data->oo2n; + loo2z = Data->oo2n; + } + else { /*--- Decrement on A ---*/ + a = 0; + t2max = io[la]*io[lc+1]; + PA[0] = Data->U[0][0]; + PA[1] = Data->U[0][1]; + PA[2] = Data->U[0][2]; + U1[0] = Data->U[0][0]*Data->oo2n + Data->U[1][0]*Data->oo2z; + U1[1] = Data->U[0][1]*Data->oo2n + Data->U[1][1]*Data->oo2z; + U1[2] = Data->U[0][2]*Data->oo2n + Data->U[1][2]*Data->oo2z; + loo2z = Data->oo2z; + } + + t2 = t3 = t4 = 0; + + for(i = 0; i <= la; i++){ + am[0][0] = la - i; + for(j = 0; j <= i; j++){ + am[0][1] = i - j; + am[0][2] = j; + + for(k = 0; k <= lc; k++){ + am[1][0] = lc - k; + for(l = 0; l <= k; l++){ + am[1][1] = k - l; + am[1][2] = l; + + if(am[a][2]) xyz = 2; + if(am[a][1]) xyz = 1; + if(am[a][0]) xyz = 0; + + if (t2 == t2max) { + /*--- reset indices (read Justin Fermann's thesis, pp 36-41 ---*/ + /*--- (a-1,0|c0) ---*/ + am[a][xyz] = am[a][xyz] - 1; + am_in[a] = am_in[a] - 1; + t2 = hash(am,am_in); + + /*--- (a-2,0|c0) ---*/ + if (am_in[a]) { + am[a][xyz] = am[a][xyz] - 1; + am_in[a] = am_in[a] - 1; + t3 = hash(am,am_in); + am[a][xyz] = am[a][xyz] + 1; + am_in[a] = am_in[a] + 1; + } + + /*--- (a-1,0|c-1,0) ---*/ + if (am_in[a^1]) { + am[a^1][0] = am[a^1][0] - 1; + am_in[a^1] = am_in[a^1] - 1; + t4 = hash(am,am_in); + am[a^1][0] = am[a^1][0] + 1; + am_in[a^1] = am_in[a^1] + 1; + } + + am[a][xyz] = am[a][xyz] + 1; + am_in[a] = am_in[a] + 1; + } + r12int = PA[xyz]*i0[t2] - U1[xyz]*i3[t2] + loo2p*(*i2); + t2++; + if(am[a][xyz] > 1){ + r12int += (am[a][xyz]-1)*(loo2z*i1[t3] - loo4zn*i4[t3]); + t3++; + } + if(am[a^1][xyz] > 0){ + r12int -= am[a^1][xyz]*loo4zn*i5[t4]; + t4++; + } + *vp = r12int; + vp++; + i2++; + } + } + } + } + + return vp; +} + + +int hash(a, b) + int a[2][3]; + int b[2]; +{ + int c[2] = {0,0}; + int i; + static int io[] = {0,1,3,6,10,15,21,28,36,45,55,66,78,91,105,120,136,153,171,190,210,231,253,276,300,325,351,378,406,435,465}; + + if(b[0]){ + i=b[0]-a[0][0]; + c[0]=i+io[i]-a[0][1]; + } + if(b[1]){ + i=b[1]-a[1][0]; + c[1]=i+io[i]-a[1][1]; + } + + return c[0]*io[b[1]+1]+c[1]; +} diff --git a/src/lib/libr12/t1_vrr_build.c b/src/lib/libr12/t1_vrr_build.c new file mode 100644 index 0000000..34b4c33 --- /dev/null +++ b/src/lib/libr12/t1_vrr_build.c @@ -0,0 +1,111 @@ +#include +#include +#include +#include +#include "libr12.h" + +extern void punt(char *); +static int hash(int a[2][3], int b[2]); + +REALTYPE *t1_vrr_build_xxxx(int am_in[2], prim_data *Data, contr_data *ShellData, REALTYPE *vp, REALTYPE *i0, + const REALTYPE *i1, const REALTYPE *i2, const REALTYPE *i3, const REALTYPE *i4) +{ + int i, j, k, l; + int am[2][3]; + int t1, t2, t3, t4; + int xyz; + int la, lc; + REALTYPE AC[3], U1[3], U0, lzboz, r12t1int; + + la = am_in[0]; + lc = am_in[1]; + lzboz = Data->twozeta_b*Data->oo2z; + U0 = (Data->twozeta_a - Data->twozeta_b*(Data->twozeta_a*ShellData->ABdotAC + la + 1))*Data->oo2z; + AC[0] = ShellData->AC[0]; + AC[1] = ShellData->AC[1]; + AC[2] = ShellData->AC[2]; + U1[0] = ShellData->AB[0]*(Data->twozeta_a*Data->twozeta_b*Data->oo2z); + U1[1] = ShellData->AB[1]*(Data->twozeta_a*Data->twozeta_b*Data->oo2z); + U1[2] = ShellData->AB[2]*(Data->twozeta_a*Data->twozeta_b*Data->oo2z); + + t1 = t2 = t3 = t4 = 0; + + for(i = 0; i <= la; i++){ + am[0][0] = la - i; + for(j = 0; j <= i; j++){ + am[0][1] = i - j; + am[0][2] = j; + + for(k = 0; k <= lc; k++){ + am[1][0] = lc - k; + for(l = 0; l <= k; l++){ + am[1][1] = k - l; + am[1][2] = l; + + /*--- (a0|c0) ---*/ + r12t1int = U0*(*i0); + + /*--- add (a+1,0|c0) and (a0|c+1,0) ---*/ + for(xyz=0;xyz<3;xyz++) { + am[0][xyz] = am[0][xyz] + 1; + am_in[0] = am_in[0] + 1; + t1 = hash(am,am_in); + am[0][xyz] = am[0][xyz] - 1; + am_in[0] = am_in[0] - 1; + + am[1][xyz] = am[1][xyz] + 1; + am_in[1] = am_in[1] + 1; + t2 = hash(am,am_in); + am[1][xyz] = am[1][xyz] - 1; + am_in[1] = am_in[1] - 1; + r12t1int -= U1[xyz]*(i1[t1]-i2[t2]); + } + + /*--- (a-1,0|c+1,0) and (a-1,0|c0) if possible ---*/ + for(xyz=0;xyz<3;xyz++) { + if(am[0][xyz]){ + am[0][xyz] = am[0][xyz] - 1; + am_in[0] = am_in[0] - 1; + am[1][xyz] = am[1][xyz] + 1; + am_in[1] = am_in[1] + 1; + t3 = hash(am,am_in); + am[1][xyz] = am[1][xyz] - 1; + am_in[1] = am_in[1] - 1; + t4 = hash(am,am_in); + am[0][xyz] = am[0][xyz] + 1; + am_in[0] = am_in[0] + 1; + + r12t1int += am[0][xyz]*lzboz*(i3[t3] - AC[xyz]*i4[t4]); + } + } + *vp = r12t1int; + vp++; + i0++; + } + } + } + } + + return vp; +} + + +int hash(a, b) + int a[2][3]; + int b[2]; +{ + int c[2] = {0,0}; + int i; + static int io[] = {0,1,3,6,10,15,21,28,36,45,55,66,78,91,105,120,136,153,171,190,210,231,253,276,300,325,351,378,406,435,465}; + + if(b[0]){ + i=b[0]-a[0][0]; + c[0]=i+io[i]-a[0][1]; + } + if(b[1]){ + i=b[1]-a[1][0]; + c[1]=i+io[i]-a[1][1]; + } + + return c[0]*io[b[1]+1]+c[1]; +} diff --git a/src/lib/libr12/t2_vrr_build.c b/src/lib/libr12/t2_vrr_build.c new file mode 100644 index 0000000..664b65f --- /dev/null +++ b/src/lib/libr12/t2_vrr_build.c @@ -0,0 +1,112 @@ +#include +#include +#include +#include +#include "libr12.h" + +extern void punt(char *); +static int hash(int a[2][3], int b[2]); + +REALTYPE *t2_vrr_build_xxxx(int am_in[2], prim_data *Data, contr_data *ShellData, REALTYPE *vp, REALTYPE *i0, + const REALTYPE *i1, const REALTYPE *i2, const REALTYPE *i3, const REALTYPE *i4) +{ + int i, j, k, l; + int am[2][3]; + int t1, t2, t3, t4; + int xyz; + int la, lc; + REALTYPE AC[3], U1[3], U0, lzdon, r12t2int; + + la = am_in[0]; + lc = am_in[1]; + lzdon = Data->twozeta_d*Data->oo2n; + U0 = (Data->twozeta_c - Data->twozeta_d*(Data->twozeta_c*ShellData->CDdotCA + lc + 1))*Data->oo2n; + AC[0] = ShellData->AC[0]; + AC[1] = ShellData->AC[1]; + AC[2] = ShellData->AC[2]; + U1[0] = ShellData->CD[0]*(Data->twozeta_c*Data->twozeta_d*Data->oo2n); + U1[1] = ShellData->CD[1]*(Data->twozeta_c*Data->twozeta_d*Data->oo2n); + U1[2] = ShellData->CD[2]*(Data->twozeta_c*Data->twozeta_d*Data->oo2n); + + t1 = t2 = t3 = t4 = 0; + + for(i = 0; i <= la; i++){ + am[0][0] = la - i; + for(j = 0; j <= i; j++){ + am[0][1] = i - j; + am[0][2] = j; + + for(k = 0; k <= lc; k++){ + am[1][0] = lc - k; + for(l = 0; l <= k; l++){ + am[1][1] = k - l; + am[1][2] = l; + + /*--- (a0|c0) ---*/ + r12t2int = U0*(*i0); + + /*--- add (a+1,0|c0) and (a0|c+1,0) ---*/ + for(xyz=0;xyz<3;xyz++) { + am[1][xyz] = am[1][xyz] + 1; + am_in[1] = am_in[1] + 1; + t1 = hash(am,am_in); + am[1][xyz] = am[1][xyz] - 1; + am_in[1] = am_in[1] - 1; + + am[0][xyz] = am[0][xyz] + 1; + am_in[0] = am_in[0] + 1; + t2 = hash(am,am_in); + am[0][xyz] = am[0][xyz] - 1; + am_in[0] = am_in[0] - 1; + + r12t2int -= U1[xyz]*(i1[t1]-i2[t2]); + } + + /*--- (a-1,0|c+1,0) and (a-1,0|c0) if possible ---*/ + for(xyz=0;xyz<3;xyz++) { + if(am[1][xyz]){ + am[0][xyz] = am[0][xyz] + 1; + am_in[0] = am_in[0] + 1; + am[1][xyz] = am[1][xyz] - 1; + am_in[1] = am_in[1] - 1; + t3 = hash(am,am_in); + am[0][xyz] = am[0][xyz] - 1; + am_in[0] = am_in[0] - 1; + t4 = hash(am,am_in); + am[1][xyz] = am[1][xyz] + 1; + am_in[1] = am_in[1] + 1; + + r12t2int += am[1][xyz]*lzdon*(i3[t3] + AC[xyz]*i4[t4]); + } + } + *vp = r12t2int; + vp++; + i0++; + } + } + } + } + + return vp; +} + + +int hash(a, b) + int a[2][3]; + int b[2]; +{ + int c[2] = {0,0}; + int i; + static int io[] = {0,1,3,6,10,15,21,28,36,45,55,66,78,91,105,120,136,153,171,190,210,231,253,276,300,325,351,378,406,435,465}; + + if(b[0]){ + i=b[0]-a[0][0]; + c[0]=i+io[i]-a[0][1]; + } + if(b[1]){ + i=b[1]-a[1][0]; + c[1]=i+io[i]-a[1][1]; + } + + return c[0]*io[b[1]+1]+c[1]; +} diff --git a/updates b/updates new file mode 100644 index 0000000..f2f2043 --- /dev/null +++ b/updates @@ -0,0 +1,24 @@ + +03/05/2014: Fixed compilation issues with printf, due to Susi Lehtola -EFV + +05/15/2013: Upgraded libtool and bin/config.*; updated license info, etc. -EFV + +12/05/2007: Upgraded to libtool-1.5.24, which works on Darwin/gcc. -EFV + +08/29/2007: 1) Fixed a severe bug in libderiv + 2) Fixed build issues pointed out by Daniel Leidert: + - DESTDIR is now prepended to location of every install + - uninstall make target added + - prototypes for strlen, strcat, strcpy added + - fixed targetclean + - fixed distclean + -EFV + +06/03/2007: Upgraded to libtool-1.5.23b . -EFV + +12/05/2003: Added programmer's documentation. -EFV + +12/05/2003: Fixed Makefiles to avoid compilation errors. -EFV + +12/05/2003: Started updates file. -EFV + -- 2.30.2