在bazel构建中使用生成的代码

Ghi*_*ADJ 6 bazel

$ python gencpp.py 
Run Code Online (Sandbox Code Playgroud)

此命令foo.cpp在工作目录中生成cpp文件.

我想在运行此命令bazel建立能够包括之前foo.cppcc_binarysrcs属性.

我尝试过的:

genrule(
    name = 'foo',
    outs = ['foo.cpp'],
    cmd = 'python gencpp.py',
)

cc_library(
    srcs = ['foo.cpp'], # tried also with :foo
    ...
)
Run Code Online (Sandbox Code Playgroud)

声明输出'external/somelib/foo.cpp'不是由genrule创建的.这可能是因为genrule实际上没有创建此输出,或者因为输出是一个目录而且genrule是远程运行的(请注意,只有声明的文件输出的内容是从远程运行的genrules复制的).

我知道有一个解决方案需要gencpp.py稍微修改一下,但这不是我想要的.

And*_*ner 5

foo.cpp该命令在工作目录中生成一个 cpp 文件。

我建议您更改此设置,以便:

  • 将输出写入由命令行标志指定的文件
  • 将输出写入标准输出,并将标准输出重定向到文件

那么你的 genrule 命令可以是:

python gencpp.py --outputFile=$@
Run Code Online (Sandbox Code Playgroud)

或者

python gencpp.py > $@
Run Code Online (Sandbox Code Playgroud)

(我个人的一般偏好是后者,尽管在需要写入多个输出的情况下不能使用它。)

分别。

正如乌尔夫·亚当斯指出的:

Bazel 并行运行多个操作,如果同一个规则是工具和应用程序的依赖项,它可能会尝试同时运行这两个操作,并且它们会相互覆盖,从而可能产生非常糟糕的结果。

因此,最好避免编写 bazel 不直接了解的输出文件。

  • 实际上更糟。Bazel 并行运行多个操作,如果同一个规则是工具和应用程序的依赖项,它可能会尝试同时运行这两个操作,并且它们会相互覆盖,从而可能产生非常糟糕的结果。(尽管如果启用了沙箱则不会。) (2认同)

Ghi*_*ADJ 3

感谢@kristina 的回答

生成后我必须复制foo.cpp到目录。outs

genrule(
    name = 'foo',
    outs = ['foo.cpp'],
    cmd = """
            python gencpp.py
            cp foo.cpp $@
    """,

)
Run Code Online (Sandbox Code Playgroud)