bazel.rc中的默认,特定于平台的Bazel标志

时间:2018-01-08 23:29:51

标签: bazel

我想知道它是否可能用于特定于平台的默认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文件,但如果不是必需的话,它会更清洁/更好。

由于

3 个答案:

答案 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

简而言之,您的步骤:

  1. 定义一个宏来包装 cc_library:
def my_cc_library(
  name,
  copts=[],
  **kwargs):
  cc_library(name, copts=copts + my_flags(), **kwargs)
  1. 定义 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 将向项目中的每个目标提供此标志。