bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 2/4] gnulib-tool: avoid forks with func_get_* functions.


From: Ralf Wildenhues
Subject: [PATCH 2/4] gnulib-tool: avoid forks with func_get_* functions.
Date: Sun, 28 Dec 2008 11:19:19 +0100
User-agent: Mutt/1.5.18 (2008-05-17)

* gnulib-tool (func_get_description)
(func_get_status, func_get_notice, func_get_filelist)
(func_get_dependencies, func_get_autoconf_early_snippet)
(func_get_autoconf_snippet, func_get_automake_snippet)
(func_get_include_directive, func_get_link_directive)
(func_get_license, func_get_maintainer, func_get_tests_module):
Change semantics so that each function sets an output variable
instead of printing the result to stdout.  Adjust callers.
(func_modules_transitive_closure, func_modules_add_dummy)
(func_modules_notice, func_modules_to_filelist)
(func_emit_lib_Makefile_am, func_emit_tests_Makefile_am)
(func_import, func_note_Makefile_am_edit, func_done_dir)
(func_create_testdir, func_create_megatestdir): Likewise,
adjust callers of func_get_* functions.
---
 gnulib-tool |  184 +++++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 128 insertions(+), 56 deletions(-)

diff --git a/gnulib-tool b/gnulib-tool
index d5eb9df..c172d6c 100755
--- a/gnulib-tool
+++ b/gnulib-tool
@@ -1365,41 +1365,48 @@ func_cache_lookup_module ()
 # func_get_description module
 # Input:
 # - local_gnulib_dir  from --local-dir
+# Output:
+# - module_desc
 func_get_description ()
 {
   func_cache_lookup_module "$1"
-  eval "echo \"\$${cachevar}_desc\""
+  eval "module_desc=\"\$${cachevar}_desc\""
 }
 
 # func_get_status module
 # Input:
 # - local_gnulib_dir  from --local-dir
+# Output:
+# - module_status
 func_get_status ()
 {
   func_cache_lookup_module "$1"
-  eval "echo \"\$${cachevar}_status\""
+  eval "module_status=\"\$${cachevar}_status\""
 }
 
 # func_get_notice module
 # Input:
 # - local_gnulib_dir  from --local-dir
+# Output:
+# - module_notice
 func_get_notice ()
 {
   func_cache_lookup_module "$1"
-  eval "echo \"\$${cachevar}_notice\""
+  eval "module_notice=\"\$${cachevar}_notice\""
 }
 
 # func_get_filelist module
 # Input:
 # - local_gnulib_dir  from --local-dir
+# Output:
+# - module_files
 func_get_filelist ()
 {
   func_cache_lookup_module "$1"
-  eval "echo \"\$${cachevar}_files\""
-  echo m4/gnulib-common.m4
+  eval "module_files=\"\$${cachevar}_files\"\${nl}m4/gnulib-common.m4"
   case "$autoconf_minversion" in
     2.59)
-      echo m4/onceonly.m4
+      module_files="$module_files${nl}m4/onceonly.m4"
       ;;
   esac
 }
@@ -1407,45 +1414,59 @@ func_get_filelist ()
 # func_get_dependencies module
 # Input:
 # - local_gnulib_dir  from --local-dir
+# Output:
+# - module_deps
 func_get_dependencies ()
 {
+  module_deps=
   # ${module}-tests always implicitly depends on ${module}.
-  echo "$1" | sed -n -e 's/-tests$//p'
+  case $1 in
+    *-tests*)
+    module_deps=`echo "$1" | sed -n -e 's/-tests$//p'` ;;
+  esac
   # Then the explicit dependencies listed in the module description.
   func_cache_lookup_module "$1"
-  eval "echo \"\$${cachevar}_deps\""
+  eval "module_deps=\"\$module_deps\$nl\$${cachevar}_deps\""
 }
 
 # func_get_autoconf_early_snippet module
 # Input:
 # - local_gnulib_dir  from --local-dir
