Différence entre CMAKE_CURRENT_SOURCE_DIR et CMAKE_CURRENT_LIST_DIR

105

Depuis le Wiki:

CMAKE_CURRENT_SOURCE_DIR c'est le répertoire où se trouve le CMakeLists.txt actuellement traité

CMAKE_CURRENT_LIST_DIR (depuis 2.8.3) c'est le répertoire du fichier liste en cours de traitement.

À partir des documents:

CMAKE_CURRENT_SOURCE_DIR: chemin vers le répertoire source en cours de traitement. Il s'agit du chemin d'accès complet au répertoire source en cours de traitement par cmake.

CMAKE_CURRENT_LIST_DIR: Répertoire complet du fichier liste en cours de traitement. Au fur et à mesure que CMake traite les fichiers de liste dans votre projet, cette variable sera toujours définie sur le répertoire où se trouve le fichier de liste en cours de traitement (CMAKE_CURRENT_LIST_FILE). La valeur a une portée dynamique. Lorsque CMake commence le traitement des commandes dans un fichier source, il définit cette variable sur le répertoire où se trouve ce fichier. Lorsque CMake a fini de traiter les commandes du fichier, il restaure la valeur précédente. Par conséquent, la valeur de la variable à l'intérieur d'une macro ou d'une fonction est le répertoire du fichier invoquant l'entrée la plus basse de la pile d'appels, et non le répertoire du fichier contenant la définition de macro ou de fonction.

Dans quelles circonstances ces variables auraient-elles des valeurs différentes?

William Payne
la source
10
Et aussi en quoi diffèrent-ils du simple et du gentil ./?
kyb

Réponses:

139

Les variables CMAKE_CURRENT_SOURCE_DIRet CMAKE_CURRENT_LIST_DIRpeuvent faire référence à différents répertoires pour un fichier de liste CMake qui est inclus par un autre fichier avec la commande include . Par exemple, si a CMakeLists.txtest présent dans un répertoire projectet contient la directive suivante

include(src/CMakeLists.txt)

alors pendant que src/CMakeLists.txtest en cours de traitement CMAKE_CURRENT_LIST_DIRse référera à project/srctandis que CMAKE_CURRENT_SOURCE_DIRpointe encore vers le répertoire externe project.

CMAKE_CURRENT_LIST_DIRest pratique lorsque vous devez localiser des fichiers de ressources tels que des fichiers modèles ou des scripts de commandes situés à côté du CMakeLists.txtfichier en cours de traitement.


Remarque: lorsque vous utilisez la add_subdirectory()commande plutôt que include(), le comportement est différent et lors du src/CMakeLists.txttraitement, les deux variables pointeront vers project/src.

Sakra
la source
42
+1. Je voudrais simplement ajouter que cela CMAKE_CURRENT_LIST_DIRchange avec chaque fichier que vous include(); il n'a pas besoin d'être appelé CMakeLists.txt.
Angew n'est plus fier de SO
2
Bonne discussion ici sur la façon d'utiliser efficacement CMAKE_CURRENT_LIST_DIRet include(...)dans vos projets.
jmcarter9t
1
Facilement confondu car il CMAKE_CURRENT_SOURCE_DIRressemble plus à ce CMAKE_SOURCE_DIRque la documentation l'implique.
Malachi
Et avec add_subdirectory()? Les deux variables pointeront-elles vers le dossier?
einpoklum
@einpoklum, Oui, ils pointent tous les deux vers le dossier,
rjhcnf il y a