[patch] config language dep_* enhancements

From: Peter Samuelson (peter@cadcamlab.org)
Date: Thu Aug 08 2002 - 23:15:43 EST


  [Kai Germaschewski]
> > As you're hacking Configure anyway, what about "fixing"
> >
> > dep_tristate ' ..' CONFIG_FOO $CONFIG_BAR,

[I wrote]
> I've thought about that many times. I think the cleanest solution is
> to deprecate the '$' entirely:
>
> dep_tristate ' ..' CONFIG_FOO CONFIG_BAR

This applies to 2.4.20pre and (except changelog bits) to 2.5.30 with
offsets. I still haven't touched xconfig, because frankly it scares
me. The tkparse.c vs Peter match is well underway, stay tuned..

diff -urN 2.4.20pre1/Documentation/kbuild/config-language.txt 2.4.20pre1p/Documentation/kbuild/config-language.txt
--- 2.4.20pre1/Documentation/kbuild/config-language.txt 2002-02-25 13:37:51.000000000 -0600
+++ 2.4.20pre1p/Documentation/kbuild/config-language.txt 2002-08-08 23:10:44.000000000 -0500
@@ -84,8 +84,17 @@
     to generate dependencies on individual CONFIG_* symbols instead of
     making one massive dependency on include/linux/autoconf.h.
 
- A /dep/ is a dependency. Syntactically, it is a /word/. At run
- time, a /dep/ must evaluate to "y", "m", "n", or "".
+ A /tristate/ is a single character in the set {"y","m","n"}.
+
+ A /dep/ is a dependency. Syntactically, it is a /word/. It is
+ either a /tristate/ or a /symbol/ (with an optional, but
+ deprecated, prefix "$"). At run time, the /symbol/, if present,
+ is expanded to produce a /tristate/. If the /symbol/ has not been
+ defined, the /tristate/ will be "n".
+
+ In addition, the /dep/ may have a prefix "!", which negates the
+ sense of the /tristate/: "!y" and "!m" reduce to "n", and "!n"
+ reduces to "y".
 
     An /expr/ is a bash-like expression using the operators
     '=', '!=', '-a', '-o', and '!'.
@@ -439,12 +448,12 @@
 === dep_bool /prompt/ /symbol/ /dep/ ...
 
 This verb evaluates all of the dependencies in the dependency list.
-Any dependency which has a value of "y" does not restrict the input
-range. Any dependency which has an empty value is ignored.
-Any dependency which has a value of "n", or which has some other value,
-(like "m") restricts the input range to "n". Quoting dependencies is not
-allowed. Using dependencies with an empty value possible is not
-recommended. See also dep_mbool below.
+Any dependency which expands to "y" (including "!n" and "!"; see
+above) does not restrict the input range. Any dependency which
+expands to an empty value is ignored. Any dependency which expands to
+"n", or any other value (like "m"), restricts the input range to "n".
+Quoting dependencies is not allowed. Using dependencies with an empty
+value possible is not recommended. See also dep_mbool below.
 
 If the input range is restricted to the single choice "n", dep_bool
 silently assigns "n" to /symbol/. If the input range has more than
@@ -469,11 +478,12 @@
 === dep_mbool /prompt/ /symbol/ /dep/ ...
 
 This verb evaluates all of the dependencies in the dependency list.
-Any dependency which has a value of "y" or "m" does not restrict the
-input range. Any dependency which has an empty value is ignored.
-Any dependency which has a value of "n", or which has some other value,
-restricts the input range to "n". Quoting dependencies is not allowed.
-Using dependencies with an empty value possible is not recommended.
+Any dependency which expands to "y" or "m" (including "!n" and "!";
+see above) does not restrict the input range. Any dependency which
+expands to an empty value is ignored. Any dependency which expands to
+"n", or any other value, restricts the input range to "n". Quoting
+dependencies is not allowed. Using dependencies with an empty value
+possible is not recommended.
 
 If the input range is restricted to the single choice "n", dep_bool
 silently assigns "n" to /symbol/. If the input range has more than
@@ -514,12 +524,13 @@
 === dep_tristate /prompt/ /symbol/ /dep/ ...
 
 This verb evaluates all of the dependencies in the dependency list.