+# Output:
+# - module_config_early
 func_get_autoconf_early_snippet ()
 {
   func_cache_lookup_module "$1"
-  eval "echo \"\$${cachevar}_config_early\""
+  eval "module_config_early=\"\$${cachevar}_config_early\""
 }
 
 # func_get_autoconf_snippet module
 # Input:
 # - local_gnulib_dir  from --local-dir
+# Output:
+# - module_config
 func_get_autoconf_snippet ()
 {
   func_cache_lookup_module "$1"
-  eval "echo \"\$${cachevar}_config\""
+  eval "module_config=\"\$${cachevar}_config\""
 }
 
 # func_get_automake_snippet module
 # Input:
 # - local_gnulib_dir  from --local-dir
+# Output:
+# - module_makefile
 func_get_automake_snippet ()
 {
-  func_cache_lookup_module "$1"
-  eval "echo \"\$${cachevar}_makefile\""
+  mymodule=$1
+  func_cache_lookup_module "$mymodule"
+  eval "module_makefile=\"\$${cachevar}_makefile\""
   case "$1" in
     *-tests)
       # *-tests module live in tests/, not lib/.
       # Synthesize an EXTRA_DIST augmentation.
-      all_files=`func_get_filelist $1`
+      func_get_filelist "$mymodule"
+      all_files=$module_files
       tests_files=`for f in $all_files; do \
                      case $f in \
                        tests/*) echo $f ;; \
@@ -1453,8 +1474,9 @@ func_get_automake_snippet ()
                    done | sed -e 's,^tests/,,'`
       extra_files="$tests_files"
       if test -n "$extra_files"; then
-        echo "EXTRA_DIST +=" $extra_files
-        echo
+        set x $extra_files
+        shift
+        func_append module_makefile "${nl}EXTRA_DIST += $*"
       fi
       ;;
     *)
