* gnulib-tool (sed_extract_prog): Match newline before each header, and rewrite header to a shell variable suffix. (func_cache_var, func_cache_lookup_module): New functions, to turn a module name into a cache variable prefix, and to look up and cache module metainformation. (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): Use func_cache_lookup_module. --- gnulib-tool | 169 +++++++++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 124 insertions(+), 45 deletions(-)
diff --git a/gnulib-tool b/gnulib-tool index bc3effb..d5eb9df 100755 --- a/gnulib-tool +++ b/gnulib-tool @@ -1263,34 +1263,112 @@ func_verify_tests_module () esac } -sed_extract_prog=':[ ]*$/ { - :a - n - s/^Description:[ ]*$// - s/^Status:[ ]*$// - s/^Notice:[ ]*$// - s/^Files:[ ]*$// - s/^Depends-on:[ ]*$// - s/^configure\.ac-early:[ ]*$// - s/^configure\.ac:[ ]*$// - s/^Makefile\.am:[ ]*$// - s/^Include:[ ]*$// - s/^Link:[ ]*$// - s/^License:[ ]*$// - s/^Maintainer:[ ]*$// - tb - p - ba - :b -}' +# func_cache_var file +# +# return the cache variable name corresponding to $file. +# Output: +# - cachevar +if test -n "$BASH_VERSION"; then + func_cache_var () + { + cachevar=c_${1//[!a-zA-Z0-9_]/_} + } +else + func_cache_var () + { + case $1 in + *[!a-zA-Z0-9_]*) + cachevar=c_`echo "$1" | LC_ALL=C sed 's/[^a-zA-Z0-9_]/_/g'` ;; + *) + cachevar=c_$1 ;; + esac + } +fi + +# Extract headers from module descriptions. +# The pattern space will contain an embedded newline before the header. +sed_extract_prog=" + s/\nDescription:[ ]*$/\\${nl}desc/ + s/\nStatus:[ ]*$/\\${nl}status/ + s/\nNotice:[ ]*$/\\${nl}notice/ + s/\nFiles:[ ]*$/\\${nl}files/ + s/\nDepends-on:[ ]*$/\\${nl}deps/ + s/\nconfigure\.ac-early:[ ]*$/\\${nl}config_early/ + s/\nconfigure\.ac:[ ]*$/\\${nl}config/ + s/\nMakefile\.am:[ ]*$/\\${nl}makefile/ + s/\nInclude:[ ]*$/\\${nl}include/ + s/\nLink:[ ]*$/\\${nl}link/ + s/\nLicense:[ ]*$/\\${nl}license/ + s/\nMaintainer:[ ]*$/\\${nl}maint/" + +# func_cache_lookup_module file +# +# look up a module, like 'func_lookup_file modules/$file', and store all of its +# relevant data in a cache. If already cached, do not look it up again. +# Input: +# - file +# Output: +# - cachevar +# - ${cachevar}_cached +# - ${cachevar}_desc +# - ${cachevar}_status +# - ... +func_cache_lookup_module () +{ + func_cache_var "$1" + if eval "test -z \"\$${cachevar}_cached\""; then + func_lookup_file "modules/$1" + # Parse the module file: + # - match a known header + # - if the first found header, then accumulate lines + # until we have all its contents, plus the next header or EOF + # - remember the next header for later, cut it off, then modify + # the current header and value into a shell variable assignment, + # after removing trailing white space from the value. + # - finally, restore the next header, rinse and repeat. + # - setting ${cachevar}_cached at the beginning helps simplify + # the script. + sed_cache_module=' + s/^/cached\'"$nl"'yes\'"$nl"'/ + :match + t match + '"$sed_extract_prog"' + t hdr + :more + $b ws + N + b match + + :hdr + h + s/\(.*\)\n.*/\1/ + :ws + t ws + s/\n[ ]*$// + t ws + s/'\''/&"'\''"&/g + s/^\([a-zA-Z0-9_]\{1,\}\)/'${cachevar}_'\1='\''/ + s/\n// + s/$/'\''/ + p + $d + + x + s/.*\n// + b more + ' + cache_script=`sed -n "$sed_cache_module" < "$lookedup_file"` + eval "$cache_script" + fi +} # func_get_description module # Input: # - local_gnulib_dir from --local-dir func_get_description () { - func_lookup_file "modules/$1" - sed -n -e "/^Description$sed_extract_prog" < "$lookedup_file" + func_cache_lookup_module "$1" + eval "echo \"\$${cachevar}_desc\"" } # func_get_status module @@ -1298,8 +1376,8 @@ func_get_description () # - local_gnulib_dir from --local-dir func_get_status () { - func_lookup_file "modules/$1" - sed -n -e "/^Status$sed_extract_prog" < "$lookedup_file" + func_cache_lookup_module "$1" + eval "echo \"\$${cachevar}_status\"" } # func_get_notice module @@ -1307,8 +1385,8 @@ func_get_status () # - local_gnulib_dir from --local-dir func_get_notice () { - func_lookup_file "modules/$1" - sed -n -e "/^Notice$sed_extract_prog" < "$lookedup_file" + func_cache_lookup_module "$1" + eval "echo \"\$${cachevar}_notice\"" } # func_get_filelist module @@ -1316,8 +1394,8 @@ func_get_notice () # - local_gnulib_dir from --local-dir func_get_filelist () { - func_lookup_file "modules/$1" - sed -n -e "/^Files$sed_extract_prog" < "$lookedup_file" + func_cache_lookup_module "$1" + eval "echo \"\$${cachevar}_files\"" echo m4/gnulib-common.m4 case "$autoconf_minversion" in 2.59) @@ -1334,8 +1412,8 @@ 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. - func_lookup_file "modules/$1" - sed -n -e "/^Depends-on$sed_extract_prog" < "$lookedup_file" + func_cache_lookup_module "$1" + eval "echo \"\$${cachevar}_deps\"" } # func_get_autoconf_early_snippet module @@ -1343,8 +1421,8 @@ func_get_dependencies () # - local_gnulib_dir from --local-dir func_get_autoconf_early_snippet () { - func_lookup_file "modules/$1" - sed -n -e "/^configure\.ac-early$sed_extract_prog" < "$lookedup_file" + func_cache_lookup_module "$1" + eval "echo \"\$${cachevar}_config_early\"" } # func_get_autoconf_snippet module @@ -1352,8 +1430,8 @@ func_get_autoconf_early_snippet () # - local_gnulib_dir from --local-dir func_get_autoconf_snippet () { - func_lookup_file "modules/$1" - sed -n -e "/^configure\.ac$sed_extract_prog" < "$lookedup_file" + func_cache_lookup_module "$1" + eval "echo \"\$${cachevar}_config\"" } # func_get_automake_snippet module @@ -1361,8 +1439,8 @@ func_get_autoconf_snippet () # - local_gnulib_dir from --local-dir func_get_automake_snippet () { - func_lookup_file "modules/$1" - sed -n -e "/^Makefile\.am$sed_extract_prog" < "$lookedup_file" + func_cache_lookup_module "$1" + eval "echo \"\$${cachevar}_makefile\"" case "$1" in *-tests) # *-tests module live in tests/, not lib/. @@ -1390,7 +1468,7 @@ func_get_automake_snippet () }' sed_extract_mentioned_files='s/^lib_SOURCES[ ]*+=[ ]*//p' already_mentioned_files=` \ - sed -n -e "/^Makefile\.am$sed_extract_prog" < "$lookedup_file" \ + 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` @@ -1461,8 +1539,8 @@ func_get_automake_snippet () # - local_gnulib_dir from --local-dir func_get_include_directive () { - func_lookup_file "modules/$1" - sed -n -e "/^Include$sed_extract_prog" < "$lookedup_file" | \ + func_cache_lookup_module "$1" + eval "echo \"\$${cachevar}_include\"" | \ sed -e 's/^\(["<]\)/#include \1/' } @@ -1471,8 +1549,8 @@ func_get_include_directive () # - local_gnulib_dir from --local-dir func_get_link_directive () { - func_lookup_file "modules/$1" - sed -n -e "/^Link$sed_extract_prog" < "$lookedup_file" + func_cache_lookup_module "$1" + eval "echo \"\$${cachevar}_link\"" } # func_get_license module @@ -1480,8 +1558,9 @@ func_get_link_directive () # - local_gnulib_dir from --local-dir func_get_license () { - func_lookup_file "modules/$1" - { sed -n -e "/^License$sed_extract_prog" < "$lookedup_file" + func_cache_lookup_module "$1" + { + eval "echo \"\$${cachevar}_license\"" # The default is GPL. echo "GPL" } | sed -e 's,^ *$,,' | sed -e 1q @@ -1492,8 +1571,8 @@ func_get_license () # - local_gnulib_dir from --local-dir func_get_maintainer () { - func_lookup_file "modules/$1" - sed -n -e "/^Maintainer$sed_extract_prog" < "$lookedup_file" + func_cache_lookup_module "$1" + eval "echo \"\$${cachevar}_maint\"" } # func_get_tests_module module -- 1.6.1.rc3.96.g159c88