-Any dependency which has a value of "y" does not restrict the input range.
-Any dependency which has a value of "m" restricts the input range to
-"m" or "n". Any dependency which has an empty value is ignored.
-Any dependency which has a value of "n", or which has some other value,
-restricts the input range to "n". Quoting dependencies is not allowed.
-Using dependencies with an empty value possible is not recommended.
+Any dependency which expands to "y" (including "!n" or "!"; see above)
+does not restrict the input range. Any dependency which expands to
+"m" restricts the input range to "m" or "n". Any dependency which
+expands to an empty value is ignored. Any dependency which expands to
+"n", or any other value, restricts the input range to "n". Quoting
+dependencies is not allowed. Using dependencies with an empty value
+possible is not recommended.
 
 If the input range is restricted to the single choice "n", dep_tristate
 silently assigns "n" to /symbol/. If the input range has more than
diff -urN 2.4.20pre1/scripts/Configure 2.4.20pre1p/scripts/Configure
--- 2.4.20pre1/scripts/Configure 2001-07-02 15:56:40.000000000 -0500
+++ 2.4.20pre1p/scripts/Configure 2002-08-08 22:31:49.000000000 -0500
@@ -48,6 +48,15 @@
 #
 # 24 January 1999, Michael Elizabeth Chastain, <mec@shout.net>
 # - Improve the exit message (Jeff Ronne).
+#
+# 8 Aug 2002, Peter Samuelson <peter@cadcamlab.org>
+# for dependencies in dep_* functions:
+# - deprecate '$' (dep_bool 'foo' CONFIG_FOO CONFIG_BAR CONFIG_BAZ)
+# - allow negation:
+# dep_bool 'New Foo' CONFIG_FOO !CONFIG_OLDFOO
+# dep_bool 'Old Foo' CONFIG_OLDFOO !CONFIG_FOO
+# (Note that since the !CONFIG_OLDFOO is a forward reference, it
+# is meaningless for the line-based interface.)
 
 #
 # Make sure we're really running bash.
@@ -232,6 +241,28 @@
 }
 
 #
+# dep_calc reduces a dependency line down to a single char [ymn]
+#
+function dep_calc () {
+ local neg arg
+ cur_dep=y # return value
+ for arg; do
+ neg=;
+ case "$arg" in
+ !*) neg=N; arg=${arg#?} ;;
+ esac
+ case "$arg" in
+ y|m|n) ;;
+ *) arg=$(eval echo \$$arg) ;;
+ esac
+ case "$neg$arg" in
+ m) cur_dep=m ;;
+ n|Ny|Nm) cur_dep=n; return ;;
+ esac
+ done
+}
+
+#
 # dep_tristate processes a tristate argument that depends upon
 # another option or options. If any of the options we depend upon is a
 # module, then the only allowable options are M or N. If all are Y, then
@@ -248,18 +279,16 @@
         var=$2
         need_module=0
         shift 2
- while [ $# -gt 0 ]; do
- case "$1" in
- n)
+ dep_calc "$@"
+ case $cur_dep in
+ n)
               define_tristate "$var" "n"
               return
               ;;
             m)
               need_module=1
               ;;
- esac
- shift
- done
+ esac
 
         if [ $need_module = 1 ]; then
            if [ "$CONFIG_MODULES" = "y" ]; then
@@ -299,15 +328,13 @@
         ques=$1
         var=$2
         shift 2
- while [ $# -gt 0 ]; do
- case "$1" in
+ dep_calc "$@"
+ case $cur_dep in
             m | n)
               define_bool "$var" "n"
               return
               ;;
- esac
- shift
- done
+ esac
 
         bool "$ques" "$var"
 }
@@ -316,8 +343,8 @@
         ques=$1
         var=$2
         shift 2
- while [ $# -gt 0 ]; do
- case "$1" in
+ dep_calc "$@"
+ case $cur_dep in
             n)
               define_bool "$var" "n"
               return
diff -urN 2.4.20pre1/scripts/Menuconfig 2.4.20pre1p/scripts/Menuconfig
--- 2.4.20pre1/scripts/Menuconfig 2002-06-14 15:09:40.000000000 -0500
+++ 2.4.20pre1p/scripts/Menuconfig 2002-08-08 22:32:09.000000000 -0500
@@ -77,8 +77,14 @@
 # 12 November 2001, Keith Owens <kaos@ocs.com.au>
 # Escape double quotes on eval so the quotes are still there on the second
 # evaluation, required to handle strings with special characters.
