Bazel-获取当前的OS和CPU类型作为要在构建规则中使用的变量

时间:2019-03-07 07:20:56

标签: java maven bazel platform

在当前设置中,我们使用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 :(得分:0)

最好直接使用Bazel构建所有库,然后您将免费获得此行为。参见Migrating from Maven to 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