cmake_host_system_information

查询各种主机系统信息。

概要

Query host system specific information
  cmake_host_system_information(RESULT <variable> QUERY <key> ...)

Query the Windows registry
  cmake_host_system_information(RESULT <variable> QUERY WINDOWS_REGISTRY <key> ...)

查询主机系统特定信息

cmake_host_system_information(RESULT <variable> QUERY <key> ...)

查询 cmake 运行所在主机系统的系统信息。可以提供一个或多个 <key> 来选择要查询的信息。查询到的值列表将存储在 <variable> 中。

<key> 可以是下列值之一

NUMBER_OF_LOGICAL_CORES

逻辑核心数

NUMBER_OF_PHYSICAL_CORES

物理核心数

HOSTNAME

主机名

FQDN

完全限定域名

TOTAL_VIRTUAL_MEMORY

以 MiB 为单位的总虚拟内存 [1]

AVAILABLE_VIRTUAL_MEMORY

以 MiB 为单位的可用虚拟内存 [1]

TOTAL_PHYSICAL_MEMORY

以 MiB 为单位的总物理内存 [1]

AVAILABLE_PHYSICAL_MEMORY

以 MiB 为单位的可用物理内存 [1]

IS_64BIT

3.10 版本新增。

如果处理器是 64 位的,则为 1

HAS_FPU

3.10 版本新增。

如果处理器有浮点运算单元,则为 1

HAS_MMX

3.10 版本新增。

如果处理器支持 MMX 指令,则为 1

HAS_MMX_PLUS

3.10 版本新增。

如果处理器支持扩展 MMX 指令,则为 1

HAS_SSE

3.10 版本新增。

如果处理器支持 SSE 指令,则为 1

HAS_SSE2

3.10 版本新增。

如果处理器支持 SSE2 指令,则为 1

HAS_SSE_FP

3.10 版本新增。

如果处理器支持 SSE FP 指令,则为 1

HAS_SSE_MMX

3.10 版本新增。

如果处理器支持 SSE MMX 指令,则为 1

HAS_AMD_3DNOW

3.10 版本新增。

如果处理器支持 3DNow 指令,则为 1

HAS_AMD_3DNOW_PLUS

3.10 版本新增。

如果处理器支持 3DNow+ 指令,则为 1

HAS_IA64

3.10 版本新增。

如果处理器是模拟 x86 的 IA64 处理器,则为 1

HAS_SERIAL_NUMBER

3.10 版本新增。

如果处理器有序列号,则为 1

HAS_APIC

Added in version 4.3.

如果处理器支持 APIC,则为 1

HAS_L1_CACHE

Added in version 4.3.

如果处理器有 L1 缓存,则为 1

PROCESSOR_SERIAL_NUMBER

3.10 版本新增。

处理器序列号

PROCESSOR_NAME

3.10 版本新增。

人类可读的处理器名称

PROCESSOR_DESCRIPTION

3.10 版本新增。

人类可读的完整处理器描述

LOCALE_CHARSET

Added in version 4.3.

区域设置的字符集(如果已知),否则为空。

这是 cmake-language(7) 文件和脚本中预期的 编码

  • 在 Windows 上,这始终是 UTF-8

  • 在 UNIX 和 macOS 上,这基于当前区域设置。

OS_NAME

3.10 版本新增。

主机操作系统名称

  • 在 UNIX 平台上,这是 uname -s

  • 在 Apple 平台上,这是 sw_vers -productName

  • 在 Windows 上,这是 Windows

另请参见 CMAKE_HOST_SYSTEM_NAME

OS_RELEASE

3.10 版本新增。

操作系统子类型,例如在 Windows 上为 Professional

OS_VERSION

3.10 版本新增。

操作系统构建 ID

OS_PLATFORM

3.10 版本新增。

请参见 CMAKE_HOST_SYSTEM_PROCESSOR

MSYSTEM_PREFIX

版本 3.28 新增。

仅在 Windows 主机上可用。在设置了 MSYSTEM 环境变量的 MSYS 或 MinGW 开发环境中,这是其安装前缀。否则,这是空字符串。