-#
-
+#
+# 8 Aug 2002, Peter Samuelson <peter@cadcamlab.org>
+# for dependencies in dep_* functions:
+# - deprecate '$' (dep_bool 'foo' CONFIG_FOO CONFIG_BAR CONFIG_BAZ)
+# - allow negation:
+# dep_bool 'New Foo' CONFIG_FOO !CONFIG_OLDFOO
+# dep_bool 'Old Foo' CONFIG_OLDFOO !CONFIG_FOO
+# (Yes, forward references DTRT in Menuconfig.)
 
 #
 # Change this to TRUE if you prefer all kernel options listed
@@ -202,6 +208,28 @@
 }
 
 #
+# Reduces a dependency line down to a single char [ymn]
+#
+function dep_calc () {
+ local neg arg
+ cur_dep=y # return value
+ for arg; do
+ neg=;
+ case "$arg" in
+ !*) neg=N; arg=${arg#?} ;;
+ esac
+ case "$arg" in
+ y|m|n) ;;
+ *) arg=$(eval echo \$$arg) ;;
+ esac
+ case "$neg$arg" in
+ m) cur_dep=m ;;
+ n|Ny|Nm) cur_dep=n; return ;;
+ esac
+ done
+}
+
+#
 # Create a tristate radiolist function which is dependent on
 # another kernel configuration option.
 #
@@ -216,26 +244,13 @@
 function dep_tristate () {
         ques="$1"
         var="$2"
- dep=y
- shift 2
- while [ $# -gt 0 ]; do
- if [ "$1" = y ]; then
- shift
- elif [ "$1" = m ]; then
- dep=m
- shift
- else
- dep=n
- shift $#
- fi
- done
- if [ "$dep" = y ]; then
- tristate "$ques" "$var"
- elif [ "$dep" = m ]; then
- mod_bool "$ques" "$var"
- else
- define_tristate "$var" n
- fi
+ shift 2
+ dep_calc "$@"
+ case $cur_dep in
+ y) tristate "$ques" "$var" ;;
+ m) mod_bool "$ques" "$var" ;;
+ n) define_tristate "$var" n ;;
+ esac
 }
 
 #
@@ -245,41 +260,23 @@
 function dep_bool () {
         ques="$1"
         var="$2"
- dep=y
         shift 2
- while [ $# -gt 0 ]; do
- if [ "$1" = y ]; then
- shift
- else
- dep=n
- shift $#
- fi
- done
- if [ "$dep" = y ]; then
- bool "$ques" "$var"
- else
- define_bool "$var" n
- fi
+ dep_calc "$@"
+ case $cur_dep in
+ y) bool "$ques" "$var" ;;
+ *) define_bool "$var" n ;;
+ esac
 }
 
 function dep_mbool () {
         ques="$1"
         var="$2"
- dep=y
         shift 2
- while [ $# -gt 0 ]; do
- if [ "$1" = y -o "$1" = m ]; then
- shift
- else
- dep=n
- shift $#
- fi
- done
- if [ "$dep" = y ]; then
- bool "$ques" "$var"
- else
- define_bool "$var" n
- fi
+ dep_calc "$@"
+ case $cur_dep in
+ y|m) bool "$ques" "$var" ;;
+ n) define_bool "$var" n ;;
+ esac
 }
 
 #
@@ -1088,15 +1085,11 @@
                 set_x_info "$2" "n"
                 var="$2"
                 shift 2
- while [ $# -gt 0 ]; do
- if [ "$1" = y ]; then
- shift
- elif [ "$1" = m -a "$x" != n ]; then
- x=m; shift
- else
- x=n; shift $#
- fi
- done
+ dep_calc "$@"
+ case $cur_dep$x in
+ my) x=m ;;
+ n*) x=n ;;
+ esac
                 define_tristate "$var" "$x"
         }
 
@@ -1104,13 +1097,8 @@
                 set_x_info "$2" "n"
                 var="$2"
                 shift 2
- while [ $# -gt 0 ]; do
- if [ "$1" = y ]; then
- shift
- else
- x=n; shift $#
- fi
- done
+ dep_calc "$@"
+ [ $cur_dep = y ] || x=n
                 define_bool "$var" "$x"
         }
 
@@ -1118,13 +1106,8 @@
                 set_x_info "$2" "n"
                 var="$2"
                 shift 2
- while [ $# -gt 0 ]; do
- if [ "$1" = y -o "$1" = m ]; then
- shift
- else
- x=n; shift $#
- fi
- done
+ dep_calc "$@"
+ [ $cur_dep = n ] && x=n
                 define_bool "$var" "$x"
         }
 
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Thu Aug 15 2002 - 22:00:18 EST