2014-11-13 17 views
5

Qualcuno conosce una variabile o hook cmake o qualcosa che può darmi nome piattaforma/nome di piattaforma sottostante su cui viene eseguito? ad es. Linux CentOS Linux Ubuntu Linux SLESRileva piattaforma/flavor sottostante in Cmake

so CMake ha "CMAKE_SYSTEM" variabile, ma questo non aiuta differenziare versioni di Linux per esempio Qualsiasi aiuto è apprezzato.

modifica: Ho appena letto che può essere eseguito utilizzando il comando lsb_release?

risposta

3

Probabilmente, è necessario scrivere un test di questo tipo. Ecco uno dei possibili esempi, solo su google: https://htcondor-wiki.cs.wisc.edu/index.cgi/fileview?f=build/cmake/FindLinuxPlatform.cmake&v=4592599fecc08e5588c4244e2b0ceb7d32363a56

Tuttavia, a seconda delle esigenze effettive, il test potrebbe essere piuttosto complesso. Ad esempio, Ubuntu come sistema operativo basato su Debian ha sempre /etc/debian_version e molti SO basati su RPM hanno tradizionalmente /etc/redhat-release. C'è un file /etc/os-release nella specifica Linux Standard Base (LSB), ma per esempio sul localhost questo file è vuoto per un motivo sconosciuto :)

+0

sì il problema è abbastanza complesso e sto pensando di impostare manualmente la variabile ma volevo solo vedere se ci sono soluzioni là fuori. – tejas

+0

Bene, una delle possibili implementazioni che ho dato sopra. Per SuSE-based si può anche guardare a '/ etc/SuSE-release' Un'altra soluzione possibile è quella di rilevare" aromi principali "(ad esempio se il suo' RPM'-, 'DEB'- o' '-basato e quindi chiama un gestore di pacchetti rilevato e cerca un pacchetto specifico come descritto [qui] (http://unix.stackexchange.com/questions/37336/how-to-detect-sles-version) – user3159253

+0

Si noti che '/ etc/os-release' funzionerà su tutte le distribuzioni basate su systemd, come minimo – mattdm

1

sulla mia macchina

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

ottenuti con cmake --system-information, lo so di persone che utilizzano detti macro nei propri file CMakeLists.txt in modo che funzionino come previsto, probabilmente CMAKE_SYSTEM_NAME è ciò che si vuole veramente, ma qui si ottiene, si ottiene questo 3 e il comando per ispezionare le proprietà della propria macchina fino a cmake.

+0

Sfortunatamente una versione del kernel Linux è solitamente la caratteristica meno significativa di una determinata installazione di Linux.Poticamente potrei installare un kernel molto antico sulla mia workstation Beh, probabilmente dovrei anche eseguire il downgrade o compilare specificamente LIBC ... Beh, con alcuni "software di base". – user3159253

+0

@ user3159253 è per questo che ho aggiunto il comando, che comando ti dà tutto ciò che devi sapere per compila il tuo software – user2485710

0

No. A partire dal 2015, CMake a quanto pare non è ancora in grado di dirti se è in esecuzione su Ubuntu.

CMake ci ha fornito un linguaggio standard in cui scrivere le specifiche di compilazione procedurali specifiche della piattaforma garbage, ma a mio parere ha fallito in tutti i suoi obiettivi oltre. Non può nemmeno pacchettizzare ~ stesso correttamente per Ubuntu; un povero manutentore lo sta facendo apparentemente a mano.

2

Un po 'meno complicato del controllo dei file sul filesystem è quello di ricavare il meglio che si può dai vars di CMAKE_SYSTEM disponibili. Per esempio, un CMakeLists.txt linee di file contenente come questo:

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

Risulterà quando mi sono imbattuto 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 

e per la mia situazione, il .el6 era abbastanza per differenziare.

10

Il seguente frammento popola la variabile LSB_RELEASE_ID_SHORT cmake con informazioni sul sistema Linux sottostante:

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

Su Ubuntu, per esempio, produce Ubuntu.

0

Sulla base di thiagowfx answer, Se si desidera ottenere il nome in codice della distro (se disponibile):

execute_process(COMMAND lsb_release -cs 
    OUTPUT_VARIABLE RELEASE_CODENAME 
    OUTPUT_STRIP_TRAILING_WHITESPACE 
) 

Ad es in Ubuntu 14.04 la variabile RELEASE_CODENAME si manterrà trusty.