Ricerca…


introduzione

Le fasi di generazione personalizzate sono utili per eseguire target personalizzati nella creazione del progetto o per copiare facilmente i file in modo da non doverli eseguire manualmente (forse dll?). Qui vi mostrerò due esempi, il primo è per copiare dll (in particolare Qt5 dll) nella directory binaria dei vostri progetti (sia Debug che Release) e il secondo è per eseguire una destinazione personalizzata (Doxygen in questo caso) nella vostra soluzione (se stai usando Visual Studio).

Osservazioni

Come puoi vedere, puoi fare molto con obiettivi di build personalizzati e passaggi in cmake, ma dovresti stare attento ad usarli, specialmente quando copi le DLL. Sebbene sia conveniente farlo, a volte può risultare in quello che viene chiamato affettuosamente "inferno dll".

Fondamentalmente questo significa che puoi perderti in quale dll dipende il tuo eseguibile, quali sono i suoi caricamenti e quali devono essere eseguiti (forse a causa della variabile del tuo computer).

Oltre a questo avvertimento, sentiti libero di fare obiettivi personalizzati fare tutto ciò che vuoi! Sono potenti e flessibili e sono uno strumento inestimabile per qualsiasi progetto cmake.

Esempio di copia di Qt5 dll

Quindi diciamo che hai un progetto che dipende da Qt5 e devi copiare le dll rilevanti nella tua directory di costruzione e non vuoi farlo manualmente; puoi fare quanto segue:

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

Così ora ogni volta che costruisci il tuo progetto, se le dll di destinazione sono cambiate che vuoi copiare, allora saranno copiate dopo che il tuo obiettivo (in questo caso l'eseguibile principale) è stato costruito (nota il comando copy_if_different ); in caso contrario, non verranno copiati.

Inoltre, si noti l'uso delle espressioni del generatore qui. Il vantaggio nell'usarli è che non devi dire esplicitamente dove copiare le DLL o quali varianti usare. Per poterli usare, però, il progetto che stai usando (Qt5 in questo caso) deve avere obiettivi importati.

Se si sta eseguendo il debug, CMake sa (in base alla destinazione importata) copiare i file Qt5Cored.dll, Qt5Guid.dll e Qt5Widgetsd.dll nella cartella Debug della cartella di generazione. Se stai costruendo in versione, le versioni di rilascio di .dlls verranno copiate nella cartella di rilascio.

Esecuzione di una destinazione personalizzata

È anche possibile creare un target personalizzato da eseguire quando si desidera eseguire una determinata attività. Questi sono in genere eseguibili eseguiti per fare cose diverse. Qualcosa che può essere di particolare utilità è eseguire Doxygen per generare documentazione per il tuo progetto. Per fare questo puoi fare quanto segue nel tuo CMakeLists.txt (per semplicità continueremo il nostro esempio di progetto 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)

Ora quando creiamo la nostra soluzione (sempre supponendo che tu stia usando Visual Studio), avrai un obiettivo di compilazione chiamato DOCUMENTATION che puoi costruire per rigenerare la documentazione del tuo progetto.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow