在我们当前的设置中,我们使用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系统上构建?
最好直接使用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
。