cmake
Benutzerdefinierte Build-Schritte
Suche…
Einführung
Benutzerdefinierte Erstellungsschritte sind hilfreich, um benutzerdefinierte Ziele in Ihrem Projekterstellungsvorgang auszuführen oder um Dateien einfach zu kopieren, sodass Sie sie nicht manuell ausführen müssen (vielleicht DLLs?). Hier zeige ich Ihnen zwei Beispiele. Das erste ist das Kopieren von DLLs (insbesondere Qt5-DLLs) in das Binärverzeichnis Ihres Projekts (entweder Debug oder Release) und das zweite ist das Ausführen eines benutzerdefinierten Ziels (in diesem Fall Doxygen) in Ihrer Lösung (wenn Sie Visual Studio verwenden).
Bemerkungen
Wie Sie sehen, können Sie mit benutzerdefinierten Erstellungszielen und Schritten in cmake eine Menge tun, aber Sie sollten vorsichtig damit umgehen, insbesondere beim Kopieren von DLLs. Dies ist zwar praktisch, kann aber manchmal zu etwas führen, das liebevoll "dll hell" genannt wird.
Im Grunde bedeutet dies, dass Sie sich verlaufen können, in welcher DLL-Datei Ihre ausführbare Datei tatsächlich davon abhängt, von welcher Datei sie geladen wird und welche sie ausführen muss (möglicherweise aufgrund der Pfadvariablen Ihres Computers).
Abgesehen von der oben genannten Einschränkung, können Sie benutzerdefinierte Ziele tun lassen, was Sie wollen! Sie sind leistungsstark und flexibel und ein unschätzbares Werkzeug für jedes cmake-Projekt.
Qt5 dll kopie beispiel
Nehmen wir an, Sie haben ein Projekt, das von Qt5 abhängt, und Sie müssen die entsprechenden DLLs in Ihr Build-Verzeichnis kopieren und möchten dies nicht manuell tun. Sie können folgendes tun:
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>
)
Jedes Mal, wenn Sie Ihr Projekt erstellen und die Ziel-DLLs geändert haben, die Sie kopieren möchten, werden sie nach dem copy_if_different
Ihres Ziels (in diesem Fall der Hauptprogrammdatei) kopiert (beachten Sie den Befehl copy_if_different
). Andernfalls werden sie nicht kopiert.
Beachten Sie außerdem die Verwendung von Generatorausdrücken . Der Vorteil bei der Verwendung dieser Optionen ist, dass Sie nicht explizit angeben müssen, wo DLLs oder welche Varianten verwendet werden sollen. Um diese jedoch verwenden zu können, muss das von Ihnen verwendete Projekt (in diesem Fall Qt5) Ziele importiert haben.
Wenn Sie in Debug bauen, kann CMake (basierend auf dem importierten Ziel) die Dateien Qt5Cored.dll, Qt5Guid.dll und Qt5Widgetsd.dll in den Ordner Debug des Build-Ordners kopieren. Wenn Sie ein Release erstellen, werden die Release-Versionen der DLL-Dateien in den Release-Ordner kopiert.
Ein benutzerdefiniertes Ziel ausführen
Sie können auch ein benutzerdefiniertes Ziel erstellen, das ausgeführt werden soll, wenn Sie eine bestimmte Aufgabe ausführen möchten. Dies sind normalerweise ausführbare Dateien, die Sie ausführen, um verschiedene Aufgaben auszuführen. Etwas, das besonders nützlich sein kann, ist das Ausführen von Doxygen , um Dokumentation für Ihr Projekt zu erstellen. Dazu können Sie in Ihrer CMakeLists.txt
Folgendes CMakeLists.txt
(der Einfachheit halber setzen wir unser Qt5-Projektbeispiel fort):
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)
Wenn Sie nun unsere Lösung erstellen (vorausgesetzt, Sie verwenden Visual Studio), haben Sie ein Erstellungsziel namens DOCUMENTATION
, das Sie erstellen können, um die Dokumentation Ihres Projekts neu zu erstellen.