有没有人知道任何cmake变量或钩子或什么东西可以给我基础平台名称/风味名称,它正在执行? 例如Linux的CentOS的 Linux的Ubuntu的 Linux的SLES
我知道cmake有" CMAKE_SYSTEM"变量,但这并没有帮助区分linux的风格,例如任何帮助表示赞赏。
编辑: 我刚看到它可以使用lsb_release命令完成吗?
答案 0 :(得分:14)
以下代码段使用有关基础Linux系统的信息填充LSB_RELEASE_ID_SHORT
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
)
例如,在Ubuntu上,它会产生Ubuntu
。
答案 1 :(得分:6)
比检查文件系统上的文件稍微复杂一点就是从可用的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}")
在我运行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
对于我的情况,.el6
足以区分。
答案 2 :(得分:4)
可能,你必须亲自编写这样的测试。这是一个可能的例子,只是谷歌搜索:https://htcondor-wiki.cs.wisc.edu/index.cgi/fileview?f=build/cmake/FindLinuxPlatform.cmake&v=4592599fecc08e5588c4244e2b0ceb7d32363a56
但是,根据您的实际需要,测试可能非常复杂。例如,作为基于Debian的操作系统的Ubuntu始终具有/etc/debian_version
,并且许多基于RPM的操作系统传统上具有/etc/redhat-release
。 Linux Standard Base(LSB)规范中有一个文件/etc/os-release
,但是例如在本地主机上,由于未知原因,该文件为空:)
答案 3 :(得分:1)
在我的机器上
CMAKE_SYSTEM_INFO_FILE == "Platform/Linux"
CMAKE_SYSTEM_NAME == "Linux"
CMAKE_SYSTEM == "Linux-<kernel version>"
使用cmake --system-information
获得,我知道有人在自己的CMakeLists.txt
文件中使用这些宏,因此它们按预期工作,可能CMAKE_SYSTEM_NAME
是您真正想要的,但是在这里,你得到这个3以及检查机器属性的命令,直到cmake
为止。
答案 4 :(得分:0)
没有。截至2015年,CMake显然仍然无法告诉你它是否在Ubuntu上运行。
CMake为我们提供了一种标准语言,可以编写特定于垃圾过程平台的构建规范,但在我看来,它已经超越了它的所有目标。它甚至无法为Ubuntu正确打包〜本身;一些可怜的维护者显然是手工做的。
答案 5 :(得分:0)
基于thiagowfx answer,如果您想获得发行版的代号(如果可用):
execute_process(COMMAND lsb_release -cs
OUTPUT_VARIABLE RELEASE_CODENAME
OUTPUT_STRIP_TRAILING_WHITESPACE
)
E.g。在Ubuntu 14.04中,变量RELEASE_CODENAME
将保留trusty
。
答案 6 :(得分:0)
### find our os (wins, centos, ubuntu, etc)
set(VAR_OS "")
IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
MESSAGE(DEBUG "Linux")
execute_process (
COMMAND bash -c "awk -F= '/^ID=/{print $2}' /etc/os-release |tr -d '\n' | tr -d '\"'"
OUTPUT_VARIABLE outOS
)
MESSAGE(DEBUG "Linux os: ${outOS}")
ELSEIF(CMAKE_SYSTEM_NAME MATCHES "Windows")
MESSAGE(DEBUG "Windows")
set(VAR_OS "wins")
ELSE()
MESSAGE(FATAL "No OS detected!")
ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
答案 7 :(得分:0)
我知道这是一个老问题,但是到目前为止,还没有内置cmake
内置函数来详细查找此信息。我已经实现了一个小的实用程序函数,该函数在Linux上使用lsb_release
来查找许多相关的系统详细信息:
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()
将其添加到您的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()
如果您需要更多详细信息,请检查lsb_release
可以为lsb_release -a
提供的其他内容。
请注意,并非每个Linux都安装了lsb_release
。大多数系统都提供它,但不是强制性的。例如,在较新的Ubuntu上,它是台式机安装的默认设置,ubuntu-minimal
要求安装。如果您的计算机上缺少该文件,则可以使用sudo apt install lsb-release
进行安装。