Répertoire de sortie / build CMake

Je suis assez nouveau sur cmake, et j’ai lu quelques tutoriels sur son utilisation, et j’ai écrit des scripts CMake compliqués de 50 lignes pour créer un programme pour 3 compilateurs différents. Ceci conclut probablement toutes mes connaissances sur cmake.

Maintenant, mon problème est que j’ai un code source, dont je ne veux pas toucher le dossier lorsque je crée le programme. Je veux que tous les cmake et les fichiers de sortie et les dossiers pour aller dans ../Comstack/, donc j’ai changé quelques variables dans mon script cmake pour cela, et cela a fonctionné pendant quelque temps quand j’ai fait quelque chose comme ça sur mon ordinateur portable:

Comstack$ cmake ../src Comstack$ make 

Là où j’ai eu une sortie propre dans le dossier dans lequel je suis en ce moment, c’est exactement ce que je recherche.

Maintenant, je suis passé à un autre ordinateur, et recompilé CMake 2.8.11.2, et je suis presque de retour à la case départ! Il comstack toujours la chose dans le dossier src où se trouve mon CMakeLists.txt.

La partie où je choisis le répertoire dans mon script cmake est la suivante:

 set(dir ${CMAKE_CURRENT_SOURCE_DIR}/../Comstack/) set(EXECUTABLE_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE) set(LIBRARY_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${dir}) set(CMAKE_BUILD_FILES_DIRECTORY ${dir}) set(CMAKE_BUILD_DIRECTORY ${dir}) set(CMAKE_BINARY_DIR ${dir}) SET(EXECUTABLE_OUTPUT_PATH ${dir}) SET(LIBRARY_OUTPUT_PATH ${dir}lib) SET(CMAKE_CACHEFILE_DIR ${dir}) 

Et maintenant ça finit toujours avec:

 -- Build files have been written to: /.../src 

Est-ce que je manque quelque chose?

Il est inutile de définir toutes les variables que vous définissez. CMake les place à des valeurs par défaut raisonnables. Vous ne devez absolument pas modifier CMAKE_BINARY_DIR ou CMAKE_CACHEFILE_DIR . Traitez-les comme étant en lecture seule.

Supprimez tout d’abord le fichier cache problématique existant dans le répertoire src:

 cd src rm CMakeCache.txt cd .. 

Supprimez ensuite toutes les commandes set() et faites:

 cd Comstack rm -rf * cmake ../src 

Tant que vous êtes en dehors du répertoire source lors de l’exécution de CMake, le répertoire source ne sera pas modifié, sauf indication contraire de votre CMakeList.

Une fois que vous avez fait cela, vous pouvez regarder où CMake place les choses par défaut, et seulement si vous n’êtes pas satisfait des emplacements par défaut (comme la valeur par défaut de EXECUTABLE_OUTPUT_PATH ), modifiez uniquement ceux dont vous avez besoin. Et essayez de les exprimer par rapport à CMAKE_BINARY_DIR , CMAKE_CURRENT_BINARY_DIR , PROJECT_BINARY_DIR etc.

Si vous regardez la documentation CMake, vous verrez des variables partitionnées en sections sémantiques. Sauf dans des circonstances très particulières, vous devez traiter tous ceux répertoriés sous “Variables qui fournissent des informations” en lecture seule dans CMakeLists.

On dirait que vous voulez une construction hors source . Vous pouvez créer un build hors source de plusieurs manières.

  1. Fais ce que tu faisais, cours

     cd /path/to/my/build/folder cmake /path/to/my/source/folder 

    Cela fera que cmake générera une arborescence de construction dans /path/to/my/build/folder pour l’ arborescence source dans /path/to/my/source/folder .

    Une fois que vous l’avez créé, cmake se souvient de l’emplacement du dossier source – vous pouvez donc réexécuter cmake sur l’arborescence de construction avec

     cmake /path/to/my/build/folder 

    ou même

     cmake . 

    si votre répertoire actuel est déjà le dossier de construction.

  2. Utilisez des options non documentées pour définir les dossiers source et build :

     cmake -B/path/to/my/build/folder -H/path/to/my/source/folder 

    qui fera exactement la même chose que (1), mais sans compter sur le répertoire de travail en cours.

