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

  1. CACHE , che lo renderà globalmente disponibile

  2. usa PARENT_SCOPE , che lo renderà disponibile nell'ambito genitore. L'ambito genitore è il file CMakeLists.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 comando add_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):

  1. Un valore nel tuo codice dovrebbe essere modificabile dall'utente del tuo progetto, ad es. Con l' cmakegui , ccmake o con cmake -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

    inserisci la descrizione dell'immagine qui

    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.

  1. 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:

  1. Compila il codice con l'opzione -pg
  2. Codice di collegamento con opzione -pg
  3. Eseguire il programma
  4. Il programma genera il file gmon.out
  5. 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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow