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
.
从检查可用的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
足以区分。
很可能,您必须自己编写这样的测试。这是可能的例子之一,只是用谷歌搜索: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-release
Linux Standard Base (LSB) 规范中有一个文件,但例如在本地主机上,由于未知原因,此文件为空:)
我知道这是一个老问题,但到目前为止,仍然没有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
。
归档时间: |
|
查看次数: |
9434 次 |
最近记录: |