New module 'posix_spawn_file_actions_destroy'.
[gnulib.git] / gnulib-tool
index 4a1d02e..b0f4c18 100755 (executable)
@@ -83,6 +83,10 @@ if (alias) > /dev/null 2>&1 && echo | sed --posix -e d >/dev/null 2>&1; then
   alias sed='sed --posix'
 fi
 
+# sed_noop is a sed expression that does nothing.
+# An empty expression does not work with the native 'sed' on AIX 6.1.
+sed_noop='s,x,x,'
+
 # func_usage
 # outputs to stdout the --help usage message.
 func_usage ()
@@ -212,7 +216,7 @@ q
     date=`echo "$date" | sed -e "$sed_year_before_time"`
     # Use GNU date to compute the time in GMT.
     date=`date -d "$date" -u +"%Y-%m-%d %H:%M:%S"`
-    version=' '`"$gnulib_dir"/build-aux/git-version-gen /dev/null | sed -e 's/-dirty/-modified/'`
+    version=' '`cd "$gnulib_dir" && ./build-aux/git-version-gen /dev/null | sed -e 's/-dirty/-modified/'`
   else
     if test -d "$gnulib_dir"/CVS \
        && (cvs --version) >/dev/null 2>/dev/null; then
@@ -258,7 +262,9 @@ func_emit_copyright_notice ()
 }
 
 # func_exit STATUS
-# exit with status
+# exits with a given status.
+# This function needs to be used, rather than 'exit', when a 'trap' handler is
+# in effect that refers to $?.
 func_exit ()
 {
   (exit $1); exit $1
@@ -266,14 +272,16 @@ func_exit ()
 
 # func_gnulib_dir
 # locates the directory where the gnulib repository lives
+# Input:
+# - progname                 name of this program
 # Sets variables
 # - self_abspathname         absolute pathname of gnulib-tool
 # - gnulib_dir               absolute pathname of gnulib repository
 func_gnulib_dir ()
 {
-  case "$0" in
-    /*) self_abspathname="$0" ;;
-    */*) self_abspathname=`pwd`/"$0" ;;
+  case "$progname" in
+    /*) self_abspathname="$progname" ;;
+    */*) self_abspathname=`pwd`/"$progname" ;;
     *)
       # Look in $PATH.
       # Iterate through the elements of $PATH.
@@ -320,8 +328,8 @@ func_gnulib_dir ()
       for d in $pathx; do
         IFS="$save_IFS"
         test -z "$d" && d=.
-        if test -x "$d/$0" && test ! -d "$d/$0"; then
-          self_abspathname="$d/$0"
+        if test -x "$d/$progname" && test ! -d "$d/$progname"; then
+          self_abspathname="$d/$progname"
           break
         fi
       done
@@ -345,6 +353,8 @@ func_gnulib_dir ()
 
 # func_tmpdir
 # creates a temporary directory.
+# Input:
+# - progname                 name of this program
 # Sets variable
 # - tmp             pathname of freshly created temporary directory
 func_tmpdir ()
@@ -369,7 +379,7 @@ func_tmpdir ()
     (umask 077 && mkdir "$tmp")
   } ||
   {
-    echo "$0: cannot create a temporary directory in $TMPDIR" >&2
+    echo "$progname: cannot create a temporary directory in $TMPDIR" >&2
     func_exit 1
   }
 }
@@ -392,10 +402,12 @@ fi
 
 # func_fatal_error message
 # outputs to stderr a fatal error message, and terminates the program.
+# Input:
+# - progname                 name of this program
 func_fatal_error ()
 {
-  echo "gnulib-tool: *** $1" 1>&2
-  echo "gnulib-tool: *** Stop." 1>&2
+  echo "$progname: *** $1" 1>&2
+  echo "$progname: *** Stop." 1>&2
   func_exit 1
 }
 
