0

我有一个基于 jamfile 的项目,其中一个构建步骤编译了一个自定义工具(称为“codegen”),我想在以后的构建步骤中使用它。codegen 工具相对于根目录构建在 projects/codegen/Jamfile.jam 中,可执行目标最终用以下行声明:

install codegen-tool : $(full-exe-target) : <location>$(install-dir) ;

在 Jamroot.jam 中,我有以下内容:

rule codegen ( target : source : properties * )
{
    COMMAND on $(target) = projects/codegen//codegen-tool ;
    DEPENDS $(target) : projects/codegen//codegen-tool ;
}

actions codegen bind COMMAND
{
    $(COMMAND) $(<) $(>)
}

project.load projects/codegen//codegen-tool ;
local codegen-input = <blah> ;
local codegen-output = <blah> ;

make $(codegen-output) : $(codegen-input) : @codegen ;
alias codegen-output : $(codegen-output) ;

当我运行命令“b2 codegen-output”时,出现错误:

don't know how to make project projects/codegen//codegen-tool

但是运行命令“b2 projects/codegen//codegen-tool”是成功的。为什么我无法从 Jamroot.jam 引用 codegen-tool 目标?

4

1 回答 1

1

您遇到的关键问题是该工具的代码生成规则:

rule codegen ( target : source : properties * )
{
    COMMAND on $(target) = projects/codegen//codegen-tool ;
    DEPENDS $(target) : projects/codegen//codegen-tool ;
}

指向元目标,而不是通过构建 codegen-tool 元目标生成的真实目标(又名文件目标)。使此类工具依赖项工作的“简单”方法是使用 make 目标上的功能来通知它所构建的工具完整路径是什么。您使用的功能是“依赖”功能。例如,您可以在 jamroot 中添加如下内容:

import feature ;

feature.feature codegen : : dependency free ;

并设置并使用该功能来引用 codegent-tool:

project : requirements <codegen>projects/codegen//codegen-tool ;

您的问题中没有足够的信息来回答完整的示例。但是您应该查阅完整的built_tool 示例,了解如何获取有关如何使用依赖项功能对自定义构建工具的用例起作用的详细信息。

于 2016-10-04T03:50:06.337 回答