文本预处理器

构建系统包含一个类似于 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

在此处导致致命错误,错误消息为给定的字符串。