@@ -1658,6 +1670,10 @@ func_execute_command ()
 # - po_domain       prefix of i18n domain to use (without -gnulib suffix)
 # - actioncmd       (optional) command that will reproduce this invocation
 # - for_test        true if creating a package for testing, false otherwise
+# - destfile        filename relative to destdir of makefile being generated
+# Input/Output:
+# - makefile_am_edits and makefile_am_edit${edit}_{dir,var,val}
+#                   list of edits to be done to Makefile.am variables
 # Output:
 # - uses_subdirs    nonempty if object files in subdirs exist
 func_emit_lib_Makefile_am ()
@@ -1672,7 +1688,7 @@ func_emit_lib_Makefile_am ()
   if test "$libtool" = true; then
     libext=la
     perhapsLT=LT
-    sed_eliminate_LDFLAGS=
+    sed_eliminate_LDFLAGS="$sed_noop"
   else
     libext=a
     perhapsLT=
@@ -1685,7 +1701,7 @@ func_emit_lib_Makefile_am ()
     # situation. Turn check_PROGRAMS into noinst_PROGRAMS.
     sed_transform_check_PROGRAMS='s,check_PROGRAMS,noinst_PROGRAMS,g'
   else
-    sed_transform_check_PROGRAMS=
+    sed_transform_check_PROGRAMS="$sed_noop"
   fi
   echo "## DO NOT EDIT! GENERATED AUTOMATICALLY!"
   echo "## Process this file with automake to produce Makefile.in."
@@ -1742,6 +1758,7 @@ func_emit_lib_Makefile_am ()
   fi
   echo
   if test -z "$makefile_name"; then
+    echo "SUBDIRS ="
     echo "noinst_HEADERS ="
     echo "noinst_LIBRARIES ="
     echo "noinst_LTLIBRARIES ="
@@ -1760,6 +1777,22 @@ func_emit_lib_Makefile_am ()
     echo "CLEANFILES ="
     echo "DISTCLEANFILES ="
     echo "MAINTAINERCLEANFILES ="
+  fi
+  # Execute edits that apply to the Makefile.am being generated.
+  edit=0
+  while test $edit != $makefile_am_edits; do
+    edit=`expr $edit + 1`
+    eval dir=\"\$makefile_am_edit${edit}_dir\"
+    eval var=\"\$makefile_am_edit${edit}_var\"
+    eval val=\"\$makefile_am_edit${edit}_val\"
+    if test -n "$var"; then
+      if test "${dir}Makefile.am" = "$destfile" || test "./${dir}Makefile.am" = "$destfile"; then
+        echo "${var} += ${val}"
+        eval "makefile_am_edit${edit}_var="
+      fi
+    fi
+  done
+  if test -z "$makefile_name"; then
     echo
     echo "AM_CPPFLAGS ="
   fi
@@ -1891,13 +1924,17 @@ func_emit_po_POTFILES_in ()
 # - macro_prefix    prefix of gl_LIBOBJS macros to use
 # - for_test        true if creating a package for testing, false otherwise
 # - use_libtests    true if a libtests.a should be built, false otherwise
