2014-11-13 15 views
5

Kennt jemand CMake Variable oder Hook oder etwas, das mir zugrunde liegenden Plattform Name/Flavor Name, auf dem es ausgeführt werden kann? z.B. Linux-CentOs Linux-Ubuntu Linux-SLESErkennen Sie die zugrunde liegende Plattform/Geschmack in Cmake

Ich weiß Cmake hat "CMAKE_SYSTEM" Variable, aber das hilft nicht, Aromen von Linux-Differenzierung für z.B. Jede Hilfe wird geschätzt.

edit: Ich habe gerade gelesen, dass es mit dem Befehl lsb_release getan werden kann?

Antwort

3

Wahrscheinlich müssen Sie einen solchen Test selbst schreiben. Hier ist eines der möglichen Beispiele, nur googled: https://htcondor-wiki.cs.wisc.edu/index.cgi/fileview?f=build/cmake/FindLinuxPlatform.cmake&v=4592599fecc08e5588c4244e2b0ceb7d32363a56

Allerdings kann der Test je nach Ihren tatsächlichen Bedürfnissen sehr komplex sein. Zum Beispiel hat Ubuntu als ein Debian-basiertes OS immer /etc/debian_version und viele RPM-basierte Betriebssysteme haben traditionell /etc/redhat-release. Es gibt eine Datei /etc/os-release in der Linux Standard Base (LSB) Spezifikation, sondern zum Beispiel auf dem lokalen Host diese Datei aus einem unbekannten Grunde ist leer :)

+0

Ja, das Problem ist ziemlich komplex und ich denke daran, die Variable manuell einzurichten, aber ich wollte nur sehen, ob es irgendwelche Lösungen gibt. – tejas

+0

Nun, eine der möglichen Implementierungen, die ich oben gegeben habe. Auf SuSE-based kann man sich auch '/ etc/SuSE-release' anschauen. Eine andere mögliche Lösung ist die Erkennung von" Hauptgeschmacksrichtungen "(zB' RPM', 'DEB' oder' '-basiert und dann einen gefundenen Paketmanager aufrufen und nach einem bestimmten Paket suchen, wie [hier] beschrieben (http://unix.stackexchange.com/questions/37336/how-to-detect-sles-version) – user3159253

+0

Beachten Sie, dass '/ etc/os-release' mindestens auf allen systemd-basierten Distributionen funktioniert – mattdm

1

auf meinem Rechner

CMAKE_SYSTEM_INFO_FILE == "Platform/Linux" 
CMAKE_SYSTEM_NAME == "Linux" 
CMAKE_SYSTEM == "Linux-<kernel version>" 

mit cmake --system-information erhalten, ich weiß, von Leuten, die diese Makros in ihren eigenen CMakeLists.txt Dateien verwenden, so dass sie wie erwartet funktionieren, wahrscheinlich CMAKE_SYSTEM_NAME ist, was Sie wirklich wollen, aber hier gehen Sie, erhalten Sie diese 3 und den Befehl, die Eigenschaften Ihrer Maschine zu überprüfen, soweit cmake betroffen ist.

+0

Leider stellt eine Version des Linux-Kernels normalerweise das am wenigsten signifikante Merkmal einer gegebenen Linux-Installation dar. Technisch könnte ich einen wirklich alten Kernel einrichten auf meiner Workstation Nun, wahrscheinlich würde ich auch LIBC herunterstufen oder speziell kompilieren müssen ... Nun, mit einigen "Kern-Software". – user3159253

+0

@ user3159253 Deshalb habe ich den Befehl hinzugefügt, dieser Befehl gibt Ihnen alles, was Sie wissen müssen Kompiliere deine Software – user2485710

0

Nein. Ab 2015 kann CMake anscheinend noch nicht einmal sagen, ob es auf Ubuntu läuft.

CMake hat uns eine Standardsprache zur Verfügung gestellt, in der man plattformspezifische Buildspezifikationen für die Müllprozedur schreiben kann, aber meiner Meinung nach ist es bei all seinen Zielen darüber hinaus gescheitert. Es kann nicht mal ~ selbst ordentlich für Ubuntu verpacken; ein armer Maintainer macht das anscheinend von Hand.

2

Etwas weniger verschachtelt als das Überprüfen von Dateien auf dem Dateisystem ist das Beste aus den verfügbaren CMAKE_SYSTEM vars abzuleiten. Zum Beispiel ein CMakeLists.txt Datei enthält Zeilen wie diese:

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}") 

gibt diese als ich cmake . lief:

-- 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 

Und für meine Situation war die .el6 genug zu unterscheiden.

10

Der folgende Ausschnitt füllt den LSB_RELEASE_ID_SHORT Cmake Variable mit Informationen über das zugrunde liegende Linux-System:

find_program(LSB_RELEASE lsb_release) 
execute_process(COMMAND ${LSB_RELEASE} -is 
    OUTPUT_VARIABLE LSB_RELEASE_ID_SHORT 
    OUTPUT_STRIP_TRAILING_WHITESPACE 
) 

auf Ubuntu zum Beispiel es ergibt Ubuntu.

0

Basierend auf thiagowfx answer, wenn Sie die Codename des Distro erhalten möchten (sofern verfügbar):

execute_process(COMMAND lsb_release -cs 
    OUTPUT_VARIABLE RELEASE_CODENAME 
    OUTPUT_STRIP_TRAILING_WHITESPACE 
) 

Z.B. in Ubuntu 14.04 die Variable RELEASE_CODENAME wird trusty halten.

Verwandte Themen