ich mit Ihrer ursprünglichen Idee der Verwendung von add_custom_command
bleiben würde. Ich würde jedoch empfehlen, das Formular add_custom_command(TARGET ...)
statt add_custom_command(OUTPUT ...)
zu verwenden.
Die OUTPUT
Version wird entwickelt, um die Ausgabedatei als Quelldatei in einem anderen CMake Ziel in der gleichen CMakeLists.txt verwendet haben. Der benutzerdefinierte Befehl wird aufgerufen, wenn dieses Ziel erstellt wird (direkt am Anfang), da das Ziel die Datei an diesem Punkt benötigt.
In Ihrem Fall hängt kein Ziel von Ihrer Datei ab - es ist ein Produkt des Build-Prozesses.
Wenn Sie add_custom_command(TARGET ...)
verwenden, garantiert dies, dass der Befehl jedes Mal ausgeführt wird, wenn das Ziel neu erstellt wird. Wenn Sie add_custom_target
verwenden, müssen Sie daran denken, das zu erstellen, wenn das ursprüngliche Ziel (test
in diesem Fall) aktualisiert wird. Es fügt auch unnötig Ihre Liste der Ziele hinzu - vielleicht kein Problem für ein kleines Projekt, aber es kann für größere Projekte sein.
Hier ist, wie ich den Befehl einrichten würde:
SET(COPY_TO_PATH custom1)
ADD_CUSTOM_COMMAND(TARGET test POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
$<TARGET_FILE:test>
${COPY_TO_PATH}
COMMENT "Copying 'test' library to '${COPY_TO_PATH}'")
Dies fügt den Befehl als Post-Build-Ereignis von test
‚s. Wie Sie richtig erkannt haben, ist die Namensgebung von Hard-Coding-Bibliotheken nicht großartig. Daher stellt CMake "Generator-Ausdrücke" zur Verfügung, um dies zu handhaben. Der Generatorausdruck $<TARGET_FILE:test>
wird in den vollständigen Pfad der von test
erstellten Bibliothek aufgelöst, unabhängig von Plattform oder Compiler. Beachten Sie, dass Generatorausdrücke nur im Argument COMMAND
verwendet werden können. Sie könnten sie zum Beispiel nicht im COMMENT
Teil verwenden.
Der eigentliche Befehl ruft CMake selbst (${CMAKE_COMMAND}
) mit seiner -E
command line option auf. Dies bietet eine plattformübergreifende Möglichkeit, die Kopie zu erreichen, da cp
kein Windows-Befehl ist. Führen Sie cmake -E help
aus, um alle -E
Optionen anzuzeigen.