CMake 系列(九):检测操作系统

CMake 是一组跨平台工具。不过,了解操作系统(OS)上执行的配置或构建步骤也很重要,与操作系统相关的 CMake 代码会根据操作系统启用条件编译,或者在可用或必要时使用特定于编译器的扩展。本示例中,我们将通过一个不需要编译任何源代码的示例,演示如何使用 CMake 检测操作系统。为了简单起见,我们只考虑配置过程。

提示:本示例在 CMake 3.5 或更高版本中有效,并已在 GNU/Linux、macOS 和 Windows 上测试通过。

具体实施

我们将用一个非常简单的 CMakeLists.txt 进行演示。

首先,定义 CMake 最低版本和项目名称。请注意,语言是 NONE:

cmake_minimum_required(VERSION 3.5 FATAL_ERROR)

project(recipe-01 LANGUAGES NONE)

然后,根据检测到的操作系统信息打印消息:

if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
  message(STATUS "Configuring on/for Linux")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
  message(STATUS "Configuring on/for macOS")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
  message(STATUS "Configuring on/for Windows")
elseif(CMAKE_SYSTEM_NAME STREQUAL "AIX")
  message(STATUS "Configuring on/for IBM AIX")
else()
  message(STATUS "Configuring on/for ${CMAKE_SYSTEM_NAME}")
endif()

测试之前,先检查前面的代码块,并考虑在相应系统上的具体行为。

现在,测试并配置项目:

$ mkdir -p build
$ cd build
$ cmake ..

关于 CMake 的输出,这里有一行很有趣——在 Linux 系统上(在其他系统上,输出会不同):

-- Configuring on/for Linux

工作原理

CMake 为目标操作系统定义了 CMAKE_SYSTEM_NAME 变量,因此不需要使用定制命令、工具或脚本来查询此信息。然后,可以使用此变量的值实现特定于操作系统的条件和解决方案。在具有 uname 命令的系统上,将此变量设置为 uname -s 的输出。该变量在 macOS 上设置为 Darwin;在 Linux 和 Windows 上,它分别计算为 Linux 和 Windows。我们了解了如何在特定的操作系统上执行特定的 CMake 代码。当然,应该尽量减少这种定制化行为,以便简化迁移到新平台的过程。

注意:为了最小化从一个平台转移到另一个平台时的成本,应该避免直接使用 Shell 命令,还应该避免显式的路径分隔符(Linux 和 macOS 上的前斜杠和 Windows 上的后斜杠)。CMake 代码中只使用前斜杠作为路径分隔符,CMake 会自动将它们转换为所涉及操作系统环境适用的格式。

系列导航


   转载规则


《CMake 系列(九):检测操作系统》 由 吴杭沉 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
CMake 系列(十):处理与平台相关的源代码 CMake 系列(十):处理与平台相关的源代码
理想情况下,应该避免依赖于平台的源代码,但是有时我们没有选择,特别是当要求配置和编译不是自己编写的代码时。本示例中,将演示如何使用 CMake 根据操作系统编译源代码。 提示:本示例包含一个 C++ 示例,在 CMake 3.5 或更高版
2022-05-17
下一篇 
CMake 系列(八):脚本控制流 CMake 系列(八):脚本控制流
本章前面的示例中,已经使用过 if-else-endif。CMake 还提供了创建循环的语言工具:foreach-endforeach 和 while-endwhile。两者都可以与 break() 结合使用,以便尽早从循环中跳出。本示例将
2022-05-03
  目录