[I wrote]
> I've come up with syntax I think I'm happy with.
Thank you one and all for all the discussion and suggestions for
improvement on my proposals. I've incorporated a lot of feedback.
I know I promised to try and come up with a working prototype
including some Config.in files, but some of the Menuconfig bits were
harder than they looked, and I ran out of time tonight - I'm about to
leave town for a couple of days. My Menuconfig currently doesn't
work, and I haven't converted any Config.in files yet. Meanwhile,
here is the documentation portion. Critiques are more than welcome,
both for the proposal and for its documentation..
Peter
--- 2.5.31/Documentation/kbuild/config-language.txt 2002-06-09 00:29:17.000000000
-0500
+++ 2.5.31w/Documentation/kbuild/config-language.txt 2002-08-16 21:18:16.000000000
+-0500
@@ -84,8 +84,10 @@
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 /dep/ is a dependency list. Syntactically, it is zero or more
+ /word/s separated by whitespace. When evaluated, a /dep/ is
+ reduced to a single character "y", "m" or "n". See the following
+ section for details.
An /expr/ is a bash-like expression using the operators
'=', '!=', '-a', '-o', and '!'.
@@ -116,12 +118,12 @@
Dependent statements:
- dep_bool /prompt/ /symbol/ /dep/ ...
- dep_mbool /prompt/ /symbol/ /dep/ ...
- dep_hex /prompt/ /symbol/ /word/ /dep/ ...
- dep_int /prompt/ /symbol/ /word/ /dep/ ...
- dep_string /prompt/ /symbol/ /word/ /dep/ ...
- dep_tristate /prompt/ /symbol/ /dep/ ...
+ dep_bool /prompt/ /symbol/ /dep/
+ dep_mbool /prompt/ /symbol/ /dep/
+ dep_hex /prompt/ /symbol/ /word/ /dep/
+ dep_int /prompt/ /symbol/ /word/ /dep/
+ dep_string /prompt/ /symbol/ /word/ /dep/
+ dep_tristate /prompt/ /symbol/ /dep/
Unset statement:
@@ -132,7 +134,22 @@
choice /prompt/ /word/ /word/
nchoice /prompt/ /symbol/ /prompt/ /symbol/ ...
- If statements:
+ New-style if blocks:
+
+ if_dep /dep/
+ /statement/
+ ...
+ fi_dep
+
+ if_dep /dep/
+ /statement/
+ ...
+ else_dep
+ /statement/
+ ...
+ fi_dep
+
+ Old-style if blocks (deprecated):
if [ /expr/ ] ; then
/statement/
@@ -161,6 +178,69 @@
+=== Dependency lists
+
+A dependency list evaluates to a single character "y", "m" or "n".
+Individual words in the list can include:
+
+ The word "or" divides a list into two sub-lists, one on either
+ side of the "or". The sub-lists are evaluated independently and
+ then combined, as described below.
+
+ A /symbol/ is expanded to the current value of the symbol, or the
+ empty string if the symbol is unset. In the latter case, if
+ /symbol/ appears in a word by itself, the word is ignored. This
+ is for backward compatibility and may change in the future.
+
+ If a /symbol/ has a "$" prefix, that prefix is ignored, for
+ backward compatibility. This may become a syntax error in the
+ future.
+
+ A word with a suffix of "=X", where X is a quoted or unquoted
+ string, expands to "y" if the rest of the word evaluates to X, or
+ "n" otherwise.
+
+ A word prefixed by "!" expands to a transformation of the word:
+ "!y" becomes "n"; "!n" or "!" become "y"; "!m" becomes "m". The
+ "!" prefix is expanded only after expansion of /symbol/s and the
+ "=" suffix.
+
+Once each word is expanded as described above, it should have a value
+of "y", "m" or "n", or the empty value "", which is discarded. If the
+dependency list has multiple words, the words are reduced to a single
+word as follows:
+
+ If any word is "n", the value of the list becomes "n".
+
+ Otherwise, if any word is "m", the value of the list becomes "m".
+
+ Otherwise, the value of the list becomes "y".
+
+If there are multiple sub-lists separated by "or" words, each sub-list
+is reduced to a single word as described above, then they are combined
+as follows:
+
+ If any sub-list is "y", the final result is "y".
+
+ Otherwise, if any sub-list is "m", the final result is "m".
+
+ Otherwise, if all sub-lists are "n", the final result is "n".
+
+Finally, an empty /dep/ evaluates to "y".
+
+If you think in terms of Boolean algebra, most of the above rules make
+sense if you think of each primitive value ("y", "m" and "n") as two
+bits: "y"=11, "m"=01, "n"=00. Adjacent words are implicitly ANDed
+together, and the "or" statement, with lower precedence, performs an
+OR between lists of words. The "!" operator does not quite fit this
+explanation, because "!m" = "m", but that was specified for practical
+reasons, to cover a common case in kernel configuration.
+
+For examples, look at the statements which use dependency lists
+(dep_bool, dep_mbool, dep_tristate, if_dep).
+
+
+
=== mainmenu_name /prompt/
This verb is a lot less important than it looks. It specifies the top-level
@@ -436,15 +516,15 @@
-=== dep_bool /prompt/ /symbol/ /dep/ ...
+=== 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 +549,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 +595,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
@@ -619,6 +701,68 @@
+=== if_dep /dep/, else_dep, fi_dep
+
+"if_dep" begins a set of one or two blocks ending with the "fi_dep"
+statement and separated by the "else_dep" statement. The "else_dep"
+and following block are optional.
+
+First, the dependency line for the if_dep is evaluated. If it yields
+is "y", the following block is executed, and the block after the
+"else_dep", if present, is skipped. If it yields "n", the opposite
+happens: the first block is skipped and the second (if present) is
+executed.
+
+If the dependency yields "m", the first block is executed and the
+second skipped, just as with "y", but with one crucial difference: the
+output for certain verbs is restricted. "bool" and "dep_bool"
+statements are suppressed entirely; "tristate" and "dep_tristate" are
+restricted to the two values "m" and "n". The valid values for other
+verbs such as "define_bool", "dep_mbool" and "hex" are not restricted.
+
+"if_dep" statements can be nested arbitrarily. Each level of nesting
+further restricts whether and how the block within is interpreted.
+
+ | Value of the if_dep dependency line
+ Statements in | (nested restrictions are cumulative)
+ the blocks | y | n | m
+ --------------+--------------+--------------+-----------------------
+ bool, | | | suppressed in
+ dep_bool | | | both blocks
+ | unrestricted | suppressed |
+ --------------+ in if_dep | in if_dep +-----------------------
+ tristate, | block, | block, | restricted to {m,n} in
+ dep_tristate | suppressed | unrestricted | if_dep block, suppressed
+ | in else_dep | in else_dep | in else_dep block
+ --------------+ block | block +-----------------------
+ all other | | | unrestricted in if_dep
+ verbs | | | block, suppressed in
+ | | | else_dep block
+
+Note that "bool" and "dep_bool" are restricted by the "if_dep" in
+exactly the same way as "dep_bool" is by its own dependency line.
+Likewise, "tristate" and "dep_tristate" are restricted in exactly the
+same way as "dep_tristate" is by its dependency line.
+
+Example:
+
+ # FIXME: replace this example and add more, as soon as people
+ # FIXME: start actually using if_dep.
+ if_dep CONFIG_FOO !CONFIG_BAR
+ ...statements which execute if CONFIG_FOO is set to "y" or
+ "m", and CONFIG_BAR is unset or set to "n"
+ else_dep
+ ...statements which execute if the above conditions are not
+ both true
+ fi_dep
+
+Configure: not implemented
+Menuconfig: implemented
+XConfig: not implemented
+mconfig: not implemented
+
+
+
=== if [ /expr/ ] ; then
This is a conditional statement, with an optional 'else' clause. You may
-------------------------------------------------------
This sf.net email is sponsored by: OSDN - Tired of that same old
cell phone? Get a new here for FREE!
https://www.inphonic.com/r.asp?r=sourceforge1&refcode1=vs3390
_______________________________________________
kbuild-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/kbuild-devel