Bazel - Получить текущие ОС и тип процессора в качестве переменных для использования в правилах сборки. - PullRequest
0 голосов
/ 07 марта 2019

В нашей текущей настройке мы используем Bazel как общий инструмент для сборки, но для отдельных Java-проектов мы используем Maven для их сборки. Пример правила сборки для проекта Java будет выглядеть следующим образом:

genrule (
    name = "build-core",
    srcs = [
        ":deps-core",
    ],
    outs = [
        "core-1.0.jar",
    ],
    cmd = "rm -rf $(@D)/src && cd project/ && umask 0000"
        + " && mvn -U clean install -Djavacpp.platform=linux-x86_64 -pl :core"
        + " && cp core/target/core-1.0.jar ../$(@D)"
)

Как вы можете заметить, в настоящее время мы жестко кодируем от -Djavacpp.platform до linux-x86_64. Есть ли способ автоматически получить это значение из Bazel, возможно, в качестве переменной, чтобы мы могли использовать те же правила сборки и для систем MacOSX и Windows?

1 Ответ

0 голосов
/ 08 марта 2019

Было бы лучше собрать все библиотеки напрямую с Bazel, тогда вы бы получили это поведение бесплатно. См. Миграция из Мавена в Базель .

Однако, если это не вариант, вы можете получить доступ к некоторым этой информации, используя Make Variables :

genrule(
  name = "g",
  outs = [
    "g.txt",
  ],
  cmd = "echo \"$(TARGET_CPU) $(COMPILATION_MODE) $(JAVA) $(JAVABASE)\" > $@",
  toolchains = [
    "@bazel_tools//tools/jdk:current_java_runtime",
  ],
)

Однако я не смог найти операционную систему в этих переменных.

Возможно, лучшая идея - использовать select операторы:

genrule(
  name = "f",
  outs = [
    "f.txt",
  ],
  cmd = select({
    "@bazel_tools//src/conditions:darwin": "echo 'macOS' > $@",
    "//conditions:default": "echo 'Linux' > $@",
  }),
)

Затем вы бы написали разные cmd для каждой платформы.

...