Skopiuj plik docelowy do innej lokalizacji w kroku budowania post w CMake

Mam bibliotekę dynamiczną, która otrzymuje inną nazwę w zależności od konfiguracji, określoną w skryptach CMake przez:

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

W efekcie końcowym otrzymuję inną nazwę Przy release i debug buildach. Chciałbym skopiować powstałą bibliotekę do innego katalogu jako krok po budowaniu, ale dar(?) CMake-Fu nie uśmiechnął się do ciebie.

Próbowałem to zrobić:

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

To działa dobrze w release builds, ale do debugowania źródło nie zawiera tego bym się spodziewał. Jak uzyskać ścieżkę wyjściową dla celu, aby móc skopiować plik?

Uwaga: Jak widać z powyższego fragmentu, jest to obecnie Dla Windows / Visual Studio, ale chciałbym, aby to działało również na OS X / Xcode / make.

Uwaga: potrzebuję, aby Biblioteka była umieszczona w dodatkowym katalogu, który służy jako katalog wyjściowy dla kilku innych projektów, które zależą od tej biblioteki, aby te projekty były w stanie aby załadować bibliotekę w czasie wykonywania. Alternatywnym rozwiązaniem, które byłoby akceptowalne, byłoby stworzenie niestandardowego celu, który wykonuje kopiowanie, tak aby inne projekty mogły zależeć od tego projektu, co z kolei zależy od biblioteki.

Author: villintehaspam, 2012-04-03

2 answers

Zamiast używać przestarzałej właściwości LOCATION, preferuj użycie wyrażeń generatora:

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

Możesz również wygenerować exe bezpośrednio w katalogu docelowym, ustawiając właściwość target RUNTIME_OUTPUT_DIRECTORY zamiast ją kopiować. Posiada opcje per-configuration (np. RUNTIME_OUTPUT_DIRECTORY_DEBUG).

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

Aby uzyskać więcej informacji, Uruchom:

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

Ponadto, powinieneś mieć możliwość używania ukośników do przodu dla separatorów ścieżek, nawet w systemie Windows.

 36
Author: Fraser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-03 14:03:58

Użyj wyrażeń generatora w poleceniu POST_BUILD zamiast ręcznie obliczać ścieżkę wyjściową. Są świadome 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")
 11
Author: sakra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-03 14:12:54