X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=gnulib-tool;h=e3e928d06bcc738abaf9c9644f91fee5e6248927;hb=46f74723b3fd5b41bebc0fd9c10b642726a0d47e;hp=713e6004a22c4cfdcc5c085013fed4a36824a81e;hpb=55fd7a94941411ea9fa53b65186389eed0762be3;p=gnulib.git diff --git a/gnulib-tool b/gnulib-tool index 713e6004a..e3e928d06 100755 --- a/gnulib-tool +++ b/gnulib-tool @@ -1,6 +1,6 @@ #! /bin/sh # -# Copyright (C) 2002-2006 Free Software Foundation, Inc. +# Copyright (C) 2002-2007 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 @@ -22,7 +22,7 @@ progname=$0 package=gnulib -cvsdatestamp='$Date: 2006-10-19 12:23:41 $' +cvsdatestamp='$Date: 2007-01-09 13:44:33 $' last_checkin_date=`echo "$cvsdatestamp" | sed -e 's,^\$[D]ate: ,,'` version=`echo "$last_checkin_date" | sed -e 's/ .*$//' -e 's,/,-,g'` nl=' @@ -66,10 +66,13 @@ if test -z "${AUTOPOINT}" || test -n "${GETTEXTPATH}"; then AUTOPOINT="${GETTEXTPATH}autopoint" fi -# GNU sort is needed. Set SORT to its location (not needed if it's called -# 'sort' and already in the PATH). -if test -z "$SORT"; then - SORT=sort +# When using GNU sed, turn off as many GNU extensions as possible, +# to minimize the risk of accidentally using non-portable features. +# However, do this only for gnulib-tool itself, not for the code that +# gnulib-tool generates, since we don't want "sed --posix" to leak +# into makefiles. +if (alias) > /dev/null 2>&1 && echo | sed --posix d >/dev/null 2>&1; then + alias sed='sed --posix' fi # func_usage @@ -159,6 +162,8 @@ Options for --import: Options for --import and --update: --dry-run For --import, only print what would have been done. -s, --symbolic, --symlink Make symbolic links instead of copying files. + --local-symlink Make symbolic links instead of copying files, only + for files from the local override directory. Report bugs to ." } @@ -180,7 +185,7 @@ Written by" "Bruno Haible" "and" "Simon Josefsson" # outputs to stdout a header for a generated file. func_emit_copyright_notice () { - echo "# Copyright (C) 2004-2006 Free Software Foundation, Inc." + echo "# Copyright (C) 2004-2007 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" @@ -271,21 +276,6 @@ else } fi -# func_ln_if_changed SRC DEST -# Like ln -s, but avoids munging timestamps if the link is correct. -func_ln_if_changed () -{ - if test $# -ne 2; then - echo "usage: func_ln_if_changed SRC DEST" >&2 - fi - if test -L "$2" && test "$1" = "`func_readlink "$2"`"; then - : - else - rm -f "$2" - ln -s "$1" "$2" - fi -} - # func_relativize DIR1 DIR2 # computes a relative pathname RELDIR such that DIR1/RELDIR = DIR2. # Input: @@ -379,6 +369,45 @@ func_relconcat () done } +# func_ln SRC DEST +# Like ln -s, except that SRC is given relative to the current directory (or +# absolute), not given relative to the directory of DEST. +func_ln () +{ + case "$1" in + /*) + ln -s "$1" "$2" ;; + *) # SRC is relative. + case "$2" in + /*) + ln -s "`pwd`/$1" "$2" ;; + *) # DEST is relative too. + ln_destdir=`echo "$2" | sed -e 's,[^/]*$,,'` + test -n "$ln_destdir" || ln_destdir="." + func_relativize "$ln_destdir" "$1" + ln -s "$reldir" "$2" + ;; + esac + ;; + esac +} + +# func_ln_if_changed SRC DEST +# Like func_ln, but avoids munging timestamps if the link is correct. +func_ln_if_changed () +{ + if test $# -ne 2; then + echo "usage: func_ln_if_changed SRC DEST" >&2 + fi + ln_target=`func_readlink "$2"` + if test -L "$2" && test "$1" = "$ln_target"; then + : + else + rm -f "$2" + func_ln "$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 @@ -400,7 +429,8 @@ func_relconcat () # - autoconf_minversion minimum supported autoconf version # - do_changelog false if --no-changelog was given, : otherwise # - doit : if actions shall be executed, false if only to be printed -# - symbolic true if --symbolic was given, blank otherwise +# - symbolic true if --symlink was given, blank otherwise +# - lsymbolic true if --local-symlink was given, blank otherwise { mode= destdir= @@ -421,6 +451,7 @@ func_relconcat () do_changelog=: doit=: symbolic= + lsymbolic= supplied_opts="$@" @@ -584,6 +615,9 @@ func_relconcat () -s | --symbolic | --symboli | --symbol | --symbo | --symb | --symlink | --symlin | --symli | --syml | --sym | --sy ) symbolic=true shift ;; + --local-symlink | --local-symlin | --local-symli | --local-syml | --local-sym | --local-sy | --local-s ) + lsymbolic=true + shift ;; --help | --hel | --he | --h ) func_usage func_exit $? ;; @@ -659,11 +693,14 @@ func_relconcat () s,^dnl .*$,, s, dnl .*$,, /AC_PREREQ/ { - s,^.*AC_PREREQ([[ ]*\([^])]*\).*$,prereqs="$prereqs \1",p + s,^.*AC_PREREQ([[ ]*\([^])]*\).*$,\1,p }' - eval `sed -n -e "$my_sed_traces" < "$configure_ac"` + prereqs=`sed -n -e "$my_sed_traces" < "$configure_ac"` if test -n "$prereqs"; then - autoconf_minversion=`for version in $prereqs; do echo $version; done | $SORT -g -u | tail -1` + autoconf_minversion=` + for version in $prereqs; do echo $version; done | + LC_ALL=C sort -nru | sed 1q + ` fi fi if test -z "$autoconf_minversion"; then @@ -678,7 +715,7 @@ func_relconcat () # m4base (to avoid an error in func_import) and optional for the others. sed_trimtrailingslashes='s,\([^/]\)//*$,\1,' case "$local_gnulib_dir" in - */ ) sourcebase=`echo "$local_gnulib_dir" | sed -e "$sed_trimtrailingslashes"` ;; + */ ) local_gnulib_dir=`echo "$local_gnulib_dir" | sed -e "$sed_trimtrailingslashes"` ;; esac case "$sourcebase" in */ ) sourcebase=`echo "$sourcebase" | sed -e "$sed_trimtrailingslashes"` ;; @@ -777,12 +814,18 @@ func_all_modules () # Filter out unit test modules; they can be retrieved through # --extract-tests-module if desired. { - (cd "$gnulib_dir/modules" && ls -1) + (cd "$gnulib_dir" && find modules -type f -print | sed -e 's,^modules/,,') if test -n "$local_gnulib_dir" && test -d "$local_gnulib_dir/modules"; then - (cd "$local_gnulib_dir/modules" && ls -1 | sed -e 's,\.diff$,,') + (cd "$local_gnulib_dir" && find modules -type f -print | sed -e 's,^modules/,,' -e 's,\.diff$,,') fi } \ - | sed -e '/^CVS$/d' -e '/^ChangeLog$/d' -e '/^COPYING$/d' -e '/^README$/d' -e '/^TEMPLATE$/d' -e '/^TEMPLATE-TESTS$/d' -e '/~$/d' \ + | sed -e '/^CVS$/d' -e '/[/]CVS$/d' \ + -e '/^ChangeLog$/d' -e '/[/]ChangeLog$/d' \ + -e '/^COPYING$/d' -e '/[/]COPYING$/d' \ + -e '/^README$/d' -e '/[/]README$/d' \ + -e '/^TEMPLATE$/d' \ + -e '/^TEMPLATE-TESTS$/d' \ + -e '/~$/d' \ | sed -e '/-tests$/d' \ | LC_ALL=C sort -u } @@ -871,6 +914,7 @@ func_get_filelist () { func_lookup_file "modules/$1" sed -n -e "/^Files$sed_extract_prog" < "$lookedup_file" + echo m4/gnulib-common.m4 case "$autoconf_minversion" in 2.59) #echo m4/onceonly.m4 @@ -916,12 +960,11 @@ func_get_automake_snippet () sed_combine_lines='/\\$/{ :a N - s/\\\ -// + s/\\\n/ / s/\\$/\\/ ta }' - sed_extract_mentioned_files='s/^lib_SOURCES[ ]*+=[ ]*//p' + sed_extract_mentioned_files='s/^lib_SOURCES[ ]*+=[ ]*//p' already_mentioned_files=` \ sed -n -e "/^Makefile\.am$sed_extract_prog" < "$lookedup_file" \ | sed -e "$sed_combine_lines" \ @@ -940,6 +983,23 @@ func_get_automake_snippet () echo "EXTRA_DIST +=" $extra_files echo fi + # Synthesize also an EXTRA_lib_SOURCES augmentation. + # This is necessary so that automake can generate the right list of + # dependency rules. + # A possible approach would be to use autom4te --trace of the redefined + # AC_LIBOBJ and AC_REPLACE_FUNCS macros when creating the Makefile.am + # (use autom4te --trace, not just grep, so that AC_LIBOBJ invocations + # inside autoconf's built-in macros are not missed). + # But it's simpler and more robust to do it here, based on the file list. + # If some .c file exists and is not used with AC_LIBOBJ - for example, + # a .c file is preprocessed into another .c file for BUILT_SOURCES -, + # automake will generate a useless dependency; this is harmless. + sed_extract_c_files='/\.c$/p' + extra_files=`echo "$extra_files" | sed -n -e "$sed_extract_c_files"` + if test -n "$extra_files"; then + echo "EXTRA_lib_SOURCES +=" $extra_files + echo + fi ;; esac } @@ -1111,10 +1171,13 @@ func_modules_to_filelist () # - local_gnulib_dir from --local-dir # - modules list of modules, including dependencies # - libname library name +# - auxdir directory relative to destdir where to place build aux files # - makefile_name from --makefile-name # - libtool true if libtool will be used, false or blank otherwise # - macro_prefix prefix of gl_LIBOBJS macros to use # - actioncmd (optional) command that will reproduce this invocation +# Output: +# - uses_subdirs nonempty if object files in subdirs exist func_emit_lib_Makefile_am () { # When creating an includable Makefile.am snippet, augment variables with @@ -1140,11 +1203,8 @@ func_emit_lib_Makefile_am () echo "# Reproduce by: $actioncmd" fi echo - if test -z "$makefile_name"; then - echo "AUTOMAKE_OPTIONS = 1.5 gnits" - fi - echo - ( + uses_subdirs= + { for module in $modules; do func_verify_nontests_module if test -n "$module"; then @@ -1170,28 +1230,29 @@ func_emit_lib_Makefile_am () echo fi rm -f amsnippet.tmp + # Test whether there are some source files in subdirectories. + for f in `func_get_filelist "$module"`; do + case $f in + lib/*/*.c) uses_subdirs=yes ;; + esac + done fi done - ) > allsnippets.tmp - if grep "^[a-zA-Z0-9_]*_${perhapsLT}LIBRARIES *= *$libname\\.$libext\$" allsnippets.tmp > /dev/null; then - # One of the snippets already specifies an installation location for the - # library. Don't confuse automake by saying it should not be installed. - : - else - # By default, the generated library should not be installed. - echo "noinst_${perhapsLT}LIBRARIES $assign $libname.$libext" + } > allsnippets.tmp + if test -z "$makefile_name"; then + # If there are source files in subdirectories, prevent collision of the + # object files (example: hash.c and libxml/hash.c). + subdir_options= + if test -n "$uses_subdirs"; then + subdir_options=' subdir-objects' + fi + echo "AUTOMAKE_OPTIONS = 1.5 gnits${subdir_options}" fi echo - echo "${libname}_${libext}_SOURCES =" - # Here we use $(LIBOBJS), not @LIBOBJS@. The value is the same. However, - # automake during its analyses looks for $(LIBOBJS), not for @LIBOBJS@. - echo "${libname}_${libext}_LIBADD = \$(${macro_prefix}_${perhapsLT}LIBOBJS)" - echo "${libname}_${libext}_DEPENDENCIES = \$(${macro_prefix}_${perhapsLT}LIBOBJS)" - if test "$libtool" = true; then - echo "${libname}_${libext}_LDFLAGS = \$(AM_LDFLAGS)" - fi if test -z "$makefile_name"; then echo "noinst_HEADERS =" + echo "noinst_LIBRARIES =" + echo "noinst_LTLIBRARIES =" # Automake versions < 1.9b create an empty pkgdatadir at installation time # if you specify pkgdata_DATA to empty. This is a workaround. if grep '^pkgdata_DATA *+=' allsnippets.tmp > /dev/null; then @@ -1211,15 +1272,34 @@ func_emit_lib_Makefile_am () echo "AM_CPPFLAGS =" fi echo - cat allsnippets.tmp + if grep "^[a-zA-Z0-9_]*_${perhapsLT}LIBRARIES *= *$libname\\.$libext\$" allsnippets.tmp > /dev/null; then + # One of the snippets already specifies an installation location for the + # library. Don't confuse automake by saying it should not be installed. + : + else + # By default, the generated library should not be installed. + echo "noinst_${perhapsLT}LIBRARIES += $libname.$libext" + fi + echo + echo "${libname}_${libext}_SOURCES =" + # Here we use $(LIBOBJS), not @LIBOBJS@. The value is the same. However, + # automake during its analyses looks for $(LIBOBJS), not for @LIBOBJS@. + echo "${libname}_${libext}_LIBADD = \$(${macro_prefix}_${perhapsLT}LIBOBJS)" + echo "${libname}_${libext}_DEPENDENCIES = \$(${macro_prefix}_${perhapsLT}LIBOBJS)" + echo "EXTRA_${libname}_${libext}_SOURCES =" + if test "$libtool" = true; then + echo "${libname}_${libext}_LDFLAGS = \$(AM_LDFLAGS)" + fi + echo + cat allsnippets.tmp \ + | sed -e 's|\$(top_srcdir)/build-aux/|$(top_srcdir)/'"$auxdir"'/|g' echo echo "mostlyclean-local: mostlyclean-generic" - echo " @test -z \"\$(MOSTLYCLEANDIRS)\" || \\" - echo " for dir in \$(MOSTLYCLEANDIRS); do \\" - echo " if test -d \$\$dir; then \\" - echo " echo \"rmdir \$\$dir\"; rmdir \$\$dir; \\" - echo " fi; \\" - echo " done" + echo " @for dir in '' \$(MOSTLYCLEANDIRS); do \\" + echo " if test -n \"\$\$dir\" && test -d \$\$dir; then \\" + echo " echo \"rmdir \$\$dir\"; rmdir \$\$dir; \\" + echo " fi; \\" + echo " done" rm -f allsnippets.tmp } @@ -1317,12 +1397,11 @@ func_emit_tests_Makefile_am () echo " rm -rf SunWS_cache" echo echo "mostlyclean-local: mostlyclean-generic" - echo " @test -z \"\$(MOSTLYCLEANDIRS)\" || \\" - echo " for dir in \$(MOSTLYCLEANDIRS); do \\" - echo " if test -d \$\$dir; then \\" - echo " echo \"rmdir \$\$dir\"; rmdir \$\$dir; \\" - echo " fi; \\" - echo " done" + echo " @for dir in '' \$(MOSTLYCLEANDIRS); do \\" + echo " if test -n \"\$\$dir\" && test -d \$\$dir; then \\" + echo " echo \"rmdir \$\$dir\"; rmdir \$\$dir; \\" + echo " fi; \\" + echo " done" rm -f allsnippets.tmp } @@ -1331,8 +1410,22 @@ func_emit_tests_Makefile_am () # - macro_prefix prefix of gl_EARLY, gl_INIT macros to use func_emit_initmacro_start () { + # Overriding AC_LIBOBJ and AC_REPLACE_FUNCS has the effect of storing + # platform-dependent object files in ${macro_prefix}_LIBOBJS instead of + # LIBOBJS. The purpose is to allow several gnulib instantiations under + # a single configure.ac file. (AC_CONFIG_LIBOBJ_DIR does not allow this + # flexibility.) + # Furthermore it avoids an automake error like this when a Makefile.am + # that uses pieces of gnulib also uses $(LIBOBJ): + # automatically discovered file `error.c' should not be explicitly mentioned echo " m4_pushdef([AC_LIBOBJ], m4_defn([${macro_prefix}_LIBOBJ]))" echo " m4_pushdef([AC_REPLACE_FUNCS], m4_defn([${macro_prefix}_REPLACE_FUNCS]))" + # Overriding AC_LIBSOURCES has the same purpose of avoiding the automake + # error when a Makefile.am that uses pieces of gnulib also uses $(LIBOBJ): + # automatically discovered file `error.c' should not be explicitly mentioned + # We let automake know about the files to be distributed through the + # EXTRA_lib_SOURCES variable. + echo " m4_pushdef([AC_LIBSOURCES], m4_defn([${macro_prefix}_LIBSOURCES]))" } # func_emit_initmacro_end @@ -1340,6 +1433,7 @@ func_emit_initmacro_start () # - macro_prefix prefix of gl_EARLY, gl_INIT macros to use func_emit_initmacro_end () { + echo " m4_popdef([AC_LIBSOURCES])" echo " m4_popdef([AC_REPLACE_FUNCS])" echo " m4_popdef([AC_LIBOBJ])" echo " AC_CONFIG_COMMANDS_PRE([" @@ -1373,6 +1467,11 @@ func_emit_initmacro_done () echo "# into ${macro_prefix}_LIBOBJS instead of into LIBOBJS." echo "AC_DEFUN([${macro_prefix}_REPLACE_FUNCS]," echo " [AC_CHECK_FUNCS([\$1], , [${macro_prefix}_LIBOBJ(\$ac_func)])])" + echo + echo "# Like AC_LIBSOURCES, except that it does nothing." + echo "# We rely on EXTRA_lib..._SOURCES instead." + echo "AC_DEFUN([${macro_prefix}_LIBSOURCES]," + echo " [])" } # func_import modules @@ -1396,6 +1495,8 @@ func_emit_initmacro_done () # - autoconf_minversion minimum supported autoconf version # - doit : if actions shall be executed, false if only to be printed # - symbolic true if files should be symlinked, copied otherwise +# - lsymbolic true if files from local_gnulib_dir should be symlinked, +# copied otherwise func_import () { # Get the cached settings. @@ -1616,52 +1717,50 @@ func_import () func_append old_files " m4/gnulib-tool.m4" fi + sed_rewrite_old_files="\ + s,^build-aux/,$auxdir/, + s,^doc/,$cached_docbase/, + s,^lib/,$cached_sourcebase/, + s,^m4/,$cached_m4base/, + s,^tests/,$cached_testsbase/," + sed_rewrite_new_files="\ + s,^build-aux/,$auxdir/, + s,^doc/,$docbase/, + s,^lib/,$sourcebase/, + s,^m4/,$m4base/, + s,^tests/,$testsbase/," + # Create directories. - if test ! -d "$destdir/$sourcebase"; then - if $doit; then - echo "Creating directory $destdir/$sourcebase" - mkdir "$destdir/$sourcebase" || func_fatal_error "failed" - else - echo "Create directory $destdir/$sourcebase" + { echo "$sourcebase" + echo "$m4base" + docfiles=`echo "$files" | sed -n -e 's,^doc/,,p'` + if test -n "$docfiles"; then + echo "$docbase" fi - fi - if test ! -d "$destdir/$m4base"; then - if $doit; then - echo "Creating directory $destdir/$m4base" - mkdir "$destdir/$m4base" || func_fatal_error "failed" - else - echo "Create directory $destdir/$m4base" + if test -n "$inctests"; then + echo "$testsbase" fi - fi - docfiles=`echo "$files" | sed -n -e 's,^doc/,,p'` - if test -n "$docfiles"; then - if test ! -d "$destdir/$docbase"; then - if $doit; then - echo "Creating directory $destdir/$docbase" - mkdir "$destdir/$docbase" || func_fatal_error "failed" - else - echo "Create directory $destdir/$docbase" - fi - fi - fi - if test -n "$inctests"; then - if test ! -d "$destdir/$testsbase"; then - if $doit; then - echo "Creating directory $destdir/$testsbase" - mkdir "$destdir/$testsbase" || func_fatal_error "failed" - else - echo "Create directory $destdir/$testsbase" + echo "$auxdir" + for f in $files; do echo $f; done \ + | sed -e "$sed_rewrite_new_files" \ + | sed -n -e 's,^\(.*\)/[^/]*,\1,p' \ + | LC_ALL=C sort -u + } > "$tmp"/dirs + { # Rearrange file descriptors. Needed because "while ... done < ..." + # constructs are executed in a subshell e.g. by Solaris 10 /bin/sh. + exec 5<&0 < "$tmp"/dirs + while read d; do + if test ! -d "$destdir/$d"; then + if $doit; then + echo "Creating directory $destdir/$d" + mkdir -p "$destdir/$d" || func_fatal_error "failed" + else + echo "Create directory $destdir/$d" + fi fi - fi - fi - if test ! -d "$destdir/$auxdir"; then - if $doit; then - echo "Creating directory $destdir/$auxdir" - mkdir "$destdir/$auxdir" || func_fatal_error "failed" - else - echo "Create directory $destdir/$auxdir" - fi - fi + done + exec 0<&5 5<&- + } # func_dest_tmpfilename file # determines the name of a temporary file (file is relative to destdir). @@ -1682,18 +1781,6 @@ func_import () # Copy files or make symbolic links. Remove obsolete files. delimiter=' ' - sed_rewrite_old_files="\ - s,^build-aux/,$auxdir/, - s,^doc/,$cached_docbase/, - s,^lib/,$cached_sourcebase/, - s,^m4/,$cached_m4base/, - s,^tests/,$cached_testsbase/," - sed_rewrite_new_files="\ - s,^build-aux/,$auxdir/, - s,^doc/,$docbase/, - s,^lib/,$sourcebase/, - s,^m4/,$m4base/, - s,^tests/,$testsbase/," # Construct a table with 2 columns: rewritten-file-name original-file-name, # representing the files according to the last gnulib-tool invocation. for f in $old_files; do echo $f; done \ @@ -1750,7 +1837,10 @@ func_import () echo "Replacing file $g (non-gnulib code backuped in ${g}~) !!" fi mv -f "$destdir/$g" "$destdir/${g}~" || func_fatal_error "failed" - if test -n "$symbolic" && test -z "$lookedup_tmp" \ + if { test -n "$symbolic" \ + || { test -n "$lsymbolic" \ + && test "$lookedup_file" = "$local_gnulib_dir/$f"; }; } \ + && test -z "$lookedup_tmp" \ && cmp "$lookedup_file" "$tmpfile" > /dev/null; then func_ln_if_changed "$lookedup_file" "$destdir/$g" else @@ -1770,7 +1860,10 @@ func_import () # frequently that developers don't put autogenerated files into CVS. if $doit; then echo "Copying file $g" - if test -n "$symbolic" && test -z "$lookedup_tmp" \ + if { test -n "$symbolic" \ + || { test -n "$lsymbolic" \ + && test "$lookedup_file" = "$local_gnulib_dir/$f"; }; } \ + && test -z "$lookedup_tmp" \ && cmp "$lookedup_file" "$tmpfile" > /dev/null; then func_ln_if_changed "$lookedup_file" "$destdir/$g" else @@ -1828,7 +1921,7 @@ func_import () func_append actioncmd " --lgpl" fi if test -n "$makefile_name"; then - func_append actioncmd " --makefile_name=$makefile_name" + func_append actioncmd " --makefile-name=$makefile_name" fi if test "$libtool" = true; then func_append actioncmd " --libtool" @@ -1965,6 +2058,9 @@ func_import () echo " m4_pattern_allow([^gl_LIBOBJS\$])dnl a variable" echo " m4_pattern_allow([^gl_LTLIBOBJS\$])dnl a variable" echo " AC_REQUIRE([AC_PROG_RANLIB])" + if test -n "$uses_subdirs"; then + echo " AC_REQUIRE([AM_PROG_CC_C_O])" + fi if grep AC_GNU_SOURCE "$destdir"/$m4base/*.m4 >/dev/null 2>/dev/null; then echo " AC_REQUIRE([AC_GNU_SOURCE])" fi @@ -2096,10 +2192,17 @@ func_import () echo "Finished." echo echo "You may need to add #include directives for the following .h files." + # Intersect $specified_modules and $modules + # (since $specified_modules is not necessarily of subset of $modules - some + # may have been skipped through --avoid, and since the elements of $modules + # but not in $specified_modules can go away without explicit notice - through + # changes in the module dependencies). + echo "$specified_modules" > "$tmp"/modules1 # a sorted list, one module per line + echo "$modules" > "$tmp"/modules2 # also a sorted list, one module per line # First the #include <...> directives without #ifs, sorted for convenience, # then the #include "..." directives without #ifs, sorted for convenience, # then the #include directives that are surrounded by #ifs. Not sorted. - for module in $modules; do + for module in `LC_ALL=C join "$tmp"/modules1 "$tmp"/modules2`; do include_directive=`func_get_include_directive "$module"` case "$nl$include_directive" in *"$nl#if"*) @@ -2161,11 +2264,36 @@ func_create_testdir () # All modules together. # Except config-h, which breaks all modules which use HAVE_CONFIG_H. # Except fnmatch-posix, which conflicts with fnmatch-gnu. FIXME. + # Except ftruncate, mountlist, which abort the configuration on mingw. FIXME. modules=`func_all_modules` - modules=`for m in $modules; do if test $m != config-h && test $m != fnmatch-posix; then echo $m; fi; done` + modules=`for m in $modules; do case $m in config-h | fnmatch-posix | ftruncate | mountlist) ;; *) echo $m;; esac; done` fi modules=`for m in $modules; do echo $m; done | LC_ALL=C sort -u` + # Check that the license of every module is consistent with the license of + # its dependencies. + saved_modules="$modules" + for requested_module in $saved_modules; do + requested_license=`func_get_license "$requested_module"` + if test "$requested_license" != GPL; then + # Here we use func_modules_transitive_closure, not just + # func_get_dependencies, so that we also detect weird situations like + # an LGPL module which depends on a GPLed build tool module which depends + # on a GPL module. + modules="$requested_module" + func_modules_transitive_closure + for module in $modules; do + license=`func_get_license "$module"` + case $license in + LGPL | 'GPLed build tool') ;; + 'public domain' | 'unlimited' | 'unmodifiable license text') ;; + *) echo "warning: module $requested_module depends on a module with an incompatible license: $module" 1>&2 ;; + esac + done + fi + done + modules="$saved_modules" + # Subdirectory names. sourcebase=gllib m4base=glm4 @@ -2186,26 +2314,30 @@ func_create_testdir () echo "File list:" echo "$files" | sed -e 's/^/ /' - # Create directories. - for d in `echo "$files" | sed -n -e 's,^\(.*\)/[^/]*,\1,p'`; do - case "$d" in - build-aux) mkdir -p "$testdir/$auxdir" ;; - doc) mkdir -p "$testdir/$docbase" ;; - lib) mkdir -p "$testdir/$sourcebase" ;; - m4) mkdir -p "$testdir/$m4base" ;; - tests) mkdir -p "$testdir/$testsbase" ;; - *) mkdir -p "$testdir/$d" ;; - esac - done - - # Copy files or make symbolic links. - delimiter=' ' sed_rewrite_files="\ s,^build-aux/,$auxdir/, s,^doc/,$docbase/, s,^lib/,$sourcebase/, s,^m4/,$m4base/, s,^tests/,$testsbase/," + + # Create directories. + for f in $files; do echo $f; done \ + | sed -e "$sed_rewrite_files" \ + | sed -n -e 's,^\(.*\)/[^/]*,\1,p' \ + | LC_ALL=C sort -u \ + > "$tmp"/dirs + { # Rearrange file descriptors. Needed because "while ... done < ..." + # constructs are executed in a subshell e.g. by Solaris 10 /bin/sh. + exec 5<&0 < "$tmp"/dirs + while read d; do + mkdir -p "$testdir/$d" + done + exec 0<&5 5<&- + } + + # Copy files or make symbolic links. + delimiter=' ' for f in $files; do echo $f; done \ | sed -e "s,^.*\$,&$delimiter&," -e "$sed_rewrite_files" \ | LC_ALL=C sort \ @@ -2219,10 +2351,12 @@ func_create_testdir () cp -p "$lookedup_file" "$testdir/$g" else ln "$lookedup_file" "$testdir/$g" 2>/dev/null || - if test -z "$symbolic"; then - cp -p "$lookedup_file" "$testdir/$g" + if { test -n "$symbolic" \ + || { test -n "$lsymbolic" \ + && test "$lookedup_file" = "$local_gnulib_dir/$f"; }; }; then + func_ln "$lookedup_file" "$testdir/$g" else - ln -s "$lookedup_file" "$testdir/$g" + cp -p "$lookedup_file" "$testdir/$g" fi fi done @@ -2296,7 +2430,6 @@ func_create_testdir () echo "gl_libdeps=" echo "gl_ltlibdeps=" fi - echo "gl_source_base='$testsbase'" # Wrap the set of autoconf snippets into an autoconf macro that is then # invoked. This is needed because autoconf does not support AC_REQUIRE # at the top level: @@ -2306,20 +2439,17 @@ func_create_testdir () # expansion total). echo "AC_DEFUN([gl_INIT], [" func_emit_initmacro_start - if test "$auxdir" != "build-aux"; then - sed_replace_build_aux=' - :a - /AC_CONFIG_FILES(.*:build-aux\/.*)/{ - s|AC_CONFIG_FILES(\(.*\):build-aux/\(.*\))|AC_CONFIG_FILES(\1:../'"$auxdir"'/\2)| - ba - }' - sed_replace_build_aux=`echo "$sed_replace_build_aux" | sed -e 1d -e 's/^ *//'` - else - sed_replace_build_aux= - fi + sed_replace_build_aux=' + :a + /AC_CONFIG_FILES(.*:build-aux\/.*)/{ + s|AC_CONFIG_FILES(\(.*\):build-aux/\(.*\))|AC_CONFIG_FILES(\1:../'"$auxdir"'/\2)| + ba + }' + sed_replace_build_aux=`echo "$sed_replace_build_aux" | sed -e 1d -e 's/^ *//'` # 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. + echo "gl_source_base='../$sourcebase'" for module in $modules; do func_verify_nontests_module if test -n "$module"; then @@ -2327,6 +2457,7 @@ func_create_testdir () | sed -e "$sed_replace_build_aux" fi done + echo "gl_source_base='.'" for module in $modules; do func_verify_tests_module if test -n "$module"; then @@ -2383,6 +2514,10 @@ func_create_testdir () echo "AC_PROG_INSTALL" echo "AC_PROG_MAKE_SET" echo + echo "# For autobuild." + echo "AC_CANONICAL_BUILD" + echo "AC_CANONICAL_HOST" + echo echo "m4_pattern_forbid([^gl_[A-Z]])dnl the gnulib macro namespace" echo "m4_pattern_allow([^gl_ES\$])dnl a valid locale name" echo "m4_pattern_allow([^gl_LIBOBJS\$])dnl a variable" @@ -2390,6 +2525,10 @@ func_create_testdir () echo echo "AC_PROG_RANLIB" echo + if test -n "$uses_subdirs"; then + echo "AM_PROG_CC_C_O" + echo + fi if grep AC_GNU_SOURCE "$testdir/$m4base"/*.m4 >/dev/null 2>/dev/null; then echo "AC_GNU_SOURCE" echo @@ -2475,33 +2614,59 @@ func_create_testdir () # autopoint, which brings in older versions of some of our .m4 files. if test -f $m4base/gettext.m4; then echo "executing ${AUTOPOINT} --force" - ${AUTOPOINT} --force + ${AUTOPOINT} --force || func_exit 1 for f in $m4base/*.m4~; do - mv $f `echo $f | sed -e 's,~$,,'` + mv -f $f `echo $f | sed -e 's,~$,,'` || func_exit 1 done fi - echo "executing ${ACLOCAL} --force -I $m4base" - ${ACLOCAL} --force -I $m4base + echo "executing ${ACLOCAL} -I $m4base" + ${ACLOCAL} -I $m4base || func_exit 1 if ! test -d build-aux; then echo "executing mkdir build-aux" - mkdir build-aux + mkdir build-aux || func_exit 1 fi - echo "executing ${AUTOCONF} --force" - ${AUTOCONF} --force - echo "executing ${AUTOHEADER} --force" - ${AUTOHEADER} --force - echo "executing ${AUTOMAKE} --add-missing --copy --force-missing" - ${AUTOMAKE} --add-missing --copy --force-missing - ) + echo "executing ${AUTOCONF}" + ${AUTOCONF} || func_exit 1 + echo "executing ${AUTOHEADER}" + ${AUTOHEADER} || func_exit 1 + echo "executing ${AUTOMAKE} --add-missing --copy" + ${AUTOMAKE} --add-missing --copy || func_exit 1 + ) || func_exit 1 + if test -n "$inctests"; then + # Create autogenerated files. + (cd "$testdir/$testsbase" || func_exit 1 + # Do not use "${AUTORECONF} --force --install", because it may invoke + # autopoint, which brings in older versions of some of our .m4 files. + if test -f ../$m4base/gettext.m4; then + echo "executing ${AUTOPOINT} --force" + ${AUTOPOINT} --force || func_exit 1 + for f in ../$m4base/*.m4~; do + mv -f $f `echo $f | sed -e 's,~$,,'` || func_exit 1 + done + fi + echo "executing ${ACLOCAL} -I ../$m4base" + ${ACLOCAL} -I ../$m4base || func_exit 1 + if ! test -d ../build-aux; then + echo "executing mkdir ../build-aux" + mkdir ../build-aux + fi + echo "executing ${AUTOCONF}" + ${AUTOCONF} || func_exit 1 + echo "executing ${AUTOHEADER}" + ${AUTOHEADER} || func_exit 1 + echo "executing ${AUTOMAKE} --add-missing --copy" + ${AUTOMAKE} --add-missing --copy || func_exit 1 + ) || func_exit 1 + fi if grep '^BUILT_SOURCES *+=' "$testdir/$sourcebase/Makefile.am" > /dev/null; then (cd "$testdir" - ./configure + ./configure || func_exit 1 cd "$sourcebase" echo 'built_sources: $(BUILT_SOURCES)' >> Makefile - make built_sources + make built_sources || func_exit 1 cd .. - make distclean - ) + make distclean || func_exit 1 + ) || func_exit 1 fi } @@ -2558,14 +2723,14 @@ func_create_megatestdir () # recursively, but the subdirectories are already finished, therefore # calling autoreconf here would only waste lots of CPU time. echo "executing ${ACLOCAL}" - ${ACLOCAL} + ${ACLOCAL} || func_exit 1 echo "executing mkdir build-aux" mkdir build-aux echo "executing ${AUTOCONF}" - ${AUTOCONF} + ${AUTOCONF} || func_exit 1 echo "executing ${AUTOMAKE} --add-missing --copy" - ${AUTOMAKE} --add-missing --copy - ) + ${AUTOMAKE} --add-missing --copy || func_exit 1 + ) || func_exit 1 } case $mode in @@ -2734,10 +2899,10 @@ case $mode in cd "$destdir" mkdir build cd build - ../configure - make - make check - make distclean + ../configure || func_exit 1 + make || func_exit 1 + make check || func_exit 1 + make distclean || func_exit 1 remaining=`find . -type f -print` if test -n "$remaining"; then echo "Remaining files:" $remaining 1>&2