Zoeken…


Invoering

Aangepaste build-stappen zijn handig om aangepaste doelen in uw project-build uit te voeren of voor het eenvoudig kopiëren van bestanden, zodat u dit niet handmatig hoeft te doen (misschien DLL's?). Hier laat ik je twee voorbeelden zien, de eerste is voor het kopiëren van dll's (in het bijzonder Qt5 dll's) naar de binaire map van je project (Debug of Release) en de tweede is voor het uitvoeren van een aangepast doel (in dit geval Doxygen) in je oplossing (als u Visual Studio gebruikt).

Opmerkingen

Zoals u kunt zien, kunt u veel doen met op maat gemaakte doelen en stappen in cmake, maar u moet voorzichtig zijn bij het gebruik ervan, vooral bij het kopiëren van dll's. Hoewel het handig is om dit te doen, kan het soms resulteren in wat liefdevol "dll hell" wordt genoemd.

Kort gezegd betekent dit dat u kunt verdwalen in welke DLL's uw uitvoerbare bestand daadwerkelijk afhankelijk is, welke bestanden worden geladen en welke bestanden moeten worden uitgevoerd (misschien vanwege de padvariabele van uw computer).

Afgezien van de bovenstaande waarschuwing, voel je vrij om aangepaste doelen te laten doen wat je wilt! Ze zijn krachtig en flexibel en zijn een waardevol hulpmiddel voor elk cmake-project.

Qt5 dll copy exemplaar

Laten we zeggen dat u een project hebt dat afhankelijk is van Qt5 en dat u de relevante dll's naar uw build-directory moet kopiëren en u dit niet handmatig wilt doen; u kunt het volgende doen:

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>
    )

Dus nu elke keer dat u uw project bouwt, als de doel-dll's zijn gewijzigd die u wilt kopiëren, worden ze gekopieerd nadat uw doel (in dit geval het hoofduitvoerbare bestand) is gebouwd (let op de opdracht copy_if_different ); anders worden ze niet gekopieerd.

Let ook op het gebruik van generatoruitdrukkingen hier. Het voordeel van het gebruik hiervan is dat u niet expliciet hoeft te zeggen waar dll's moeten worden gekopieerd of welke varianten u moet gebruiken. Om deze echter te kunnen gebruiken, moet het project dat u gebruikt (in dit geval Qt5) geïmporteerde doelen hebben.

Als u debug bouwt, weet CMake (op basis van het geïmporteerde doel) de Qt5Cored.dll, Qt5Guid.dll en Qt5Widgetsd.dll naar de map Debug van uw buildmap te kopiëren. Als u een release bouwt, worden de releaseversies van de dll's gekopieerd naar de releasemap.

Een aangepast doel uitvoeren

U kunt ook een aangepast doel maken om uit te voeren wanneer u een bepaalde taak wilt uitvoeren. Dit zijn meestal uitvoerbare bestanden die u uitvoert om verschillende dingen te doen. Iets dat van bijzonder nut kan zijn, is het uitvoeren van Doxygen om documentatie voor uw project te genereren. Om dit te doen, kunt u het volgende doen in uw CMakeLists.txt (voor de eenvoud zullen we ons Qt5-projectvoorbeeld voortzetten):

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)

Wanneer we nu onze oplossing maken (opnieuw aangenomen dat u Visual Studio gebruikt), hebt u een build-doel genaamd DOCUMENTATION dat u kunt bouwen om de documentatie van uw project te regenereren.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow