Базель Сделать переменную подстановку для пакета root? - PullRequest
1 голос
/ 16 января 2020

Предположим, у меня есть такой проект 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.

1 Ответ

1 голос
/ 16 января 2020

Да, есть такие переменные Make. В этом конкретном случае $< является наиболее удобным, поэтому объявление правила будет выглядеть следующим образом:

    genrule(
      name = "bar",
      srcs = ["foo.txt"],
      outs = ["bar.txt"],
      cmd = "cp $< $@",
    )

$< можно использовать, если в srcs есть только один файл. Если их больше, рассмотрите возможность использования $(SRCS), который будет расширяться в разделенных пробелами входных данных из srcs.

Кроме того, существуют предопределенные замены пути, такие как $(execpath) и $(rootpath), которые расширяют метки на их полные пути. Итак, фрагмент, упомянутый выше, будет выглядеть примерно так:

    genrule(
      name = "bar",
      srcs = ["foo.txt"],
      outs = ["bar.txt"],
      cmd = "cp $(execpath foo.txt) $@",
    )

И есть расширение $(location), которое является синонимом либо execpath, либо rootpath (в зависимости от контекста), но это наследие и использовать его не рекомендуется.

Здесь вы можете проверить официальные документы по созданию переменных в Bazel: https://docs.bazel.build/versions/2.0.0/be/make-variables.html

...