对于大多数主目标规则,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
规则。