CMake 用于检测 Ninja 的 Visual C++ 编译器工具的环境变量

Environment variable used by CMake to detect Visual C++ compiler tools for Ninja

我有 Mingw64 GCC 6.3.0(总是在 PATH 中)和来自 Visual Studio 2017 RTM(不在 PATH 中)的 Visual C++ 编译器工具。

如果我运行cmake . -G "MinGW Makefiles",将选择GCC 6.3.0。

如果我运行cmake . -G "Ninja",将选择GCC 6.3.0。

我的Visual C++编译工具是none标准的,我只保留我需要的部分,删除其余部分(如MSBuild,IDE等)。我使用自己的批处理脚本来设置 PATHINCLUDELIB(效果很好)。

如果我 运行 这个批处理脚本和 运行 cmake .,将选择 MSVC 并使用 NMake 构建。

在相同的环境下,cmake . -G "Ninja",选择了 GCC 6.3.0 而不是 MSVC。

所以我的问题是,当两者都在 PATH 中时,如何告诉 CMake 我想使用 MSVC + Ninja 而不是 GCC + Ninja?我应该设置任何环境变量吗?

使用工具链文件

set(CMAKE_C_COMPILER cl.exe)
set(CMAKE_CXX_COMPILER cl.exe)

然后使用 -DCMAKE_TOOLCHAIN_FILE=toolchainfile

构建您的 cmake 项目

您还可以使用反向方法并使用 CMAKE_IGNORE_PATH 排除所有不需要的编译器。它需要一个要忽略的路径列表,但请注意它需要是一个完全匹配的字符串。优点是您可以直接从命令行声明它们。

所以我所做的是从找到的编译器中获取路径 "not to be taken" 到 CMAKE_IGNORE_PATH

在我的系统上 PATH 实际上有三个 GCC 编译器(每次尝试都要确保从一个空的二进制输出目录开始):

> cmake -G"Ninja" ..
...
-- Check for working C compiler: C:/MinGW/bin/cc.exe
...

> cmake -DCMAKE_IGNORE_PATH="C:/MinGW/bin" -G"Ninja" ..
...
-- Check for working C compiler: C:/Strawberry/c/bin/gcc.exe
...

> cmake -DCMAKE_IGNORE_PATH="C:/MinGW/bin;C:/Strawberry/c/bin" -G"Ninja" ..
...
-- Check for working C compiler: C:/Program Files (x86)/LLVM/bin/clang.exe
...

> cmake -DCMAKE_IGNORE_PATH="C:/MinGW/bin;C:/Strawberry/c/bin;C:/Program Files (x86)/LLVM/bin" -G"Ninja" ..
...
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/cl.exe
...