文本预处理器¶
构建系统包含一个类似于 C 预处理器的文本预处理器,用于处理没有内置预处理器的文件,例如 XUL 和 JavaScript 文档。它在 python/mozbuild/mozbuild/preprocessor.py
中实现,通常通过 JAR 清单 调用。
虽然用于预处理 CSS 文件,但指令已更改为以 %
而不是 #
开头,以避免与 id 选择器冲突。
指令¶
变量定义¶
define¶
#define variable
#define variable value
定义一个预处理器变量。
请注意,与 C 预处理器不同,源代码中稍后出现的此变量实例不会自动替换(请参阅 #filter)。如果未提供值,则默认为 1
。
请注意,空格很重要,因此 "#define foo one"
和 "#define foo one "
是不同的(在第二种情况下,foo
被定义为一个四字符字符串)。
undef¶
#undef variable
取消定义一个预处理器变量。
条件语句¶
if¶
#if variable
#if !variable
#if variable == string
#if variable != string
如果条件为假,则禁用输出。这可以嵌套到任意深度。请注意,在相等性检查中,变量必须放在前面。
else¶
#else
反转上一个条件块的状态;例如,如果最后一个 #if
为真(输出已启用),则 #else
会将其关闭(输出被禁用)。
endif¶
#endif
结束条件块。
ifdef / ifndef¶
#ifdef variable
#ifndef variable
一个 #if
条件,仅当预处理器变量 variable 已定义(在 ifdef
的情况下)或未定义(ifndef
)时才为真。
elif / elifdef / elifndef¶
#elif variable
#elif !variable
#elif variable == string
#elif variable != string
#elifdef variable
#elifndef variable
一种简写,表示 #else
与相关条件的组合。以下两个块等效
#ifdef foo
block 1
#elifdef bar
block 2
#endif
#ifdef foo
block 1
#else
#ifdef bar
block 2
#endif
#endif
文件包含¶
include¶
#include filename
由 filename 指定的文件被处理,就好像其内容放置在此位置一样。这也意味着预处理器条件甚至可以在一个文件中开始并在另一个文件中结束(但不建议这样做)。对包含深度、相同文件的重复包含或自身包含没有限制;因此,应注意避免无限循环。
includesubst¶
#includesubst @variable@filename
与 #include
相同,除了包含文件中变量的所有实例也像 #filter
替换一样展开。
expand¶
#expand string
所有包含在 __
中的变量都将替换为其值,仅限于此行。如果变量未定义,则扩展为空字符串。例如,如果 foo
的值为 bar
,并且 baz
未定义,则
#expand This <__foo__> <__baz__> gets expanded
扩展为
This <bar> <> gets expanded
filter / unfilter¶
#filter filter1 filter2 ... filterN
#unfilter filter1 filter2 ... filterN
#filter
启用给定的过滤器。
过滤器按字母顺序逐行运行。
#unfilter
关闭给定的过滤器。可用的过滤器有:
- emptyLines
从输出中删除空行
- dumbComments
dumbComments:清空任何由可选空格后跟
//
组成的行。适合去除单独一行的注释,并且使用简单的正则表达式过滤器更智能是不可能的- substitution
所有包含在 @ 中的变量都将替换为其值。如果变量未定义,则为致命错误。类似于
#expand
和#filter
- attemptSubstitution
所有包含在
@
中的变量都将替换为其值,或者如果变量未定义则替换为空字符串。类似于#expand
。
literal¶
#literal string
按字面输出字符串(即行的其余部分),没有任何其他修复。这对于输出以 #
开头的行或临时禁用过滤器很有用。
其他¶
#error¶
#error string
在此处导致致命错误,错误消息为给定的字符串。