如何使用select来正确检测我是在Windows或Linux中构建C++代码?

thi*_*zzy 11 c++ bazel

我正在编写一个示例C++项目,该项目使用Bazel作为其他合作者遵循的示例习惯.

这是存储库:https://github.com/thinlizzy/bazelexample

我有兴趣知道我是否正在做'对',更具体地说是关于这个文件:https://github.com/thinlizzy/bazelexample/blob/38cc07931e58ff5a888dd6a83456970f76d7e5b3/demo/BUILD 当选择特定的实现时.

cc_library(
    name = "demo",
    srcs = ["demo.cpp"],
    deps = [
        "//example:frontend",
    ],
)

cc_binary(
    name = "main_win",
    deps = [
        ":demo",
        "//example:impl_win",
    ],
)

cc_binary(
    name = "main_linux",
    deps = [
        ":demo",
        "//example:impl_linux",
    ],
)
Run Code Online (Sandbox Code Playgroud)

这是否遵循Bazel项目的正确/预期的习惯用法?我已经为其他项目做了这种方式,通过将所有特定于平台的依赖关注集中在不同的目标中,然后二进制文件只依赖于它们.

在bazel讨论列表中的某个人告诉我使用select,但我的尝试未能"检测"操作系统.我确定我做错了什么,但缺乏信息和示例并没有告诉我如何正确使用它.

Jin*_*Jin 19

@bazel_tools 包含预定义平台条件:

$ bazel query @bazel_tools//src/conditions:all
@bazel_tools//src/conditions:windows_msys
@bazel_tools//src/conditions:windows_msvc
@bazel_tools//src/conditions:windows
@bazel_tools//src/conditions:remote
@bazel_tools//src/conditions:host_windows_msys
@bazel_tools//src/conditions:host_windows_msvc
@bazel_tools//src/conditions:host_windows
@bazel_tools//src/conditions:freebsd
@bazel_tools//src/conditions:darwin_x86_64
@bazel_tools//src/conditions:darwin
Run Code Online (Sandbox Code Playgroud)

您可以直接在BUILD文件中使用它们:

cc_library(
  name = "impl",
  srcs = ["Implementation.cpp"] + select({
    "@bazel_tools//src/conditions:windows": ["ImplementationWin.cpp"],
    "@bazel_tools//src/conditions:darwin": ["ImplementationMacOS.cpp"],
     "//conditions:default": ["ImplementationLinux.cpp"],
  }),
  # .. same for hdrs and data
)

cc_binary(
  name = "demo",
  deps = [":impl"],
)
Run Code Online (Sandbox Code Playgroud)

有关select语法的详细信息,请参阅文档.