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.
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.
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")
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