假设我有一个像这样的Bazel项目:
tree .
.
├── foo
│ ├── BUILD.bazel
│ └── foo.txt
└── WORKSPACE
1 directory, 3 files
foo/BUILD.bazel
:
genrule(
name = "bar",
srcs = [
"foo.txt",
],
cmd = "cp foo.txt $@",
outs = [
"bar.txt",
],
)
我无法建立bazel build //foo:bar
:
bazel build //foo:bar
...
cp: cannot stat 'foo.txt': No such file or directory
cmd
中的路径似乎必须相对于WORKSPACE
根,而不是BUILD
根。
此作品:
genrule(
name = "bar",
srcs = [
"foo.txt",
],
# cmd = "cp foo.txt $@",
cmd = "cp foo/foo.txt $@",
outs = [
"bar.txt",
],
)
必须指定完整路径,特别是当BUILD
文件可能会四处移动时,这样做很不方便。
是否存在Make变量替换项,使我可以更清楚地指定它?
例如:
genrule(
name = "bar",
srcs = [
"foo.txt",
],
cmd = "cp $(SRCDIR)/foo.txt $@",
outs = [
"bar.txt",
],
)
是的,有这样的Make变量。在这种特殊情况下,$<
是最方便的,因此规则声明将如下所示:
genrule(
name = "bar",
srcs = ["foo.txt"],
outs = ["bar.txt"],
cmd = "cp $< $@",
)
$<
如果srcs中只有一个文件,则可以使用。如果还有更多,请考虑使用$(SRCS)
,它将在与srcs分隔的输入中扩展。
此外,您也可以查看有关在Bazel中制作变量的官方文档:https://docs.bazel.build/versions/2.0.0/be/make-variables.html