2017-02-10 11 views
6

Ponieważ używam cmake po edycji CMakeLists.txt niektóre zmienne nie będą ładowane. Gdybym miał coś zdefiniowanego z CACHE STRING, nie pozwoliłbym na zmianę go bez wymuszania lub usuwania pamięci podręcznej.Co to jest CMakeCache.txt i dlaczego zastępuje moje zmienne

Więc dlaczego mamy ten plik CMakeCache.txt. Czy to jest nawet potrzebne?

+1

Więcej szczegółów zobacz [Jaka jest składnia CMake do ustawiania i używania zmiennych?] (https://stackoverflow.com/questions/31037882/whats-the-cmake-syntax-to-set-and-use-variables). – Florian

Odpowiedz

8

Tak, jest to na pewno potrzebne. CMake używa pamięci podręcznej, gdy jest ponownie uruchamiany podczas kompilacji, ponieważ plik CMakeList został zmieniony, lub gdy jesteś make rebuild_cache. Ładuje również pamięć podręczną na początku normalnego przebiegu konfiguracji.

Standardowa worflow za korzystanie CUpewnij jest następujący:

  1. Run CMake w pustym katalogu binarnego w celu wygenerowania wstępnej wersji projektu & cache
  2. W CMake GUI lub ccmake lub podobny, zbadaj zmienne pamięci podręcznej skonfigurowane przez początkowe uruchomienie i zmodyfikuj je zgodnie z oczekiwaniami.
  3. Ponownie uruchom CMake (lub po prostu skonfiguruj krok, jeśli twój interfejs to oferuje).
  4. Powtórz kroki 2 & 3 dopóki nie jesteś zadowolony z konfiguracją
  5. Gdybyś tylko działa Konfiguruj w 3, uruchomić Generowanie

Masz teraz buildsystem skonfigurowany w zależności od smaku.

Aby powyższe działało, zmiany użytkownika w pamięci podręcznej muszą mieć pierwszeństwo przed domyślnymi wartościami pamięci podręcznej określonymi w pliku CMakeLists.txt. W przeciwnym razie użytkownik zmieniający się z punktu 2 zostanie utracony podczas następnej konfiguracji, nadpisanej ponownie przez domyślne ustawienia projektu.

Z tego powodu polecenia CMake set(var ... CACHE) nie modyfikują zmiennej pamięci podręcznej var, jeśli już istnieje. Zwykle projekt powinien traktować konfigurowanie pamięci podręcznej jako zapewniającej domyślne ustawienia domyślne.

Jeśli naprawdę potrzebujesz, aby zastąpić wyboru użytkownika w projekcie, można:

  • dodać FORCE dowodzić set lub
  • użycie set bez CACHE ustawić zmienne non-cache. Zmienne pamięci podręcznej mają pierwszeństwo przed zmiennymi pamięci podręcznej o tej samej nazwie.
+0

I na koniec, polecenie [load_cache] (https://cmake.org/cmake/help/v3.4/command/load_cache.html?highlight=load_cache) ładuje wartości z bufora CMake innego projektu. –

1

Motywowanie przykład

Jest to w zasadzie co https://stackoverflow.com/a/42160304/895245 wspomina, ale z bardziej wyraźną przykład aby łatwiej zrozumieć.

Rozważmy następujący przypadek użycia:

git clone project 
cd project 
# Options dfined with "option(" in CMakeLists.txt. 
cmake -DOPT1=ON -DOPT2=OFF -DOPT3=ON . 
make 
# Create bugs (edit code). 
make 

Potem, kilka dni później, nowy katalog jest dodawany do projektu.

Oznacza to, że CMakeLists.txt został zmieniony na nowy add_subdirectory, więc musimy ponownie uruchomić cmake, aby zaktualizować nasze pliki make.

Jeśli nie mamy CMakeCache.txt, mielibyśmy do zapamiętania i wpisz wszystkie opcje ponownie:

git pull 
cmake -DOPT1=ON -DOPT2=OFF -DOPT3=ON . 
make 

Ale ze względu na cache, możemy zrobić tylko:

cmake . 
make