cmake
Zmienne i właściwości
Szukaj…
Wprowadzenie
Prostota podstawowych zmiennych CMake zaprzecza złożoności pełnej składni zmiennych. Ta strona dokumentuje różne przypadki zmiennych, z przykładami i wskazuje pułapki, których należy unikać.
Składnia
- zestaw (wartość zmiennej nazwa [opis typu CACHE [FORCE]])
Uwagi
W nazwach zmiennych rozróżniana jest wielkość liter. Ich wartości są typu ciąg. Wartość zmiennej jest wskazywana przez:
${variable_name}
i jest oceniany w cytowanym argumencie
"${variable_name}/directory"
Zmienna buforowana (globalna)
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")
W przypadku, gdy buforowana zmienna jest już zdefiniowana w pamięci podręcznej, gdy CMake przetwarza odpowiednią linię (np. Po ponownym uruchomieniu CMake), nie jest zmieniana. Aby zastąpić wartość domyślną, dodaj FORCE
jako ostatni argument:
set(my_global_overwritten_string "foo"
CACHE STRING "this is overwritten each time CMake is run" FORCE)
Zmienna lokalna
set(my_variable "the value is a string")
Domyślnie zmienna lokalna jest zdefiniowana tylko w bieżącym katalogu, a wszystkie podkatalogi dodawane za pomocą polecenia add_subdirectory
.
Aby rozszerzyć zakres zmiennej, istnieją dwie możliwości:
CACHE
to, co sprawi, że będzie dostępne na całym świecieużyj
PARENT_SCOPE
, który udostępni go w zakresie nadrzędnym. Zakres nadrzędny to plikCMakeLists.txt
w katalogu nadrzędnym lub obiekt wywołujący bieżącej funkcji.Technicznie katalog nadrzędny będzie
CMakeLists.txt
plik dołączony aktualny plik za pośrednictwemadd_subdirectory
polecenia.
Ciągi i listy
Ważne jest, aby wiedzieć, jak CMake rozróżnia listy i zwykłe ciągi znaków. Kiedy piszesz:
set(VAR "ab c")
tworzysz ciąg o wartości "ab c"
. Ale kiedy piszesz ten wiersz bez cudzysłowów:
set(VAR abc)
Zamiast tego tworzysz listę trzech elementów: "a"
, "b"
i "c"
.
Zmienne nie będące listami są również listami (jednego elementu).
Listy można obsługiwać za pomocą polecenia list()
, które umożliwia konkatenację list, przeszukiwanie ich, uzyskiwanie dostępu do dowolnych elementów i tak dalej ( dokumentacja list () ).
Nieco myląca, lista jest także ciągiem znaków . Linia
set(VAR abc)
jest równa
set(VAR "a;b;c")
Dlatego do łączenia list można również użyć polecenia set()
:
set(NEW_LIST "${OLD_LIST1};${OLD_LIST2})"
Zmienne i pamięć podręczna zmiennych globalnych
Najczęściej będziesz używać „normalnych zmiennych” :
set(VAR TRUE)
set(VAR "main.cpp")
set(VAR1 ${VAR2})
Ale CMake zna także globalne „buforowane zmienne” (utrwalone w CMakeCache.txt
). A jeśli w bieżącym zakresie istnieją zmienne normalne i buforowane o tej samej nazwie, zmienne normalne ukrywają te buforowane:
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}")
Wyjście pierwszego uruchomienia
VAR = CACHED-init
VAR = NORMAL
VAR = CACHED
Wynik drugiego uruchomienia
VAR = CACHED
VAR = NORMAL
VAR = CACHED
Uwaga: Opcja FORCE
nie powoduje również rozbrojenia / usunięcia normalnej zmiennej z bieżącego zakresu.
Użyj przypadków dla buforowanych zmiennych
Zazwyczaj występują dwa przypadki użycia (nie należy ich niewłaściwie wykorzystywać do zmiennych globalnych):
Wartość w kodzie powinna być modyfikowalna przez użytkownika projektu, np. Za pomocą opcji
cmakegui
,ccmake
lubcmake -D ...
CMakeLists.txt / MyToolchain.cmake
set(LIB_A_PATH "/some/default/path" CACHE PATH "Path to lib A")
Wiersz poleceń
$ cmake -D LIB_A_PATH:PATH="/some/other/path" ..
Spowoduje to wstępne ustawienie tej wartości w pamięci podręcznej i powyższa linia jej nie zmodyfikuje.
CMake GUI
W interfejsie GUI użytkownik najpierw rozpoczyna proces konfiguracji, a następnie może zmodyfikować dowolną wartość z pamięci podręcznej i kończy się wraz z rozpoczęciem generowania środowiska kompilacji.
Dodatkowo CMake dokonuje wyszukiwania w pamięci podręcznej wyników wyszukiwania / testu / identyfikacji kompilatora (więc nie musi tego robić ponownie przy każdym ponownym uruchomieniu kroków konfiguracji / generowania)
find_path(LIB_A_PATH libA.a PATHS "/some/default/path")
Tutaj
LIB_A_PATH
jest tworzony jako zmienna buforowana.
Dodawanie flag profilowania do CMake w celu użycia gprof
Cykl wydarzeń tutaj powinien działać w następujący sposób:
- Skompiluj kod z opcją -pg
- Link do kodu z opcją -pg
- Uruchom program
- Program generuje plik gmon.out
- Uruchom program gprof
Aby dodać flagi profilowania, musisz dodać do pliku 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")
To musi dodać flagi do kompilacji i dowiązania oraz użyć po uruchomieniu programu:
gprof ./my_exe
Jeśli pojawi się błąd taki jak:
gmon.out: No such file or directory
Oznacza to, że kompilacja nie dodała poprawnie informacji profilowania.