Zoeken…


Invoering

De eenvoud van de basis CMake-variabelen schuilt in de complexiteit van de volledige variabele syntaxis. Deze pagina documenteert de verschillende variabele gevallen, met voorbeelden, en wijst op de te vermijden valkuilen.

Syntaxis

  • set (variabele_naam waarde [CACHE type beschrijving [FORCE]])

Opmerkingen

Variabelenamen zijn hoofdlettergevoelig. Hun waarden zijn van het type string. De waarde van een variabele wordt aangeduid via:

${variable_name}

en wordt geëvalueerd binnen een geciteerd argument

"${variable_name}/directory"

In de cache opgeslagen (globale) variabele

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

In het geval een variabele in de cache al is gedefinieerd in de cache wanneer CMake de respectieve regel verwerkt (bijvoorbeeld wanneer CMake opnieuw wordt uitgevoerd), wordt deze niet gewijzigd. Voeg FORCE als laatste argument om de standaard te overschrijven:

set(my_global_overwritten_string "foo"
    CACHE STRING "this is overwritten each time CMake is run" FORCE)

Lokale variabele

set(my_variable "the value is a string")

Standaard wordt een lokale variabele alleen gedefinieerd in de huidige map en worden alle submappen toegevoegd via de opdracht add_subdirectory .

Om het bereik van een variabele uit te breiden zijn er twee mogelijkheden:

  1. CACHE it, waardoor het wereldwijd beschikbaar wordt

  2. gebruik PARENT_SCOPE , waardoor het beschikbaar is in het bovenliggende bereik. Het bovenliggende bereik is het bestand CMakeLists.txt in de bovenliggende map of de beller van de huidige functie.

    Technisch gezien is de bovenliggende map het bestand CMakeLists.txt dat het huidige bestand bevatte via de opdracht add_subdirectory .

Strings en Lijsten

Het is belangrijk om te weten hoe CMake onderscheid maakt tussen lijsten en gewone tekenreeksen. Wanneer u schrijft:

set(VAR "ab c")

je maakt een string met de waarde "ab c" . Maar wanneer u deze regel zonder aanhalingstekens schrijft:

set(VAR abc)

U maakt in plaats daarvan een lijst met drie items: "a" , "b" en "c" .

Niet-lijstvariabelen zijn eigenlijk ook lijsten (van een enkel element).

Lijsten kunnen worden bediend met de opdracht list() , waarmee lijsten kunnen worden samengevoegd, doorzocht, toegang tot willekeurige elementen enzovoort ( documentatie van list () ).

Enigszins verwarrend, een lijst is ook een string . De lijn

set(VAR abc)

is gelijk aan

set(VAR "a;b;c")

Om lijsten samen te voegen, kan men daarom ook de opdracht set() gebruiken:

set(NEW_LIST "${OLD_LIST1};${OLD_LIST2})"

Variabelen en de globale variabelencache

Meestal gebruikt u "normale variabelen" :

set(VAR TRUE)
set(VAR "main.cpp")
set(VAR1 ${VAR2})

Maar CMake kent ook globale "in de cache opgeslagen variabelen" (bleef bestaan in CMakeCache.txt ). En als normale en in de cache opgeslagen variabelen met dezelfde naam in het huidige bereik voorkomen, verbergen normale variabelen de in de cache opgeslagen variabelen:

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

Uitvoer van de eerste run

VAR = CACHED-init
VAR = NORMAL
VAR = CACHED

Uitvoer van de tweede run

VAR = CACHED
VAR = NORMAL
VAR = CACHED

Opmerking: Met de optie FORCE wordt ook de normale variabele uit het huidige bereik verwijderd / verwijderd.

Gebruik cases voor in de cache opgeslagen variabelen

Er zijn doorgaans twee gebruiksscenario's (gebruik ze alstublieft niet voor globale variabelen):

  1. Een waarde in uw code moet door de gebruiker van uw project kunnen worden gewijzigd, bijvoorbeeld met de optie cmakegui , ccmake of met cmake -D ... :

    CMakeLists.txt / MyToolchain.cmake

    set(LIB_A_PATH "/some/default/path" CACHE PATH "Path to lib A")
    

    Opdrachtregel

    $ cmake -D LIB_A_PATH:PATH="/some/other/path" ..
    

    Dit stelt deze waarde vooraf in de cache in en de bovenstaande regel zal deze niet wijzigen.

    CMake GUI

    voer hier de afbeeldingsbeschrijving in

    In de GUI start de gebruiker eerst het configuratieproces, kan vervolgens elke cachewaarde wijzigen en eindigt met het starten van de generatie van de buildomgeving.

  1. Bovendien bewaart CMake de resultaten van het zoeken / testen / compileren van de cache (dus het hoeft dit niet opnieuw te doen wanneer de configuratie- / generatiestappen opnieuw worden uitgevoerd)

    find_path(LIB_A_PATH libA.a PATHS "/some/default/path")
    

    Hier wordt LIB_A_PATH gemaakt als een variabele in de cache.

Profiling vlaggen toevoegen aan CMake om gprof te gebruiken

De reeks evenementen hier zou als volgt moeten werken:

  1. Compileer code met de optie -pg
  2. Link code met -pg optie
  3. Programma uitvoeren
  4. Programma genereert gmon.out-bestand
  5. Voer gprof-programma uit

Om profileervlaggen toe te voegen, moet u toevoegen aan uw 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")

Dat moet vlaggen toevoegen om te compileren en te koppelen en te gebruiken na het uitvoeren van het programma:

gprof ./my_exe

Als u een foutmelding krijgt zoals:

gmon.out: No such file or directory

Dat betekent dat compilatie profilering niet correct heeft toegevoegd.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow