169 votes

Différence entre CMAKE_CURRENT_SOURCE_DIR et CMAKE_CURRENT_LIST_DIR

Du Wiki :

CMAKE_CURRENT_SOURCE_DIR il s'agit du répertoire dans lequel se trouve le fichier CMakeLists.txt actuellement traité

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

De la part des docteurs :

CMAKE_CURRENT_SOURCE_DIR : Le chemin d'accès au répertoire source en cours de traitement. C'est le chemin complet vers le répertoire source qui est actuellement traité par cmake.

CMAKE_CURRENT_LIST_DIR : Répertoire complet du fichier de liste en cours de traitement. Au fur et à mesure que CMake traite les fichiers de liste de votre projet, cette variable sera toujours définie comme 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 à traiter les commandes dans un fichier source, il définit cette variable dans le répertoire où se trouve ce fichier. Lorsque CMake termine le traitement des 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 la macro ou de la fonction.

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

212voto

sakra Points 13373

Les variables CMAKE_CURRENT_SOURCE_DIR y CMAKE_CURRENT_LIST_DIR peuvent se référer à des répertoires différents pour un fichier de liste CMake qui est inclus par un autre fichier avec l'attribut inclure commande. Par exemple, si une CMakeLists.txt est présent dans un répertoire project et contient la directive suivante

include(src/CMakeLists.txt)

alors que src/CMakeLists.txt est en cours de traitement CMAKE_CURRENT_LIST_DIR se référera à project/src alors que CMAKE_CURRENT_SOURCE_DIR pointe toujours vers le répertoire externe project .

CMAKE_CURRENT_LIST_DIR s'avère pratique lorsque vous devez localiser des fichiers de ressources comme des fichiers de modèles ou des scripts qui sont situés à côté de l'icône de l'utilisateur. CMakeLists.txt fichier en cours de traitement.


Remarque : Lorsque vous utilisez le <code>add_subdirectory()</code> plutôt que la commande <code>include()</code> le comportement est différent, et lorsque <code>src/CMakeLists.txt</code> est en cours de traitement, les deux variables pointeront vers <code>project/src</code> .

36voto

Aykut Bozkurt Points 181

Définitions

CMAKE_SOURCE_DIR : Dossier le plus haut (répertoire source) qui contient un fichier CMakeList.txt. La valeur ne change jamais dans les différents scopes.

PROJECT_SOURCE_DIR : Le dossier le plus proche qui contient le fichier CMakeList.txt, avec sa propre portée, qui contient la commande project().

CMAKE_CURRENT_SOURCE_DIR : Le dossier le plus proche qui contient le fichier CMakeList.txt avec sa propre portée. (Le fichier ne doit pas nécessairement contenir la commande project()).

CMAKE_CURRENT_LIST_DIR : Le dossier qui contient le fichier CMakeList.txt ou .cmake actuellement traité.

Ce que j'entends par sa propre portée est lié aux règles de cadrage. Alors que la commande include(file) ne crée pas une nouvelle portée, add_subdirectory crée une nouvelle portée qui affecte les valeurs PROJECT_SOURCE_DIR et CMAKE_CURRENT_SOURCE_DIR.

Exemple

La structure du projet doit être la suivante :

A/
=> CMakeList.txt
=> B/
   => CMakeList.txt

et supposons que nous imprimons toutes les variables cmake en mettant la commande message dans le fichier CMakeList.txt du sous-dossier B.

  • Si CMakeList.txt dans le dossier A contient une ligne include("B/CMakeList.txt"), alors

CMAKE_SOURCE_DIR sera le répertoire source qui est "le chemin vers le projet/A".

PROJECT_SOURCE_DIR sera "path to project/A", car la commande include ne crée pas de nouvelle portée et le fichier CMakeList.txt le plus proche qui a sa propre portée et contient la commande project est dans le dossier A.

CMAKE_CURRENT_SOURCE_DIR sera "path to project/A", car la commande include ne crée pas de nouvelle portée et le fichier CMakeList.txt le plus proche qui a sa propre portée est dans le dossier A.

CMAKE_CURRENT_LIST_DIR sera "chemin vers le projet/A/B", car le fichier actuellement traité se trouve dans le sous-dossier B.

  • Si CMakeList.txt contient une ligne add_subdirectory("./B"), alors

CMAKE_SOURCE_DIR sera le répertoire source qui est "le chemin vers le projet/A".

PROJECT_SOURCE_DIR sera "path to project/A/B", parce que la commande add_subdirectory crée une nouvelle portée et le fichier CMakeList.txt le plus proche qui a sa propre portée et contient la commande project est dans le sous-dossier B.

CMAKE_CURRENT_SOURCE_DIR sera "path to project/A/B", parce que la commande add_subdirectory crée une nouvelle portée et le fichier CMakeList.txt le plus proche qui a sa propre portée est dans le sous-dossier B.

CMAKE_CURRENT_LIST_DIR sera "chemin vers le projet/A/B", car le fichier actuellement traité se trouve dans le sous-dossier B.

Référence : https://gitlab.kitware.com/cmake/community/-/wikis/doc/cmake/Useful-Variables

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X