Linux 检测Cmake中的底层平台/味道

Linux 检测Cmake中的底层平台/味道,linux,cmake,platform,Linux,Cmake,Platform,是否有人知道任何cmake变量或钩子或其他可以给我执行它的底层平台名/风格名的东西? e、 g.Linux CentOs Linux Ubuntu Linux SLES 我知道cmake有“cmake_SYSTEM”变量,但这无助于区分linux的不同风格,例如,感谢您的帮助 编辑: 我刚刚读到,可以使用lsb_release命令来完成这个测试?很可能,您必须自己编写这样的测试。以下是一个可能的例子,谷歌搜索到: 然而,根据您的实际需要,测试可能相当复杂。例如,Ubuntu作为基于Debian的

是否有人知道任何cmake变量或钩子或其他可以给我执行它的底层平台名/风格名的东西? e、 g.Linux CentOs Linux Ubuntu Linux SLES

我知道cmake有“cmake_SYSTEM”变量,但这无助于区分linux的不同风格,例如,感谢您的帮助

编辑:
我刚刚读到,可以使用lsb_release命令来完成这个测试?

很可能,您必须自己编写这样的测试。以下是一个可能的例子,谷歌搜索到:

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

CMAKE_SYSTEM_INFO_FILE == "Platform/Linux"
CMAKE_SYSTEM_NAME == "Linux"
CMAKE_SYSTEM == "Linux-<kernel version>"
CMAKE\u系统\u信息\u文件==“平台/Linux”
CMAKE_系统_名称==“Linux”
CMAKE_系统==“Linux-”

通过
cmake--system information
获得,我知道有人在自己的
CMakeLists.txt
文件中使用了上述宏,因此它们可以按预期工作,可能
cmake\u system\u NAME
是您真正想要的,但现在开始吧,您得到了这3个命令,该命令用于检查机器的属性(就
cmake
而言)。

比检查文件系统上的文件稍微复杂一些,是为了从可用的cmake\u系统变量中推断出最佳结果。例如,包含以下行的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}")
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()
当我运行
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
足以区分。

下面的代码片段用底层Linux系统的信息填充
LSB\u RELEASE\u ID\u 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


例如,在Ubuntu 14.04中,变量
RELEASE\u CODENAME
将保持
trusty
我知道这是一个老问题,但到目前为止,仍然没有
cmake
内置函数来详细查找此信息。我在Linux上实现了一个小实用程序函数,它使用
lsb_release
查找许多相关的系统详细信息:

### 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")
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
中,并按如下方式使用:

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}")
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_发行版。大多数系统都提供,但不是强制性的。例如,在较新的Ubuntu上,它是桌面安装的默认设置,并且是
ubuntuminimal
所必需的。如果您的机器上缺少该变量,您可以使用
sudo apt install lsb release

安装它。是的,问题非常复杂,我正在考虑手动设置该变量,但只是想看看是否有任何解决方案。好的,我上面给出的一个可能的实现。对于基于SuSE的产品,您还可以查看
/etc/SuSE版本
,另一种可能的解决方案是检测“主要口味”(例如,无论是基于
RPM
-、
DEB
还是
,然后调用检测到的包管理器并查找所述的特定包。请注意,
/etc/os发行版
将至少适用于所有基于systemd的发行版。不幸的是,Linux内核的版本通常是最不重要的特性一个给定Linux安装的ic。从技术上讲,我可以在我的工作站上安装一个非常古老的内核。那么,我可能还需要降级或专门编译LIBC…好吧,使用一些“核心软件”@user3159253这就是我添加该命令的原因,该命令提供编译软件所需的任何信息。不,我有一个基于Ubuntu的发行版,它没有告诉我任何信息,它甚至没有告诉我我的实际发行版(KDE Neon).必须使用
uname
。不同的发行版将相同的东西放在不同的地方。这是包含使用这些发行版特定位置的库的完美方式。可能想以某种方式用linux的简洁检查来概括这一点。我只是在学习cmake。这不适用于在Ubuntu上测试ARM64的Red Hat,它说
没有LSB模块可用。
您的系统中是否安装了
lsb\U版本
二进制文件?例如,在Arch上,其包名为
lsb版本