It has come to the awareness of many (apparently *after* I did my talk at the summit) that the mini-config-language is quite useful and indeed necessary unless we want a bunch of really ugly, duplicated makefile code scattered through our codebase, and (most) people have come to the realization that they don't want to handwrite static C initialization structures unnecessarily.
So, by request, I've modified the old pseudo-BNF for the config language and appended it to this message with the (initial) changes to include in the "new" language. This is by no means complete nor formal (yet hopefully it is relatively accurate ;). Most of the language description matches what we currently have, but I've also added many of the changes I deem necessary (mostly from common sense). There are a few notes and suggestions on which I'd like some feedback. Feel free to rant or rave on anything and furthermore share your ideas.
Said changes are mostly small and include, but are not limited to:
- Removing unnecessary "end" statements to commands that needn't be blocks (like 'arch') - Combined the function of 'define' (as found in src/config/Options.lb) as an optional part of the 'default' statement - Limited the widespread used of 'default' for setting options - Changed 'dir' to 'config' and 'config' to 'static' (maybe) - Removing necessity of double-quotes surrounding strings (which may happen to include double-quotes of their own) - etc...
-------------------------------------------------------------------------------
New config language for LinuxBIOS
This document defines the new configuration language for LinuxBIOS.
The goals of the new language are these:
- Move from the python based configuration tool to something more easily extensible and flexible - Simplify parser so people can see and alter what is done - Detail output so people can visualize the configuration tree during the parsing process - Implement capability for viewing and altering configuration with Kconfig
Here is the new language. It is very similar to the old one, differing in only a few aspects. Furthermore, effort has been put forth to make the new configuration tool capable of parsing the syntax of the old language. This capability may be phased out in the near future, and replaced with warning/error statements for configuration files not conforming to the new language.
Pseudo-BNF extensions key: Elements in angled brackets (<>) are nonterminal symbols; items within braces ({}) are for clarification and do not represent grammar, double-quotes ("") denote literal strings required in the text, elements in single-quotes ('') are keywords picked up by the parser, and a postfixed asterisk (*) denotes optionally repeatable blocks.
# Expressions are composed of terms acted upon by operators # (unary or binary). # They may optionally be surrounded by parentheses. # (Preferably, surrounding parentheses may soon be required syntax - ?) expr ::= ["("] ( unary-op term ) | ( term (binary-op term)* ) [")"]
# term is a number (dec or hex with '0x' notation), ID, or expression. # An ID remains as an unexpanded reference until it is used or exported. term ::= NUM | ID | expr
unary-op ::= "+" | "-" | "!" binary-op ::= "+" | "-" | "*" | "/" | "^" | "&&" | "||"
# Default command: Define and set an ID to its initial value. # Defaults may only be set in Options.lb files. # Attempts to assign defaults elsewhere are treated as like 'option'. # It is OK to set an ID's default value after it has already been set. # Default assignments may optionally be followed on subsequent lines # with 'export', 'type', and/or 'comment' commands in any order. # A comment will be displayed in generated Kconfig menus. # Values are re-evaluated from component statements when referenced # (ie, are delayed-evaluate, or recursively expanded variables). default ::= 'default' ID "=" value [ type ::= ("number" | "bool" | "string") # (Hex vs. Dec ???) export ::= ("always" | "used" | "never") comment ::= 'comment' [<newline> <comment>]* "end" ]
# Option command: Re-sets ID to new value. # Options are used in Config files (in expressions and 'if' statements) # and are also passed to the C compiler when building rom images. # Options always over-ride defaults. # It is an error to have an option command define the value of an ID # after the ID has been referenced (i.e. 'set after used' is an error). option ::= 'option' ID "=" value
# Values are treated differently depending on their declared type. # A string is taken literally and doesn't need surrounding quotes. # A numeric type is always evaluated mathematically, as an expression. # An expr containing at least 1 one hex term results in a hex answer. value ::= string | term
# Before any option may be referenced in a Config, it must be "used". uses ::= 'uses' ID
# The 'chip' command causes sourcing of Config files as in the old # config tool. As parts are sourced, a device tree is built. # The 'device' command also works just as it has in the past. # Note that the 'device' command is used exclusively for describing the # device tree and it does not source any configuration files. # The structure of the tree is determined by the structure of the # components. # Example of structure: ... chip southbridge/via/vt8231 register "enable_native_ide" = "0" device pci 11.0 on # Southbrdge chip superio/winbond/w83627hf device pnp 2e.0 on # Floppy io 0x60 = 0x3f0 end ... # Static initializers are auto-generated from this hierarchy (static.c). # Order does not matter for statements in the same block (for instance, # in the above example, the device block may go before 'register' as # long as it ends). chip ::= 'chip' PATH ['register' """<register_name>""" "=" """<register_value>"""]* [<embedded_chip_or_device_statement>]* "end" # NOTE: Quotes may (preferably) become unneccessary in 'register' # clause.
device ::= 'device' device_path_type device_path ("on" | "off") [device_resource <resource_index> "=" <resource_base>]*
device_path_type ::= ("pci_domain" | "pci" | "pnp" | "apic" | "apic_cluster" | "i2c")
device_path ::= <port_on_path_type>"."<device_number_on_path_type> # NOTE: The two numbers composing the path are implied hex (without the "0x")
device_resource ::= "io" | "irq" | "drq" | "mem"
# Except as otherwise noted (in 'mainboard' and 'arch'), # PATH is to a file's location in relation to the LinuxBIOS src dir. PATH ::= {path_to_Config_file/}<filename>
# Files to include in static.c (Can this command have a better name?) static ::= 'static' PATH
# Add C code to the current component (motherboard, etc.) # to initialise the component-INDEPENDENT structure members. # (Only used for src/arch/<arch>/init/crt0.S, so may become implicit) init ::= 'init' PATH
# Add C code to the current component (motherboard, etc.) # to initialise the component-DEPENDENT structure members. register ::= 'register' <CODE>
# mainboard command specifies where (from src/mainboard directory) # to find the board's root-level Config file with device tree. mainboard ::= 'mainboard' {src/mainboard/}PATH
# Specify where (from within src/arch directory) to find the # architecture-specific Config file. arch ::= 'arch' {src/arch/}PATH
# Target build directory target ::= 'target' PATH
# Payload to include in image; existence is checked before compilation payload ::= 'payload' PATH
# Files for building linuxbios:
# Include a file in crt0.S mainboardinit ::= 'mainboardinit' PATH
# Include an object for initialization initobject ::= 'initobject' PATH
# Object file object ::= 'object' PATH
# Driver objects are built into the image in a different way driver ::= 'driver' PATH
# Use the Config file in the PATH config ::= 'config' PATH
# Add a file to the set of ldscript files. ldscript ::= 'ldscript' PATH
# Set up a makerule makerule ::= 'makerule' "<rule_name>" ("""[depends]""")* ("""[action]""")* "end" # NOTE: Again, quotes may become unneccessary
# Dependencies or actions for the makerule command depends ::= 'depends' <raw_make_syntax(prerequisites)> action ::= 'action' <raw_make_syntax(commands)>
# Add an action to an existing make rule. addaction ::= 'addaction' "<rule_name>" <raw_make_syntax(commands)>
# Addition definitions used in generated image makefiles. makedefine ::= 'makedefine' <raw_make_syntax>
# statements statement ::= option | default | uses | arch | target | chip | device | driver | object | makerule | makedefine | addaction | init | mainboardinit | initobject | if | config | static | ldscript
statements ::= (statement)*
As I figured... there are some typos. One in particular to note is that the 'device' block does indeed end with an 'end' keyword.
-Josiah