Recherche…


Introduction

Les étapes de construction personnalisées sont utiles pour exécuter des cibles personnalisées dans la construction de votre projet ou pour copier facilement des fichiers afin de ne pas avoir à le faire manuellement (peut-être des DLL?). Ici, je vais vous montrer deux exemples, le premier est de copier les DLL (en particulier QLL5 DLL) dans le répertoire binaire de vos projets (Debug ou Release) et le second est de lancer une cible personnalisée (Doxygen dans ce cas) dans votre solution. (si vous utilisez Visual Studio).

Remarques

Comme vous pouvez le voir, vous pouvez faire beaucoup de choses avec les cibles et étapes de construction personnalisées dans cmake, mais vous devez être prudent lorsque vous les utilisez, en particulier lorsque vous copiez des DLL. Bien qu’il soit utile de le faire, cela peut parfois conduire à ce que l’on appelle affectueusement «Dll Hell».

Fondamentalement, cela signifie que vous pouvez vous perdre dans les DLL dont dépend réellement votre exécutable, lesquelles sont chargées et quelles sont celles qui doivent être exécutées (peut-être à cause de la variable de chemin de votre ordinateur).

Hormis ce qui précède, n'hésitez pas à faire en sorte que les cibles personnalisées fassent ce que vous voulez! Ils sont puissants et flexibles et constituent un outil précieux pour tout projet de cmake.

Qt5 dll copier exemple

Donc, disons que vous avez un projet qui dépend de Qt5 et que vous devez copier les DLL appropriées dans votre répertoire de construction et que vous ne voulez pas le faire manuellement; vous pouvez faire ce qui suit:

cmake_minimum_required(VERSION 3.0)
project(MyQtProj LANGUAGES C CXX)
find_package(Qt5 COMPONENTS Core Gui Widgets)
#...set up your project

# add the executable
add_executable(MyQtProj ${PROJ_SOURCES} ${PROJ_HEADERS})
    
add_custom_command(TARGET MyQtProj POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Core> $<TARGET_FILE_DIR:MyQtProj>
    COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Gui> $<TARGET_FILE_DIR:MyQtProj>
    COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Widgets> $<TARGET_FILE_DIR:MyQtProj>
    )

Donc, chaque fois que vous construisez votre projet, si les DLL cibles ont été modifiées et que vous souhaitez les copier, elles seront copiées après la construction de votre cible (ici le fichier exécutable principal) (notez la commande copy_if_different ); sinon, ils ne seront pas copiés.

De plus, notez l'utilisation des expressions de générateur ici. L'avantage de leur utilisation est que vous n'avez pas à dire explicitement où copier les DLL ou quelles variantes utiliser. Pour pouvoir les utiliser, le projet que vous utilisez (Qt5 dans ce cas) doit avoir des cibles importées.

Si vous construisez dans le débogage, CMake sait alors (en fonction de la cible importée) copier les fichiers Qt5Cored.dll, Qt5Guid.dll et Qt5Widgetsd.dll dans le dossier Debug de votre dossier de génération. Si vous construisez dans la version, les versions de publication des fichiers .dll seront copiées dans le dossier de la version.

Exécution d'une cible personnalisée

Vous pouvez également créer une cible personnalisée à exécuter lorsque vous souhaitez effectuer une tâche particulière. Ce sont généralement des exécutables que vous exécutez pour faire des choses différentes. Quelque chose qui peut être particulièrement utile est d'exécuter Doxygen pour générer de la documentation pour votre projet. Pour ce faire, vous pouvez effectuer les opérations suivantes dans votre CMakeLists.txt (par souci de simplicité, nous continuerons notre exemple de projet Qt5):

cmake_minimum_required(VERSION 3.0)
project(MyQtProj LANGUAGES C CXX)
find_package(Qt5 COMPONENTS Core Gui Widgets)
#...set up your project

add_executable(MyQtProj ${PROJ_SOURCES} ${PROJ_HEADERS})
    
add_custom_command(TARGET MyQtProj POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Core> $<TARGET_FILE_DIR:MyQtProj>
    COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Gui> $<TARGET_FILE_DIR:MyQtProj>
    COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Widgets> $<TARGET_FILE_DIR:MyQtProj>
    )

#Add target to build documents from visual studio.
set(DOXYGEN_INPUT ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile)
#set the output directory of the documentation
set(DOXYGEN_OUTPUT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/docs)
# sanity check...
message("Doxygen Output ${DOXYGEN_OUTPUT_DIR}")
find_package(Doxygen)

if(DOXYGEN_FOUND)
    # create the output directory where the documentation will live
    file(MAKE_DIRECTORY ${DOXYGEN_OUTPUT_DIR})
    # configure our Doxygen configuration file. This will be the input to the doxygen
    # executable
    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in
    ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY)

# now add the custom target. This will create a build target called 'DOCUMENTATION' 
# in your project
ADD_CUSTOM_TARGET(DOCUMENTATION
  COMMAND ${CMAKE_COMMAND} -E echo_append "Building API Documentation..."
  COMMAND ${CMAKE_COMMAND} -E make_directory ${DOXYGEN_OUTPUT_DIR}
  COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  COMMAND ${CMAKE_COMMAND} -E echo "Done."
  WORKING_DIRECTORY ${DOXYGEN_OUTPUT_DIR})

endif(DOXYGEN_FOUND)

Maintenant, lorsque nous créons notre solution (en supposant que vous utilisez Visual Studio), vous aurez une cible de génération appelée DOCUMENTATION que vous pouvez créer pour régénérer la documentation de votre projet.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow