我们在简介中做的第一件事是声明一个新的目标类型
import type ; type.register VERBATIM : verbatim ;
类型是目标最重要的属性。Boost.Build 能够自动生成必要的构建操作,只因为您指定了所需的类型(使用不同的主目标规则),并且因为 Boost.Build 可以从其扩展名猜测源代码的类型。
对于 type.register
规则,前两个参数是新类型的名称和与之关联的扩展名列表。具有列表中扩展名的文件将具有给定的目标类型。在从其他源代码生成声明类型的目标的情况下,将使用第一个指定的扩展名。
有时您希望根据构建属性(例如工具集)更改用于生成目标的后缀。例如,某些编译器对可执行文件使用扩展名 elf
。您可以使用 type.set-generated-target-suffix
规则
type.set-generated-target-suffix EXE : <toolset>elf : elf ;
可以从现有类型继承新目标类型。
type.register PLUGIN : : SHARED_LIB ;
上面的代码定义了一个从 SHARED_LIB
派生的新类型。最初,新类型继承了基类型的全部属性,特别是生成器和后缀。通常,您会以某种方式更改新类型。例如,使用 type.set-generated-target-suffix
,您可以为新类型设置后缀。或者,您可以为新类型编写特殊的生成器。例如,它可以为插件生成额外的元信息。无论哪种方式,只要可以使用 SHARED_LIB
,就可以使用 PLUGIN
类型。例如,您可以将插件直接链接到应用程序。
可以将类型定义为“main”,在这种情况下,Boost.Build 将自动为构建该类型目标声明一个主目标规则。更多详细信息可以在后面找到。
有时,文件可以通过某些包含系统引用其他文件。为了使 Boost.Build 跟踪包含文件之间的依赖关系,您需要提供一个扫描器。主要限制是,只能为目标类型分配一个扫描器。
首先,我们需要为扫描器声明一个新类
class verbatim-scanner : common-scanner { rule pattern ( ) { return "//###include[ ]*\"([^\"]*)\"" ; } }
所有复杂的逻辑都在 common-scanner
类中,您只需要覆盖返回用于扫描的正则表达式的方法。正则表达式中的括号表示包含文件名的字符串部分。正则表达式中只有第一个带括号的组会被识别;如果无法用这种方式表达您想要的所有内容,则可以返回多个正则表达式,每个正则表达式都包含一个要匹配的带括号的组。
之后,我们需要注册我们的扫描器类
scanner.register verbatim-scanner : include ;
第二个参数的值,在本例中为 include
,指定包含应搜索包含文件的路径列表的属性。
最后,我们将新扫描器分配给 VERBATIM
目标类型
type.set-scanner VERBATIM : verbatim-scanner ;
这足以扫描包含依赖项。