X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=gnulib-tool;h=435897ee2dc30b30b4f250c5cacd4310240cb2f5;hb=ec469199fa07f362e581b64ef06921e7764caebe;hp=803a2038a1f8653790b0adfac4b525db991dec85;hpb=3092a88dd136df60b6a70d97430346f1841dfd94;p=gnulib.git diff --git a/gnulib-tool b/gnulib-tool index 803a2038a..435897ee2 100755 --- a/gnulib-tool +++ b/gnulib-tool @@ -1,6 +1,6 @@ #! /bin/sh # -# Copyright (C) 2002, 2003 Free Software Foundation, Inc. +# Copyright (C) 2002, 2003, 2004, 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 @@ -14,7 +14,7 @@ # # 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # This program is meant for authors or maintainers which want to import @@ -22,23 +22,20 @@ progname=$0 package=gnulib -cvsdatestamp='$Date: 2003-01-09 13:22:53 $' +cvsdatestamp='$Date: 2005-08-29 20:03:02 $' last_checkin_date=`echo "$cvsdatestamp" | sed -e 's,^\$[D]ate: ,,'` version=`echo "$last_checkin_date" | sed -e 's/ .*$//' -e 's,/,-,g'` # You can set AUTOCONFPATH to empty if autoconf 2.57 is already in your PATH. AUTOCONFPATH= -case $USER in - bruno ) - AUTOCONFBINDIR=/packages/gnu-inst-autoconf/2.57/bin - AUTOCONFPATH="eval env PATH=${AUTOCONFBINDIR}:\$PATH " - ;; -esac +#case $USER in +# bruno ) +# AUTOCONFBINDIR=/packages/gnu-inst-autoconf/2.57/bin +# AUTOCONFPATH="eval env PATH=${AUTOCONFBINDIR}:\$PATH " +# ;; +#esac -AUTOCONF="${AUTOCONFPATH}autoconf" -AUTOHEADER="${AUTOCONFPATH}autoheader" -AUTOMAKE="${AUTOCONFPATH}automake-1.7" -ACLOCAL="aclocal-1.7" +AUTORECONF="${AUTOCONFPATH}autoreconf" # func_usage # outputs to stdout the --help usage message. @@ -46,7 +43,7 @@ func_usage () { echo "\ Usage: gnulib-tool --list - gnulib-tool --import module1 ... moduleN + gnulib-tool --import [module1 ... moduleN] gnulib-tool --create-testdir --dir=directory module1 ... moduleN gnulib-tool --create-megatestdir --dir=directory [module1 ... moduleN] gnulib-tool --test --dir=directory module1 ... moduleN @@ -57,6 +54,9 @@ Usage: gnulib-tool --list gnulib-tool --extract-autoconf-snippet module gnulib-tool --extract-automake-snippet module gnulib-tool --extract-include-directive module + gnulib-tool --extract-license module + gnulib-tool --extract-maintainer module + gnulib-tool --extract-tests-module module Operation modes: --list print the available module names @@ -65,20 +65,46 @@ Operation modes: --create-megatestdir create a mega scratch package with the given modules one by one and all together --test test the combination of the given modules - (recommended to use CC="gcc -Wall -Werror" here) + (recommended to use CC=\"gcc -Wall\" here) --megatest test the given modules one by one and all together - (recommended to use CC="gcc -Wall -Werror" here) + (recommended to use CC=\"gcc -Wall\" here) --extract-description extract the description --extract-filelist extract the list of files --extract-dependencies extract the dependencies --extract-autoconf-snippet extract the snippet for configure.ac --extract-automake-snippet extract the snippet for lib/Makefile.am --extract-include-directive extract the #include directive + --extract-license report the license terms of the source files + under lib/ + --extract-maintainer report the maintainer(s) inside gnulib + --extract-tests-module report the unit test module, if it exists Options: --dir=DIRECTORY specify the target directory - --lib=libRARY specify the library name + For --import, this specifies where your + configure.ac can be found. Defaults to current + directory. + --lib=LIBRARY Specify the library name. Defaults to 'libgnu'. + --source-base=DIRECTORY + Directory relative --dir where source code is + placed (default \"lib\"), for --import. + --m4-base=DIRECTORY Directory relative --dir where *.m4 macros are + placed (default \"m4\"), for --import. + --tests-base=DIRECTORY + Directory relative --dir where unit tests are + placed (default \"tests\"), for --import. + --aux-dir=DIRECTORY Directory relative --dir where auxiliary build + tools are placed (default \"build-aux\"). + --with-tests Include unit tests for the included modules. + --avoid=MODULE Avoid including the given MODULE. Useful if you + have code that provides equivalent functionality. + This option can be repeated. + --lgpl Abort if modules aren't available under the LGPL. + Also modify license template from GPL to LGPL. + --libtool Use libtool rules, for --import. --no-changelog don't update or create ChangeLog files + --dry-run For --import, only print what would have been done. + -s, --symbolic, --symlink Make symbolic links instead of copying files. Report bugs to ." } @@ -88,10 +114,10 @@ Report bugs to ." func_version () { echo "$progname (GNU $package) $version" - echo "Copyright (C) 2002 Free Software Foundation, Inc. + echo "Copyright (C) 2002-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." - echo "Written by" "Bruno Haible" + echo "Written by" "Bruno Haible" "and" "Simon Josefsson" } # func_fatal_error message @@ -103,17 +129,92 @@ func_fatal_error () exit 1 } +# func_cp_if_changed SRC DEST +# Like cp, but avoids munging timestamps if the file hasn't changed. +# Uses also the variables +# - dry_run true if actions shall only be printed, blank otherwise +func_cp_if_changed () +{ + if test $# -ne 2; then + echo "usage: func_cp_if_changed SRC DEST" >&2 + fi + test -n "$dry_run" && dry=echo + if cmp "$1" "$2" >/dev/null 2>&1; then + : + else + $dry cp -p "$1" "$2" + fi +} + +# func_mv_if_changed SRC DEST +# Like mv, but avoids munging timestamps if the file hasn't changed. +# Removes SRC if it is not renamed. +# Uses also the variables +# - dry_run true if actions shall only be printed, blank otherwise +func_mv_if_changed () +{ + if test $# -ne 2; then + echo "usage: func_mv_if_changed SRC DEST" >&2 + fi + test -n "$dry_run" && dry=echo + if cmp "$1" "$2" >/dev/null 2>&1; then + $dry rm "$1" + else + $dry mv "$1" "$2" + fi +} + +# func_ln_if_changed SRC DEST +# Like ln -s, but avoids munging timestamps if the link is correct. +# Uses also the variables +# - dry_run true if actions shall only be printed, blank otherwise +func_ln_if_changed () +{ + if test $# -ne 2; then + echo "usage: func_ln_if_changed SRC DEST" >&2 + fi + test -n "$dry_run" && dry=echo + if test -L "$2" -a "$1" = "`readlink "$2"`"; then + : + else + $dry rm -f "$2" + $dry ln -s "$1" "$2" + fi +} + # Command-line option processing. # Removes the OPTIONS from the arguments. Sets the variables: # - mode list or import or create-testdir or create-megatestdir # - destdir from --dir -# - libname from --lib +# - libname, supplied_libname from --lib +# - sourcebase from --source-base +# - m4base from --m4-base +# - testsbase from --tests-base +# - auxdir from --aux-dir +# - inctests true if --with-tests was given, blank otherwise +# - avoidlist list of modules to avoid, from --avoid +# - lgpl true if --lgpl was given, blank otherwise +# - libtool true if --libtool was given, blank otherwise # - do_changelog false if --no-changelog was given, : otherwise +# - dry_run true if --dry-run was given, blank otherwise { mode= destdir= - libname=libfoo + libname=libgnu + supplied_libname= + sourcebase= + m4base= + testsbase= + auxdir= + inctests= + avoidlist= + lgpl= + libtool= do_changelog=: + dry_run= + symbolic= + + supplied_opts="$@" while test $# -gt 0; do case "$1" in @@ -154,13 +255,80 @@ func_fatal_error () func_fatal_error "missing argument for --lib" fi libname=$1 + supplied_libname=true shift ;; --lib=* ) libname=`echo "X$1" | sed -e 's/^X--lib=//'` + supplied_libname=true + shift ;; + --source-base ) + shift + if test $# = 0; then + func_fatal_error "missing argument for --source-base" + fi + sourcebase=$1 + shift ;; + --source-base=* ) + sourcebase=`echo "X$1" | sed -e 's/^X--source-base=//'` + shift ;; + --m4-base ) + shift + if test $# = 0; then + func_fatal_error "missing argument for --m4-base" + fi + m4base=$1 + shift ;; + --m4-base=* ) + m4base=`echo "X$1" | sed -e 's/^X--m4-base=//'` + shift ;; + --tests-base ) + shift + if test $# = 0; then + func_fatal_error "missing argument for --tests-base" + fi + testsbase=$1 + shift ;; + --tests-base=* ) + testsbase=`echo "X$1" | sed -e 's/^X--tests-base=//'` + shift ;; + --aux-dir ) + shift + if test $# = 0; then + func_fatal_error "missing argument for --aux-dir" + fi + auxdir=$1 + shift ;; + --aux-dir=* ) + auxdir=`echo "X$1" | sed -e 's/^X--aux-dir=//'` + shift ;; + --with-tests ) + inctests=true + shift ;; + --avoid ) + shift + if test $# = 0; then + func_fatal_error "missing argument for --avoid" + fi + avoidlist="$avoidlist $1" + shift ;; + --avoid=* ) + avoidlist="$avoidlist "`echo "X$1" | sed -e 's/^X--avoid=//'` + shift ;; + --lgpl ) + lgpl=true + shift ;; + --libtool ) + libtool=true shift ;; --no-changelog | --no-changelo | --no-changel | --no-change | --no-chang | --no-chan | --no-cha | --no-ch | --no-c ) do_changelog=false shift ;; + --dry-run ) + dry_run=true + shift ;; + -s | --symbolic | --symlink ) + symbolic=true + shift ;; --help | --hel | --he | --h ) func_usage exit 0 ;; @@ -195,7 +363,7 @@ case "$0" in fi ;; esac -while test -L "$self_abspathname"; do +while test -h "$self_abspathname"; do # Resolve symbolic link. sedexpr1='s, -> ,#%%#,' sedexpr2='s,^.*#%%#\(.*\)$,\1,p' @@ -211,8 +379,12 @@ gnulib_dir=`echo "$self_abspathname" | sed -e 's,/[^/]*$,,'` # func_all_modules func_all_modules () { + # Filter out metainformation files like README, which are not modules. + # Filter out unit test modules; they can be retrieved through + # --extract-tests-module if desired. (cd "$gnulib_dir/modules" && ls -1) \ - | sed -e '/^CVS$/d' -e '/^ChangeLog$/d' -e '/^TEMPLATE$/d' -e '/~$/d' \ + | sed -e '/^CVS$/d' -e '/^ChangeLog$/d' -e '/^README$/d' -e '/^TEMPLATE$/d' -e '/^TEMPLATE-TESTS$/d' -e '/~$/d' \ + | sed -e '/-tests$/d' \ | sort } @@ -223,17 +395,45 @@ func_verify_module () if test ! -f "$gnulib_dir/modules/$module" \ || test "CVS" = "$module" \ || test "ChangeLog" = "$module" \ - || test "TEMPLATE" = "$module"; then + || test "README" = "$module" \ + || test "TEMPLATE" = "$module" \ + || test "TEMPLATE-TESTS" = "$module"; then echo "gnulib-tool: module $module doesn't exist" 1>&2 module= fi } -tags_regexp='\(Description\|Files\|Depends-on\|configure\.ac\|Makefile\.am\|Include\)' +# func_verify_nontests_module +# verifies a module name, excluding tests modules +func_verify_nontests_module () +{ + case "$module" in + *-tests ) module= ;; + * ) func_verify_module ;; + esac +} + +# func_verify_tests_module +# verifies a module name, considering only tests modules +func_verify_tests_module () +{ + case "$module" in + *-tests ) func_verify_module ;; + * ) module= ;; + esac +} + sed_extract_prog=':[ ]*$/ { :a n - s/^'"$tags_regexp"':[ ]*$// + s/^Description:[ ]*$// + s/^Files:[ ]*$// + s/^Depends-on:[ ]*$// + s/^configure\.ac:[ ]*$// + s/^Makefile\.am:[ ]*$// + s/^Include:[ ]*$// + s/^License:[ ]*$// + s/^Maintainer:[ ]*$// tb p ba @@ -257,6 +457,9 @@ func_get_filelist () # func_get_dependencies module func_get_dependencies () { + # ${module}-tests always implicitly depends on ${module}. + echo "$1" | sed -n -e 's/-tests//p' + # Then the explicit dependencies listed in the module description. sed -n -e "/^Depends-on$sed_extract_prog" < "$gnulib_dir/modules/$1" } @@ -279,20 +482,81 @@ func_get_include_directive () sed -e 's/^\(["<]\)/#include \1/' } -# func_create_testdir testdir modules -func_create_testdir () +# func_get_license module +func_get_license () { - testdir="$1" - modules="$2" - modules=`for m in $modules; do echo $m; done | sort | uniq` + sed -n -e "/^License$sed_extract_prog" < "$gnulib_dir/modules/$1" +} - # Determine final module list. +# func_get_maintainer module +func_get_maintainer () +{ + sed -n -e "/^Maintainer$sed_extract_prog" < "$gnulib_dir/modules/$1" +} + +# func_get_tests_module module +func_get_tests_module () +{ + # The naming convention for tests modules is hardwired: ${module}-tests. + if test -f modules/"$1"-tests; then + echo "$1"-tests + fi +} + +# func_acceptable module +# tests whether a module is acceptable. +# Input: +# - avoidlist list of modules to avoid +func_acceptable () +{ + for avoid in $avoidlist; do + if test "$avoid" = "$1"; then + return 1 + fi + done + return 0 +} + +# func_modules_transitive_closure +# Input: +# - modules list of specified modules +# - inctests true if tests should be included, blank otherwise +# - avoidlist list of modules to avoid +# Output: +# - modules list of modules, including dependencies +func_modules_transitive_closure () +{ while true; do xmodules= for module in $modules; do func_verify_module if test -n "$module"; then - xmodules="$xmodules $module "`func_get_dependencies $module` + # Duplicate dependencies are harmless, but Jim wants a warning. + duplicated_deps=`func_get_dependencies $module | sort | uniq -d` + if test -n "$duplicated_deps"; then + echo "warning: module $module has duplicated dependencies: "`echo $duplicated_deps` 1>&2 + fi + if func_acceptable $module; then + xmodules="$xmodules $module" + for depmodule in `func_get_dependencies $module`; do + if func_acceptable $depmodule; then + xmodules="$xmodules $depmodule" + fi + done + if test -n "$inctests"; then + testsmodule=`func_get_tests_module $module` + if test -n "$testsmodule"; then + if func_acceptable $testsmodule; then + xmodules="$xmodules $testsmodule" + for depmodule in `func_get_dependencies $testsmodule`; do + if func_acceptable $depmodule; then + xmodules="$xmodules $depmodule" + fi + done + fi + fi + fi + fi fi done xmodules=`for m in $xmodules; do echo $m; done | sort | uniq` @@ -301,10 +565,15 @@ func_create_testdir () fi modules="$xmodules" done - echo "Module list with included dependencies:" - echo "$modules" | sed -e 's/^/ /' +} - # Determine final file list. +# func_modules_to_filelist +# Input: +# - modules list of modules, including dependencies +# Output: +# - files list of files +func_modules_to_filelist () +{ files= for module in $modules; do func_verify_module @@ -313,49 +582,373 @@ func_create_testdir () fi done files=`for f in $files; do echo $f; done | sort | uniq` +} + +# func_emit_lib_Makefile_am +# emits the contents of lib/Makefile.am to standard output. +# Input: +# - modules list of modules, including dependencies +# - libname library name +# - libtool true if libtool will be used, blank otherwise +# - cmd (optional) command that led to this invocation +# - actioncmd (optional) command that will reproduce this invocation +func_emit_lib_Makefile_am () +{ + if test -n "$libtool"; then + libext=la + perhapsLT=LT + else + libext=a + perhapsLT= + fi + echo "## Process this file with automake to produce Makefile.in." + echo "# Copyright (C) 2004 Free Software Foundation, Inc." + echo "#" + echo "# This file is free software, distributed under the terms of the GNU" + echo "# General Public License. As a special exception to the GNU General" + echo "# Public License, this file may be distributed as part of a program" + echo "# that contains a configuration script generated by Automake, under" + echo "# the same distribution terms as the rest of that program." + echo "#" + echo "# Generated by gnulib-tool." + if test -n "$cmd"; then + echo "# Invoked as: $cmd" + fi + if test -n "$actioncmd"; then + echo "# Reproduce by: $actioncmd" + fi + echo + # No need to generate dependencies since the sources are in gnulib, not here. + echo "AUTOMAKE_OPTIONS = 1.5 gnits no-dependencies" + echo + echo "noinst_${perhapsLT}LIBRARIES = $libname.$libext" + echo + echo "${libname}_${libext}_SOURCES =" + echo "${libname}_${libext}_LIBADD = @${perhapsLT}LIBOBJS@" + echo "EXTRA_DIST =" + echo "BUILT_SOURCES =" + echo "SUFFIXES =" + echo "MOSTLYCLEANFILES =" + echo "CLEANFILES =" + echo "DISTCLEANFILES =" + echo "MAINTAINERCLEANFILES =" + echo + for module in $modules; do + func_verify_nontests_module + if test -n "$module"; then + { + func_get_automake_snippet "$module" | + sed -e 's,lib_\([A-Z][A-Z]*\),'"${libname}_${libext}"'_\1,g' + if test "$module" = 'alloca'; then + echo "${libname}_${libext}_LIBADD += @${perhapsLT}ALLOCA@" + fi + } > amsnippet.tmp + # Skip the contents if its entirely empty. + if grep '[^ ]' amsnippet.tmp > /dev/null ; then + echo "## begin gnulib module $module" + echo + cat amsnippet.tmp + echo "## end gnulib module $module" + echo + fi + rm -f amsnippet.tmp + fi + done + echo + echo "# Makefile.am ends here" +} + +# func_emit_tests_Makefile_am +# emits the contents of tests/Makefile.am to standard output. +# Input: +# - modules list of modules, including dependencies +# - libname library name +# - libtool true if libtool will be used, blank otherwise +# - sourcebase relative directory containing lib source code +func_emit_tests_Makefile_am () +{ + if test -n "$libtool"; then + libext=la + else + libext=a + fi + echo "## Process this file with automake to produce Makefile.in." + echo "# Copyright (C) 2004-2005 Free Software Foundation, Inc." + echo "#" + echo "# This file is free software, distributed under the terms of the GNU" + echo "# General Public License. As a special exception to the GNU General" + echo "# Public License, this file may be distributed as part of a program" + echo "# that contains a configuration script generated by Automake, under" + echo "# the same distribution terms as the rest of that program." + echo "#" + echo "# Generated by gnulib-tool." + echo + # Generate dependencies here, since it eases the debugging of test failures. + echo "AUTOMAKE_OPTIONS = 1.5 foreign" + echo + echo "ACLOCAL_AMFLAGS = -I ../m4" + echo + echo "TESTS =" + echo "noinst_PROGRAMS =" + echo "EXTRA_DIST =" + echo "BUILT_SOURCES =" + echo "SUFFIXES =" + echo "MOSTLYCLEANFILES =" + echo "CLEANFILES =" + echo "DISTCLEANFILES =" + echo "MAINTAINERCLEANFILES =" + echo + echo "AM_CPPFLAGS = \\" + echo " -I. -I\$(srcdir) \\" + echo " -I.. -I\$(srcdir)/.. \\" + echo " -I../${sourcebase-lib} -I\$(srcdir)/../${sourcebase-lib}" + echo + echo "LDADD = ../${sourcebase-lib}/${libname}.${libext}" + echo + for module in $modules; do + func_verify_tests_module + if test -n "$module"; then + func_get_automake_snippet "$module" > amsnippet.tmp + # Skip the contents if its entirely empty. + if grep '[^ ]' amsnippet.tmp > /dev/null ; then + echo "## begin gnulib module $module" + echo + cat amsnippet.tmp + echo "## end gnulib module $module" + echo + fi + rm -f amsnippet.tmp + fi + done + echo "# Clean up after Solaris cc." + echo "clean-local:" + echo " rm -rf SunWS_cache" + echo + echo "# Makefile.am ends here" +} + +# func_import modules +# Uses also the variables +# - destdir target directory +# - libname library name +# - sourcebase directory relative to destdir where to place source code +# - m4base directory relative to destdir where to place *.m4 macros +# - auxdir directory relative to destdir where to place build aux files +# - avoidlist list of modules to avoid, from --avoid +# - lgpl true if library's license shall be LGPL, blank otherwise +# - libtool true if libtool will be used, blank otherwise +# - dry_run true if actions shall only be printed, blank otherwise +# - symbolic true if files should be symlinked, copied otherwise +# - supplied_opts all options passed to gnulib-tool +func_import () +{ + modules="$1" + modules=`for m in $modules; do echo $m; done | sort | uniq` + + # Determine final module list. + func_modules_transitive_closure + echo "Module list with included dependencies:" + echo "$modules" | sed -e 's/^/ /' + + # If --lgpl, check the license of modules are compatible. + if test -n "$lgpl"; then + for module in $modules; do + license=`func_get_license $module` + case $license in + LGPL | 'public domain' | 'unlimited') ;; + *) + func_fatal_error \ + "incompatible license on module \`$module\`: $license" ;; + esac + done + fi + + # Determine final file list. + func_modules_to_filelist + echo "File list:" + echo "$files" | sed -e 's/^/ /' + + test -n "$files" \ + || func_fatal_error "refusing to do nothing" + + # Copy files or make symbolic links. + for f in $files; do + source= + case "$f" in + build-aux/*) g=`echo "$f" | sed -e "s,^build-aux/,$auxdir/,"` ;; + lib/*) g=`echo "$f" | sed -e "s,^lib/,$sourcebase/,"`; source=true ;; + m4/*) g=`echo "$f" | sed -e "s,^m4/,$m4base/,"` ;; + *) g="$f" ;; + esac + if test -z "$symbolic"; then + func_cp_if_changed "$gnulib_dir/$f" "$destdir/$g" + else + func_ln_if_changed "$gnulib_dir/$f" "$destdir/$g" + fi + # Update license. + if test -z "$dry_run" && test -n "$lgpl" && test -n "$source"; then + perl -pi -e 's/GNU General/GNU Lesser General/g;' \ + -e 's/version 2([ ,])/version 2.1\1/g' \ + "$destdir/$g" + fi + done + + # Commands printed in a comment in generated files. + cmd="gnulib-tool $supplied_opts" + opt_libtool= + if test -n "$libtool"; then + opt_libtool="--libtool" + fi + opt_lgpl= + if test -n "$lgpl"; then + opt_lgpl="--lgpl" + fi + actioncmd="gnulib-tool --import --dir=$destdir --lib=$libname --source-base=$sourcebase --m4-base=$m4base --aux-dir=$auxdir $opt_libtool $opt_lgpl `echo $modules`" + + # Create lib/Makefile.am. + echo "Creating $destdir/$sourcebase/Makefile.am..." + if test -z "$dry_run"; then + func_emit_lib_Makefile_am > "$destdir"/$sourcebase/Makefile.am.new + else + func_emit_lib_Makefile_am + fi + func_mv_if_changed "$destdir"/$sourcebase/Makefile.am.new \ + "$destdir"/$sourcebase/Makefile.am + + # Create gnulib.m4. + echo "Creating $destdir/$m4base/gnulib.m4..." + ( + if test -z "$dry_run"; then + exec > "$destdir"/$m4base/gnulib.m4.new + else + echo "# $destdir/$m4base/gnulib.m4" + fi + echo "# Copyright (C) 2004 Free Software Foundation, Inc." + echo "# This file is free software, distributed under the terms of the GNU" + echo "# General Public License. As a special exception to the GNU General" + echo "# Public License, this file may be distributed as part of a program" + echo "# that contains a configuration script generated by Autoconf, under" + echo "# the same distribution terms as the rest of that program." + echo "#" + echo "# Generated by gnulib-tool." + echo "#" + echo "# Invoked as: $cmd" + echo "# Reproduce by: $actioncmd" + echo + echo "# This macro should be invoked from $configure_ac, in the section" + echo "# \"Checks for programs\", right after AC_PROG_CC, and certainly before" + echo "# any checks for libraries, header files, types and library functions." + echo "AC_DEFUN([gl_EARLY]," + echo "[" + if grep AC_GNU_SOURCE "$destdir"/$m4base/*.m4 > /dev/null; then + echo " AC_GNU_SOURCE" + fi + if grep gl_USE_SYSTEM_EXTENSIONS "$destdir"/$m4base/*.m4 > /dev/null; then + echo " gl_USE_SYSTEM_EXTENSIONS" + fi + echo "])" + echo + echo "# This macro should be invoked from $configure_ac, in the section" + echo "# \"Check for header files, types and library functions\"." + echo "AC_DEFUN([gl_INIT]," + echo "[" + for module in $modules; do + func_verify_module + if test -n "$module"; then + func_get_autoconf_snippet "$module" | sed -e '/^$/d;' -e 's/^/ /' -e 's/AM_GNU_GETTEXT(\[external\])/dnl you must add AM_GNU_GETTEXT([external]) or similar to configure.ac./' + if test "$module" = 'alloca' && test -n "$libtool"; then + echo 'changequote(,)dnl' + echo 'LTALLOCA=`echo "$ALLOCA" | sed '"'"'s/\.[^.]* /.lo /g;s/\.[^.]*$/.lo/'"'"'`' + echo 'changequote([, ])dnl' + echo 'AC_SUBST([LTALLOCA])' + fi + fi + done + echo "])" + echo + echo "dnl Usage: gl_MODULES([module1 module2 ...])" + echo "AC_DEFUN([gl_MODULES], [])" + echo + echo "dnl Usage: gl_AVOID([module1 module2 ...])" + echo "AC_DEFUN([gl_AVOID], [])" + echo + echo "dnl Usage: gl_SOURCE_BASE([DIR])" + echo "AC_DEFUN([gl_SOURCE_BASE], [])" + echo + echo "dnl Usage: gl_M4_BASE([DIR])" + echo "AC_DEFUN([gl_M4_BASE], [])" + echo + echo "dnl Usage: gl_LIB([LIBNAME])" + echo "AC_DEFUN([gl_LIB], [])" + echo + echo "dnl Usage: gl_LGPL" + echo "AC_DEFUN([gl_LGPL], [])" + echo + echo "# gnulib.m4 ends here" + ) + func_mv_if_changed "$destdir"/$m4base/gnulib.m4.new "$destdir"/$m4base/gnulib.m4 + echo "Finished." + echo + echo "You may need to add #include directives for the following .h files." + for module in $modules; do + func_get_include_directive "$module" + done | LC_ALL=C sort -u | sed -e '/^$/d;' -e 's/^/ /' + echo + echo "Don't forget to" + echo " - add \"$sourcebase/Makefile\" to AC_CONFIG_FILES in $configure_ac," + sourcebase_dir=`echo "$sourcebase" | sed -n -e 's,/[^/]*$,/,p'` + sourcebase_base=`basename "$sourcebase"` + echo " - mention \"${sourcebase_base}\" in SUBDIRS in ${sourcebase_dir}Makefile.am," + echo " - mention \"-I ${m4base}\" in ACLOCAL_AMFLAGS in Makefile.am," + echo " - invoke gl_EARLY in $configure_ac, right after AC_PROG_CC," + echo " - invoke gl_INIT in $configure_ac." +} + +# func_create_testdir testdir modules +# Input: +# - auxdir directory relative to destdir where to place build aux files +func_create_testdir () +{ + testdir="$1" + modules="$2" + modules=`for m in $modules; do echo $m; done | sort | uniq` + + # Determine final module list. + func_modules_transitive_closure + echo "Module list with included dependencies:" + echo "$modules" | sed -e 's/^/ /' + + # Determine final file list. + func_modules_to_filelist echo "File list:" echo "$files" | sed -e 's/^/ /' # Create directories. for d in `echo "$files" | sed -n -e 's,^\(.*\)/[^/]*,\1,p'`; do - mkdir -p "$testdir/$d" + if test "$d" = build-aux; then + mkdir -p "$testdir/$auxdir" + else + mkdir -p "$testdir/$d" + fi done - # Copy files. + # Copy files or make symbolic links. for f in $files; do - ln "$gnulib_dir/$f" "$testdir/$f" 2>/dev/null || - cp -p "$gnulib_dir/$f" "$testdir/$f" + case "$f" in + build-aux/*) g=`echo "$f" | sed -e "s,^build-aux/,$auxdir/,"` ;; + *) g="$f" ;; + esac + ln "$gnulib_dir/$f" "$testdir/$g" 2>/dev/null || + if test -z "$symbolic"; then + cp -p "$gnulib_dir/$f" "$testdir/$g" + else + ln -s "$gnulib_dir/$f" "$testdir/$g" + fi done # Create lib/Makefile.am. mkdir -p "$testdir/lib" - (echo "## Process this file with automake to produce Makefile.in." - echo - echo "AUTOMAKE_OPTIONS = 1.5 gnits no-dependencies" - echo - echo "noinst_LIBRARIES = $libname.a" - echo - echo "$libname"'_a_SOURCES =' - echo "$libname"'_a_LIBADD = @LIBOBJS@' - echo '#'"$libname"'_la_LIBADD = @LTLIBOBJS@' - echo "EXTRA_DIST =" - echo "BUILT_SOURCES =" - echo "SUFFIXES =" - echo "MOSTLYCLEANFILES =" - echo "CLEANFILES =" - echo "DISTCLEANFILES =" - echo "MAINTAINERCLEANFILES =" - for module in $modules; do - func_verify_module - if test -n "$module"; then - func_get_automake_snippet "$module" | sed -e "s,lib_SOURCES,$libname"'_a_SOURCES,g' - if test "$module" = 'alloca'; then - echo "$libname"'_a_LIBADD += @ALLOCA@' - echo '#'"$libname"'_la_LIBADD += @LTALLOCA@' - fi - fi - done - ) > "$testdir/lib/Makefile.am" + func_emit_lib_Makefile_am > "$testdir/lib/Makefile.am" # Create m4/Makefile.am. mkdir -p "$testdir/m4" @@ -371,6 +964,7 @@ func_create_testdir () ) > "$testdir/m4/Makefile.am" subdirs="lib m4" + subdirs_with_configure_ac="" if test -f "$testdir"/m4/gettext.m4; then # Avoid stupid error message from automake: @@ -381,6 +975,58 @@ func_create_testdir () subdirs="$subdirs po" fi + if test -n "$inctests"; then + test -d "$testdir/tests" || mkdir "$testdir/tests" + # Create tests/Makefile.am. + sourcebase=lib + func_emit_tests_Makefile_am > "$testdir/tests/Makefile.am" + # Create tests/configure.ac. + (echo "# Process this file with autoconf to produce a configure script." + echo "AC_INIT([dummy], [0])" + echo "AC_CONFIG_AUX_DIR([../$auxdir])" + echo "AM_INIT_AUTOMAKE" + echo + echo "AM_CONFIG_HEADER([config.h])" + echo + echo "AC_PROG_CC" + echo "AC_PROG_INSTALL" + echo "AC_PROG_MAKE_SET" + echo "AC_PROG_RANLIB" + echo + if grep AC_GNU_SOURCE "$testdir"/m4/*.m4 > /dev/null; then + echo "AC_GNU_SOURCE" + echo + fi + if grep gl_USE_SYSTEM_EXTENSIONS "$testdir"/m4/*.m4 > /dev/null; then + echo "gl_USE_SYSTEM_EXTENSIONS" + echo + fi + # We don't have explicit ordering constraints between the various + # autoconf snippets. It's cleanest to put those of the library before + # those of the tests. + for module in $modules; do + func_verify_nontests_module + if test -n "$module"; then + func_get_autoconf_snippet "$module" + fi + done + for module in $modules; do + func_verify_tests_module + if test -n "$module"; then + func_get_autoconf_snippet "$module" + fi + done + echo + # Usually tests/config.h will be a superset of config.h. Verify this by + # "merging" config.h into tests/config.h; look out for gcc warnings. + echo "AH_TOP([#include \"../config.h\"])" + echo + echo "AC_OUTPUT([Makefile])" + ) > "$testdir/tests/configure.ac" + subdirs="$subdirs tests" + subdirs_with_configure_ac="$subdirs_with_configure_ac tests" + fi + # Create Makefile.am. (echo "## Process this file with automake to produce Makefile.in." echo @@ -393,10 +1039,13 @@ func_create_testdir () # Create configure.ac. (echo "# Process this file with autoconf to produce a configure script." - echo "AC_INIT(dummy,0)" + echo "AC_INIT([dummy], [0])" + if test "$auxdir" != "."; then + echo "AC_CONFIG_AUX_DIR([$auxdir])" + fi echo "AM_INIT_AUTOMAKE" echo - echo "AM_CONFIG_HEADER(config.h)" + echo "AM_CONFIG_HEADER([config.h])" echo echo "AC_PROG_CC" echo "AC_PROG_INSTALL" @@ -407,30 +1056,36 @@ func_create_testdir () echo "AC_GNU_SOURCE" echo fi + if grep gl_USE_SYSTEM_EXTENSIONS "$testdir"/m4/*.m4 > /dev/null; then + echo "gl_USE_SYSTEM_EXTENSIONS" + echo + fi for module in $modules; do - func_verify_module + func_verify_nontests_module if test -n "$module"; then func_get_autoconf_snippet "$module" fi done echo + if test -n "$subdirs_with_configure_ac"; then + echo "AC_CONFIG_SUBDIRS(["`echo $subdirs_with_configure_ac`"])" + fi makefiles="Makefile" for d in $subdirs; do - makefiles="$makefiles $d/Makefile" + # For subdirs that have a configure.ac by their own, it's the subdir's + # configure.ac which creates the subdir's Makefile.am, not this one. + case " $subdirs_with_configure_ac " in + *" $d "*) ;; + *) makefiles="$makefiles $d/Makefile" ;; + esac done echo "AC_OUTPUT([$makefiles])" ) > "$testdir/configure.ac" # Create autogenerated files. (cd "$testdir" - echo "executing ${ACLOCAL} -I m4" - ${ACLOCAL} -I m4 - echo "executing ${AUTOHEADER}" - ${AUTOHEADER} - echo "executing ${AUTOCONF}" - ${AUTOCONF} - echo "executing ${AUTOMAKE} --add-missing --copy" - ${AUTOMAKE} --add-missing --copy + echo "executing ${AUTORECONF} --force --install" + ${AUTORECONF} --force --install ) if grep '^BUILT_SOURCES *+=' "$testdir/lib/Makefile.am" > /dev/null; then (cd "$testdir" @@ -447,6 +1102,8 @@ func_create_testdir () } # func_create_megatestdir megatestdir allmodules +# Input: +# - auxdir directory relative to destdir where to place build aux files func_create_megatestdir () { megatestdir="$1" @@ -477,7 +1134,10 @@ func_create_megatestdir () # Create configure.ac. (echo "# Process this file with autoconf to produce a configure script." - echo "AC_INIT(dummy,0)" + echo "AC_INIT([dummy], [0])" + if test "$auxdir" != "."; then + echo "AC_CONFIG_AUX_DIR([$auxdir])" + fi echo "AM_INIT_AUTOMAKE" echo echo "AC_PROG_MAKE_SET" @@ -488,12 +1148,8 @@ func_create_megatestdir () # Create autogenerated files. (cd "$megatestdir" - echo "executing ${ACLOCAL}" - ${ACLOCAL} - echo "executing ${AUTOCONF}" - ${AUTOCONF} - echo "executing ${AUTOMAKE} --add-missing --copy Makefile" - ${AUTOMAKE} --add-missing --copy Makefile + echo "executing ${AUTORECONF} --install" + ${AUTORECONF} --install ) } @@ -506,7 +1162,88 @@ case $mode in ;; import ) - func_fatal_error "NYI" ;; + # Where to import. + if test -z "$destdir"; then + destdir=. + fi + test -d "$destdir" \ + || func_fatal_error "destination directory does not exist: $destdir" + + # Prefer configure.ac to configure.in + test -f "$destdir"/configure.in && configure_ac="$destdir/configure.in" + test -f "$destdir"/configure.ac && configure_ac="$destdir/configure.ac" + test -f "$configure_ac" \ + || func_fatal_error "cannot find $destdir/configure.ac" + + # Get settings. + my_sed_traces='s,#.*$,,; s,^dnl .*$,,; s, dnl .*$,,; + /gl_MODULES[^_]/ { + s,^.*gl_MODULES([[ ]*\([^])]*\).*$,ac_modules="\1",; p; + }; + /gl_AVOID[^_]/ { + s,^.*gl_AVOID([[ ]*\([^])]*\).*$,ac_avoidlist="\1",; p; + }; + /gl_SOURCE_BASE/ { + s,^.*gl_SOURCE_BASE([[ ]*\([^])]*\).*$,ac_sourcebase="\1",; p; + }; + /gl_M4_BASE/ { + s,^.*gl_M4_BASE([[ ]*\([^])]*\).*$,ac_m4base="\1",; p; + }; + /gl_LIB/ { + s,^.*gl_LIB([[ ]*\([^])]*\).*$,ac_libname="\1",; p; + }; + /AC_CONFIG_AUX_DIR/ { + s,^.*AC_CONFIG_AUX_DIR([[ ]*\([^])]*\).*$,ac_auxdir="\1",; p; + } + /A[CM]_PROG_LIBTOOL/ { s,^.*$,seen_libtool=:,; p; }; + /LT_INIT/ { s,^.*$,seen_libtool=:,; p; }; + /gl_LGPL/ { s,^.*$,lgpl=true,; p; }; + d;' + eval `cat $configure_ac | sed "$my_sed_traces"` + + # Override libname? + if test -z "$supplied_libname" && test -n "$ac_libname"; then + libname="$ac_libname" + fi + + # Set up source base. + test -z "$sourcebase" && sourcebase="$ac_sourcebase" + test -z "$sourcebase" && sourcebase="lib" + test -d "$destdir/$sourcebase" \ + || { test -z "$dry_run" && mkdir "$destdir/$sourcebase"; } \ + || func_fatal_error "source base $destdir/$sourcebase doesn't exist" + + # Set up m4 base. + test -z "$m4base" && m4base="$ac_m4base" + test -z "$m4base" && m4base="m4" + test -d "$destdir/$m4base" \ + || { test -z "$dry_run" && mkdir "$destdir/$m4base"; } \ + || func_fatal_error "m4 base $destdir/$m4base doesn't exist" + + # Set up auxiliary directory. + test -z "$auxdir" && auxdir="$ac_auxdir" + test -z "$auxdir" && auxdir="build-aux" + test -d "$destdir/$auxdir" \ + || { test -z "$dry_run" && mkdir "$destdir/$auxdir"; } \ + || func_fatal_error "aux directory $destdir/$auxdir doesn't exist" + + # Using libtool? + if test -n "$seen_libtool"; then + libtool=true + fi + + # What modules to extract. + if test $# = 0; then + modules="$ac_modules" + else + modules="$*" + fi + + # Which modules to avoid? + avoidlist=`echo $avoidlist $ac_avoidlist` + + func_import "$modules" + ;; create-testdir ) if test -z "$destdir"; then @@ -515,6 +1252,7 @@ case $mode in mkdir "$destdir" test -d "$destdir" \ || func_fatal_error "could not create destination directory" + test -n "$auxdir" || auxdir="build-aux" func_create_testdir "$destdir" "$*" ;; @@ -523,12 +1261,14 @@ case $mode in func_fatal_error "please specify --dir option" fi mkdir "$destdir" || func_fatal_error "could not create destination directory" + test -n "$auxdir" || auxdir="build-aux" func_create_megatestdir "$destdir" "$*" ;; test ) test -n "$destdir" || destdir=testdir$$ mkdir "$destdir" || func_fatal_error "could not create destination directory" + test -n "$auxdir" || auxdir="build-aux" func_create_testdir "$destdir" "$*" cd "$destdir" mkdir build @@ -551,6 +1291,7 @@ case $mode in megatest ) test -n "$destdir" || destdir=testdir$$ mkdir "$destdir" || func_fatal_error "could not create destination directory" + test -n "$auxdir" || auxdir="build-aux" func_create_megatestdir "$destdir" "$*" cd "$destdir" mkdir build @@ -630,6 +1371,36 @@ case $mode in done ;; + extract-license ) + for module + do + func_verify_module + if test -n "$module"; then + func_get_license "$module" + fi + done + ;; + + extract-maintainer ) + for module + do + func_verify_module + if test -n "$module"; then + func_get_maintainer "$module" + fi + done + ;; + + extract-tests-module ) + for module + do + func_verify_module + if test -n "$module"; then + func_get_tests_module "$module" + fi + done + ;; + * ) func_fatal_error "unknown operation mode --$mode" ;; esac