FAMILY_ID

Added in version 4.3.

处理器家族名称

MODEL_ID

Added in version 4.3.

处理器型号 ID

MODEL_NAME

Added in version 4.3.

处理器型号名称

PROCESSOR_APIC_ID

Added in version 4.3.

处理器 APIC ID

PROCESSOR_CACHE_SIZE

Added in version 4.3.

处理器 L1 缓存大小

PROCESSOR_CLOCK_FREQUENCY

Added in version 4.3.

处理器时钟频率

VENDOR_ID

Added in version 4.3.

处理器供应商 ID

VENDOR_STRING

Added in version 4.3.

处理器供应商字符串

DISTRIB_INFO

3.22 版本新增。

读取 /etc/os-release 文件并将给定的 <variable> 定义为一个读取变量列表

DISTRIB_<name>

3.22 版本新增。

如果 /etc/os-release 文件中存在 <name> 变量,则获取它(参见 man 5 os-release

示例

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`

如果未找到 /etc/os-release 文件,该命令会尝试通过回退脚本收集 OS 标识。回退脚本可以使用 各种特定于发行版的文件 来收集 OS 标识数据,并将其映射到 man 5 os-release 变量中。

回退接口变量

CMAKE_GET_OS_RELEASE_FALLBACK_SCRIPTS

除了 CMake 附带的脚本外,用户可以将其实脚本的完整路径追加到此列表中。脚本文件名格式如下:NNN-<name>.cmake,其中 NNN 是用于按特定顺序应用收集的脚本的三位数字。

CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_<varname>

用户提供的回退脚本收集的变量应使用此命名约定分配给 CMake 变量。例如,手册中的 ID 变量变为 CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_ID

CMAKE_GET_OS_RELEASE_FALLBACK_RESULT

回退脚本应将所有已分配的 CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_<varname> 变量的名称存储在此列表中。

示例

# 000-FallbackScript.cmake
#
# Try to detect some old distribution
# See also
# - http://linuxmafia.com/faq/Admin/release-files.html
#
if(NOT EXISTS "${CMAKE_SYSROOT}/etc/foobar-release")
  return()
endif()
# Get the first string only
file(
    STRINGS "${CMAKE_SYSROOT}/etc/foobar-release" CMAKE_GET_OS_RELEASE_FALLBACK_CONTENT
    LIMIT_COUNT 1
  )
#
# Example:
#
#   Foobar distribution release 1.2.3 (server)
#
if(CMAKE_GET_OS_RELEASE_FALLBACK_CONTENT MATCHES "Foobar distribution release ([0-9\.]+) .*")
  set(CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_NAME Foobar)
  set(CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_PRETTY_NAME "${CMAKE_GET_OS_RELEASE_FALLBACK_CONTENT}")
  set(CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_ID foobar)
  set(CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_VERSION ${CMAKE_MATCH_1})
  set(CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_VERSION_ID ${CMAKE_MATCH_1})
  list(
      APPEND CMAKE_GET_OS_RELEASE_FALLBACK_RESULT
      CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_NAME
      CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_PRETTY_NAME
      CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_ID
      CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_VERSION
      CMAKE_GET_OS_RELEASE_FALLBACK_RESULT_VERSION_ID
    )
endif()
unset(CMAKE_GET_OS_RELEASE_FALLBACK_CONTENT)

然后,此脚本可以作为确定缺失主机系统信息的回退手段。

list(
  APPEND
  CMAKE_GET_OS_RELEASE_FALLBACK_SCRIPTS
  ${CMAKE_CURRENT_SOURCE_DIR}/000-FallbackScript.cmake
)

cmake_host_system_information(RESULT info QUERY DISTRIB_INFO)

脚注

查询 Windows 注册表

在 3.24 版本中添加。

cmake_host_system_information(RESULT <variable> QUERY WINDOWS_REGISTRY <key> [VALUE_NAMES|SUBKEYS|VALUE <name>] [VIEW (64|32|64_32|32_64|HOST|TARGET|BOTH)] [SEPARATOR <separator>] [ERROR_VARIABLE <result>])

对本地计算机注册表子项执行查询操作。返回位于注册表中指定子项下的子项列表、值名称列表或指定值名称的数据。查询实体结果存储在 <variable> 中。

注意

在除 Windows 之外的任何平台(包括 CYGWIN)上查询注册表,将始终返回空字符串,并在通过子选项 ERROR_VARIABLE 指定的变量中设置错误消息。

<key> 指定本地计算机上子项的完整路径。<key> 必须包含有效的根键。本地计算机的有效根键为

  • HKLMHKEY_LOCAL_MACHINE

  • HKCUHKEY_CURRENT_USER

  • HKCRHKEY_CLASSES_ROOT

  • HKUHKEY_USERS

  • HKCCHKEY_CURRENT_CONFIG

以及可选的指定根键下的子项路径。路径分隔符可以是斜杠或反斜杠。<key> 不区分大小写。例如

cmake_host_system_information(RESULT result QUERY WINDOWS_REGISTRY "HKLM")
cmake_host_system_information(RESULT result QUERY WINDOWS_REGISTRY "HKLM/SOFTWARE/Kitware")
cmake_host_system_information(RESULT result QUERY WINDOWS_REGISTRY "HKCU\\SOFTWARE\\Kitware")
VALUE_NAMES

请求在 <key> 下定义的值名称列表。如果定义了默认值,它将由特殊名称 (default) 标识。

SUBKEYS

请求在 <key> 下定义的子项列表。

VALUE <name>

请求存储在名为 <name> 的值中的数据。如果未指定 VALUE 或参数是特殊名称 (default),则将返回默认值的内容(如果有)。

# query default value for HKLM/SOFTWARE/Kitware key
cmake_host_system_information(RESULT result
                              QUERY WINDOWS_REGISTRY "HKLM/SOFTWARE/Kitware")

# query default value for HKLM/SOFTWARE/Kitware key using special value name
cmake_host_system_information(RESULT result
                              QUERY WINDOWS_REGISTRY "HKLM/SOFTWARE/Kitware"
                              VALUE "(default)")

支持的类型包括

  • REG_SZ.

  • REG_EXPAND_SZ。返回的数据会被展开。

  • REG_MULTI_SZ。返回的内容表示为 CMake 列表。另请参见 SEPARATOR 子选项。

  • REG_DWORD.

  • REG_QWORD.

对于所有其他类型,返回空字符串。

VIEW

指定必须查询哪些注册表视图。如果未指定,则使用 BOTH 视图。

64

查询 64 位注册表。在 32 位 Windows 上,始终返回空字符串。

32

查询 32 位注册表。

64_32

对于 VALUE 子选项或默认值,使用视图 64 查询注册表,如果请求失败,则使用视图 32 查询。对于 VALUE_NAMESSUBKEYS 子选项,查询两个视图(6432)并合并结果(排序并删除重复项)。

32_64

对于 VALUE 子选项或默认值,使用视图 32 查询注册表,如果请求失败,则使用视图 64 查询。对于 VALUE_NAMESSUBKEYS 子选项,查询两个视图(3264)并合并结果(排序并删除重复项)。

HOST

查询与主机架构匹配的注册表:在 64 位 Windows 上为 64,在 32 位 Windows 上为 32

TARGET

查询与 CMAKE_SIZEOF_VOID_P 变量指定的架构匹配的注册表。如果未定义,则回退到 HOST 视图。

BOTH

查询两个视图(3264)。顺序取决于以下规则:如果定义了 CMAKE_SIZEOF_VOID_P 变量。根据此变量的内容使用以下视图

  • 8: 64_32

  • 4: 32_64

如果未定义 CMAKE_SIZEOF_VOID_P 变量,则依赖于主机的架构

  • 64 位: 64_32

  • 32 位: 32

SEPARATOR

REG_MULTI_SZ 类型指定分隔符。如果未指定,则使用字符 \0

ERROR_VARIABLE <result>

返回查询操作期间引发的任何错误。如果成功,该变量为空字符串。