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

时间:2017-02-15 13:44:57

标签: bazel

require(gplots)

data(mtcars)
x <- as.matrix(mtcars)
heatmap.2(x, ylab = 'foo bar', xlab = 'bar foo')
par(cex.lab = 5.0)
heatmap.2(x, ylab = 'foo bar', xlab = 'bar foo')

此命令在工作目录中生成cpp文件$ python gencpp.py

我希望在构建之前在foo.cpp中运行此命令,以便能够在bazel的{​​{1}}属性中包含foo.cpp。< / p>

我尝试过的事情:

cc_binary
  

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

我知道有一个解决方案需要对srcs进行一点修改,但这并不是我想要的。

2 个答案:

答案 0 :(得分:3)

感谢@kristina the answer

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

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

)

答案 1 :(得分:3)

  

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

我建议你改变它,以便:

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

然后你的genrule命令可以是:

python gencpp.py --outputFile=$@

python gencpp.py > $@

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

分别

正如Ulf Adams所指出的那样:

  

Bazel并行运行多个动作,如果相同的规则是工具和应用程序的依赖关系,它可能会尝试同时运行,并且它们会相互覆盖,可能非常糟糕的结果。

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