Unterschied zwischen CMAKE_CURRENT_SOURCE_DIR und CMAKE_CURRENT_LIST_DIR

103

Aus dem Wiki:

CMAKE_CURRENT_SOURCE_DIR Dies ist das Verzeichnis, in dem sich die aktuell verarbeitete CMakeLists.txt befindet

CMAKE_CURRENT_LIST_DIR (seit 2.8.3) Dies ist das Verzeichnis der aktuell verarbeiteten Listendatei.

Aus den Dokumenten:

CMAKE_CURRENT_SOURCE_DIR: Der Pfad zum Quellverzeichnis, das gerade verarbeitet wird. Dies ist der vollständige Pfad zum Quellverzeichnis, das derzeit von cmake verarbeitet wird.

CMAKE_CURRENT_LIST_DIR: Vollständiges Verzeichnis der aktuell verarbeiteten Listendatei. Während CMake die Listendateien in Ihrem Projekt verarbeitet, wird diese Variable immer auf das Verzeichnis gesetzt, in dem sich die aktuell verarbeitete Listendatei (CMAKE_CURRENT_LIST_FILE) befindet. Der Wert hat einen dynamischen Bereich. Wenn CMake mit der Verarbeitung von Befehlen in einer Quelldatei beginnt, wird diese Variable auf das Verzeichnis gesetzt, in dem sich diese Datei befindet. Wenn CMake die Verarbeitung von Befehlen aus der Datei beendet hat, wird der vorherige Wert wiederhergestellt. Daher ist der Wert der Variablen in einem Makro oder einer Funktion das Verzeichnis der Datei, die den untersten Eintrag im Aufrufstapel aufruft, nicht das Verzeichnis der Datei, die die Makro- oder Funktionsdefinition enthält.

Unter welchen Umständen würden diese Variablen unterschiedliche Werte haben?

William Payne
quelle
10
Und wie unterscheiden sie sich von einfach und nett ./?
Kyb

Antworten:

137

Die Variablen CMAKE_CURRENT_SOURCE_DIRund CMAKE_CURRENT_LIST_DIRkönnen auf verschiedene Verzeichnisse für eine CMake-Listendatei verweisen, die von einer anderen Datei mit dem Befehl include enthalten ist . Zum Beispiel, wenn a CMakeLists.txtin einem Verzeichnis vorhanden ist projectund die folgende Anweisung enthält

include(src/CMakeLists.txt)

dann wird während src/CMakeLists.txtder Verarbeitung CMAKE_CURRENT_LIST_DIRauf verwiesen, project/srcwährend CMAKE_CURRENT_SOURCE_DIRimmer noch auf das äußere Verzeichnis verweist project.

CMAKE_CURRENT_LIST_DIRDies ist praktisch, wenn Sie Ressourcendateien wie Vorlagendateien oder Batch-Skripte suchen müssen, die sich neben der CMakeLists.txtaktuell verarbeiteten Datei befinden.

Sakra
quelle
42
+1. Ich würde diese CMAKE_CURRENT_LIST_DIRÄnderungen einfach mit jeder Datei hinzufügen, die Sie include(); es muss nicht aufgerufen werden CMakeLists.txt.
Angew ist nicht mehr stolz auf SO
2
Gute Diskussion hier über die effektive Nutzung CMAKE_CURRENT_LIST_DIRund include(...)in Ihren Projekten.
jmcarter9t
1
Leicht zu verwechseln, da CMAKE_CURRENT_SOURCE_DIRes ähnlicher ist CMAKE_SOURCE_DIRals in den Dokumenten angegeben.
Malachi
Und mit add_subdirectory()? Zeigen beide Variablen auf den Ordner?
Einpoklum