123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 |
- .. _preprocessor:
- =================
- Text Preprocessor
- =================
- The build system contains a text preprocessor similar to the C preprocessor,
- meant for processing files which have no built-in preprocessor such as XUL
- and JavaScript documents. It is implemented at ``python/mozbuild/mozbuild/preprocessor.py`` and
- is typically invoked via :ref:`jar_manifests`.
- While used to preprocess CSS files, the directives are changed to begin with
- ``%`` instead of ``#`` to avoid conflict of the id selectors.
- Directives
- ==========
- Variable Definition
- -------------------
- define
- ^^^^^^
- ::
- #define variable
- #define variable value
- Defines a preprocessor variable.
- Note that, unlike the C preprocessor, instances of this variable later in the
- source are not automatically replaced (see #filter). If value is not supplied,
- it defaults to ``1``.
- Note that whitespace is significant, so ``"#define foo one"`` and
- ``"#define foo one "`` is different (in the second case, ``foo`` is defined to
- be a four-character string).
- undef
- ^^^^^
- ::
- #undef variable
- Undefines a preprocessor variable.
- Conditionals
- ------------
- if
- ^^
- ::
- #if variable
- #if !variable
- #if variable==string
- #if variable!=string
- Disables output if the conditional is false. This can be nested to arbitrary
- depths. Note that in the equality checks, the variable must come first, and
- the comparison operator must not be surrounded by any whitespace.
- else
- ^^^^
- ::
- #else
- Reverses the state of the previous conditional block; for example, if the
- last ``#if`` was true (output was enabled), an ``#else`` makes it off
- (output gets disabled).
- .. warning:: An ``#else`` is relative to the last conditional block only,
- unlike the C preprocessor.
- It does not matter whether any blocks before it were true. This behavior
- changed on trunk (Gecko 1.9) on 2006-12-07; see Bug 277122 for details.
- ::
- #if 1
- always included
- #elif 1
- never included
- #else
- always included
- #endif
- endif
- ^^^^^
- ::
- #endif
- Ends the conditional block.
- ifdef / ifndef
- ^^^^^^^^^^^^^^
- ::
- #ifdef variable
- #ifndef variable
- An ``#if`` conditional that is true only if the preprocessor variable
- variable is defined (in the case of ``ifdef``) or not defined (``ifndef``).
- elif / elifdef / elifndef
- ^^^^^^^^^^^^^^^^^^^^^^^^^
- ::
- #elif variable
- #elif !variable
- #elif variable == string
- #elif variable != string
- #elifdef variable
- #elifndef variable
- A shorthand to mean an ``#else`` combined with the relevant conditional.
- The following two blocks are equivalent::
- #ifdef foo
- block 1
- #elifdef bar
- block 2
- #endif
- ::
- #ifdef foo
- block 1
- #else
- #ifdef bar
- block 2
- #endif
- #endif
- .. warning:: An ``#elif``, ``#elifdef``, or ``#elifndef`` is relative to
- the last conditional block only (as well as the condition it implies),
- unlike the C preprocessor. It does not matter whether any blocks before
- it were true. This behavior changed on trunk (Gecko 1.9) on 2006-12-07.
- See Bug 277122 for details.
- File Inclusion
- --------------
- include
- ^^^^^^^
- ::
- #include filename
- The file specified by filename is processed as if the contents was placed
- at this position. This also means that preprocessor conditionals can even
- be started in one file and ended in another (but is highly discouraged).
- There is no limit on depth of inclusion, or repeated inclusion of the same
- file, or self inclusion; thus, care should be taken to avoid infinite loops.
- includesubst
- ^^^^^^^^^^^^
- ::
- #includesubst @variable@filename
- Same as a ``#include`` except that all instances of variable in the included
- file is also expanded as in ``#filter`` substitution
- expand
- ^^^^^^
- ::
- #expand string
- All variables wrapped in ``__`` are replaced with their value, for this line
- only. If the variable is not defined, it expands to an empty string. For
- example, if ``foo`` has the value ``bar``, and ``baz`` is not defined, then::
- #expand This <__foo__> <__baz__> gets expanded
- Is expanded to::
- This <bar> <> gets expanded
- filter / unfilter
- ^^^^^^^^^^^^^^^^^
- ::
- #filter filter1 filter2 ... filterN
- #unfilter filter1 filter2 ... filterN
- ``#filter`` turns on the given filter.
- Filters are run in alphabetical order on a per-line basis.
- ``#unfilter`` turns off the given filter. Available filters are:
- emptyLines
- strips blank lines from the output
- slashslash
- strips everything from the first two consecutive slash (``/``)
- characters until the end of the line
- spaces
- collapses consecutive sequences of spaces into a single space,
- and strips leading and trailing spaces
- substitution
- all variables wrapped in @ are replaced with their value. If the
- variable is not defined, it is a fatal error. Similar to ``#expand``
- and ``#filter``
- attemptSubstitution
- all variables wrapped in ``@`` are replaced with their value, or an
- empty string if the variable is not defined. Similar to ``#expand``.
- literal
- ^^^^^^^
- ::
- #literal string
- Output the string (i.e. the rest of the line) literally, with no other fixups.
- This is useful to output lines starting with ``#``, or to temporarily
- disable filters.
- Other
- -----
- #error
- ^^^^^^
- ::
- #error string
- Cause a fatal error at this point, with the error message being the
- given string.
|