== Description == [http://www.cmake.org/ CMake] (pour cross-platform make) est un outil de compilation libre multiplateforme et multilangage. Alors que [[Autotools/fr|Autotools]] est l'outil traditionnel sous Linux (utilisé entre autres pour tous les projets GNU), plusieurs projets sont passés à CMake au cours des dernières années, et ce pour différentes raisons, entre autres KDE et MySQL. Ceux qui ont éprouvé certaines difficultés à construire leur propre projet avec Autotools trouveront probablement CMake beaucoup plus facile d'utilisation. Selon KDE, les principales raisons pour lesquelles ils sont passés de Autotools à CMake sont que la compilation est beaucoup plus rapide et que les fichiers de construction sont beaucoup plus faciles à écrire. == Principe de base == CMake fonctionne de la même manière que Autotools et requiert l'exécution d'un script configure, suivi d'un build avec make. Cependant, plutôt qu'appeler ./configure, on appelle cmake directory. Par exemple, si on est dans le répertoire où l'on veut construire l'application, on exécute {{Command|cmake .}} Ainsi, pour configurer, construire et installer une application ou une bibliothèque, la façon la plus simple est avec {{Command|cmake . && make && make install}} == Options utiles pour travailler avec les grappes == Nos grappes sont configurées de telle sorte qu'à la compilation d'un nouveau paquet logiciel, l'information est automatiquement ajoutée au binaire résultant afin qu'il puisse trouver les bibliothèques desquelles il dépend; le mécanisme utilisé est RUNPATH (ou RPATH). Certains paquets qui utilisent CMake font de même avec une fonctionnalité offerte par CMake. Des conflits sont parfois créés quand les deux sont utilisés en même temps; pour éviter ceci, ajouter l'option * -DCMAKE_SKIP_INSTALL_RPATH=ON en ligne de commande. Aussi, les bibliothèques de nos grappes sont installées dans des endroits non standards et il est difficile pour CMake de les trouver; il peut être utile d'ajouter sur la ligne de commande l'option * -DCMAKE_SYSTEM_PREFIX_PATH=$EBROOTGENTOO Parfois, même cela n'est pas suffisant et vous pourriez devoir ajouter des options plus spécifiques aux bibliothèques utilisées par votre paquet logiciel, par exemple : * -DCURL_LIBRARY=$EBROOTGENTOO/lib/libcurl.so -DCURL_INCLUDE_DIR=$EBROOTGENTOO/include * -DPYTHON_EXECUTABLE=$EBROOTPYTHON/bin/python * -DPNG_PNG_INCLUDE_DIR=$EBROOTGENTOO/include -DPNG_LIBRARY=$EBROOTGENTOO/lib/libpng.so * -DJPEG_INCLUDE_DIR=$EBROOTGENTOO/include -DJPEG_LIBRARY=$EBROOTGENTOO/lib/libjpeg.so * -DOPENGL_INCLUDE_DIR=$EBROOTGENTOO/include -DOPENGL_gl_LIBRARY=$EBROOTGENTOO/lib/libGL.so -DOPENGL_glu_LIBRARY=$EBROOTGENTOO/lib/libGLU.so * -DZLIB_ROOT=$EBROOTGENTOO == Personnalisation de la configuration == Tout comme avec Autotools, il est possible de personnaliser la configuration de l'application ou de la bibliothèque. Cela peut se faire par différentes options de la ligne de commande, mais aussi via une interface texte avec la commande ccmake. === Commande ccmake === La commande ccmake est appelée de la même façon que la commande cmake, en indiquant le répertoire à construire. S'il s'agit du répertoire courant, la commande est {{Command|ccmake .}} Il faut appeler ccmake après avoir appelé cmake : en général, la commande est {{Command|cmake . && ccmake .}} ccmake affiche d'abord la liste des options définies par le projet. Le résultat est une liste relativement courte semblable à ceci : {{Command |cmake . && ccmake . |result= Page 1 of 1 ARPACK_LIBRARIES ARPACK_LIBRARIES-NOTFOUND CMAKE_BUILD_TYPE CMAKE_INSTALL_PREFIX /usr/local CMAKE_OSX_ARCHITECTURES CMAKE_OSX_DEPLOYMENT_TARGET CMAKE_OSX_SYSROOT /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk GSL_CONFIG /opt/local/bin/gsl-config GSL_CONFIG_PREFER_PATH /bin;;/bin; GSL_EXE_LINKER_FLAGS -Wl,-rpath,/opt/local/lib NON_TEMPLATES_DISABLED ON NO_SQUACK_WARNINGS ON PRECOMPILED_TEMPLATES ON USE_GSL_OMP OFF USE_OMP OFF Press [enter] to edit option CMake Version 2.8.8 Press [c] to configure Press [h] for help Press [q] to quit without generating Press [t] to toggle advanced mode (Currently Off) }} Comme indiqué au bas de cette liste, vous pouvez éditer une valeur en appuyant sur la touche Enter. Si vous modifiez une valeur, appuyez sur la touche c pour tester la configuration avec cette nouvelle valeur. Si la configuration réussit, vous aurez alors l'option g, pour générer le Makefile avec la nouvelle configuration, ou vous pouvez quitter avec la touche q. Le mode avancé est activé avec la touche t, ce qui produit une liste beaucoup plus longue de variables qui permettra de configurer l'application avec précision. Voici un exemple de liste d'options : {{ File |name=ccmake_output.txt |contents= ARPACK_LIBRARIES ARPACK_LIBRARIES-NOTFOUND BLAS_Accelerate_LIBRARY /System/Library/Frameworks/Accelerate.framework BLAS_acml_LIBRARY BLAS_acml_LIBRARY-NOTFOUND BLAS_acml_mp_LIBRARY BLAS_acml_mp_LIBRARY-NOTFOUND BLAS_complib.sgimath_LIBRARY BLAS_complib.sgimath_LIBRARY-NOTFOUND BLAS_cxml_LIBRARY BLAS_cxml_LIBRARY-NOTFOUND BLAS_dxml_LIBRARY BLAS_dxml_LIBRARY-NOTFOUND BLAS_essl_LIBRARY BLAS_essl_LIBRARY-NOTFOUND BLAS_f77blas_LIBRARY BLAS_f77blas_LIBRARY-NOTFOUND BLAS_goto2_LIBRARY BLAS_goto2_LIBRARY-NOTFOUND BLAS_scsl_LIBRARY BLAS_scsl_LIBRARY-NOTFOUND BLAS_sgemm_LIBRARY BLAS_sgemm_LIBRARY-NOTFOUND BLAS_sunperf_LIBRARY BLAS_sunperf_LIBRARY-NOTFOUND CMAKE_AR /opt/local/bin/ar CMAKE_BUILD_TYPE CMAKE_COLOR_MAKEFILE ON CMAKE_CXX_COMPILER /opt/local/bin/c++ CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG -g CMAKE_CXX_FLAGS_MINSIZEREL -Os -DNDEBUG CMAKE_CXX_FLAGS_RELEASE -O3 -DNDEBUG CMAKE_CXX_FLAGS_RELWITHDEBINFO -O2 -g CMAKE_C_COMPILER /opt/local/bin/gcc CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG -g CMAKE_C_FLAGS_MINSIZEREL -Os -DNDEBUG CMAKE_C_FLAGS_RELEASE -O3 -DNDEBUG CMAKE_C_FLAGS_RELWITHDEBINFO -O2 -g CMAKE_EXE_LINKER_FLAGS CMAKE_EXE_LINKER_FLAGS_DEBUG CMAKE_EXE_LINKER_FLAGS_MINSIZE CMAKE_EXE_LINKER_FLAGS_RELEASE CMAKE_EXE_LINKER_FLAGS_RELWITH CMAKE_EXPORT_COMPILE_COMMANDS OFF CMAKE_INSTALL_NAME_TOOL /opt/local/bin/install_name_tool CMAKE_INSTALL_PREFIX /usr/local CMAKE_LINKER /opt/local/bin/ld CMAKE_MAKE_PROGRAM /Applications/Xcode.app/Contents/Developer/usr/bin/make CMAKE_MODULE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS_DEBU CMAKE_MODULE_LINKER_FLAGS_MINS CMAKE_MODULE_LINKER_FLAGS_RELE CMAKE_MODULE_LINKER_FLAGS_RELW CMAKE_NM /opt/local/bin/nm CMAKE_OBJCOPY CMAKE_OBJCOPY-NOTFOUND CMAKE_OBJDUMP CMAKE_OBJDUMP-NOTFOUND CMAKE_OSX_ARCHITECTURES CMAKE_OSX_DEPLOYMENT_TARGET CMAKE_OSX_SYSROOT /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk CMAKE_RANLIB /opt/local/bin/ranlib CMAKE_SHARED_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS_DEBU CMAKE_SHARED_LINKER_FLAGS_MINS CMAKE_SHARED_LINKER_FLAGS_RELE CMAKE_SHARED_LINKER_FLAGS_RELW CMAKE_SKIP_INSTALL_RPATH OFF CMAKE_SKIP_RPATH OFF CMAKE_STRIP /opt/local/bin/strip CMAKE_USE_RELATIVE_PATHS OFF CMAKE_VERBOSE_MAKEFILE OFF CMAKE_XCODE_SELECT /usr/bin/xcode-select DOXYGEN_DOT_EXECUTABLE /usr/local/bin/dot DOXYGEN_DOT_PATH /usr/local/bin DOXYGEN_EXECUTABLE /Applications/Doxygen.app/Contents/Resources/doxygen GSL_CONFIG /opt/local/bin/gsl-config GSL_CONFIG_PREFER_PATH /bin;;/bin; GSL_EXE_LINKER_FLAGS -Wl,-rpath,/opt/local/lib GSL_INCLUDE_DIR /opt/local/include GTEST_INCLUDE_DIR /opt/local/include GTEST_LIBRARY /opt/local/lib/libgtest.dylib GTEST_LIBRARY_DEBUG GTEST_LIBRARY_DEBUG-NOTFOUND GTEST_MAIN_LIBRARY /opt/local/lib/libgtest_main.dylib GTEST_MAIN_LIBRARY_DEBUG GTEST_MAIN_LIBRARY_DEBUG-NOTFOUND LAPACK_Accelerate_LIBRARY /System/Library/Frameworks/Accelerate.framework LAPACK_goto2_LIBRARY LAPACK_goto2_LIBRARY-NOTFOUND NON_TEMPLATES_DISABLED ON NO_SQUACK_WARNINGS ON PRECOMPILED_TEMPLATES ON USE_GSL_OMP OFF USE_OMP OFF }} Remarquez que ccmake en mode avancé affiche aussi bien les bibliothèques trouvées que celles qui n'ont pas été trouvées. Si vous voulez utiliser une certaine version de [[BLAS and LAPACK/fr|BLAS]] par exemple, vous saurez immédiatement si c'est celle que CMake a trouvée et, le cas échéant, pourrez la modifier. ccmake affiche aussi la liste des options passées aux compilateurs et à l’éditeur de liens, et ce, en fonction du type de construction. ===Options en ligne de commande=== Les options affichées par ccmake peuvent toutes être modifiées en ligne de commande, avec la syntaxe {{Command|cmake . -DVARIABLE{{=}}VALEUR}} Par exemple, pour spécifier l'emplacement d'installation : {{Command|cmake . -DCMAKE_INSTALL_PREFIX{{=}}/home/user/mon_repertoire}} Pour configurer la compilation, vous voudrez possiblement changer les valeurs suivantes : {| class="wikitable" style="font-size: 95%; text-align: center;" !Option !Description |- !CMAKE_C_COMPILER |change le compilateur C |- !CMAKE_CXX_COMPILER |change le compilateur C++ |- !CMAKE_LINKER |change l'éditeur de liens |- !CMAKE_C_FLAGS |change les options passées au compilateur C |- !CMAKE_CXX_FLAGS |change les options passées au compilateur C++ |- !CMAKE_SHARED_LINKER_FLAGS |change les options passées à l'éditeur de liens |- |} La liste complète des options est disponible sur la [http://www.cmake.org/Wiki/CMake_Useful_Variables page officielle de CMake]. Si vous ne voulez pas vous aventurer dans ces options spécifiques, CMake propose une option plus simple avec CMAKE_BUILD_TYPE, qui définit le type de compilation à utiliser. Les valeurs possibles sont {| class="wikitable" style="font-size: 95%; text-align: center;" !Option !Description |- ! - | aucune valeur |- ! Debug | active les options de débogage, désactive les options d'optimisation |- ! Release | désactive les options de débogage, active les optimisations typiques |- ! MinSizeRel | désactive les options de débogage, active les options d'optimisation en minimisant la taille du binaire |- ! RelWithDebInfo | active les options de débogage et les optimisations typiques |- |} Ces différents types de compilation définissent des options de compilateurs qui varient selon le compilateur utilisé; vous n'avez donc pas à vérifier quelles options doivent être utilisées. == Références == * [http://florian-goujeon.developpez.com/cours/cmake/initiation/ Guide d'initiation en français] qui couvre aussi bien la création de fichiers CMake que la compilation d'un projet déjà fait. * [http://www.cmake.org/cmake/help/examples.html Exemple simple (en anglais)] sur le site officiel. * [http://www.cmake.org/cmake/help/cmake_tutorial.html Tutoriel (en anglais)] plutôt complet sur le site officiel. * [http://rachid.koucha.free.fr/tech_corner/cmake_manual_fr.html Tutoriel assez complet en français].