【问题标题】:Use generated code in a bazel build在 bazel 构建中使用生成的代码
【发布时间】:2017-02-15 13:44:56
【问题描述】:
$ python gencpp.py 

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

我想在构建之前在bazel 中运行此命令,以便能够在cc_binarysrcs 属性中包含foo.cpp

我尝试过的:

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

cc_library(
    srcs = ['foo.cpp'], # tried also with :foo
    ...
)

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

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

【问题讨论】:

标签: bazel


【解决方案1】:

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

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

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

那么你的 genrule 命令可以是:

python gencpp.py --outputFile=$@

python gencpp.py > $@

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

分别。

正如Ulf Adams 指出的那样:

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

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

【讨论】:

  • 实际上更糟。 Bazel 并行运行多个操作,如果相同的规则是工具和应用程序的依赖项,它可能会尝试同时运行两者,并且它们会相互覆盖,可能会产生非常糟糕的结果。 (但如果启用了沙盒,则不会。)
  • @UlfAdams “实际上更糟”如“我的建议更糟”,或者“写作和复制的后果比我建议的更糟”?
  • 后者。写入当前目录然后复制或移动到目标的后果可能会导致静默破坏。
  • @UlfAdams 我的编辑是否捕捉到了你想说的内容?
【解决方案2】:

感谢@kristina 提供the answer

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

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

)

【讨论】:

  • 复制技巧也对我有用。请注意,当您有多个输出时(我的脚本生成 C++ 代码、一个 hpp 文件和一个 cpp 文件),您必须使用:cp file.hpp $(@D); cp 文件.cpp $(@D);
猜你喜欢
  • 2017-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
相关资源
最近更新 更多