From: Ralf Wildenhues Date: Thu, 18 Aug 2005 17:07:17 +0000 (+0000) Subject: * m4/libtool.m4 (LT_OUTPUT): New macro to generate X-Git-Tag: release-2-1b~576 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2222a9d9aab6d7b4d5cdaed4cacca62ed95af812;p=thirdparty%2Flibtool.git * m4/libtool.m4 (LT_OUTPUT): New macro to generate libtool before config.status. (_LT_CONFIG_COMMANDS): If LT_OUTPUT has been invoked, then generate code in config.status to call config.lt instead of generating libtool directly. * doc/libtool.texi (LT_INIT): Document LT_OUTPUT. * tests/early-libtool.at: New test. * Makefile.am (TESTSUITE_AT): Updated. * tests/testsuite.at: Updated. Define defaults for $ACLOCAL, $AUTOCONF. --- diff --git a/ChangeLog b/ChangeLog index 786b1e6e5..39f08372b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2005-08-18 Gary V. Vaughan , + Ralf Wildenhues + + * m4/libtool.m4 (LT_OUTPUT): New macro to generate + libtool before config.status. + (_LT_CONFIG_COMMANDS): If LT_OUTPUT has been invoked, then + generate code in config.status to call config.lt instead of + generating libtool directly. + * doc/libtool.texi (LT_INIT): Document LT_OUTPUT. + * tests/early-libtool.at: New test. + * Makefile.am (TESTSUITE_AT): Updated. + * tests/testsuite.at: Updated. Define defaults for $ACLOCAL, + $AUTOCONF. + 2005-08-18 Ralf Wildenhues * TODO: Actually updated now. diff --git a/Makefile.am b/Makefile.am index 8b004acb3..c8d38da00 100644 --- a/Makefile.am +++ b/Makefile.am @@ -301,6 +301,7 @@ TESTSUITE_AT = tests/testsuite.at \ tests/stresstest.at \ tests/link-order.at \ tests/convenience.at \ + tests/early-libtool.at \ tests/template.at EXTRA_DIST += $(TESTSUITE) $(TESTSUITE_AT) tests/package.m4 diff --git a/doc/libtool.texi b/doc/libtool.texi index 2662523fb..92b592f35 100644 --- a/doc/libtool.texi +++ b/doc/libtool.texi @@ -24,7 +24,7 @@ @ifnottex This file documents GNU Libtool @value{VERSION} -Copyright (C) 1996-2004 Free Software Foundation, Inc. +Copyright (C) 1996-2005 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 @@ -51,7 +51,7 @@ identical to this one except for the removal of this paragraph @page @vskip 0pt plus 1filll -Copyright @copyright{} 2004 Free Software Foundation, Inc. +Copyright @copyright{} 2005 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the @sc{gnu} Free Documentation License, Version 1.1 @@ -2116,6 +2116,23 @@ equivalent Autoconf shell variables that are set by the configure time tests before being passed to @file{config.status} for inclusion in the generated libtool script. +@defmac LT_OUTPUT +By default, the configured @file{libtool} script is generated by the +call to @code{AC_OUTPUT} command, and there is rarely any need to use +@file{libtool} from @file{configure}. However, sometimes it is +necessary to run configure time compile and link tests using +@file{libtool}. You can add @code{LT_OUTPUT} to your +@file{configure.ac} any time after @code{LT_INIT} and any +@code{LT_LANG} calls; that done, @file{libtool} will be created by a +specially generated @file{config.lt} file, and available for use in +later tests. + +Also, when @code{LT_OUTPUT} is used, for backwards compatibility with +Automake regeneration rules, @file{config.status} will call +@file{config.lt} to regenerate @file{libtool}, rather than generating +the file itself. +@end defmac + @pindex aclocal When you invoke the @command{libtoolize} program (@pxref{Invoking libtoolize}), it will tell you where to find a definition of @@ -5401,7 +5418,7 @@ trick$ chmod +x libtool trick$ libtool --version ltmain.sh (GNU @@PACKAGE@@@@TIMESTAMP@@) @@VERSION@@ -Copyright (C) 2004 Free Software Foundation, Inc. +Copyright (C) 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. trick$ diff --git a/m4/libtool.m4 b/m4/libtool.m4 index b69558a4f..cbca3dd6d 100644 --- a/m4/libtool.m4 +++ b/m4/libtool.m4 @@ -189,8 +189,7 @@ no_glob_subst='s/\*/\\\*/g' RM="rm -f" # Global variables: -default_ofile=libtool -ofile="$default_ofile" +ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, @@ -461,7 +460,23 @@ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # 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_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_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. @@ -510,11 +525,118 @@ esac _LT_OUTPUT_LIBTOOL_INIT ]) -])#_LT_CONFIG_COMMANDS + + +# 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], +[dnl This macro can only work once all the language testing is completed +AC_BEFORE([LT_INIT], [LT_OUTPUT]) +AC_BEFORE([LT_LANG], [LT_OUTPUT]) + +: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +cat >"$CONFIG_LT" <<_LTEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate a libtool stub with the current configuration. + +lt_cl_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AS_SHELL_SANITIZE +_AS_PREPARE + +exec AS_MESSAGE_FD>&1 +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) 2005 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([unrecognised 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. +if test "$no_create" != yes; then + 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) +fi +])# 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 @@ -537,7 +659,7 @@ m4_defun([_LT_CONFIG], #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by config.status (GNU $PACKAGE$TIMESTAMP) $VERSION +# Generated automatically by $as_me (GNU $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. # diff --git a/tests/early-libtool.at b/tests/early-libtool.at new file mode 100644 index 000000000..5b4d7ad26 --- /dev/null +++ b/tests/early-libtool.at @@ -0,0 +1,213 @@ +# Hand crafted tests for GNU Libtool. -*- Autotest -*- +# Copyright 2005 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + + +AT_BANNER([libtool script generation.]) + + +## --------------------------------------------- ## +## Building libtool normally from config.status. ## +## --------------------------------------------- ## + +AT_SETUP([config.status]) + +AT_DATA([configure.ac], +[[AC_INIT([libtool-demo], ]]AT_PACKAGE_VERSION[[, ]]AT_PACKAGE_BUGREPORT[[) +AC_CONFIG_MACRO_DIR([m4]) +AM_INIT_AUTOMAKE +LT_INIT +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT +]]) + +AT_DATA([Makefile.in], +[[prefix = @prefix@ +libdir = @libdir@ +top_builddir = . +DEFAULT_INCLUDES = -I. -I@srcdir@ +EXEEXT = @EXEEXT@ +LIBTOOL = @LIBTOOL@ + +COMPILE = $(CC) $(DEFAULT_INCLUDES) +LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFAULT_INCLUDES) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CC) -o $@ + +all: hell + +libhello.la: hello.lo + $(LINK) -rpath $(libdir) hello.lo +hell$(EXEEXT): main.o libhello.la + $(LINK) main.o libhello.la + +.SUFFIXES: +.SUFFIXES: .c .o .lo + +.c.o: + $(COMPILE) -c -o $@ $< +.c.lo: + $(LTCOMPILE) -c -o $@ $< +]]) + +AT_DATA([hello.c], +[[#include + +void +hello (void) +{ + printf ("** This is not GNU Hello. There is no built-in mail reader. **\n"); +} +]]) + +AT_DATA([main.c], +[[#include + +extern void hello (void); + +int +main (int argc, char *argv[]) +{ + printf ("Welcome to GNU Hell!\n"); + + hello (); + + return 0; +} +]]) + +AT_DATA(expout, +[[Welcome to GNU Hell! +** This is not GNU Hello. There is no built-in mail reader. ** +]]) + +cat > missing <<_EOF +#! /bin/sh +exit 0 +_EOF +chmod a+x missing + +test -f ltmain.sh || LT_AT_LIBTOOLIZE([--copy --verbose --install]) +test -f aclocal.m4 || $ACLOCAL -I m4 || exit 1 +test -f configure || $AUTOCONF --force || exit 1 +test -f Makefile || ./configure || exit 1 +${MAKE-make} + +LT_AT_EXEC_CHECK([./hell], [0], [expout]) + +AT_CLEANUP + + +## ------------------------------------------ ## +## Building and using libtool from config.lt. ## +## ------------------------------------------ ## + +AT_SETUP([config.lt]) + +AT_DATA([configure.ac], +[[AC_INIT([libtool-demo], ]]AT_PACKAGE_VERSION[[, ]]AT_PACKAGE_BUGREPORT[[) +AC_CONFIG_MACRO_DIR([m4]) +AM_INIT_AUTOMAKE +LT_INIT +LT_OUTPUT + +cat >hello.c <<\_EOF +#include + +void +hello (void) +{ + printf ("** This is not GNU Hello. There is no built-in mail reader. **\n"); +} +_EOF + +# Prove that we can run libtool from inside configure: +$SHELL ./libtool --mode=compile --tag=CC "$CC" -I. -I$srcdir \ + -c -o hello.lo hello.c || exit 1 +$SHELL ./libtool --mode=link --tag=CC "$CC" -o libhello.la \ + -rpath /notexist hello.lo || exit 1 + +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT +]]) + +AT_DATA([Makefile.in], +[[prefix = @prefix@ +libdir = @libdir@ +top_builddir = . +DEFAULT_INCLUDES = -I. -I@srcdir@ +EXEEXT = @EXEEXT@ +LIBTOOL = @LIBTOOL@ + +COMPILE = $(CC) $(DEFAULT_INCLUDES) +LINK = $(LIBTOOL) --mode=link --tag=CC $(CC) -o $@ + +hell$(EXEEXT): main.o libhello.la + $(LINK) main.o libhello.la + +.SUFFIXES: +.SUFFIXES: .c .o + +.c.o: + $(COMPILE) -c -o $@ $< +]]) + +AT_DATA([hello.c], +[[#include + +void +hello (void) +{ + printf ("** This is not GNU Hello. There is no built-in mail reader. **\n"); +} +]]) + +AT_DATA([main.c], +[[#include + +extern void hello (void); + +int +main (int argc, char *argv[]) +{ + printf ("Welcome to GNU Hell!\n"); + + hello (); + + return 0; +} +]]) + +AT_DATA(expout, +[[Welcome to GNU Hell! +** This is not GNU Hello. There is no built-in mail reader. ** +]]) + +cat > missing <<_EOF +#! /bin/sh +exit 0 +_EOF +chmod a+x missing + +test -f ltmain.sh || LT_AT_LIBTOOLIZE([--copy --verbose --install]) +test -f aclocal.m4 || $ACLOCAL -I m4 || exit 1 +test -f configure || $AUTOCONF --force || exit 1 +test -f Makefile || ./configure || exit 1 +${MAKE-make} + +LT_AT_EXEC_CHECK([./hell], [0], [expout]) + +AT_CLEANUP diff --git a/tests/testsuite.at b/tests/testsuite.at index 886aa86aa..958e74972 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -21,7 +21,9 @@ m4_divert_push([PREPARE_TESTS])dnl : ${LIBTOOLIZE="${abs_top_builddir}/libtoolize"} : ${LIBTOOL="${abs_top_builddir}/libtool"} -export LIBTOOLIZE LIBTOOL +: ${ACLOCAL=aclocal} +: ${AUTOCONF=autoconf} +export LIBTOOLIZE LIBTOOL ACLOCAL AUTOCONF eval `$LIBTOOL --config | grep ^EGREP=` eval `$LIBTOOL --config | $EGREP '(host|build)='` m4_divert_pop([PREPARE_TESTS])dnl @@ -97,5 +99,7 @@ m4_include([link-order.at]) m4_include([am-subdir.at]) # C++ templates tests m4_include([template.at]) +# Behaviour of LT_OUTPUT +m4_include([early-libtool.at]) # stress test m4_include([stresstest.at])