我开始使用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
Run Code Online (Sandbox Code Playgroud)
我的项目回购是:( WORKSPACE是一个空文件)
??? myLib
? ??? BUILD
? ??? file.sh
??? WORKSPACE
Run Code Online (Sandbox Code Playgroud)
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__"],
)
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
问题(A),处理genrule()部分:
我必须使用的事实
cmd = "./$(location file.sh);cp file.cpp $(@D);cp file.hpp $(@D);"
Run Code Online (Sandbox Code Playgroud)
很神秘.
我的第一次尝试是:
cmd = "./$(location file.sh)"
Run Code Online (Sandbox Code Playgroud)
但是在这种情况下,我收到以下错误:
声明输出'myLib/file.cpp'不是由genrule创建的.这可能是因为genrule实际上没有创建此输出,或者因为输出是一个目录而且genrule是远程运行的(请注意,只有声明的文件输出的内容是从远程运行的genrules复制的)
问题(B),处理cc_library()部分
我不知道如何让Bazel意识到:文件目标取决于:tangle_file目标.
如果我取消注释:
deps = [":tangle_file"],
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
在cc_library规则的deps属性中// myLib:file:genrule rule'// 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)"
)
Run Code Online (Sandbox Code Playgroud)
和
#!/bin/sh
echo "int foo();" >> $1/file.hpp
echo "#include \"myLib/file.hpp\"\n\nint foo() { return 2017; }" >> $1/file.cpp
Run Code Online (Sandbox Code Playgroud)
事实上你有
srcs = ["file.cpp"],
hdrs = ["file.hpp"],
Run Code Online (Sandbox Code Playgroud)
在你的cc_library是什么告诉Bazel它依赖于genrule,因为genrule创建这些文件.如果你想让它更明确,你可以使用标签语法,它做同样的事情:
srcs = ["//myLib:file.cpp"],
hdrs = ["//myLib:file.hpp"],
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1318 次 |
| 最近记录: |