+# - destfile        filename relative to destdir of makefile being generated
+# Input/Output:
+# - makefile_am_edits and makefile_am_edit${edit}_{dir,var,val}
+#                   list of edits to be done to Makefile.am variables
 # Output:
 # - uses_subdirs    nonempty if object files in subdirs exist
 func_emit_tests_Makefile_am ()
 {
   if test "$libtool" = true; then
     libext=la
-    sed_eliminate_LDFLAGS=
+    sed_eliminate_LDFLAGS="$sed_noop"
   else
     libext=a
     sed_eliminate_LDFLAGS='/^lib_LDFLAGS[       ]*+=/d'
@@ -1909,7 +1946,7 @@ func_emit_tests_Makefile_am ()
     # situation. Turn check_PROGRAMS into noinst_PROGRAMS.
     sed_transform_check_PROGRAMS='s,check_PROGRAMS,noinst_PROGRAMS,g'
   else
-    sed_transform_check_PROGRAMS=
+    sed_transform_check_PROGRAMS="$sed_noop"
   fi
   testsbase_inverse=`echo "$testsbase" | sed -e 's,/$,,' | sed -e 's,[^/][^/]*,..,g'`
   echo "## DO NOT EDIT! GENERATED AUTOMATICALLY!"
@@ -2002,6 +2039,20 @@ func_emit_tests_Makefile_am ()
   echo "CLEANFILES ="
   echo "DISTCLEANFILES ="
   echo "MAINTAINERCLEANFILES ="
+  # Execute edits that apply to the Makefile.am being generated.
+  edit=0
+  while test $edit != $makefile_am_edits; do
+    edit=`expr $edit + 1`
+    eval dir=\"\$makefile_am_edit${edit}_dir\"
+    eval var=\"\$makefile_am_edit${edit}_var\"
+    eval val=\"\$makefile_am_edit${edit}_val\"
+    if test -n "$var"; then
+      if test "${dir}Makefile.am" = "$destfile" || test "./${dir}Makefile.am" = "$destfile"; then
+        echo "${var} += ${val}"
+        eval "makefile_am_edit${edit}_var="
+      fi
+    fi
+  done
   echo
   echo "AM_CPPFLAGS = \\"
   echo "  -I. -I\$(srcdir) \\"
@@ -2471,6 +2522,7 @@ func_import ()
 
   # If --lgpl, verify that the licenses of modules are compatible.
   if test -n "$lgpl"; then
+    license_incompatibilities=
     for module in $main_modules; do
       license=`func_get_license $module`
       case $license in
@@ -2481,13 +2533,13 @@ func_import ()
             yes | 3)
               case $license in
                 LGPL | LGPLv2+) ;;
-                *) func_fatal_error "incompatible license on module $module: $license" ;;
+                *) func_append license_incompatibilities "$module $license$nl" ;;
               esac
               ;;
             2)
               case $license in
                 LGPLv2+) ;;
-                *) func_fatal_error "incompatible license on module $module: $license" ;;
+                *) func_append license_incompatibilities "$module $license$nl" ;;
               esac
               ;;
             *) func_fatal_error "invalid value lgpl=$lgpl" ;;
@@ -2495,6 +2547,13 @@ func_import ()
           ;;
       esac
     done
+    if test -n "$license_incompatibilities"; then
+      # Format the license incompatibilities as a table.
+      sed_expand_column1_width50_indent17='s,^\([^ ]*\) ,\1                                                   ,
+s,^\(.................................................[^ ]*\) *,                 \1 ,'
+      license_incompatibilities=`echo "$license_incompatibilities" | sed -e "$sed_expand_column1_width50_indent17"`
+      func_fatal_error "incompatible license on modules:$nl$license_incompatibilities"
+    fi
   fi
 
   # Show banner notice of every module.
@@ -2805,6 +2864,7 @@ func_import ()
     func_append actioncmd " --po-base=$pobase"
   fi
   func_append actioncmd " --doc-base=$docbase"
+  func_append actioncmd " --tests-base=$testsbase"
   func_append actioncmd " --aux-dir=$auxdir"
   if test -n "$inctests"; then
     func_append actioncmd " --with-tests"
@@ -2850,8 +2910,61 @@ func_import ()
   # Create normal Makefile.ams.
   for_test=false
 
