有没有人知道任何cmake变量或钩子或其他东西,可以给予我底层平台名称/风味名称,它是在上面执行的?例如Linux-CentOs Linux-Ubuntu Linux-SLES我知道cmake有“CMAKE_SYSTEM”变量,但这并不能帮助区分linux的风格,例如,任何帮助都是值得的。编辑:我刚刚读到它可以使用lsb_release命令完成?
tvz2xvvm1#
以下代码片段使用有关底层Linux系统的信息填充LSB_RELEASE_ID_SHORT cmake变量:
LSB_RELEASE_ID_SHORT
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。
Ubuntu
jaxagkaj2#
比检查文件系统上的文件稍微简单一点的是,从可用的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 .
-- 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足以区分。
.el6
6l7fqoea3#
很可能,你必须自己写一个这样的测试。下面是一个可能的例子,只是谷歌: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。Linux标准库(LSB)规范中有一个文件/etc/os-release,但例如在本地主机上,该文件因未知原因而为空:)
/etc/debian_version
/etc/redhat-release
/etc/os-release
4ktjp1zp4#
我知道这是一个老问题了,但到目前为止,仍然没有cmake内置函数来详细查找这些信息。我实现了一个小的实用程序函数,它在Linux上使用lsb_release来查找许多相关的系统细节:
cmake
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中,并像这样使用它:
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安装它。
lsb_release -a
ubuntu-minimal
sudo apt install lsb-release
yvt65v4c5#
在我的机器上
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而言。
cmake --system-information
CMAKE_SYSTEM_NAME
olhwl3o26#
基于thiagowfx answer,如果你想获得发行版的 codename(如果它可用):
execute_process(COMMAND lsb_release -cs OUTPUT_VARIABLE RELEASE_CODENAME OUTPUT_STRIP_TRAILING_WHITESPACE )
例如,在Ubuntu 14.04中,变量RELEASE_CODENAME将保存trusty。
RELEASE_CODENAME
trusty
at0kjp5o7#
### 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")
ix0qys7i8#
这是检测操作系统信息的新方法:https://cmake.org/cmake/help/latest/command/cmake_host_system_information.html
8条答案
按热度按时间tvz2xvvm1#
以下代码片段使用有关底层Linux系统的信息填充
LSB_RELEASE_ID_SHORT
cmake变量:例如,在Ubuntu上,它产生
Ubuntu
。jaxagkaj2#
比检查文件系统上的文件稍微简单一点的是,从可用的CMAKE_SYSTEM变量中推断出最好的结果。例如,CMakeLists.txt文件包含如下行:
运行
cmake .
时输出如下:对于我的情况,
.el6
足以区分。6l7fqoea3#
很可能,你必须自己写一个这样的测试。下面是一个可能的例子,只是谷歌: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
。Linux标准库(LSB)规范中有一个文件/etc/os-release
,但例如在本地主机上,该文件因未知原因而为空:)4ktjp1zp4#
我知道这是一个老问题了,但到目前为止,仍然没有
cmake
内置函数来详细查找这些信息。我实现了一个小的实用程序函数,它在Linux上使用lsb_release
来查找许多相关的系统细节:将它添加到
CMakeLists.txt
中,并像这样使用它:如果您需要进一步的细节,请查看
lsb_release
还可以为lsb_release -a
提供哪些功能。请注意,并不是每个Linux都安装了
lsb_release
。大多数系统都提供了它,但不是强制性的。例如,在较新的Ubuntu上,它是桌面安装的默认设置,并且是ubuntu-minimal
所必需的。如果您的机器上缺少它,您可以使用sudo apt install lsb-release
安装它。yvt65v4c5#
在我的机器上
用
cmake --system-information
获得的,我知道有人在他们自己的CMakeLists.txt
文件中使用所说的宏,所以它们按预期工作,可能CMAKE_SYSTEM_NAME
是你真正想要的,但在这里你去,你得到这个3和命令来检查你的机器的属性,就cmake
而言。olhwl3o26#
基于thiagowfx answer,如果你想获得发行版的 codename(如果它可用):
例如,在Ubuntu 14.04中,变量
RELEASE_CODENAME
将保存trusty
。at0kjp5o7#
ix0qys7i8#
这是检测操作系统信息的新方法:https://cmake.org/cmake/help/latest/command/cmake_host_system_information.html