cmake
Variabelen en eigenschappen
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:
CACHE
it, waardoor het wereldwijd beschikbaar wordtgebruik
PARENT_SCOPE
, waardoor het beschikbaar is in het bovenliggende bereik. Het bovenliggende bereik is het bestandCMakeLists.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 opdrachtadd_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):
Een waarde in uw code moet door de gebruiker van uw project kunnen worden gewijzigd, bijvoorbeeld met de optie
cmakegui
,ccmake
of metcmake -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
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.
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:
- Compileer code met de optie -pg
- Link code met -pg optie
- Programma uitvoeren
- Programma genereert gmon.out-bestand
- 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.