我想知道它是否可能用于特定于平台的默认Bazel构建标志。
例如,我们希望使用--workspace_status_command
,但这必须是Linux上的shell脚本,并且必须指向Windows的批处理脚本。
我们是否有办法在tools/bazel.rc
文件中写入类似......
if platform=WINDOWS build: --workspace_status_command=status_command.bat
if platform=LINUX build: --workspace_status_command=status_command.sh
我们可以通过让用户在构建之前运行脚本来生成.bazelrc文件,但如果不是必需的话,它会更清洁/更好。
由于
答案 0 :(得分:2)
是的,有点儿。您可以指定特定于配置的bazelrc条目,您可以通过传递--config=<configname>
来选择。
例如你的bazelrc看起来像:
build:linux --cpu=k8
build:linux --workspace_status_command=/path/to/command.sh
build:windows --cpu=x64_windows
build:windows --workspace_status_command=c:/path/to/command.bat
你是这样构建的:
bazel build --config=linux //path/to:target
或:
bazel build --config=windows //path/to:target
你必须小心,不要混淆语义冲突的--config
标志(Bazel并没有阻止你这样做)。虽然它会起作用,但当配置修补相同的标记时,结果可能是不可预测的。
答案 1 :(得分:0)
将--config传递给所有命令很棘手,这取决于开发人员是否记得这样做,或者控制调用Bazel的位置。
我认为更好的答案是教会版本控制系统如何生成值,例如在git-bazel-stamp
/ $PATH
上添加%PATH%
脚本,以便{{1工作。
然后我们需要git bazel-stamp
来允许来自PATH的命令而不是磁盘上的路径。
答案 2 :(得分:0)
正确的方法是使用自定义宏包装您的 cc_library,并将硬编码标志传递给 copt。如需完整参考,请查看 envoy_library.bzl。
简而言之,您的步骤:
def my_cc_library(
name,
copts=[],
**kwargs):
cc_library(name, copts=copts + my_flags(), **kwargs)
my_flags()
宏如下:config_setting(
name = "windows_x86_64",
values = {"cpu": "x64_windows"},
)
config_setting(
name = "linux_k8",
values = {"cpu": "k8"},
)
def my_flags():
x64_windows_options = ["/W4"]
k8_options = ["-Wall"]
return select({
":windows_x86_64": x64_windows_options,
":linux_k8": k8_options,
"//conditions:default": [],
})
工作原理:
根据 --cpu 标志值 my_flags()
将返回不同的标志。
该值根据平台自动解析。在 Windows 上,它是 x64_windows,在 Linux 上它是 k8。
然后,您的宏 my_cc_library
将向项目中的每个目标提供此标志。