CMake place toutes ses sorties dans l’ arborescence de génération par défaut, donc à moins que vous n’utilisiez généreusement ${CMAKE_SOURCE_DIR} ou ${CMAKE_CURRENT_SOURCE_DIR} dans vos fichiers cmake, il ne devrait pas toucher votre arbre source .

La chose la plus importante qui peut se tromper est si vous avez déjà généré une arborescence de construction dans votre arbre source (c’est-à-dire que vous avez une version in source ). Une fois que vous avez fait cela, la deuxième partie de (1) ci-dessus intervient et cmake n’apporte aucune modification aux emplacements source ou de construction. Par conséquent, vous ne pouvez pas créer une version source pour un répertoire source avec une génération source . Vous pouvez résoudre ce problème assez facilement en supprimant (au minimum) CMakeCache.txt du répertoire source. Il y a quelques autres fichiers (principalement dans le répertoire CMakeFiles ) générés par CMake que vous devez supprimer également, mais ils ne feront pas en sorte que cmake traite l’arborescence source comme une arborescence de construction.

Étant donné que les versions hors source sont souvent plus souhaitables que les versions source, vous pouvez modifier votre version de cmake pour exiger des versions source:

 # Ensures that we do an out of source build MACRO(MACRO_ENSURE_OUT_OF_SOURCE_BUILD MSG) STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" insource) GET_FILENAME_COMPONENT(PARENTDIR ${CMAKE_SOURCE_DIR} PATH) STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${PARENTDIR}" insourcesubdir) IF(insource OR insourcesubdir) MESSAGE(FATAL_ERROR "${MSG}") ENDIF(insource OR insourcesubdir) ENDMACRO(MACRO_ENSURE_OUT_OF_SOURCE_BUILD) MACRO_ENSURE_OUT_OF_SOURCE_BUILD( "${CMAKE_PROJECT_NAME} requires an out of source build." ) 

La macro ci-dessus provient d’un module communément appelé MacroOutOfSourceBuild . Il existe de nombreuses sources pour MacroOutOfSourceBuild.cmake sur Google mais je n’arrive pas à trouver l’original et il est assez court pour l’inclure ici.

Malheureusement, cmake a généralement écrit quelques fichiers au moment où la macro est invoquée, donc, bien que cela vous empêche de réaliser la construction, vous devrez toujours supprimer CMakeCache.txt et CMakeFiles .

Vous trouverez peut-être utile de définir les chemins sur lesquels les fichiers binarys, les bibliothèques partagées et les bibliothèques statiques sont écrites, auquel cas voyez-vous comment créer une sortie cmake dans un répertoire ‘bin’? (avertissement, j’ai la meilleure réponse votée sur cette question … mais c’est comme ça que je le sais).

En tant que CMake Wiki :

CMAKE_BINARY_DIR si vous construisez en source, c’est la même chose que CMAKE_SOURCE_DIR, sinon c’est le répertoire de premier niveau de votre arborescence de build

Comparez ces deux variables pour déterminer si la génération hors source a été démarrée

Tout d’abord, vous ne devez pas relayer le nom de répertoire de construction dans votre script. La ligne avec ../Comstack doit être modifiée.

C’est parce que c’est à l’utilisateur de comstackr.

Au lieu de cela, utilisez l’une des variables prédéfinies: http://www.cmake.org/Wiki/CMake_Useful_Variables (recherchez CMAKE_BINARY_DIR et CMAKE_CURRENT_BINARY_DIR)

Transformer mon commentaire en réponse:

Dans le cas où quelqu’un a fait ce que j’ai fait, ce qui a commencé par mettre tous les fichiers de compilation dans le répertoire source:

 cd src cmake . 

cmake mettra un paquet de fichiers de compilation et de fichiers de cache ( CMakeCache.txt , CMakeFiles , cmake_install.cmake , etc.) dans le cmake_install.cmake src .

Pour passer à une version hors source, j’ai dû supprimer tous ces fichiers. Ensuite, je pourrais faire ce que @Agnew recommandait dans sa réponse:

 mkdir -p src/build cd src/build cmake ..