检测Cmake中的底层平台/风味

voi*_*urn 9 linux platform cmake

有没有人知道任何cmake变量或钩子或什么东西可以给我基础平台名称/风味名称,它正在执行?例如Linux-CentOs Linux-Ubuntu Linux-SLES

我知道cmake有"CMAKE_SYSTEM"变量,但这对于区分linux的风格没有帮助,例如,任何帮助都是值得赞赏的.

编辑:我刚看到它可以使用lsb_release命令完成吗?

thi*_*wfx 18

以下代码段LSB_RELEASE_ID_SHORT使用有关基础Linux系统的信息填充cmake变量:

find_program(LSB_RELEASE_EXEC lsb_release)
execute_process(COMMAND ${LSB_RELEASE_EXEC} -is
    OUTPUT_VARIABLE LSB_RELEASE_ID_SHORT
    OUTPUT_STRIP_TRAILING_WHITESPACE
)
Run Code Online (Sandbox Code Playgroud)

例如,在Ubuntu上,它会产生Ubuntu.


Mar*_*kHu 7

从检查可用的CMAKE_SYSTEM变量中得出最好的结果,要比检查文件系统上的文件复杂得多。例如,一个包含以下行的CMakeLists.txt文件:

message("-- CMAKE_SYSTEM_INFO_FILE: ${CMAKE_SYSTEM_INFO_FILE}")
message("-- CMAKE_SYSTEM_NAME:      ${CMAKE_SYSTEM_NAME}")
message("-- CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}")
message("-- CMAKE_SYSTEM:           ${CMAKE_SYSTEM}")

string (REGEX MATCH "\\.el[1-9]" os_version_suffix ${CMAKE_SYSTEM})
message("-- os_version_suffix:      ${os_version_suffix}")
Run Code Online (Sandbox Code Playgroud)

运行时输出以下内容cmake .

-- CMAKE_SYSTEM_INFO_FILE: Platform/Linux
-- CMAKE_SYSTEM_NAME:      Linux
-- CMAKE_SYSTEM_PROCESSOR: x86_64
-- CMAKE_SYSTEM:           Linux-2.6.32-573.7.1.el6.x86_64
-- os_version_suffix:      .el6
Run Code Online (Sandbox Code Playgroud)

对于我的情况,.el6足以区分。


use*_*253 6

很可能,您必须自己编写这样的测试。这是可能的例子之一,只是用谷歌搜索:https ://htcondor-wiki.cs.wisc.edu/index.cgi/fileview ? f = build/cmake/FindLinuxPlatform.cmake &v= 4592599fecc08e5588c4244e2b0ceb7d32363a56

但是,根据您的实际需要,测试可能非常复杂。例如,Ubuntu 作为基于 Debian 的操作系统总是有/etc/debian_version,许多基于 RPM 的操作系统传统上都有/etc/redhat-release. /etc/os-releaseLinux Standard Base (LSB) 规范中有一个文件,但例如在本地主机上,由于未知原因,此文件为空:)


emm*_*lau 6

我知道这是一个老问题,但到目前为止,仍然没有cmake内置函数可以详细查找此信息。我实现了一个小实用函数,用于lsb_release在 Linux 上查找许多相关的系统详细信息:

function(get_linux_lsb_release_information)
    find_program(LSB_RELEASE_EXEC lsb_release)
    if(NOT LSB_RELEASE_EXEC)
        message(FATAL_ERROR "Could not detect lsb_release executable, can not gather required information")
    endif()

    execute_process(COMMAND "${LSB_RELEASE_EXEC}" --short --id OUTPUT_VARIABLE LSB_RELEASE_ID_SHORT OUTPUT_STRIP_TRAILING_WHITESPACE)
    execute_process(COMMAND "${LSB_RELEASE_EXEC}" --short --release OUTPUT_VARIABLE LSB_RELEASE_VERSION_SHORT OUTPUT_STRIP_TRAILING_WHITESPACE)
    execute_process(COMMAND "${LSB_RELEASE_EXEC}" --short --codename OUTPUT_VARIABLE LSB_RELEASE_CODENAME_SHORT OUTPUT_STRIP_TRAILING_WHITESPACE)

    set(LSB_RELEASE_ID_SHORT "${LSB_RELEASE_ID_SHORT}" PARENT_SCOPE)
    set(LSB_RELEASE_VERSION_SHORT "${LSB_RELEASE_VERSION_SHORT}" PARENT_SCOPE)
    set(LSB_RELEASE_CODENAME_SHORT "${LSB_RELEASE_CODENAME_SHORT}" PARENT_SCOPE)
endfunction()
Run Code Online (Sandbox Code Playgroud)

将其添加到您的CMakeLists.txt并像这样使用它:

if(CMAKE_SYSTEM_NAME MATCHES "Linux")
    get_linux_lsb_release_information()
    message(STATUS "Linux ${LSB_RELEASE_ID_SHORT} ${LSB_RELEASE_VERSION_SHORT} ${LSB_RELEASE_CODENAME_SHORT}")
endif()
Run Code Online (Sandbox Code Playgroud)

如果您需要更多详细信息,请查看还lsb_release可以提供什么lsb_release -a

请注意,并非每个 Linux 都已lsb_release安装。大多数系统都提供它,但不是强制性的。例如,在较新的 Ubuntu 上,它是桌面安装的默认设置,并且是ubuntu-minimal. 如果您的计算机上缺少它,您可以使用 来安装它sudo apt install lsb-release