假设您正在编写一个生成 C++ 代码的应用程序。如果您曾经做过这样的事情,您就会知道这并不美好。在字符串字面量中嵌入大量 C++ 代码非常笨拙。一个更好的解决方案是
实现起来非常容易。您编写特殊的逐字文件,这些文件只是 C++,除了文件的第一行包含应生成的变量的名称。创建一个简单的工具,该工具接受一个逐字文件并创建一个 cpp 文件,其中包含一个 char*
变量,其名称取自逐字文件的第一行,其值为文件的正确引用的内容。
让我们看看 Boost.Build 能做什么。
首先,Boost.Build 对“逐字文件”一无所知。因此,您必须注册一个新的目标类型。以下代码执行此操作
import type ; type.register VERBATIM : verbatim ;
传递给 type.register 的第一个参数是声明类型的名称。按照惯例,它是大写的。第二个参数是此类型文件的后缀。因此,如果 Boost.Build 在源列表中看到 code.verbatim
,它就知道它是 VERBATIM
类型。
接下来,您告诉 Boost.Build 逐字文件可以在一个构建步骤中转换为 C++ 文件。一个 生成器是构建步骤的模板,该步骤将一种类型(或一组类型)的目标转换为另一种类型。我们的生成器将被称为 verbatim.inline-file
;它将 VERBATIM
文件转换为 CPP
文件
import generators ; generators.register-standard verbatim.inline-file : VERBATIM : CPP ;
最后,您必须通知 Boost.Build 用于进行转换的 shell 命令。这是通过 actions
声明完成的。
actions inline-file { "./inline-file.py" $(<) $(>) }
现在,我们准备将所有内容整合在一起。将以上所有代码放在文件 verbatim.jam
中,将 import verbatim ;
添加到 Jamroot.jam
中,并且可以在您的 Jamfile 中编写以下内容
exe codegen : codegen.cpp class_template.verbatim usage.verbatim ;
列出的逐字文件将自动转换为 C++ 源文件,编译然后链接到 codegen 可执行文件。
在后续部分中,我们将扩展此示例,并详细回顾所有机制。完整代码可在 example/customization
目录中找到。