2012-04-03 11 views
18

ich eine dynamische Bibliothek, die einen anderen Namen je nach Konfiguration erhält, indem sie in der CMake Skripte angegeben:Kopieren Zieldatei an einem anderen Ort in einem Beitrag Build-Schritt in CMake

set_target_properties(${name} PROPERTIES OUTPUT_NAME ${outputName}64) 
set_target_properties(${name} PROPERTIES DEBUG_OUTPUT_NAME ${outputName}64_d) 

Das Endergebnis ist, dass ich Bei Release- und Debug-Builds einen anderen Namen erhalten. Ich möchte die resultierende Bibliothek als Post-Build-Schritt in ein anderes Verzeichnis kopieren, aber das Geschenk (?) Von CMake-Fu lächelte nicht wirklich.

habe ich versucht, dies zu tun:

GET_TARGET_PROPERTY(origfile mylibrary LOCATION) 
STRING(REGEX REPLACE "/" "\\\\" origfile ${origfile}) 

set(targetfile my_target_path\\${CMAKE_CFG_INTDIR}\\) 
STRING(REGEX REPLACE "/" "\\\\" targetfile ${targetfile}) 

add_custom_command(TARGET mylibrary POST_BUILD 
    COMMAND copy ${origfile} ${targetfile} 
) 

Dies funktioniert gut für Release-Builds, aber die Quelle für debuggen beinhaltet nicht die _d, die ich erwartet hätte. Wie bekomme ich den Ausgabepfad für das Ziel, damit ich die Datei kopieren kann?

Hinweis: Wie aus dem obigen Code-Schnipsel zu sehen sind, ist dies zur Zeit für Windows/Visual Studio, aber ich mag dies auf O X/Xcode arbeiten/als auch machen.

Hinweis: Ich brauche die Bibliothek in ein zusätzliches Verzeichnis, das als Ausgabeverzeichnis für mehrere andere Projekte dient, die von dieser Bibliothek abhängen, damit diese Projekte die Bibliothek zur Laufzeit laden können. Eine alternative Lösung, die annehmbar wäre, wäre, in der Lage zu sein, ein benutzerdefiniertes Ziel zu erstellen, das das Kopieren durchführt, so dass die anderen Projekte von diesem Projekt abhängen können, das wiederum von der Bibliothek abhängt.

Antwort

34

Anstatt die veraltete LOCATION Eigenschaft verwenden, lieber mit Generator Ausdrücke:

add_custom_command(TARGET mylibrary POST_BUILD 
    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:mylibrary> ${targetfile} 
) 

Sie könnten auch nur die exe in dem Zielverzeichnis, indem Sie die Zieleigenschaft direkt erzeugen RUNTIME_OUTPUT_DIRECTORY, anstatt sie zu kopieren. Dies hat pro Konfigurationsoptionen (z. B. RUNTIME_OUTPUT_DIRECTORY_DEBUG).

set_target_properties(mylibrary PROPERTIES 
         RUNTIME_OUTPUT_DIRECTORY_DEBUG <debug path> 
         RUNTIME_OUTPUT_DIRECTORY_RELEASE <release path> 
) 

Für weitere Details laufen:

cmake --help-property "RUNTIME_OUTPUT_DIRECTORY" 
cmake --help-property "RUNTIME_OUTPUT_DIRECTORY_<CONFIG>" 

Außerdem sollten Sie in der Lage sein, nach vorn in allen Teilen für Pfadtrennstriche zu verwenden, auch unter Windows.

+2

Wenn Sie Xcode oder Visual Studio zielen, können Sie wollen RUNTIME_OUTPUT_DIRECTORY stattdessen verwenden und lassen Sie die IDE kümmern die korrekte Konfiguration angehängt wird. (wie Sie feststellen würden, wenn Sie die Hilfe cmd @Fraser hinzugefügt) –

10

Verwenden Sie generator expressions im Befehl POST_BUILD, anstatt den Ausgabepfad manuell zu berechnen. Diese sind konfigurationsbewusst. Beispiel:

add_custom_command(TARGET mylibrary POST_BUILD 
    COMMAND "${CMAKE_COMMAND}" -E copy 
    "$<TARGET_FILE:mylibrary>" 
    "my_target_path/$<CONFIGURATION>/$<TARGET_FILE_NAME:mylibrary>" 
    COMMENT "Copying to output directory") 
Verwandte Themen