Как я могу получить текущую дату в файле BUILD.bazel

Я новичок в bazel и столкнулся с проблемой, описанной ниже, при создании кода CPP с помощью bazel.

Я хочу передать текущую дату как одно из локальных определений в формате ниже.

date = <правило для получения текущей даты>

cc_lib(..., local_define = ["xyz = 28-11-2022"], )

как я могу получать текущую дату каждый раз, когда я запускаю сборку bazel? local_define = ["xyz = дата"],

Я попытался загрузить дату Python, но у Starlark нет поддержки для этого.

1 ответ

Обычный способ, которым bazel обрабатывает недетерминированную информацию в сборке, - это использование "штамповки сборки", описанное здесь:

https://bazel.build/docs/user-manual#workspace-status

Bazel делает все возможное, чтобы избежать недетерминизма, потому что это плохо для кэширования, поэтому добавление чего-то вроде текущего времени в сборку не так просто. Использование штамповки сборки иногда требует изменения вашей программы или создания файлов на основеstatus.txtфайлы и включение их в вашу сборку. Если определения действительно необходимы, вы можете сделать это примерно так:

BUILD:

      cc_binary(
  name = "main",
  srcs = ["main.c"],
  local_defines = ["DATE=\"$(DATE)\""],
)

main.c:

      #include <stdio.h>

#ifndef DATE
#define DATE "none"
#endif

int main() {
  printf("date is %s\n", DATE);
  return 0;
}
      $ bazel build main --define DATE="\\\"$(date)\\\""
INFO: Analyzed target //:main (37 packages loaded, 163 targets configured).
INFO: Found 1 target...
Target //:main up-to-date:
  bazel-bin/main
INFO: Elapsed time: 0.497s, Critical Path: 0.08s
INFO: 6 processes: 4 internal, 2 linux-sandbox.
INFO: Build completed successfully, 6 total actions

$ bazel-bin/main
date is Mon Nov 28 04:33:30 PM EST 2022

(Все экранирование необходимо, чтобы в дате были пробелы, но вам это может не понадобиться.)

Обратите внимание, что--define DATE="\\\"$(date)\\\""должен быть указан в командной строке и не может быть помещен в.bazelrcне оценивается как оболочка.

Другие вопросы по тегам