Sök…


Introduktion

Anpassade byggsteg är användbara för att köra anpassade mål i ditt projektbyggande eller för att enkelt kopiera filer så att du inte behöver göra det manuellt (kanske dlls?). Här visar jag dig två exempel, det första är för att kopiera dlls (särskilt Qt5 dlls) till dina projekt binära katalog (antingen Debug eller Release) och det andra är för att köra ett anpassat mål (Doxygen i detta fall) i din lösning (om du använder Visual Studio).

Anmärkningar

Som du kan se kan du göra mycket med anpassade build-mål och steg i cmake, men du bör vara försiktig med att använda dem, särskilt när du kopierar dlls. Även om det är övertygande att göra det, kan det ibland resultera i vad som kärleksfullt kallas "dll helvete".

I grund och botten betyder det att du kan gå vilse i vilka dlls din körbara faktiskt beror på, vilka som laddas och vilka som den behöver köras (kanske på grund av datorns sökvägsvariabel).

Andra än ovanstående varning, känn dig fri att göra anpassade mål göra vad du vill! De är kraftfulla och flexibla och är ett ovärderligt verktyg för alla cmake-projekt.

Exempel på Qt5 dll-kopia

Så låt oss säga att du har ett projekt som beror på Qt5 och att du behöver kopiera relevanta dlls till din build-katalog och att du inte vill göra det manuellt; du kan göra följande:

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

Så nu varje gång du bygger ditt projekt, om mål-dll-filerna har ändrats som du vill kopiera, kommer de att kopieras efter att ditt mål (i detta fall den huvudsakliga körbara) har byggts ( copy_if_different kommandot copy_if_different ); annars kommer de inte att kopieras.

Notera dessutom användningen av generatoruttryck här. Fördelen med att använda dessa är att du inte behöver uttryckligen säga var du ska kopiera dlls eller vilka varianter du ska använda. För att kunna använda dessa men projektet du använder (Qt5 i detta fall) måste ha importerade mål.

Om du bygger i felsökning vet CMake (baserat på det importerade målet) att kopiera Qt5Cored.dll, Qt5Guid.dll och Qt5Widgetsd.dll till mappen Debug i din build-mapp. Om du bygger i release kommer kopieringsversionerna av .dlls att kopieras till release-mappen.

Köra ett anpassat mål

Du kan också skapa ett anpassat mål som ska köras när du vill utföra en viss uppgift. Dessa är vanligtvis körbara filer som du kör för att göra olika saker. Något som kan vara särskilt användbart är att köra Doxygen för att generera dokumentation för ditt projekt. För att göra detta kan du göra följande i ditt CMakeLists.txt (för enkelhets skull fortsätter vi med vårt exempel på Qt5-projekt):

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)

När vi nu skapar vår lösning (igen förutsatt att du använder Visual Studio), har du ett byggmål som heter DOCUMENTATION som du kan bygga för att återskapa projektets dokumentation.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow