config-language.txt
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:20k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. Config Language Specification
  2. 18 October 1999
  3. Michael Elizabeth Chastain, <mailto:mec@shout.net>
  4. === Introduction
  5. Config Language is not 'bash'.
  6. This document describes Config Language, the Linux Kernel Configuration
  7. Language.  config.in and Config.in files are written in this language.
  8. Although it looks, and usually acts, like a subset of the 'sh' language,
  9. Config Language has a restricted syntax and different semantics.
  10. Here is a basic guideline for Config Language programming: use only the
  11. programming idioms that you see in existing Config.in files.  People often
  12. draw on their shell programming experience to invent idioms that look
  13. reasonable to shell programmers, but silently fail in Config Language.
  14. Config Language is not 'bash'.
  15. === Interpreters
  16. Four different configuration programs read Config Language:
  17.     scripts/Configure   make config, make oldconfig
  18.     scripts/Menuconfig  make menuconfig
  19.     scripts/tkparse     make xconfig
  20.     mconfig             ftp.kernel.org/pub/linux/kernel/people/hch/mconfig/
  21. 'Configure' is a bash script which interprets Config.in files by sourcing
  22. them.  Some of the Config Language commands are native bash commands;
  23. simple bash functions implement the rest of the commands.
  24. 'Menuconfig' is another bash script.  It scans the input files with a
  25. small awk script, builds a shell function for each menu, sources the
  26. shell functions that it builds, and then executes the shell functions
  27. in a user-driven order.  Menuconfig uses 'lxdialog', a back-end utility
  28. program, to perform actual screen output.  'lxdialog' is a C program
  29. which uses curses.
  30. 'scripts/tkparse' is a C program with an ad hoc parser which translates
  31. a Config Language script to a huge TCL/TK program.  'make xconfig'
  32. then hands this TCL/TK program to 'wish', which executes it.
  33. 'mconfig' is the next generation of Config Language interpreters.  It is a
  34. C program with a bison parser which translates a Config Language script
  35. into an internal syntax tree and then hands the syntax tree to one of
  36. several user-interface front ends.
  37. === Statements
  38. A Config Language script is a list of statements.  There are 21 simple
  39. statements; an 'if' statement; menu blocks; and a 'source' statement.
  40. A '' at the end of a line marks a line continuation.
  41. '#' usually introduces a comment, which continues to the end of the line.
  42. Lines of the form '# ... is not set', however, are not comments.  They
  43. are semantically meaningful, and all four config interpreters implement
  44. this meaning.
  45. Newlines are significant.  You may not substitute semicolons for newlines.
  46. The 'if' statement does accept a semicolon in one position; you may use
  47. a newline in that position instead.
  48. Here are the basic grammar elements.
  49.     A /prompt/ is a single-quoted string or a double-quoted string.
  50.     If the word is double-quoted, it may not have any $ substitutions.
  51.     A /word/ is a single unquoted word, a single-quoted string, or a
  52.     double-quoted string.  If the word is unquoted or double quoted,
  53.     then $-substitution will be performed on the word.
  54.     A /symbol/ is a single unquoted word.  A symbol must have a name of
  55.     the form CONFIG_*.  scripts/mkdep.c relies on this convention in order
  56.     to generate dependencies on individual CONFIG_* symbols instead of
  57.     making one massive dependency on include/linux/autoconf.h.
  58.     A /dep/ is a dependency.  Syntactically, it is a /word/.  At run
  59.     time, a /dep/ must evaluate to "y", "m", "n", or "".
  60.     An /expr/ is a bash-like expression using the operators
  61.     '=', '!=', '-a', '-o', and '!'.
  62. Here are all the statements:
  63.     Text statements:
  64.         mainmenu_name   /prompt/
  65.         comment         /prompt/
  66.         text            /prompt/
  67.     Ask statements:
  68.         bool            /prompt/ /symbol/
  69.         hex             /prompt/ /symbol/ /word/
  70.         int             /prompt/ /symbol/ /word/
  71.         string          /prompt/ /symbol/ /word/
  72.         tristate        /prompt/ /symbol/
  73.     Define statements:
  74.         define_bool     /symbol/ /word/
  75.         define_hex      /symbol/ /word/
  76.         define_int      /symbol/ /word/
  77.         define_string   /symbol/ /word/
  78.         define_tristate /symbol/ /word/
  79.     Dependent statements:
  80.         dep_bool        /prompt/ /symbol/ /dep/ ...
  81.         dep_mbool       /prompt/ /symbol/ /dep/ ...
  82.         dep_hex         /prompt/ /symbol/ /word/ /dep/ ...
  83.         dep_int         /prompt/ /symbol/ /word/ /dep/ ...
  84.         dep_string      /prompt/ /symbol/ /word/ /dep/ ...
  85.         dep_tristate    /prompt/ /symbol/ /dep/ ...
  86.     Unset statement:
  87.         unset /symbol/ ...
  88.     Choice statements:
  89.         choice          /prompt/ /word/ /word/
  90.         nchoice         /prompt/ /symbol/ /prompt/ /symbol/ ...
  91.     If statements:
  92.         if [ /expr/ ] ; then
  93.   /statement/
  94.   ...
  95.         fi
  96.         if [ /expr/ ] ; then
  97.   /statement/
  98.   ...
  99.         else
  100.   /statement/
  101.   ...
  102.         fi
  103.     Menu block:
  104.         mainmenu_option next_comment
  105.         comment /prompt/
  106.           /statement/
  107.   ...
  108.         endmenu
  109.     Source statement:
  110.         source /word/
  111. === mainmenu_name /prompt/
  112. This verb is a lot less important than it looks.  It specifies the top-level
  113. name of this Config Language file.
  114. Configure:  ignores this line
  115. Menuconfig: ignores this line
  116. Xconfig:    uses /prompt/ for the label window.
  117. mconfig:    ignores this line (mconfig does a better job without it).
  118. Example:
  119.     # arch/sparc/config.in
  120.     mainmenu_name "Linux/SPARC Kernel Configuration"
  121. === comment /prompt/
  122. This verb displays its prompt to the user during the configuration process
  123. and also echoes it to the output files during output.  Note that the
  124. prompt, like all prompts, is a quoted string with no dollar substitution.
  125. The 'comment' verb is not a Config Language comment.  It causes the
  126. user interface to display text, and it causes output to appear in the
  127. output files.
  128. Configure:  implemented
  129. Menuconfig: implemented
  130. Xconfig:    implemented
  131. mconfig:    implemented
  132. Example:
  133.     # drivers/net/Config.in
  134.     comment 'CCP compressors for PPP are only built as modules.'
  135. === text /prompt/
  136. This verb displays the prompt to the user with no adornment whatsoever.
  137. It does not echo the prompt to the output file.  mconfig uses this verb
  138. internally for its help facility.
  139. Configure:  not implemented
  140. Menuconfig: not implemented
  141. Xconfig:    not implemented
  142. mconfig:    implemented
  143. Example:
  144.     # mconfig internal help text
  145.     text 'Here are all the mconfig command line options.'
  146. === bool /prompt/ /symbol/
  147. This verb displays /prompt/ to the user, accepts a value from the user,
  148. and assigns that value to /symbol/.  The legal input values are "n" and
  149. "y".
  150. Note that the bool verb does not have a default value.  People keep
  151. trying to write Config Language scripts with a default value for bool,
  152. but *all* of the existing language interpreters discard additional values.
  153. Feel free to submit a multi-interpreter patch to linux-kbuild if you
  154. want to implement this as an enhancement.
  155. Configure:  implemented
  156. Menuconfig: implemented
  157. Xconfig:    implemented
  158. mconfig:    implemented
  159. Example:
  160.     # arch/i386/config.in
  161.     bool 'Symmetric multi-processing support' CONFIG_SMP
  162. === hex /prompt/ /symbol/ /word/
  163. This verb displays /prompt/ to the user, accepts a value from the user,
  164. and assigns that value to /symbol/.  Any hexadecimal number is a legal
  165. input value.  /word/ is the default value.
  166. The hex verb does not accept range parameters.
  167. Configure:  implemented
  168. Menuconfig: implemented
  169. Xconfig:    implemented
  170. mconfig:    implemented
  171. Example:
  172.     # drivers/sound/Config.in
  173.     hex 'I/O base for SB Check from manual of the card' CONFIG_SB_BASE 220
  174. === int /prompt/ /symbol/ /word/
  175. This verb displays /prompt/ to the user, accepts a value from the user,
  176. and assigns that value to /symbol/.  /word/ is the default value.
  177. Any decimal number is a legal input value.
  178. The int verb does not accept range parameters.
  179. Configure:  implemented
  180. Menuconfig: implemented
  181. Xconfig:    implemented
  182. mconfig:    implemented
  183. Example:
  184.     # drivers/char/Config.in
  185.     int 'Maximum number of Unix98 PTYs in use (0-2048)' 
  186.         CONFIG_UNIX98_PTY_COUNT 256
  187. === string /prompt/ /symbol/ /word/
  188. This verb displays /prompt/ to the user, accepts a value from the user,
  189. and assigns that value to /symbol/.  /word/ is the default value.  Legal
  190. input values are any ASCII string, except for the characters '"' and '\'.
  191. Configure will trap an input string of "?" to display help.
  192. The default value is mandatory.
  193. Configure:  implemented
  194. Menuconfig: implemented
  195. Xconfig:    implemented
  196. mconfig:    implemented
  197. Example:
  198.     # drivers/sound/Config.in
  199.     string '  Full pathname of DSPxxx.LD firmware file' 
  200.         CONFIG_PSS_BOOT_FILE /etc/sound/dsp001.ld
  201. === tristate /prompt/ /symbol/
  202. This verb displays /prompt/ to the user, accepts a value from the user,
  203. and assigns that value to /symbol/.  Legal values are "n", "m", or "y".
  204. The value "m" stands for "module"; it indicates that /symbol/ should
  205. be built as a kernel module.  The value "m" is legal only if the symbol
  206. CONFIG_MODULES currently has the value "y".
  207. The tristate verb does not have a default value.
  208. Configure:  implemented
  209. Menuconfig: implemented
  210. Xconfig:    implemented
  211. mconfig:    implemented
  212. Example:
  213.     # fs/Config.in
  214.     tristate 'NFS filesystem support' CONFIG_NFS_FS
  215. === define_bool /symbol/ /word/
  216. This verb the value of /word/ to /symbol/.  Legal values are "n" or "y".
  217. For compatibility reasons, the value of "m" is also legal, because it
  218. will be a while before define_tristate is implemented everywhere.
  219. Configure:  implemented
  220. Menuconfig: implemented
  221. Xconfig:    implemented
  222. mconfig:    implemented
  223. Example:
  224.     # arch/alpha/config.in
  225.     if [ "$CONFIG_ALPHA_GENERIC" = "y" ]
  226.     then
  227.             define_bool CONFIG_PCI y
  228.             define_bool CONFIG_ALPHA_NEED_ROUNDING_EMULATION y
  229.     fi
  230. === define_hex /symbol/ /word/
  231. This verb assigns the value of /word/ to /symbol/.  Any hexadecimal
  232. number is a legal value.
  233. Configure:  implemented
  234. Menuconfig: implemented
  235. Xconfig:    implemented
  236. mconfig:    implemented
  237. Example:
  238.     # Not from the corpus
  239.     bool 'Specify custom serial port' CONFIG_SERIAL_PORT_CUSTOM
  240.     if [ "$CONFIG_SERIAL_PORT_CUSTOM" = "y" ]; then
  241. hex 'Serial port number' CONFIG_SERIAL_PORT
  242.     else
  243. define_hex CONFIG_SERIAL_PORT 0x3F8
  244.     fi
  245. === define_int /symbol/ /word/
  246. This verb assigns /symbol/ the value /word/.  Any decimal number is a
  247. legal value.
  248. Configure:  implemented
  249. Menuconfig: implemented
  250. Xconfig:    implemented
  251. mconfig:    implemented
  252. Example:
  253.     # drivers/char/ftape/Config.in
  254.     define_int CONFIG_FT_ALPHA_CLOCK 0
  255. === define_string /symbol/ /word/
  256. This verb assigns the value of /word/ to /symbol/.  Legal input values
  257. are any ASCII string, except for the characters '"' and '\'.
  258. Configure:  implemented
  259. Menuconfig: implemented
  260. Xconfig:    implemented
  261. mconfig:    implemented
  262. Example
  263.     # Not from the corpus
  264.     define_string CONFIG_VERSION "2.2.0"
  265. === define_tristate /symbol/ /word/
  266. This verb assigns the value of /word/ to /symbol/.  Legal input values
  267. are "n", "m", and "y".
  268. As soon as this verb is implemented in all interpreters, please use it
  269. instead of define_bool to define tristate values.  This aids in static
  270. type checking.
  271. Configure:  implemented
  272. Menuconfig: implemented
  273. Xconfig:    implemented
  274. mconfig:    implemented
  275. Example:
  276.     # drivers/video/Config.in
  277.     if [ "$CONFIG_FB_AMIGA" = "y" ]; then
  278.        define_tristate CONFIG_FBCON_AFB y
  279.        define_tristate CONFIG_FBCON_ILBM y
  280.     else
  281.        if [ "$CONFIG_FB_AMIGA" = "m" ]; then
  282.           define_tristate CONFIG_FBCON_AFB m
  283.           define_tristate CONFIG_FBCON_ILBM m
  284.        fi
  285.     fi
  286. === dep_bool /prompt/ /symbol/ /dep/ ...
  287. This verb evaluates all of the dependencies in the dependency list.
  288. Any dependency which has a value of "y" does not restrict the input
  289. range.  Any dependency which has an empty value is ignored.
  290. Any dependency which has a value of "n", or which has some other value,
  291. (like "m") restricts the input range to "n".  Quoting dependencies is not
  292. allowed. Using dependencies with an empty value possible is not
  293. recommended.  See also dep_mbool below.
  294. If the input range is restricted to the single choice "n", dep_bool
  295. silently assigns "n" to /symbol/.  If the input range has more than
  296. one choice, dep_bool displays /prompt/ to the user, accepts a value
  297. from the user, and assigns that value to /symbol/.
  298. Configure:  implemented
  299. Menuconfig: implemented
  300. XConfig:    implemented
  301. mconfig:    implemented
  302. Example:
  303.     # drivers/net/Config.in
  304.     dep_bool 'Aironet 4500/4800 PCI support 'CONFIG_AIRONET4500_PCI $CONFIG_PCI
  305. Known bugs:
  306. - Xconfig does not write "# foo is not set" to .config (as well as
  307.   "#undef foo" to autoconf.h) if command is disabled by its dependencies.
  308. === dep_mbool /prompt/ /symbol/ /dep/ ...
  309. This verb evaluates all of the dependencies in the dependency list.
  310. Any dependency which has a value of "y" or "m" does not restrict the
  311. input range.  Any dependency which has an empty value is ignored.
  312. Any dependency which has a value of "n", or which has some other value,
  313. restricts the input range to "n".  Quoting dependencies is not allowed.
  314. Using dependencies with an empty value possible is not recommended.
  315. If the input range is restricted to the single choice "n", dep_bool
  316. silently assigns "n" to /symbol/.  If the input range has more than
  317. one choice, dep_bool displays /prompt/ to the user, accepts a value
  318. from the user, and assigns that value to /symbol/.
  319. Notice that the only difference between dep_bool and dep_mbool
  320. is in the way of treating the "m" value as a dependency.
  321. Configure:  implemented
  322. Menuconfig: implemented
  323. XConfig:    implemented
  324. mconfig:    implemented
  325. Example:
  326.     # Not from the corpus
  327.     dep_mbool 'Packet socket: mmapped IO' CONFIG_PACKET_MMAP $CONFIG_PACKET
  328. Known bugs:
  329. - Xconfig does not write "# foo is not set" to .config (as well as
  330.   "#undef foo" to autoconf.h) if command is disabled by its dependencies.
  331. === dep_hex /prompt/ /symbol/ /word/ /dep/ ...
  332. === dep_int /prompt/ /symbol/ /word/ /dep/ ...
  333. === dep_string /prompt/ /symbol/ /word/ /dep/ ...
  334. I am still thinking about the semantics of these verbs.
  335. Configure:  not implemented
  336. Menuconfig: not implemented
  337. XConfig:    not implemented
  338. mconfig:    not implemented
  339. === dep_tristate /prompt/ /symbol/ /dep/ ...
  340. This verb evaluates all of the dependencies in the dependency list.
  341. Any dependency which has a value of "y" does not restrict the input range.
  342. Any dependency which has a value of "m" restricts the input range to
  343. "m" or "n".  Any dependency which has an empty value is ignored.
  344. Any dependency which has a value of "n", or which has some other value,
  345. restricts the input range to "n".  Quoting dependencies is not allowed.
  346. Using dependencies with an empty value possible is not recommended.
  347. If the input range is restricted to the single choice "n", dep_tristate
  348. silently assigns "n" to /symbol/.  If the input range has more than
  349. one choice, dep_tristate displays /prompt/ to the user, accepts a value
  350. from the user, and assigns that value to /symbol/.
  351. Configure:  implemented
  352. Menuconfig: implemented
  353. Xconfig:    implemented
  354. mconfig:    implemented
  355. Example:
  356.     # drivers/char/Config.in
  357.     dep_tristate 'Parallel printer support' CONFIG_PRINTER $CONFIG_PARPORT
  358. Known bugs:
  359. - Xconfig does not write "# foo is not set" to .config (as well as
  360.   "#undef foo" to autoconf.h) if command is disabled by its dependencies.
  361. === unset /symbol/ ...
  362. This verb assigns the value "" to /symbol/, but does not cause /symbol/
  363. to appear in the output.  The existence of this verb is a hack; it covers
  364. up deeper problems with variable semantics in a random-execution language.
  365. Configure:  implemented
  366. Menuconfig: implemented
  367. Xconfig:    implemented (with bugs)
  368. mconfig:    implemented
  369. Example:
  370.     # arch/mips/config.in
  371.     unset CONFIG_PCI
  372.     unset CONFIG_MIPS_JAZZ
  373.     unset CONFIG_VIDEO_G364
  374. === choice /prompt/ /word/ /word/
  375. This verb implements a choice list or "radio button list" selection.
  376. It displays /prompt/ to the user, as well as a group of sub-prompts
  377. which have corresponding symbols.
  378. When the user selects a value, the choice verb sets the corresponding
  379. symbol to "y" and sets all the other symbols in the choice list to "n".
  380. The second argument is a single-quoted or double-quoted word that
  381. describes a series of sub-prompts and symbol names.  The interpreter
  382. breaks up the word at white space boundaries into a list of sub-words.
  383. The first sub-word is the first prompt; the second sub-word is the
  384. first symbol.  The third sub-word is the second prompt; the fourth
  385. sub-word is the second symbol.  And so on, for all the sub-words.
  386. The third word is a literal word.  Its value must be a unique abbreviation
  387. for exactly one of the prompts.  The symbol corresponding to this prompt
  388. is the default enabled symbol.
  389. Note that because of the syntax of the choice verb, the sub-prompts
  390. may not have spaces in them.
  391. Configure:  implemented
  392. Menuconfig: implemented
  393. Xconfig:    implemented
  394. mconfig:    implemented
  395. Example:
  396.     # arch/i386/config.in
  397.     choice '  PCI access mode' 
  398.         "BIOS           CONFIG_PCI_GOBIOS       
  399.          Direct         CONFIG_PCI_GODIRECT     
  400.          Any            CONFIG_PCI_GOANY"       Any
  401. === nchoice /prompt/ /symbol/ /prompt/ /symbol/ ...
  402. This verb has the same semantics as the choice verb, but with a sensible
  403. syntax.
  404. The first /prompt/ is the master prompt for the entire choice list.
  405. The first /symbol/ is the default symbol to enable (notice that this
  406. is a symbol, not a unique prompt abbreviation).
  407. The subsequent /prompt/ and /symbol/ pairs are the prompts and symbols
  408. for the choice list.
  409. Configure:  not implemented
  410. Menuconfig: not implemented
  411. XConfig:    not implemented
  412. mconfig:    implemented
  413. === if [ /expr/ ] ; then
  414. This is a conditional statement, with an optional 'else' clause.  You may
  415. substitute a newline for the semicolon if you choose.
  416. /expr/ may contain the following atoms and operators.  Note that, unlike
  417. shell, you must use double quotes around every atom.
  418.     /atom/:
  419. "..." a literal
  420. "$..." a variable
  421.     /expr/:
  422. /atom/  = /atom/ true if atoms have identical value
  423. /atom/ != /atom/ true if atoms have different value
  424.     /expr/:
  425. /expr/ -o /expr/ true if either expression is true
  426. /expr/ -a /expr/ true if both expressions are true
  427. ! /expr/ true if expression is not true
  428. Note that a naked /atom/ is not a valid /expr/.  If you try to use it
  429. as such:
  430.     # Do not do this.
  431.     if [ "$CONFIG_EXPERIMENTAL" ]; then
  432. bool 'Bogus experimental feature' CONFIG_BOGUS
  433.     fi
  434. ... then you will be surprised, because CONFIG_EXPERIMENTAL never has a
  435. value of the empty string!  It is always "y" or "n", and both of these
  436. are treated as true (non-empty) by the bash-based interpreters Configure
  437. and Menuconfig.
  438. Configure:  implemented
  439. Menuconfig: implemented
  440. XConfig:    implemented, with bugs
  441. mconfig:    implemented
  442. Xconfig has some known bugs, and probably some unknown bugs too:
  443. - literals with an empty "" value are not properly handled.
  444. === mainmenu_option next_comment
  445. This verb introduces a new menu.  The next statement must have a comment
  446. verb.  The /prompt/ of that comment verb becomes the title of the menu.
  447. (I have no idea why the original designer didn't create a 'menu ...' verb).
  448. Statements outside the scope of any menu are in the implicit top menu.
  449. The title of the top menu comes from a variety of sources, depending on
  450. the interpreter.
  451. Configure:  implemented
  452. Menuconfig: implemented
  453. Xconfig:    implemented
  454. mconfig:    implemented
  455. === endmenu
  456. This verb closes the scope of a menu.
  457. Configure:  implemented
  458. Menuconfig: implemented
  459. Xconfig:    implemented
  460. mconfig:    implemented
  461. === source /word/
  462. This verb interprets the literal /word/ as a filename, and interpolates
  463. the contents of that file.  The word must be a single unquoted literal
  464. word.
  465. Some interpreters interpret this verb at run time; some interpreters
  466. interpret it at parse time.
  467. Inclusion is textual inclusion, like the C preprocessor #include facility.
  468. The source verb does not imply a submenu or any kind of block nesting.
  469. Configure:  implemented (run time)
  470. Menuconfig: implemented (parse time)
  471. Xconfig:    implemented (parse time)
  472. mconfig:    implemented (parse time)