@@ -1471,7 +1493,8 @@ func_get_automake_snippet ()
         eval "echo \\"\\$${cachevar}_makefile\\"" \
         | sed -e "$sed_combine_lines" \
         | sed -n -e "$sed_extract_mentioned_files" | sed -e 's/#.*//'`
-      all_files=`func_get_filelist $1`
+      func_get_filelist "$mymodule"
+      all_files=$module_files
       lib_files=`for f in $all_files; do \
                    case $f in \
                      lib/*) echo $f ;; \
@@ -1483,8 +1506,9 @@ func_get_automake_snippet ()
                    for f in $already_mentioned_files; do echo $f; done \
                    | LC_ALL=C sort -u | LC_ALL=C join -v 2 - "$tmp"/lib-files`
       if test -n "$extra_files"; then
-        echo "EXTRA_DIST +=" $extra_files
-        echo
+        set x $extra_files
+        shift
+        func_append module_makefile "${nl}EXTRA_DIST += $*"
       fi
       # Synthesize also an EXTRA_lib_SOURCES augmentation.
       # This is necessary so that automake can generate the right list of
@@ -1497,14 +1521,15 @@ func_get_automake_snippet ()
       # 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.
-      case "$1" in
+      case "$mymodule" in
         relocatable-prog-wrapper) ;;
         *)
           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
+            set x $extra_files
+            shift
+            func_append module_makefile "${nl}EXTRA_lib_SOURCES += $*"
           fi
           ;;
       esac
@@ -1516,8 +1541,9 @@ func_get_automake_snippet ()
                       done | sed -e 's,^build-aux/,,'`
       if test -n "$buildaux_files"; then
         sed_prepend_auxdir='s,^,$(top_srcdir)/'"$auxdir"'/,'
-        echo "EXTRA_DIST += "`echo "$buildaux_files" | sed -e 
"$sed_prepend_auxdir"`
-        echo
+        set x `echo "$buildaux_files" | sed -e "$sed_prepend_auxdir"`
+        shift
+        func_append module_makefile "${nl}EXTRA_DIST += $*"
       fi
       # Synthesize an EXTRA_DIST augmentation also for the files from top/.
       top_files=`for f in $all_files; do \
@@ -1527,8 +1553,9 @@ func_get_automake_snippet ()
                  done | sed -e 's,^top/,,'`
       if test -n "$top_files"; then
         sed_prepend_topdir='s,^,$(top_srcdir)/,'
-        echo "EXTRA_DIST += "`echo "$top_files" | sed -e "$sed_prepend_topdir"`
-        echo
+        set x `echo "$top_files" | sed -e "$sed_prepend_topdir"`
+        shift
+        func_append module_makefile "${nl}EXTRA_DIST += $*"
       fi
       ;;
   esac
@@ -1537,54 +1564,65 @@ func_get_automake_snippet ()
 # func_get_include_directive module
 # Input:
 # - local_gnulib_dir  from --local-dir
+# Output:
+# - module_include
 func_get_include_directive ()
 {
   func_cache_lookup_module "$1"
-  eval "echo \"\$${cachevar}_include\"" | \
-  sed -e 's/^\(["<]\)/#include \1/'
+  module_include=`eval "echo \\"\\$${cachevar}_include\\"" | \
+    sed -e 's/^\(["<]\)/#include \1/'`
 }
 
 # func_get_link_directive module
 # Input:
 # - local_gnulib_dir  from --local-dir
+# Output:
+# - module_link
 func_get_link_directive ()
 {
   func_cache_lookup_module "$1"
-  eval "echo \"\$${cachevar}_link\""
+  eval "module_link=\"\$${cachevar}_link\""
 }
 
 # func_get_license module
 # Input:
 # - local_gnulib_dir  from --local-dir
+# Output:
+# - module_license
 func_get_license ()
 {
   func_cache_lookup_module "$1"
-  {
-    eval "echo \"\$${cachevar}_license\""
-    # The default is GPL.
-    echo "GPL"
-  } | sed -e 's,^ *$,,' | sed -e 1q
+  eval "module_license=\"\$${cachevar}_license\""
+  # The default is GPL.
+  case $module_license in
+    *[!\       \ ]*) ;;
+    *) module_license=GPL ;;
+  esac
 }
 
 # func_get_maintainer module
 # Input:
 # - local_gnulib_dir  from --local-dir
+# Output:
+# - module_maint
 func_get_maintainer ()
 {
   func_cache_lookup_module "$1"
-  eval "echo \"\$${cachevar}_maint\""
+  eval "module_maint=\"\$${cachevar}_maint\""
 }
 
 # func_get_tests_module module
 # Input:
 # - local_gnulib_dir  from --local-dir
+# Output:
+# - module_tests
 func_get_tests_module ()
 {
   # The naming convention for tests modules is hardwired: ${module}-tests.
   if test -f "$gnulib_dir/modules/$1"-tests \
      || { test -n "$local_gnulib_dir" && test -d "$local_gnulib_dir/modules" \
           && test -f "$local_gnulib_dir/modules/$1"-tests; }; then
-    echo "$1"-tests
+    module_tests=$1-tests
   fi
 }
 
@@ -1631,7 +1669,8 @@ func_modules_transitive_closure ()
       if test -n "$module"; then
         if func_acceptable $module; then
           func_append outmodules " $module"
-          deps=`func_get_dependencies $module`
+          func_get_dependencies $module
+          deps=$module_deps
           # Duplicate dependencies are harmless, but Jim wants a warning.
           duplicated_deps=`echo "$deps" | LC_ALL=C sort | LC_ALL=C uniq -d`
           if test -n "$duplicated_deps"; then
@@ -1639,12 +1678,13 @@ func_modules_transitive_closure ()
           fi
           for dep in $deps; do
             if test -n "$incobsolete" \
-               || { status=`func_get_status $dep`; test "$status" != obsolete; 
}; then
+               || { func_get_status $dep; test "$module_status" != obsolete; 
}; then
               func_append inmodules " $dep"
             fi
           done
           if test -n "$inctests"; then
-            testsmodule=`func_get_tests_module $module`
+            func_get_tests_module $module
+            testsmodule=$module_tests
             if test -n "$testsmodule"; then
               func_append inmodules " $testsmodule"
             fi
@@ -1681,7 +1721,8 @@ ba
     func_verify_nontests_module
     if test -n "$module"; then
       # Extract the value of "lib_SOURCES += ...".
-      for file in `func_get_automake_snippet "$module" | sed -e 
"$sed_remove_backslash_newline" | sed -n -e 's,^lib_SOURCES[    
]*+=\([^#]*\).*$,\1,p'`; do
+      func_get_automake_snippet "$module"
+      for file in `echo "$module_makefile" | sed -e 
"$sed_remove_backslash_newline" | sed -n -e 's,^lib_SOURCES[        
]*+=\([^#]*\).*$,\1,p'`; do
         # Ignore .h files since they are not compiled.
         case "$file" in
           *.h) ;;
@@ -1709,7 +1750,8 @@ func_modules_notice ()
     for module in $modules; do
       func_verify_module
       if test -n "$module"; then
-        msg=`func_get_notice $module`
+        func_get_notice $module
+        msg=$module_notice
         if test -n "$msg"; then
           echo "Notice from module $module:"
           echo "$msg" | sed -e 's/^/  /'
@@ -1731,8 +1773,8 @@ func_modules_to_filelist ()
   for module in $modules; do
     func_verify_module
     if test -n "$module"; then
-      fs=`func_get_filelist $module`
-      func_append files " $fs"
+      func_get_filelist $module
+      func_append files " $module_files"
     fi
   done
   files=`for f in $files; do echo $f; done | LC_ALL=C sort -u`
@@ -1823,7 +1865,8 @@ func_emit_lib_Makefile_am ()
       func_verify_nontests_module
       if test -n "$module"; then
         {
-          func_get_automake_snippet "$module" |
+          func_get_automake_snippet "$module"
+          echo "$module_makefile" |
             sed -e 's,lib_LIBRARIES,lib%_LIBRARIES,g' \
                 -e 's,lib_LTLIBRARIES,lib%_LTLIBRARIES,g' \
                 -e "$sed_eliminate_LDFLAGS" \
@@ -1846,7 +1889,8 @@ func_emit_lib_Makefile_am ()
         fi
         rm -f amsnippet.tmp
         # Test whether there are some source files in subdirectories.
-        for f in `func_get_filelist "$module"`; do
+        func_get_filelist "$module"
+        for f in $module_files; do
           case $f in
             lib/*/*.c) uses_subdirs=yes ;;
           esac
