使用Boost.build(bbv2/bjam)控制构建顺序(用于自动生成的代码)

使用Boost.build(bbv2/bjam)控制构建顺序(用于自动生成的代码),boost,generator,bjam,boost-build,Boost,Generator,Bjam,Boost Build,我正在使用外部工具为工作中的应用程序生成源代码。该工具使用一个充满JSON文件的目录树,并生成C++和其他一些实用文件。我已经能够设置一个规则和一个目标,在源代码发生更改时重新运行生成器,但我正在努力确定如何控制构建顺序 因为我没有直接的方法来生成代码生成器将生成的C++/H文件列表(因为它是由运行时配置决定的),所以除了运行生成器,然后对输出目录中的所有文件执行GLOB之外,我看不到任何替代方法 当我将源(JSON)文件设置为可执行文件的依赖项时,Boost.Build会在情况发生变化时运行生

我正在使用外部工具为工作中的应用程序生成源代码。该工具使用一个充满JSON文件的目录树,并生成C++和其他一些实用文件。我已经能够设置一个规则和一个目标,在源代码发生更改时重新运行生成器,但我正在努力确定如何控制构建顺序

因为我没有直接的方法来生成代码生成器将生成的C++/H文件列表(因为它是由运行时配置决定的),所以除了运行生成器,然后对输出目录中的所有文件执行GLOB之外,我看不到任何替代方法

当我将源(JSON)文件设置为可执行文件的依赖项时,Boost.Build会在情况发生变化时运行生成器,但是,它会在运行代码生成器之前计算可执行文件的依赖项,因此不会重建正确的内容(例如,如果生成了新文件,或更改了头文件,则不会重新编译它们的依赖关系),因为该检查是在代码生成器运行之前执行的,因此GLOB会获取当前(过期)生成的文件,而不是新文件

我通过两次调用b2来解决这个问题,第一次调用生成代码的目标,第二次调用,以便新生成的代码被正确地全局化并重建可执行文件“如有必要,运行代码生成器,然后对输出目录中的任何文件进行全局搜索,并确定需要重建的内容”。我没有成功地找到合适的搜索术语——bbv2有自己的“生成器”概念,这使得很难准确地找到我要查找的内容,而且我还没有找到一个好的示例源

我的规则是这样的,恐怕我不能说得更具体了。这是一个生成器,它接受*.foo和*.bar类型的文件,并创建一组CPP文件和一个.baz文件,我用它来确定它是否是最新的

type.register FOO : foo ;
type.register BAR : bar ;

type.register BAZ : baz ;

generators.register-composing fileset2baz : FOO BAR : BAZ ;
rule fileset2baz ( target : sources * : properties * )
{
   # I actually have a switch here based on OS type, but it is not germane to this example
   codegen $(target) : $(sources) : $(properties) ;
}
actions codegen
{
    ./run-the-code-generator
}

# take the fileset and a target object, and invoke the generator
rule fileset ( fileset : target )
{
    local FILES = [ path.glob-tree $(fileset) : *.foo *.bar ] ;
    local target_baz = $(fileset:B).baz;
    baz $(target_baz) : $(FILES) ;
    return $(target_baz) ;
}
…然后在我的主要项目中,我有如下内容:

alias cg : [ fileset $(PATH_TO_FILESET) : $(OUTPUT_DIR) ] ;
lib CodeGen : [ GLOB $(OUTPUT_DIR) : *.cpp *.c ] : : : <include>$(OUTPUT_DIR);
别名cg:[文件集$(路径到文件集):$(输出目录)]; lib CodeGen:[GLOB$(OUTPUT\u DIR):*.cpp*.c]:$(OUTPUT\u DIR);
如果我将文件集设置为CodeGen的源代码,那么它将评估是否需要与是否需要重建输出文件并行重建。我正在寻找一种方法来强制cg运行(如果需要),并且仅在之后,以$(output\u DIR)全局化文件.

你有什么进展吗?我也有同样的问题。唉,没有,我还是要分两步来做:(