Обнаружение базовой платформы/аромата в Cmake

Кто-нибудь знает какую-либо переменную cmake или хук или что-то, что может дать мне базовое имя платформы/название вкуса, на котором оно выполняется? например Linux-CentOs Linux-Ubuntu Linux-SLES

Я знаю, что в cmake есть переменная CMAKE_SYSTEM, но это не помогает различать разновидности Linux, например. Любая помощь приветствуется.

редактировать: я только что прочитал, что это можно сделать с помощью команды lsb_release?


person voidMainReturn    schedule 13.11.2014    source источник


Ответы (6)


Следующий фрагмент кода заполняет переменную LSB_RELEASE_ID_SHORT cmake информацией о базовой системе Linux:

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.

person thiagowfx    schedule 11.01.2017
comment
Разные дистрибутивы помещают одни и те же вещи в разные места. Это был идеальный способ включить библиотеки, используя эти местоположения для конкретного дистрибутива. - person moodboom; 20.11.2019
comment
Возможно, вы захотите как-то обернуть это краткой проверкой для Linux. Просто изучаю cmake сам. - person fuzzyTew; 19.05.2020
comment
Это не работает для Red Hat - person sourcedelica; 06.12.2020
comment
Протестировано на Ubuntu для ARM64, и там написано No LSB modules are available. - person tresf; 03.06.2021
comment
В вашей системе установлен двоичный файл lsb_release? В Arch, например, его пакет называется lsb-release. - person thiagowfx; 06.06.2021

Немного менее запутанный, чем проверка файлов в файловой системе, состоит в том, чтобы вывести лучшее, что вы можете, из доступных переменных 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 было достаточно, чтобы отличить.

person MarkHu    schedule 17.05.2016

Скорее всего, вам придется написать такой тест самостоятельно. Вот один из возможных примеров, только что найденный в Google: 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 Standard Base (LSB) есть файл /etc/os-release, но, например, на локальном хосте этот файл по неизвестной причине пуст :)

person user3159253    schedule 13.11.2014
comment
да, проблема довольно сложная, и я думаю о ручной настройке переменной, но просто хотел посмотреть, есть ли какие-либо решения. - person voidMainReturn; 14.11.2014
comment
Что ж, одну из возможных реализаций я привел выше. Для SuSE-базы вы также можете взглянуть на /etc/SuSE-release Другое возможное решение состоит в том, чтобы определить основные варианты (например, на основе RPM-, DEB- или <YOU-NAME-THE-PACKAGE-MANAGER>, а затем вызвать обнаруженный менеджер пакетов и найти конкретный пакет, как описано здесь - person user3159253; 14.11.2014
comment
Обратите внимание, что /etc/os-release будет работать как минимум на всех дистрибутивах на основе systemd. - person mattdm; 21.03.2017

Я знаю, что это старый вопрос, но на данный момент до сих пор нет встроенной функции 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()

Добавьте его в свой 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.

person emmenlau    schedule 03.09.2020

на моей машине

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 .

person user2485710    schedule 13.11.2014
comment
К сожалению, версия ядра Linux обычно является наименее важной характеристикой данной установки Linux. Технически я мог бы установить действительно древнее ядро ​​на своей рабочей станции. Ну, вероятно, тогда мне также нужно было бы понизить версию или специально скомпилировать LIBC ... Ну, с каким-то основным программным обеспечением. - person user3159253; 14.11.2014
comment
@user3159253 user3159253, поэтому я добавил команду, эта команда дает вам все, что вам нужно знать для компиляции вашего программного обеспечения. - person user2485710; 14.11.2014
comment
Нет, у меня есть дистрибутив на основе Ubuntu, и он ничего об этом не говорит, даже не говорит мне о моем фактическом дистрибутиве (KDE Neon). Надо использовать uname. - person Xerus; 02.12.2019

Основываясь на ответе thiagowfx, если вы хотите получить кодовое имя дистрибутива (если это доступный):

execute_process(COMMAND lsb_release -cs
    OUTPUT_VARIABLE RELEASE_CODENAME
    OUTPUT_STRIP_TRAILING_WHITESPACE
)

Например. в Ubuntu 14.04 переменная RELEASE_CODENAME будет содержать trusty.

person Tanasis    schedule 03.01.2018