cmake
Variabili e proprietà
Ricerca…
introduzione
La semplicità delle variabili CMake di base smentisce la complessità della sintassi completa delle variabili. Questa pagina documenta i vari casi variabili, con esempi, e sottolinea le insidie da evitare.
Sintassi
- set (nome_name variabile [descrizione tipo CACHE [FORCE]]))
Osservazioni
I nomi delle variabili fanno distinzione tra maiuscole e minuscole. I loro valori sono di tipo stringa. Il valore di una variabile è referenziato tramite:
${variable_name}
e viene valutato all'interno di un argomento citato
"${variable_name}/directory"
Variabile cache (globale)
set(my_global_string "a string value"
CACHE STRING "a description about the string variable")
set(my_global_bool TRUE
CACHE BOOL "a description on the boolean cache entry")
Nel caso in cui una variabile memorizzata nella cache sia già definita nella cache quando CMake elabora la rispettiva riga (ad esempio quando viene eseguito nuovamente Esegui CMake), non viene alterata. Per sovrascrivere il valore predefinito, aggiungi FORCE
come ultimo argomento:
set(my_global_overwritten_string "foo"
CACHE STRING "this is overwritten each time CMake is run" FORCE)
Variabile locale
set(my_variable "the value is a string")
Per impostazione predefinita, una variabile locale viene definita solo nella directory corrente e in qualsiasi sottodirectory aggiunta tramite il comando add_subdirectory
.
Per estendere l'ambito di una variabile ci sono due possibilità:
CACHE
, che lo renderà globalmente disponibileusa
PARENT_SCOPE
, che lo renderà disponibile nell'ambito genitore. L'ambito genitore è il fileCMakeLists.txt
nella directory padre o il chiamante della funzione corrente.Tecnicamente la directory principale sarà il file
CMakeLists.txt
che includeva il file corrente tramite il comandoadd_subdirectory
.
Archi ed elenchi
È importante sapere in che modo CMake distingue tra elenchi e stringhe semplici. Quando scrivi:
set(VAR "ab c")
crei una stringa con il valore "ab c"
. Ma quando scrivi questa frase senza virgolette:
set(VAR abc)
Si crea invece un elenco di tre elementi: "a"
, "b"
e "c"
.
Le variabili non-list sono in realtà anche liste (di un singolo elemento).
Le liste possono essere gestite con il comando list()
, che consente di concatenare liste, cercarle, accedere a elementi arbitrari e così via ( documentazione di list () ).
Un po 'di confusione, una lista è anche una stringa . La linea
set(VAR abc)
è equivalente a
set(VAR "a;b;c")
Pertanto, per concatenare gli elenchi si può anche usare il comando set()
:
set(NEW_LIST "${OLD_LIST1};${OLD_LIST2})"
Variabili e cache delle variabili globali
Principalmente userete "variabili normali" :
set(VAR TRUE)
set(VAR "main.cpp")
set(VAR1 ${VAR2})
Ma CMake conosce anche le "variabili memorizzate nella cache" globali (persistono in CMakeCache.txt
). E se nello scope corrente esistono variabili normali e memorizzate nella cache con lo stesso nome, le variabili normali nascondono quelle memorizzate nella cache:
cmake_minimum_required(VERSION 2.4)
project(VariablesTest)
set(VAR "CACHED-init" CACHE STRING "A test")
message("VAR = ${VAR}")
set(VAR "NORMAL")
message("VAR = ${VAR}")
set(VAR "CACHED" CACHE STRING "A test" FORCE)
message("VAR = ${VAR}")
Uscita della prima uscita
VAR = CACHED-init
VAR = NORMAL
VAR = CACHED
Uscita della seconda uscita
VAR = CACHED
VAR = NORMAL
VAR = CACHED
Nota: l'opzione FORCE
disattiva / rimuove la variabile normale dall'ambito corrente.
Usa casi per le variabili memorizzate nella cache
Di solito ci sono due casi d'uso (si prega di non utilizzarli impropriamente per variabili globali):
Un valore nel tuo codice dovrebbe essere modificabile dall'utente del tuo progetto, ad es. Con l'
cmakegui
,ccmake
o concmake -D ...
:CMakeLists.txt / MyToolchain.cmake
set(LIB_A_PATH "/some/default/path" CACHE PATH "Path to lib A")
Riga di comando
$ cmake -D LIB_A_PATH:PATH="/some/other/path" ..
Questo pre-imposta questo valore nella cache e la riga sopra non la modificherà.
CMake GUI
Nella GUI l'utente avvia per prima cosa il processo di configurazione, quindi può modificare qualsiasi valore memorizzato nella cache e termina con l'avvio della generazione dell'ambiente di generazione.
Inoltre, CMake esegue la cache dei risultati di identificazione ricerca / test / compilatore (quindi non è necessario ripetere l'operazione ogni volta che si rieseguono i passaggi di configurazione / generazione)
find_path(LIB_A_PATH libA.a PATHS "/some/default/path")
Qui
LIB_A_PATH
viene creato come variabile memorizzata nella cache.
Aggiunta di flag di profilazione a CMake per utilizzare gprof
La serie di eventi qui dovrebbe funzionare come segue:
- Compila il codice con l'opzione -pg
- Codice di collegamento con opzione -pg
- Eseguire il programma
- Il programma genera il file gmon.out
- Esegui il programma gprof
Per aggiungere flag di profilatura, devi aggiungere a CMakeLists.txt:
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg")
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pg")
Questo deve aggiungere flag per compilare e collegare e utilizzare dopo aver eseguito il programma:
gprof ./my_exe
Se ricevi un errore del tipo:
gmon.out: No such file or directory
Ciò significa che la compilazione non ha aggiunto correttamente le informazioni di profilazione.