+  # Setup list of Makefile.am edits that are to be performed afterwards.
+  # Some of these edits apply to files that we will generate; others are
+  # under the responsibility of the developer.
+  makefile_am_edits=0
+  # func_note_Makefile_am_edit dir var value
+  # remembers that ${dir}Makefile.am needs to be edited to that ${var} mentions
+  # ${value}.
+  func_note_Makefile_am_edit ()
+  {
+    makefile_am_edits=`expr $makefile_am_edits + 1`
+    eval makefile_am_edit${makefile_am_edits}_dir=\"\$1\"
+    eval makefile_am_edit${makefile_am_edits}_var=\"\$2\"
+    eval makefile_am_edit${makefile_am_edits}_val=\"\$3\"
+  }
+  if test "$makefile_am" = Makefile.am; then
+    sourcebase_dir=`echo "$sourcebase" | sed -n -e 's,/[^/]*$,/,p'`
+    sourcebase_base=`basename "$sourcebase"`
+    func_note_Makefile_am_edit "$sourcebase_dir" SUBDIRS "$sourcebase_base"
+  fi
+  if test -n "$pobase"; then
+    pobase_dir=`echo "$pobase" | sed -n -e 's,/[^/]*$,/,p'`
+    pobase_base=`basename "$pobase"`
+    func_note_Makefile_am_edit "$pobase_dir" SUBDIRS "$pobase_base"
+  fi
+  if test -n "$inctests"; then
+    if test "$makefile_am" = Makefile.am; then
+      testsbase_dir=`echo "$testsbase" | sed -n -e 's,/[^/]*$,/,p'`
+      testsbase_base=`basename "$testsbase"`
+      func_note_Makefile_am_edit "$testsbase_dir" SUBDIRS "$testsbase_base"
+    fi
+  fi
+  func_note_Makefile_am_edit "" ACLOCAL_AMFLAGS "-I ${m4base}"
+  {
+    # Find the first parent directory of $m4base that contains or will contain
+    # a Makefile.am.
+    sed_last='s,^.*/\([^/][^/]*\)//*$,\1/,
+s,//*$,/,'
+    sed_butlast='s,[^/][^/]*//*$,,'
+    dir1="${m4base}/"; dir2=""
+    while test -n "$dir1" \
+          && ! { test -f "${destdir}/${dir1}Makefile.am" \
+                 || test "${dir1}Makefile.am" = "$sourcebase/$makefile_am" \
+                 || test "./${dir1}Makefile.am" = "$sourcebase/$makefile_am" \
+                 || { test -n "$inctests" \
+                      && { test "${dir1}Makefile.am" = "$testsbase/$makefile_am" \
+                           || test "./${dir1}Makefile.am" = "$testsbase/$makefile_am"; }; }; }; do
+      dir2=`echo "$dir1" | sed -e "$sed_last"`"$dir2"
+      dir1=`echo "$dir1" | sed -e "$sed_butlast"`
+    done
+    func_note_Makefile_am_edit "$dir1" EXTRA_DIST "${dir2}gnulib-cache.m4"
+  }
+
   # Create library makefile.
   func_dest_tmpfilename $sourcebase/$makefile_am
+  destfile="$sourcebase/$makefile_am"
   modules="$main_modules"
   func_emit_lib_Makefile_am > "$tmpfile"
   if test -f "$destdir"/$sourcebase/$makefile_am; then
@@ -3153,7 +3266,7 @@ func_import ()
           ba
         }'
     else
-      sed_replace_build_aux=
+      sed_replace_build_aux="$sed_noop"
     fi
     func_emit_initmacro_start $macro_prefix
     echo "  gl_source_base='$sourcebase'"
@@ -3245,6 +3358,7 @@ func_import ()
   if test -n "$inctests"; then
     # Create tests makefile.
     func_dest_tmpfilename $testsbase/$makefile_am
+    destfile="$testsbase/$makefile_am"
     modules="$testsrelated_modules"
     func_emit_tests_Makefile_am > "$tmpfile"
     if test -f "$destdir"/$testsbase/$makefile_am; then
@@ -3437,36 +3551,16 @@ func_import ()
       echo "  - \"include $makefile_name\" from within \"$testsbase/Makefile.am\","
     fi
   fi
