2017-02-10 3 views
6

Wie ich cmake nach der Bearbeitung von CMakeLists.txt einige Variablen nicht geladen werden. Wenn ich etwas mit CACHE STRING definiert hätte, würde ich es nicht ändern, ohne es zu erzwingen oder den Cache zu löschen.Was ist CMakeCache.txt und warum überschreibt es meine Variablen

Also warum haben wir diese CMakeCache.txt-Datei. Wird es überhaupt benötigt?

+1

Weitere Details siehe [Was ist die CMake-Syntax zum Setzen und Verwenden von Variablen?] (https://stackoverflow.com/questions/31037882/whats-the-cmake-syntax-to-set-and-use-variables). – Florian

Antwort

8

Ja, es ist sicherlich erforderlich. CMake verwendet den Cache, wenn es während eines Builds erneut ausgeführt wird, weil eine CMakeList-Datei geändert wurde oder wenn Sie make rebuild_cache. Außerdem lädt es den Cache zu Beginn eines normalen Konfigurationslaufs.

Der Standard Worflow für die Verwendung von CMake ist wie folgt:

  1. Run CMake in einem leeren Binärverzeichnis die erste Version des Projekts & Cache
  2. In CMake GUI oder ccmake oder ähnliches zu erzeugen, prüfen die Cache-Variablen, die beim ersten Durchlauf eingerichtet wurden, und ändern Sie sie nach eigenem Ermessen.
  3. Führen Sie CMake erneut aus (oder nur den Schritt Konfigurieren, wenn Ihre Benutzeroberfläche dies bietet).
  4. Wiederholen Sie die Schritte 2 & 3, bis Sie mit der Konfiguration zufrieden sind
  5. Wenn Sie nur Configure in 3 ausgeführt wurden, führen Sie generieren

Sie haben nun eine Build nach Ihrem Geschmack konfiguriert entsprechend.

Damit das oben Genannte funktioniert, müssen Benutzeränderungen im Cache Vorrang vor den in CMakeLists.txt angegebenen Standardcachewerten haben. Andernfalls würde der Benutzer Änderungen von Punkt 2 bei der nächsten Konfiguration verloren, überschrieben durch die projektspezifischen Standardwerte.

Deshalb ändern CMake-Befehle set(var ... CACHE) die Cache-Variable var nicht, wenn sie bereits existiert. Normalerweise sollte Ihr Projekt die Einrichtung des Caches als benutzerdefinierbare Standardwerte behandeln.

Wenn Sie wirklich Benutzer Entscheidungen in Ihrem Projekt benötigen außer Kraft zu setzen, können Sie:

  • FORCE zum set Befehl hinzufügen oder
  • Verwendung set ohne CACHE Nicht-Cache-Variablen zu setzen. Nicht-Cache-Variablen haben Vorrang vor gleichnamigen Cache-Variablen.
+0

Und zu guter Letzt lädt der Befehl [load_cache] (https://cmake.org/cmake/help/v3.4/command/load_cache.html?highlight=load_cache) die Werte aus dem CMake-Cache eines anderen Projekts. –

1

Motivierende Beispiel

Dies ist im Grunde, was https://stackoverflow.com/a/42160304/895245 erwähnt, aber mit einem expliziten Beispiel leichter verständlich zu machen.

Betrachten Sie diesen Anwendungsfall:

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 

Dann, ein paar Tage später wird ein neues Verzeichnis zu dem Projekt hinzugefügt.

Das bedeutet CMakeLists.txt wurde mit einem neuen add_subdirectory geändert, und wir müssen cmake erneut ausführen, um unsere make-Dateien zu aktualisieren.

Wenn wir nicht CMakeCache.txt hätten, hätten wir erinnern und alle Optionen erneut eingeben:

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

Aber wegen des Cache, können wir nur tun:

cmake . 
make 
Verwandte Themen