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:

  1. CACHE to, co sprawi, że będzie dostępne na całym świecie

  2. użyj PARENT_SCOPE , który udostępni go w zakresie nadrzędnym. Zakres nadrzędny to plik CMakeLists.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średnictwem add_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):

  1. Wartość w kodzie powinna być modyfikowalna przez użytkownika projektu, np. Za pomocą opcji cmakegui , ccmake lub cmake -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

    wprowadź opis zdjęcia tutaj

    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.

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

  1. Skompiluj kod z opcją -pg
  2. Link do kodu z opcją -pg
  3. Uruchom program
  4. Program generuje plik gmon.out
  5. 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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow