* gnulib-tool (func_get_description) (func_get_status, func_get_notice, func_get_applicability) (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.
Signed-off-by: Ralf Wildenhues <ralf.wildenh...@gmx.de> --- A straight-forward rebase of the old patch. Cheers, Ralf ChangeLog | 17 +++++ gnulib-tool | 199 ++++++++++++++++++++++++++++++++++++++++------------------- 2 files changed, 152 insertions(+), 64 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9959305..30f6bdb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,22 @@ 2010-01-17 Ralf Wildenhues <ralf.wildenh...@gmx.de> + gnulib-tool: avoid forks with func_get_* functions. + * gnulib-tool (func_get_description) + (func_get_status, func_get_notice, func_get_applicability) + (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: cache module metainformation. * gnulib-tool (sed_extract_prog): Match newline before each header, and rewrite header to a shell variable suffix. diff --git a/gnulib-tool b/gnulib-tool index bb040de..8ab1c77 100755 --- a/gnulib-tool +++ b/gnulib-tool @@ -1473,45 +1473,52 @@ 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_applicability module # Input: # - local_gnulib_dir from --local-dir -# The expected result (on stdout) is either 'main', or 'tests', or 'all'. +# Output: +# - module_applicability +# +# The expected result is either 'main', or 'tests', or 'all'. func_get_applicability () { func_cache_lookup_module "$1" - eval my_applicability=\$${cachevar}_applicability - if test -n "$my_applicability"; then - echo $my_applicability - else + eval module_applicability=\$${cachevar}_applicability + if test -z "$module_applicability"; then # The default is 'main' or 'tests', depending on the module's name. case $1 in - *-tests) echo tests;; - *) echo main;; + *-tests) module_applicability=tests;; + *) module_applicability=main;; esac fi } @@ -1519,15 +1526,15 @@ func_get_applicability () # 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/00gnulib.m4 - echo m4/gnulib-common.m4 + eval "module_files=\"\$${cachevar}_files\"\${nl}m4/00gnulib.m4\${nl}m4/gnulib-common.m4" case "$autoconf_minversion" in 2.59) - echo m4/onceonly.m4 + module_files="$module_files${nl}m4/onceonly.m4" ;; esac } @@ -1582,8 +1589,11 @@ func_filter_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}. case "$1" in *-tests) @@ -1594,44 +1604,53 @@ func_get_dependencies () 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 $1 + all_files=$module_files func_filter_filelist tests_files " " "$all_files" 'tests/' '' '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 ;; *) @@ -1648,7 +1667,8 @@ func_get_automake_snippet () { eval 'echo "$'${cachevar}'_makefile"'; echo; } \ | sed -e "$sed_combine_lines" \ | sed -n -e "$sed_extract_mentioned_files" | sed -e 's/#.*//'` - all_files=`func_get_filelist $1` + func_get_filelist $1 + all_files=$module_files func_filter_filelist lib_files "$nl" "$all_files" 'lib/' '' 'lib/' '' # Remove $already_mentioned_files from $lib_files. echo "$lib_files" | LC_ALL=C sort -u > "$tmp"/lib-files @@ -1656,8 +1676,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 @@ -1670,13 +1691,14 @@ 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) ;; *) func_filter_filelist extra_files "$nl" "$extra_files" '' '.c' '' '' 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 @@ -1684,15 +1706,17 @@ func_get_automake_snippet () func_filter_filelist buildaux_files "$nl" "$all_files" 'build-aux/' '' '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/. func_filter_filelist top_files "$nl" "$all_files" 'top/' '' '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 @@ -1701,54 +1725,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 } @@ -1795,7 +1830,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 @@ -1803,12 +1839,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 @@ -1846,7 +1883,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) ;; @@ -1877,7 +1915,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/^/ /' @@ -1899,8 +1938,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` @@ -2100,7 +2139,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" \ @@ -2123,7 +2163,8 @@ func_emit_lib_Makefile_am () fi rm -f "$tmp"/amsnippet # 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 @@ -2356,7 +2397,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" \ @@ -2379,7 +2421,8 @@ func_emit_tests_Makefile_am () fi rm -f "$tmp"/amsnippet # 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 @@ -2894,7 +2937,8 @@ func_import () echo "$final_modules" | LC_ALL=C sort -u > "$tmp"/final-modules testsrelated_modules=`func_reset_sigpipe for module in $main_modules; do - if test \`func_get_applicability $module\` = main; then + func_get_applicability $module + if test "$module_applicability" = main; then echo $module fi done \ @@ -2914,7 +2958,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 # Test whether some file in $all_files lies in lib/. for f in $all_files; do case $f in @@ -2938,7 +2983,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') ;; @@ -3621,6 +3667,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/^/ /' @@ -3654,7 +3701,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" @@ -3674,7 +3722,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" \ @@ -3884,7 +3933,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 @@ -3904,6 +3954,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 @@ -3972,7 +4023,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 @@ -3981,7 +4033,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') ;; @@ -4169,6 +4222,7 @@ func_create_testdir () ;; *) func_get_autoconf_early_snippet "$module" + echo "$module_config_early" ;; esac fi @@ -4210,7 +4264,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 @@ -4220,7 +4275,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 @@ -4294,6 +4350,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/' @@ -4329,7 +4386,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 @@ -4751,6 +4809,7 @@ case $mode in func_verify_module if test -n "$module"; then func_get_description "$module" + echo "$module_desc" fi done ;; @@ -4761,6 +4820,7 @@ case $mode in func_verify_module if test -n "$module"; then func_get_status "$module" + echo "$module_status" fi done ;; @@ -4771,6 +4831,7 @@ case $mode in func_verify_module if test -n "$module"; then func_get_notice "$module" + echo "$module_notice" fi done ;; @@ -4781,6 +4842,7 @@ case $mode in func_verify_module if test -n "$module"; then func_get_applicability "$module" + echo "$module_applicability" fi done ;; @@ -4791,6 +4853,7 @@ case $mode in func_verify_module if test -n "$module"; then func_get_filelist "$module" + echo "$module_files" fi done ;; @@ -4801,6 +4864,7 @@ case $mode in func_verify_module if test -n "$module"; then func_get_dependencies "$module" + echo "$module_deps" fi done ;; @@ -4811,6 +4875,7 @@ case $mode in func_verify_module if test -n "$module"; then func_get_autoconf_snippet "$module" + echo "$module_config" fi done ;; @@ -4821,6 +4886,7 @@ case $mode in func_verify_module if test -n "$module"; then func_get_automake_snippet "$module" + echo "$module_makefile" fi done ;; @@ -4831,6 +4897,7 @@ case $mode in func_verify_module if test -n "$module"; then func_get_include_directive "$module" + echo "$module_include" fi done ;; @@ -4841,6 +4908,7 @@ case $mode in func_verify_module if test -n "$module"; then func_get_link_directive "$module" + echo "$module_link" fi done ;; @@ -4851,6 +4919,7 @@ case $mode in func_verify_module if test -n "$module"; then func_get_license "$module" + echo "$module_license" fi done ;; @@ -4861,6 +4930,7 @@ case $mode in func_verify_module if test -n "$module"; then func_get_maintainer "$module" + echo "$module_maint" fi done ;; @@ -4871,6 +4941,7 @@ case $mode in func_verify_module if test -n "$module"; then func_get_tests_module "$module" + echo "$module_tests" fi done ;; -- 1.6.5.1.31.gad12b