2011-12-12 16 views
18

Qualcosa di simile a questo:Come ottenere una variabile CMake dalla riga di comando?

cmake --get-variable=MY_CMAKE_VARIABLE 

La variabile può esistere in un file CMake incluso.

+1

La domanda è un po 'poco chiara: vuoi specificare il valore per una variabile sulla riga di comando? O vuoi estrarre una variabile esistente da alcuni CMakeFile e far sì che cmake lo stampi allo standard? –

risposta

15

Se si dispone di un file di cache esistente, si può fare:

grep MY_CMAKE_VARIABLE CMakeCache.txt 

Se non si dispone ancora di un file di cache e si desidera vedere quali opzioni ci sono in un file CMakeLists.txt, si può fare (in una directory diversa dal momento che questo scriverà un file di cache):

cmake -L /path/to/CMakeLists.txt | grep MY_CMAKE_VARIABLE 

che tornerà a voi qualcosa di simile

<VARIABLE>:<TYPE>=<VALUE> 

Se è una variabile avanzata, aggiungere il flag -A allo stesso comando e includerà le variabili avanzate. Naturalmente, se si desidera solo il valore, si può fare:

cmake -L /path/to/CMakeLists.txt | grep MY_CMAKE_VARIABLE | cut -d "=" -f2 

EDIT

Ad esempio, con un CMakeLists.txt che è:

cmake_minimum_required(VERSION 2.8) 

project(test) 

include(otherFile.txt) 

set(MY_VAR "Testing" CACHE STRING "") 

E dove otherFile. txt è:

set(MY_OTHER_VAR "Hi" CACHE STRING "") 

Il comando (eseguito da un'altra directory):

cmake -L ../cmaketest 

Dà:

-- The C compiler identification is GNU 
-- The CXX compiler identification is GNU 
-- Check for working C compiler: /usr/bin/gcc 
-- Check for working C compiler: /usr/bin/gcc -- works 
-- Detecting C compiler ABI info 
-- Detecting C compiler ABI info - done 
-- Check for working CXX compiler: /usr/bin/c++ 
-- Check for working CXX compiler: /usr/bin/c++ -- works 
-- Detecting CXX compiler ABI info 
-- Detecting CXX compiler ABI info - done 
-- Configuring done 
-- Generating done 
-- Build files have been written to: /home/tgallagher/cmaketest-build 
-- Cache values 
CMAKE_BUILD_TYPE:STRING= 
CMAKE_INSTALL_PREFIX:PATH=/usr/local 
MY_OTHER_VAR:STRING=Hi 
MY_VAR:STRING=Testing 

Quindi, Mostrano variabili da altri file. Dovrebbe analizzare l'intera build. Il problema però è che non mostrerà alcuna variabile che non è contrassegnata con CACHE. E non mostrerà nessuno che sia memorizzato nella cache INTERNAL, e mostrerà solo ADVANCED se -LA è usata al posto di -L.

Se le variabili sono contrassegnate come INTERNE o non CACHE, non c'è alcun metodo in CMake per estrarlo. Ma le variabili non CACHE sono pensate per essere transitorie, quindi non sono sicuro del perché ne avresti bisogno al di fuori di un ambiente di costruzione comunque.

+0

Non di questi suggerimenti sembra funzionare per variabili incluse da altri file CMake – Allan

+0

Aggiunto un esempio funzionante che include altri file cmake. Cosa stai cercando di ottenere? Forse c'è un altro modo, o un modo per impostare le variabili in modo da poterle usare con l'approccio di cui sopra. – tpg2114

-1

-D <var>:<type>=<value>:

Quando CMake prima esecuzione in un albero di costruzione vuota, viene creato un file CMakeCache.txt e popola con impostazioni personalizzabili per il progetto. Questa opzione può essere utilizzata per specificare un'impostazione che ha la priorità sul valore predefinito del progetto. L'opzione può essere ripetuta per tutte le voci della cache desiderate.

+1

Non è quello che ha chiesto l'OP –

2

Se è necessario ottenere senza cache variabile utente, ma non è possibile modificare lo script cmake originale, è possibile ricorrere a un trucco. Crea nuovo file CMakeLists.txt in un'altra directory con il seguente contenuto:

include(<Path to original CMakeLists.txt>) 

message(STATUS "MY_VAR={${MY_VAR}}") 

E 'del tutto possibile, CMake sarà fatto un sacco di errori durante l'esecuzione in nuova directory.I percorsi relativi, se usati nello script originale, sono sicuramente una causa di tali errori. Ma cmake stamperà l'ultimo valore assegnato per la tua variabile. Inoltre, filtrare tutti gli errori e gli avvisi utilizzando qualsiasi elaboratore di testo ben noto (assumere UNIX familiare), per esempio:

cmake . | sed -n 's/-- MY_VAR={\(.*\)}/\1/p' 2>&1 

Io uso questo approccio negli script progetti di manutenzione, è affidabile finché originale CMakeLists.txt non ha errori di sintassi.

1

Usa:

cmake -LA -N /path/to/project 

per ottenere un elenco di tutti i valori della cache. Il -N è importante; impedisce a cmake di provare a generare file di build e mostra semplicemente cosa c'è nella cache.

Problemi correlati