我试图构建Bazel项目中子模块的Makefile。我发现Bazel确实提供了genrule来执行bash命令。当前我面临两个问题 -
1. 如何在执行命令之前进入目录,类似于 -
genrule(
name = "hello-make",
srcs = ["hello"] + glob(["hello/**"]),
outs = ["hello/main"],
cmd = "(cd $(location :hello) && make)",
)
2. 在执行genrule之前,如何更新子模块?
添加cmd = "(git submodule init && git submodule update)"
会显示fatal: Not a git repository (or any of the parent directories): .git
重现步骤:
git clone git@github.com:bazelbuild/examples.git
cd examples/ && git submodule add git@github.com:mucsi96/cpp-hello-world.git cpp-tutorial/stage1/main/hello
cd cpp-tutorial/stage1/ && bazel build //main:hello-world
在此步骤后,我想添加一种规则,允许我初始化、更新和构建hello子模块。
除了将git@github.com:mucsi96/cpp-hello-world.git
作为git clone git@github.com:bazelbuild/examples.git
的子模块创建以外,是否有更好的方式来构建它?
实际项目更为复杂,因此创建一个cpp-hello-world.git的BUILD文件是不可行的。
$(location ...)
? - Kerrek SBcd ./$(location hello)
时,会出现$(location) expression is not a declared prerequisite of this rule
错误。 - Adityasrcs = ["foo.txt"] + glob(["*.json]),
,那么你可以引用$(location :foo.txt)
等等。也许列出你的源文件清单,或至少其中一个(Makefile
)? - Kerrek SB