Differenza tra CMAKE_CURRENT_SOURCE_DIR e CMAKE_CURRENT_LIST_DIR


105

Dal Wiki:

CMAKE_CURRENT_SOURCE_DIR questa è la directory in cui si trova il CMakeLists.txt attualmente elaborato

CMAKE_CURRENT_LIST_DIR (da 2.8.3) questa è la directory del listfile attualmente in elaborazione.

Dai documenti:

CMAKE_CURRENT_SOURCE_DIR: il percorso della directory di origine attualmente in fase di elaborazione. Questo è il percorso completo della directory di origine attualmente elaborata da cmake.

CMAKE_CURRENT_LIST_DIR: directory completa del file di elenco attualmente in fase di elaborazione. Poiché CMake elabora i file di elenco nel progetto, questa variabile sarà sempre impostata sulla directory in cui si trova il file di elenco attualmente in fase di elaborazione (CMAKE_CURRENT_LIST_FILE). Il valore ha un ambito dinamico. Quando CMake inizia a elaborare i comandi in un file di origine, imposta questa variabile sulla directory in cui si trova questo file. Quando CMake termina l'elaborazione dei comandi dal file, ripristina il valore precedente. Pertanto il valore della variabile all'interno di una macro o di una funzione è la directory del file che richiama la voce più in basso nello stack di chiamate, non la directory del file contenente la macro o la definizione della funzione.

In quali circostanze queste variabili avrebbero valori diversi?


10
E anche come si differenziano da semplici e simpatici ./?
kyb

Risposte:


139

Le variabili CMAKE_CURRENT_SOURCE_DIRe CMAKE_CURRENT_LIST_DIRpossono fare riferimento a directory diverse per un file di elenco CMake incluso da un altro file con il comando include . Ad esempio, se a CMakeLists.txtè presente in una directory projecte contiene la seguente direttiva

include(src/CMakeLists.txt)

quindi mentre src/CMakeLists.txtè in elaborazione CMAKE_CURRENT_LIST_DIRfarà riferimento a project/srcmentre CMAKE_CURRENT_SOURCE_DIRpunta ancora alla directory esterna project.

CMAKE_CURRENT_LIST_DIRè utile quando è necessario individuare file di risorse come file modello o script batch che si trovano accanto al CMakeLists.txtfile attualmente in elaborazione.


Nota: quando si utilizza il add_subdirectory()comando anziché include(), il comportamento è diverso e quando src/CMakeLists.txtviene elaborato, entrambe le variabili punteranno a project/src.


42
+1. Vorrei solo aggiungere che CMAKE_CURRENT_LIST_DIRcambia con ogni file tu include(); non deve essere chiamato CMakeLists.txt.
Angew non è più orgoglioso di SO

2
Buona discussione qui su come utilizzare in modo efficace CMAKE_CURRENT_LIST_DIRe include(...)nei tuoi progetti.
jmcarter9t

1
Facilmente confuso perché CMAKE_CURRENT_SOURCE_DIRè più simile a CMAKE_SOURCE_DIRquanto implicano i documenti.
Malachia

E con add_subdirectory()? Entrambe le variabili punteranno alla cartella?
einpoklum

@einpoklum, Sì, entrambi puntano alla cartella,
rjhcnf
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.