Boost C++ Libraries

PrevUpHomeNext

自定义命令

对于大多数主目标规则,Boost.Build 会自动确定要运行的命令。当您想要使用新的文件类型或支持新的工具时,一种方法是扩展 Boost.Build 以平滑地支持它们,如第 6 章,扩展器手册中所述。但是,如果新工具仅在一个地方使用,则可能更容易直接指定要运行的命令。

三种主要目标规则可用于此目的。 make 规则允许您通过运行您指定的命令从任意数量的源文件构建单个文件。 notfile 规则允许您运行任意命令,而无需创建任何文件。最后, generate 规则允许您使用 Boost.Build 的虚拟目标来描述转换。这比 make 规则操作的文件名更高级别,并且允许您创建多个目标,根据属性创建不同名称的目标或使用多个工具。

make 规则用于当您想要使用某个特定命令从多个源创建单个文件时。 notfile 用于无条件运行命令。

假设您想要通过运行命令 in2out 从文件 file.in 创建文件 file.out。以下是您在 Boost.Build 中执行此操作的方法

make file.out : file.in : @in2out ;
actions in2out
{
    in2out $(<) $(>)
}

如果您运行 b2 并且 file.out 不存在,Boost.Build 将运行 in2out 命令来创建该文件。有关指定操作的更多详细信息,请参阅名为“Boost.Jam 语言”的部分

您可能只想无条件地运行某些命令,并且该命令不会创建任何特定文件。为此,您可以使用 notfile 规则。例如

notfile echo_something : @echo ;
actions echo
{
    echo "something"
}

make 规则唯一的区别在于目标的名称不被视为文件的名称,因此 Boost.Build 将无条件地运行操作。

generate 规则用于当您想要使用 Boost.Build 的虚拟目标来表达转换,而不是仅仅使用文件名。 generate 规则具有标准的主目标规则签名,但您需要指定 generating-rule 属性。该属性的值应采用 @rule-name 的形式,命名规则应具有以下签名

rule generating-rule ( project name : property-set : sources * )

并将使用 project-target 类的实例、主目标的名称、包含构建属性的 property-set 类的实例以及对应于源的 virtual-target 类的实例列表进行调用。该规则必须返回一个 virtual-target 实例列表。可以通过查看 build/virtual-target.jam 文件来了解 virtual-target 类的接口。Boost.Build 发行版中包含的 generate 示例说明了如何使用 generate 规则。


PrevUpHomeNext