Boost C++ Libraries

PrevUpHomeNext

目标类型

扫描器

我们在简介中做的第一件事是声明一个新的目标类型

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 ;

这足以扫描包含依赖项。


PrevUpHomeNext