如何使用选择正确检测我是在Windows还是Linux中构建C 代码
How to use select to properly detect whether I am building C++ code in Windows or Linux?
我正在编写一个示例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++14
和build:gcc --cxxopt=-std=c++14
。构建代码bazel build --config=msvc //...
或bazel build --config=gcc //....
相关文章:
- enum是C++中的宏变量还是整数变量
- 在C++/Linux中设置单调时钟的一些技巧
- Linux的Cpp上的计时器
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 在Linux中哪里可以找到互斥、未来等的源代码
- 如何在linux终端中同时编译和运行c++代码
- 在Linux for Windows上编译C++代码时出错
- 在命名空间中定义函数还是限定函数
- 如何找到锁定Linux futex的C++行
- 架构决策:返回std::future还是提供回调
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 在linux上调试巨大的C++项目
- 异常属于C++中的线程还是进程
- 在决定是通过参考还是通过价值时,尺寸真的是一个问题吗
- 我如何知道 Linux 系统使用的是 Wayland 还是 X11?
- 如何使用选择正确检测我是在Windows还是Linux中构建C 代码
- 如何识别一个进程是 java 还是 Linux 中的 c 或 c++ 进程
- 确定一个程序在Linux中是GUI还是控制台应用程序
- 执行 int 3 中断是否会停止 Linux 上的整个过程,还是仅停止当前线程