Bazel&自动生成cpp / hpp文件

时间:2017-06-01 16:15:28

标签: c++ bazel

我开始使用Bazel作为我的C ++项目构建系统。

但是我遇到了以下问题:

我处于自动生成file.hpp file.cpp(文字编程)的场景中。

要重现我的问题,可以简单地使用这个最小的生成器:

-- file.sh --
#!/bin/sh
echo "int foo();" >> file.hpp
echo "#include \"myLib/file.hpp\"\n\nint foo() { return 2017; }" >> file.cpp

我的项目回购是:( WORKSPACE是一个空文件)

├── myLib
│   ├── BUILD
│   └── file.sh
└── WORKSPACE

BUILD文件是

genrule(
  name = "tangle_file",
  srcs = ["file.sh"],
  outs = ["file.cpp","file.hpp"],
  cmd =  "./$(location file.sh);cp file.cpp $(@D);cp file.hpp $(@D);"
)

cc_library(
    name = "file",
    srcs = ["file.cpp"],
    hdrs = ["file.hpp"],
#    deps = [":tangle_file"],
    visibility = ["//bin:__pkg__"],
)

我有两个问题:

问题(A),处理genrule()部分:

我必须使用

这一事实
cmd =  "./$(location file.sh);cp file.cpp $(@D);cp file.hpp $(@D);"

非常神秘。

我的第一次尝试是:

cmd =  "./$(location file.sh)"

但是在这种情况下我收到以下错误:

  

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

问题(B),处理cc_library()部分

我不知道如何让Bazel意识到:file 目标取决于:tangle_file 目标。

如果我取消注释:

deps = [":tangle_file"],

我收到以下错误:

  

在cc_library规则的deps属性中// myLib:file:genrule rule'// myLib:tangle_file'在这里放错位置(预期cc_inc_library,cc_library,objc_library,experimental_objc_library或cc_proto_library)。

1 个答案:

答案 0 :(得分:7)

问题(A)

您看到的错误是因为genrule cmd未在其输出目录中运行。如果您在bazel-out/local-fastbuild/genfiles/myLib/file.cpp脚本中对file.cpp而不是file.sh进行了硬编码,则可以正常运行。但是,建议的方法是让脚本将其输出目录作为参数。

例如,

genrule(
  name = "tangle_file",
  srcs = ["file.sh"],
  outs = ["file.cpp","file.hpp"],
  cmd =  "./$(location file.sh) $(@D)"
)

#!/bin/sh
echo "int foo();" >> $1/file.hpp
echo "#include \"myLib/file.hpp\"\n\nint foo() { return 2017; }" >> $1/file.cpp

问题(B)

你有

的事实
srcs = ["file.cpp"],
hdrs = ["file.hpp"],
cc_library中的

告诉Bazel它取决于genrule,因为genrule会创建这些文件。如果你想让它更明确,你可以使用标签语法,它做同样的事情:

srcs = ["//myLib:file.cpp"],
hdrs = ["//myLib:file.hpp"],