2012-04-03 9 views
18

mam dynamiczne biblioteki, który dostaje inną nazwę w zależności od konfiguracji, określonej w skryptach CUpewnij przez:skopiować pliku docelowego do innej lokalizacji w kroku po kompilacji w CMake

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

Końcowym rezultatem jest to, że uzyskać inną nazwę na wersjach i debugowaniu kompilacji. Chciałbym skopiować powstałą bibliotekę do innego katalogu jako etap post-kompilacji, ale prezent (?) CMake-Fu nie uśmiechał się na twój naprawdę.

Próbowałem w ten sposób:

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

Działa to dobrze dla uwalniania buduje, ale dla debugowania źródło nie obejmuje _D że bym się spodziewał. Jak uzyskać wyjściową ścieżkę docelową, aby można było skopiować plik?

Uwaga: Jak widać z powyższego fragmentu, jest obecnie dla Windows/Visual Studio, ale chciałbym to do pracy na OS X/Xcode/zrobić jak dobrze.

Uwaga: muszę biblioteki mają być umieszczone w dodatkowym katalogu, który służy jako katalog wyjściowy dla wielu innych projektów, które zależą od tej biblioteki, tak, że te projekty są w stanie załadować biblioteki w czasie wykonywania. Alternatywnym rozwiązaniem, które byłoby akceptowalne, byłoby stworzenie niestandardowego celu kopiowania, aby inne projekty mogły polegać na tym projekcie, który z kolei zależy od biblioteki.

Odpowiedz

34

Zamiast używać przestarzałego LOCATION własności, wolą używać wyrażenia generatorów:

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

Można też po prostu generują exe w katalogu docelowym bezpośrednio poprzez ustawienie właściwości docelowej RUNTIME_OUTPUT_DIRECTORY zamiast kopiując go. Ma opcje na konfigurację (np. RUNTIME_OUTPUT_DIRECTORY_DEBUG).

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

Dalsze szczegóły run:

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

Ponadto, należy być w stanie korzystać z całej ukośniki dla separatorów ścieżki, nawet w systemie Windows.

+2

Jeśli kierowania Xcode lub Visual Studio, można użyć zamiast RUNTIME_OUTPUT_DIRECTORY i niech IDE dbać o dołączenie poprawną konfigurację. (jak byś odkrył, gdybyś uruchomił pomoc, dodano cmd @Fraser) –

10

Użyj polecenia generator expressions w komendzie POST_BUILD zamiast ręcznie obliczać ścieżkę wyjściową. Są świadomi konfiguracji. Przykład:

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") 
Powiązane problemy