X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=gnulib-tool;h=b68c3e653dd664226392824039981b7148e6a943;hb=3af956aefeb791864e317142d848f6a58cf10f49;hp=b04b09257e16ceff62621d8520f5d50e43238118;hpb=55623f58e71800a93cc925fc4771ba5fe9828c5c;p=gnulib.git diff --git a/gnulib-tool b/gnulib-tool index b04b09257..b68c3e653 100755 --- a/gnulib-tool +++ b/gnulib-tool @@ -22,7 +22,7 @@ progname=$0 package=gnulib -cvsdatestamp='$Date: 2005-07-05 07:14:00 $' +cvsdatestamp='$Date: 2005-08-25 12:36:00 $' last_checkin_date=`echo "$cvsdatestamp" | sed -e 's,^\$[D]ate: ,,'` version=`echo "$last_checkin_date" | sed -e 's/ .*$//' -e 's,/,-,g'` @@ -56,6 +56,7 @@ Usage: gnulib-tool --list 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 @@ -76,6 +77,7 @@ Operation modes: --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 @@ -88,8 +90,15 @@ Options: 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 \".\"), for --import. + 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. @@ -105,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 @@ -180,9 +189,12 @@ func_ln_if_changed () # - libname, supplied_libname from --lib # - sourcebase from --source-base # - m4base from --m4-base +# - testsbase from --tests-base # - auxdir from --aux-dir -# - libtool true if --libtool was given, blank otherwise +# - 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 { @@ -192,13 +204,15 @@ func_ln_if_changed () supplied_libname= sourcebase= m4base= + testsbase= auxdir= - libtool= + inctests= + avoidlist= lgpl= + libtool= do_changelog=: dry_run= symbolic= - lgpl= supplied_opts="$@" @@ -267,6 +281,16 @@ func_ln_if_changed () --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 @@ -277,12 +301,25 @@ func_ln_if_changed () --aux-dir=* ) auxdir=`echo "X$1" | sed -e 's/^X--aux-dir=//'` shift ;; - --libtool ) - libtool=true + --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 ;; @@ -342,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 '/^README$/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 } @@ -355,12 +396,33 @@ func_verify_module () || test "CVS" = "$module" \ || test "ChangeLog" = "$module" \ || test "README" = "$module" \ - || test "TEMPLATE" = "$module"; then + || test "TEMPLATE" = "$module" \ + || test "TEMPLATE-TESTS" = "$module"; then echo "gnulib-tool: module $module doesn't exist" 1>&2 module= fi } +# 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 @@ -395,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" } @@ -429,9 +494,34 @@ 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 () @@ -441,12 +531,32 @@ func_modules_transitive_closure () for module in $modules; do func_verify_module if test -n "$module"; then - # Duplicate dependenies are harmless, but Jim wants a warning. + # 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 - xmodules="$xmodules $module "`func_get_dependencies $module` + 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` @@ -524,7 +634,7 @@ func_emit_lib_Makefile_am () echo "MAINTAINERCLEANFILES =" echo for module in $modules; do - func_verify_module + func_verify_nontests_module if test -n "$module"; then { func_get_automake_snippet "$module" | @@ -548,14 +658,85 @@ func_emit_lib_Makefile_am () 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 -# - libtool true if libtool will be used, blank otherwise +# - 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 @@ -574,7 +755,7 @@ func_import () for module in $modules; do license=`func_get_license $module` case $license in - LGPL | 'public domain') ;; + LGPL | 'public domain' | 'unlimited') ;; *) func_fatal_error \ "incompatible license on module \`$module\`: $license" ;; @@ -674,22 +855,25 @@ func_import () echo 'changequote(,)dnl' echo 'LTALLOCA=`echo "$ALLOCA" | sed '"'"'s/\.[^.]* /.lo /g;s/\.[^.]*$/.lo/'"'"'`' echo 'changequote([, ])dnl' - echo 'AC_SUBST(LTALLOCA)' + echo 'AC_SUBST([LTALLOCA])' fi fi done echo "])" echo - echo "dnl Usage: gl_MODULES(module1 module2 ...)" + echo "dnl Usage: gl_MODULES([module1 module2 ...])" echo "AC_DEFUN([gl_MODULES], [])" echo - echo "dnl Usage: gl_SOURCE_BASE(DIR)" + 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 "dnl Usage: gl_M4_BASE([DIR])" echo "AC_DEFUN([gl_M4_BASE], [])" echo - echo "dnl Usage: gl_LIB(LIBNAME)" + echo "dnl Usage: gl_LIB([LIBNAME])" echo "AC_DEFUN([gl_LIB], [])" echo echo "dnl Usage: gl_LGPL" @@ -711,6 +895,8 @@ func_import () } # func_create_testdir testdir modules +# Input: +# - auxdir directory relative to destdir where to place build aux files func_create_testdir () { testdir="$1" @@ -768,6 +954,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: @@ -778,6 +965,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 @@ -790,10 +1029,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" @@ -809,15 +1051,23 @@ func_create_testdir () 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" @@ -842,6 +1092,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" @@ -872,7 +1124,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" @@ -883,8 +1138,8 @@ func_create_megatestdir () # Create autogenerated files. (cd "$megatestdir" - echo "executing ${AUTORECONF} --force --install" - ${AUTORECONF} --force --install + echo "executing ${AUTORECONF} --install" + ${AUTORECONF} --install ) } @@ -915,6 +1170,9 @@ case $mode in /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; }; @@ -942,21 +1200,21 @@ case $mode in test -z "$sourcebase" && sourcebase="$ac_sourcebase" test -z "$sourcebase" && sourcebase="lib" test -d "$destdir/$sourcebase" \ - || (test -z "$dry_run" && mkdir "$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") \ + || { 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="." + test -z "$auxdir" && auxdir="build-aux" test -d "$destdir/$auxdir" \ - || (test -z "$dry_run" && mkdir "$destdir/$auxdir") \ + || { test -z "$dry_run" && mkdir "$destdir/$auxdir"; } \ || func_fatal_error "aux directory $destdir/$auxdir doesn't exist" # Using libtool? @@ -971,6 +1229,9 @@ case $mode in modules="$*" fi + # Which modules to avoid? + avoidlist="$avoidlist $ac_avoidlist" + func_import "$modules" ;; @@ -981,6 +1242,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" "$*" ;; @@ -989,12 +1251,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 @@ -1017,6 +1281,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 @@ -1116,6 +1381,16 @@ case $mode in 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