-  if test "$makefile_am" = Makefile.am; then
-    sourcebase_dir=`echo "$sourcebase" | sed -n -e 's,/[^/]*$,/,p'`
-    sourcebase_base=`basename "$sourcebase"`
-    echo "  - mention \"${sourcebase_base}\" in SUBDIRS in ${sourcebase_dir}Makefile.am,"
-  fi
-  if test -n "$pobase"; then
-    pobase_dir=`echo "$pobase" | sed -n -e 's,/[^/]*$,/,p'`
-    pobase_base=`basename "$pobase"`
-    echo "  - mention \"${pobase_base}\" in SUBDIRS in ${pobase_dir}Makefile.am,"
-  fi
-  if test -n "$inctests"; then
-    if test "$makefile_am" = Makefile.am; then
-      testsbase_dir=`echo "$testsbase" | sed -n -e 's,/[^/]*$,/,p'`
-      testsbase_base=`basename "$testsbase"`
-      echo "  - mention \"${testsbase_base}\" in SUBDIRS in ${testsbase_dir}Makefile.am,"
+  edit=0
+  while test $edit != $makefile_am_edits; do
+    edit=`expr $edit + 1`
+    eval dir=\"\$makefile_am_edit${edit}_dir\"
+    eval var=\"\$makefile_am_edit${edit}_var\"
+    eval val=\"\$makefile_am_edit${edit}_val\"
+    if test -n "$var"; then
+      echo "  - mention \"${val}\" in ${var} in ${dir}Makefile.am,"
     fi
-  fi
-  echo "  - mention \"-I ${m4base}\" in ACLOCAL_AMFLAGS in Makefile.am,"
-  {
-    # Find the first parent directory of $m4base that contains a Makefile.am.
-    sed_last='s,^.*/\([^/][^/]*\)//*$,\1/,
-s,//*$,/,'
-    sed_butlast='s,[^/][^/]*//*$,,'
-    dir1="${m4base}/"; dir2=""
-    while test -n "$dir1" && test ! -f "${destdir}/${dir1}Makefile.am"; do
-      dir2=`echo "$dir1" | sed -e "$sed_last"`"$dir2"
-      dir1=`echo "$dir1" | sed -e "$sed_butlast"`
-    done
-    echo "  - mention ${dir2}gnulib-cache.m4 in EXTRA_DIST in ${dir1}Makefile.am."
-  }
+  done
   echo "  - invoke ${macro_prefix}_EARLY in $configure_ac, right after AC_PROG_CC,"
   echo "  - invoke ${macro_prefix}_INIT in $configure_ac."
 }
@@ -3623,8 +3717,12 @@ func_create_testdir ()
   # Create Makefile.ams that are for testing.
   for_test=true
 
+  # No special edits are needed.
+  makefile_am_edits=0
+
   # Create $sourcebase/Makefile.am.
   mkdir -p "$testdir/$sourcebase"
+  destfile="$sourcebase/Makefile.am"
   func_emit_lib_Makefile_am > "$testdir/$sourcebase/Makefile.am"
   any_uses_subdirs="$uses_subdirs"
 
@@ -3660,6 +3758,7 @@ func_create_testdir ()
     auxdir=`echo "$testsbase/"|sed 's%[^/][^/]*//*%../%g'`"$auxdir"
     # Create $testsbase/Makefile.am.
     use_libtests=false
+    destfile="$testsbase/Makefile.am"
     func_emit_tests_Makefile_am > "$testdir/$testsbase/Makefile.am"
     any_uses_subdirs="$any_uses_subdirs$uses_subdirs"
     # Create $testsbase/configure.ac.
@@ -3830,7 +3929,7 @@ func_create_testdir ()
          ba
        }'
    else
-     sed_replace_build_aux=
+     sed_replace_build_aux="$sed_noop"
    fi
    func_emit_initmacro_start $macro_prefix
    echo "gl_source_base='$sourcebase'"