@@ -2070,7 +2114,8 @@ func_emit_tests_Makefile_am ()
       fi
       if test -n "$module"; then
         {
-          func_get_automake_snippet "$module" |
+          func_get_automake_snippet "$module"
+          echo "$module_makefile" |
             sed -e 's,lib_LIBRARIES,lib%_LIBRARIES,g' \
                 -e 's,lib_LTLIBRARIES,lib%_LTLIBRARIES,g' \
                 -e "$sed_eliminate_LDFLAGS" \
@@ -2093,7 +2138,8 @@ func_emit_tests_Makefile_am ()
         fi
         rm -f amsnippet.tmp
         # Test whether there are some source files in subdirectories.
-        for f in `func_get_filelist "$module"`; do
+        func_get_filelist "$module"
+        for f in $module_files; do
           case $f in
             lib/*/*.c | tests/*/*.c) uses_subdirs=yes ;;
           esac
@@ -2616,7 +2662,8 @@ func_import ()
   for module in $testsrelated_modules; do
     func_verify_nontests_module
     if test -n "$module"; then
-      all_files=`func_get_filelist $module`
+      func_get_filelist $module
+      all_files=$module_files
       lib_files=`for f in $all_files; do \
                    case $f in \
                      lib/*) echo $f ;; \
@@ -2640,7 +2687,8 @@ func_import ()
   if test -n "$lgpl"; then
     license_incompatibilities=
     for module in $main_modules; do
-      license=`func_get_license $module`
+      func_get_license $module
+      license=$module_license
       case $license in
         'GPLed build tool') ;;
         'public domain' | 'unlimited' | 'unmodifiable license text') ;;
@@ -3360,6 +3408,7 @@ s,//*$,/,'
       func_verify_module
       if test -n "$module"; then
         func_get_autoconf_early_snippet "$module"
+        echo "$module_config_early"
       fi
     done \
       | sed -e '/^$/d;' -e 's/^/  /'
@@ -3393,7 +3442,8 @@ s,//*$,/,'
     for module in $main_modules; do
       func_verify_module
       if test -n "$module"; then
-        func_get_autoconf_snippet "$module" \
+        func_get_autoconf_snippet "$module"
+        echo "$module_config" \
           | sed -e '/^$/d;' -e 's/^/  /' \
                 -e 's/AM_GNU_GETTEXT(\[external\])/dnl you must add 
AM_GNU_GETTEXT([external]) or similar to configure.ac./' \
                 -e "$sed_replace_build_aux"
@@ -3413,7 +3463,8 @@ s,//*$,/,'
     for module in $testsrelated_modules; do
       func_verify_module
       if test -n "$module"; then
-        func_get_autoconf_snippet "$module" \
+        func_get_autoconf_snippet "$module"
+        echo "$module_config" \
           | sed -e '/^$/d;' -e 's/^/  /' \
                 -e 's/AM_GNU_GETTEXT(\[external\])/dnl you must add 
AM_GNU_GETTEXT([external]) or similar to configure.ac./' \
                 -e "$sed_replace_build_aux" \
@@ -3623,7 +3674,8 @@ s,//*$,/,'
   # then the #include "..." directives without #ifs, sorted for convenience,
   # then the #include directives that are surrounded by #ifs. Not sorted.
   for module in `LC_ALL=C join "$tmp"/modules1 "$tmp"/modules2`; do
-    include_directive=`func_get_include_directive "$module"`
+    func_get_include_directive "$module"
+    include_directive=$module_include
     case "$nl$include_directive" in
       *"$nl#if"*)
         echo "$include_directive" 1>&5
@@ -3643,6 +3695,7 @@ s,//*$,/,'
 
   for module in $main_modules; do
     func_get_link_directive "$module"
+    echo "$module_link"
   done \
     | LC_ALL=C sort -u | sed -e '/^$/d' -e 's/^/  /' > "$tmp"/link
   if test `wc -l < "$tmp"/link` != 0; then
@@ -3712,7 +3765,8 @@ func_create_testdir ()
   # on GPL modules - therefore we don't want a warning in this case.
   inctests=""
   for requested_module in $saved_modules; do
-    requested_license=`func_get_license "$requested_module"`
+    func_get_license "$requested_module"
+    requested_license=$module_license
     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
@@ -3721,7 +3775,8 @@ func_create_testdir ()
       modules="$requested_module"
       func_modules_transitive_closure
       for module in $modules; do
-        license=`func_get_license "$module"`
+        func_get_license "$module"
+        license=$module_license
         case "$license" in
           'GPLed build tool') ;;
           'public domain' | 'unlimited' | 'unmodifiable license text') ;;
@@ -3907,6 +3962,7 @@ func_create_testdir ()
              ;;
            *)
              func_get_autoconf_early_snippet "$module"
+             echo "$module_config_early"
              ;;
          esac
        fi
@@ -3948,7 +4004,8 @@ func_create_testdir ()
              # These modules are meant to be used only in the top-level 
directory.
              ;;
            *)
-             func_get_autoconf_snippet "$module" \
+             func_get_autoconf_snippet "$module"
+             echo "$module_config" \
                | sed -e "$sed_replace_build_aux"
              ;;
          esac
@@ -3958,7 +4015,8 @@ func_create_testdir ()
      for module in $modules; do
        func_verify_tests_module
        if test -n "$module"; then
-         func_get_autoconf_snippet "$module" \
+         func_get_autoconf_snippet "$module"
+         echo "$module_config" \
            | sed -e "$sed_replace_build_aux"
        fi
      done
@@ -4035,6 +4093,7 @@ func_create_testdir ()
      func_verify_nontests_module
      if test -n "$module"; then
        func_get_autoconf_early_snippet "$module"
+       echo "$module_config_early"
      fi
    done \
      | sed -e '/^$/d;' -e 's/AC_REQUIRE(\[\([^()]*\)\])/\1/'
@@ -4070,7 +4129,8 @@ func_create_testdir ()
    for module in $modules; do
      func_verify_nontests_module
      if test -n "$module"; then
-       func_get_autoconf_snippet "$module" \
+       func_get_autoconf_snippet "$module"
+       echo "$module_config" \
          | sed -e "$sed_replace_build_aux"
      fi
    done
@@ -4490,6 +4550,7 @@ case $mode in
       func_verify_module
       if test -n "$module"; then
         func_get_description "$module"
+        echo "$module_desc"
       fi
     done
     ;;
@@ -4500,6 +4561,7 @@ case $mode in
       func_verify_module
       if test -n "$module"; then
         func_get_status "$module"
+        echo "$module_status"
       fi
     done
     ;;
@@ -4510,6 +4572,7 @@ case $mode in
       func_verify_module
       if test -n "$module"; then
         func_get_notice "$module"
+        echo "$module_notice"
       fi
     done
     ;;
@@ -4520,6 +4583,7 @@ case $mode in
       func_verify_module
       if test -n "$module"; then
         func_get_filelist "$module"
+        echo "$module_files"
       fi
     done
     ;;
@@ -4530,6 +4594,7 @@ case $mode in
       func_verify_module
       if test -n "$module"; then
         func_get_dependencies "$module"
+        echo "$module_deps"
       fi
     done
     ;;
@@ -4540,6 +4605,7 @@ case $mode in
       func_verify_module
       if test -n "$module"; then
         func_get_autoconf_snippet "$module"
+        echo "$module_config"
       fi
     done
     ;;
@@ -4550,6 +4616,7 @@ case $mode in
       func_verify_module
       if test -n "$module"; then
         func_get_automake_snippet "$module"
+        echo "$module_makefile"
       fi
     done
     ;;
@@ -4560,6 +4627,7 @@ case $mode in
       func_verify_module
       if test -n "$module"; then
         func_get_include_directive "$module"
+        echo "$module_include"
       fi
     done
     ;;
@@ -4570,6 +4638,7 @@ case $mode in
       func_verify_module
       if test -n "$module"; then
         func_get_link_directive "$module"
+        echo "$module_link"
       fi
     done
     ;;
@@ -4580,6 +4649,7 @@ case $mode in
       func_verify_module
       if test -n "$module"; then
         func_get_license "$module"
+        echo "$module_license"
       fi
     done
     ;;
@@ -4590,6 +4660,7 @@ case $mode in
       func_verify_module
       if test -n "$module"; then
         func_get_maintainer "$module"
+        echo "$module_maint"
       fi
     done
     ;;
@@ -4600,6 +4671,7 @@ case $mode in
       func_verify_module
       if test -n "$module"; then
         func_get_tests_module "$module"
+        echo "$module_tests"
       fi
     done
     ;;
-- 
1.6.1.rc3.96.g159c88





reply via email to

[Prev in Thread] Current Thread [Next in Thread]