[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 1/4] gnulib-tool: cache module metainformation.
From: |
Ralf Wildenhues |
Subject: |
[PATCH 1/4] gnulib-tool: cache module metainformation. |
Date: |
Sun, 28 Dec 2008 11:18:46 +0100 |
User-agent: |
Mutt/1.5.18 (2008-05-17) |
* 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