Bazel将变量替换为包的根吗?

问题描述 投票:0回答:1

假设我有一个像这样的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",
  ],
)
bazel
1个回答
0
投票

是的,有这样的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

© www.soinside.com 2019 - 2024. All rights reserved.