2013-09-03 2 views
6

Ich habe eine vorhandene cmake-Datei, die eine .so Bibliothek generiert. Ich möchte es so modifizieren, dass es dann eine Kopie des .so namens etwas anderes macht. Das ist ungefähr das, was ich habe:cmake benutzerdefinierten Befehl zum Kopieren und Umbenennen

CMAKE_MINIMUM_REQUIRED(VERSION 2.8.7) 
PROJECT(test1) 

SET(TEST_SOURCES f1.c) 
ADD_LIBRARY(test SHARED ${TEST_SOURCES}) 
ADD_CUSTOM_COMMAND(
    OUTPUT custom1 
    COMMAND cp libtest.so custom1 
    DEPENDS libtest.so) 

Ich weiß, es gibt bessere Möglichkeiten als hartzucodieren den Namen der Bibliothek, ich tue nur dies, während ich versuche, herauszufinden, wie es überhaupt arbeiten. Was ist die Sache, die ich vermisse, die dazu führt, dass mein benutzerdefinierter Befehl zum Kopieren/Umbenennen ausgeführt wird? Hinweis: Dies ist keine Installationssache. Dank

Antwort

6
add_custom_target(CopyAndRename 
    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/test.so ${CMAKE_BINARY_DIR}/SomeThingElse.so 
) 

add_custom_target führt ein neues Ziel mit dem Namen CopyAndRename. Sie können es mit laufen:

make CopyAndRename 
11

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.