web-dev-qa-db-fra.com

CMAKE_SOURCE_DIR et PROJECT_SOURCE_DIR sont-ils les mêmes dans CMake?

Cette page contient un bon résumé des variables que CMake définit déjà pour nous. Je pense que certaines variables sont les mêmes. Prenons l'exemple de CMAKE_SOURCE_DIR et PROJECT_SOURCE_DIR par exemple. Ils sont identiques, se référant au dossier où le CMakeLists.txt de niveau supérieur est défini. Donc ma question est: y a-t-il une différence subtile entre eux? Merci.

41
feelfree

Il y a une différence entre ces variables. CMAKE_SOURCE_DIR fait en effet référence au dossier où le CMakeLists.txt de niveau supérieur est défini. Cependant, PROJECT_SOURCE_DIR fait référence au dossier du CMakeLists.txt contenant la commande project() la plus récente.

Par exemple, supposons que vous ayez un projet de niveau supérieur appelé Outer et qu'il contienne un sous-répertoire avec son propre projet appelé Inner. CMakeLists.txt de Outer a:

project(Outer)
add_subdirectory(Inner)

et Inner:

project(Inner)

Ensuite, dans ces deux fichiers CMakeLists, CMAKE_SOURCE_DIR Fera référence au répertoire source de Outer. Mais si PROJECT_SOURCE_DIR Pour Outer est aussi le même répertoire, ce n'est pas le cas pour Inner. InnerPROJECT_SOURCE_DIR est le sous-répertoire contenant son CMakeLists.txt.

Cette différence s'applique à toutes les variables PROJECT_<var> Et CMAKE_<var>.

71
Fraser

Après l'excellente réponse de Fraser.

CMAKE_CURRENT_SOURCE_DIR est the build directory being processed.

Supposons que vous ayez un répertoire appelé Inner1 Contenant un fichier CMakeLists.txt sans appeler project à l'intérieur. Ensuite, PROJECT_SOURCE_DIR N'est pas défini avec le chemin de répertoire de Inner1, Mais CMAKE_CURRENT_SOURCE_DIR Est défini lors du traitement.

Vous pouvez également trouver CMAKE_CURRENT_LIST_DIR intéressant et la définition de listfile utile.

3
Izana