识别操作系统平台
以下代码可以识别 Windows、Linux、Macos三种类型的操作系统平台:
IF (CMAKE_SYSTEM_NAME MATCHES "Linux")
MESSAGE(STATUS "current platform: Linux ")
ELSEIF (CMAKE_SYSTEM_NAME MATCHES "Windows")
MESSAGE(STATUS "current platform: Windows")
ELSEIF (CMAKE_SYSTEM_NAME MATCHES "Darwin")
MESSAGE(STATUS "current platform: Mac OS X")
ELSE ()
MESSAGE(STATUS "other platform: ${CMAKE_SYSTEM_NAME}")
ENDIF (CMAKE_SYSTEM_NAME MATCHES "Linux")
在2.6版本以上的cmake上就可以使用以上内置变量,非常方便。
识别Linux发行版本
这就需要更详细的系统信息了,类似的,可以识别Windows系统的具体版本。
如果cmake版本在3.22以上,可以直接使用cmake_host_system_information变量,原型如下:
cmake_host_system_information(RESULT <variable> QUERY <key> ...)
使用它查询系统信息,可以在key处指定多个待查询的指标,查询结果会存储在variable的list中。
经常使用key如下:
- NUMBER_OF_LOGICAL_CORES:逻辑核数量
- NUMBER_OF_PHYSICAL_CORES:物理核数量
- HOSTNAME:主机名
- FQDN:全限定域名,同时带有主机名和域名的名称
- TOTAL_VIRTUAL_MEMORY:总虚拟内存,单位MB
- AVAILABLE_VIRTUAL_MEMORY:可用虚拟内存
- TOTAL_PHYSICAL_MEMORY:总物理内存
- AVAILABLE_PHYSICAL_MEMORY:可用物理内存
- IS_64BIT:如果处理器是64位,值为1
- HAS_FPU:如果处理器支持浮点单元,值为1
- PROCESSOR_NAME:处理器名称,如我的电脑上输出“Unknown P6 family”
- PROCESSOR_DESCRIPTION:处理器描述,如“8 core Intel® Xeon® CPU E5640 @ 2.67GHz”
- OS_NAME:操作系统名称,如“Linux”
- OS_RELEASE:操作系统发行信息,如“4.15.0-161-generic”
- OS_VERSION:操作系统版本,如“#169-Ubuntu SMP Fri Oct 15 13:41:54 UTC 2021”
- OS_PLATFORM:操作系统平台,如“x86_64”
- DISTRIB_INFO:3.22版本提供,根据/etc/os-release文件确定查询的变量
- DISTRIB_:3.22版本提供,如果/etc/os-release文件中存在name变量,则获取它
除指定3.22版本的特性外,其他特性在3.10版本都已提供。
具体使用如下:
cmake_host_system_information(RESULT PRETTY_NAME QUERY DISTRIB_PRETTY_NAME)
message(STATUS "${PRETTY_NAME}")
cmake_host_system_information(RESULT DISTRO QUERY DISTRIB_INFO)
foreach(VAR IN LISTS DISTRO)
message(STATUS "${VAR}=`${${VAR}}`")
endforeach()
可能的输出如下:
-- Ubuntu 20.04.2 LTS
-- DISTRO_BUG_REPORT_URL=`https://bugs.launchpad.net/ubuntu/`
-- DISTRO_HOME_URL=`https://www.ubuntu.com/`
-- DISTRO_ID=`ubuntu`
-- DISTRO_ID_LIKE=`debian`
-- DISTRO_NAME=`Ubuntu`
-- DISTRO_PRETTY_NAME=`Ubuntu 20.04.2 LTS`
-- DISTRO_PRIVACY_POLICY_URL=`https://www.ubuntu.com/legal/terms-and-policies/privacy-policy`
-- DISTRO_SUPPORT_URL=`https://help.ubuntu.com/`
-- DISTRO_UBUNTU_CODENAME=`focal`
-- DISTRO_VERSION=`20.04.2 LTS (Focal Fossa)`
-- DISTRO_VERSION_CODENAME=`focal`
-- DISTRO_VERSION_ID=`20.04`
可以看到,它输出了详细的系统信息,通过第一行即可判断出Linux的发行版本,如:
IF (${PRETTY_NAME} MATCHES "Ubuntu")
MESSAGE(STATUS "Linux dist: ubuntu")
ENDIF
如果cmake版本较低,可以通过执行Linux脚本的方式获取发行版本。
关于cmake中执行Linux命令的方式,请参考CMake中执行shell命令之execute_process、add_custom_target和add_custom_command。
小结
cmake提供了许多变量可以直接使用,随着cmake的迭代升级,也越来越多地推出了很多新功能。
所以要保持学习,这样看似很难的工作,其实一个变量就搞定了。