Предположим, у меня есть такой проект 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
root, а не BUILD
root.
Это работает:
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 = "cd $(SRCDIR) && cp foo.txt $@",
outs = [
"bar.txt",
],
)
Здесь $(SRCDIR)
может расшириться до ./foo
.
Обратите внимание, что это надуманный пример. Я не могу использовать $(SRCS)
, так как мне нужно использовать входные файлы по-разному. Я также не могу использовать $<
, так как у меня более одного раза srcs
.