我开始使用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规则// myLib:file的deps属性中:genrule规则'// myLib:tangle_file'在此处放错了位置(期望的cc_inc_library,cc_library,objc_library,experimental_objc_library或cc_proto_library)。
您看到的错误是因为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
你有的事实
srcs = ["file.cpp"],
hdrs = ["file.hpp"],
在你的cc_library
是什么告诉巴泽尔认为这取决于genrule
,因为genrule
创建这些文件。如果要使其更明确,则可以使用标签语法,其作用相同:
srcs = ["//myLib:file.cpp"],
hdrs = ["//myLib:file.hpp"],
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句