如何使用选择正确检测我是在Windows还是Linux中构建C 代码

How to use select to properly detect whether I am building C++ code in Windows or Linux?

本文关键字:Linux 还是 Windows 构建 代码 选择 何使用 检测      更新时间:2023-10-16

我正在编写一个示例C 项目,该项目使用Bazel作为其他合作者的示例成语。

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

我有兴趣知道我是否在做"正确",更具体地说是关于此文件的: 当要选择特定的实现时。

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",
    ],
)

这是遵循巴泽尔项目的正确/预期的成语吗?我已经为其他项目做了这种方式,通过将所有特定于平台的依赖项集中在单独的目标中,然后二进制依赖于它们。

Bazel-Discuss列表中的某人告诉我使用选择,但是我的尝试未能"检测"操作系统。我确定我做错了什么,但是缺乏信息和示例并没有告诉我太多如何正确使用它。

@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

您可以直接在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"],
)

有关语法的详细信息,请参见select的文档。

@vertexwahn的答案在我的末端引起了一些混乱,因此我希望这个答案有助于澄清一下。虽然他的答案并没有直接与这个问题联系在一起,但它可能会用于其他试图在没有文件特定包含物的情况下构建完全不同平台上的其他人。

这是我回答这个特定问题的链接:如何为Bazel的不同操作系统指定便携式构建配置?

向您的项目添加.bazelrc。添加行build:vs2019 --cxxopt=/std:c++14build:gcc --cxxopt=-std=c++14。构建代码bazel build --config=msvc //...bazel build --config=gcc //....