Скопируйте целевой файл в другое место на этапе пост-сборки в CMake
У меня есть динамическая библиотека, которая получает другое имя в зависимости от конфигурации, указанной в сценариях CMake:
set_target_properties(${name} PROPERTIES OUTPUT_NAME ${outputName}64)
set_target_properties(${name} PROPERTIES DEBUG_OUTPUT_NAME ${outputName}64_d)
Конечным результатом является то, что я получаю другое имя в выпусках и отладочных сборках. Я хотел бы скопировать полученную библиотеку в другой каталог как шаг после сборки, но подарок (?) CMake-Fu действительно не улыбнулся вам.
Я попытался сделать это:
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}
)
Это отлично работает для релизов, но для отладки источник не включает _d, который я ожидал бы.
Как получить выходной путь для цели, чтобы я мог скопировать файл?
Примечание.. Как видно из приведенного выше фрагмента, это в настоящее время для Windows/Visual Studio, но я хотел бы, чтобы это работало и с OS X/Xcode/make.
Примечание. Мне нужно, чтобы библиотека была помещена в дополнительный каталог, который служит в качестве выходного каталога для нескольких других проектов, которые зависят от этой библиотеки, чтобы эти проекты могли загружать библиотеку в во время выполнения. Альтернативным решением, которое было бы приемлемым, было бы создание настраиваемой цели, которая выполняет копирование, так что другие проекты могут зависеть от этого проекта, который, в свою очередь, зависит от библиотеки.
Ответы
Ответ 1
Вместо использования устаревшего свойства LOCATION
, используйте выражения генератора:
add_custom_command(TARGET mylibrary POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:mylibrary> ${targetfile}
)
Вы также можете просто сгенерировать exe в целевом каталоге напрямую, установив целевое свойство RUNTIME_OUTPUT_DIRECTORY
вместо его копирования. Это имеет параметры для каждой конфигурации (например, RUNTIME_OUTPUT_DIRECTORY_DEBUG
).
set_target_properties(mylibrary PROPERTIES
RUNTIME_OUTPUT_DIRECTORY_DEBUG <debug path>
RUNTIME_OUTPUT_DIRECTORY_RELEASE <release path>
)
Подробнее о выполнении:
cmake --help-property "RUNTIME_OUTPUT_DIRECTORY"
cmake --help-property "RUNTIME_OUTPUT_DIRECTORY_<CONFIG>"
Кроме того, вы должны иметь возможность использовать косые черты во всех разделителях путей, даже в Windows.
Ответ 2
Используйте выражения генератора в команде POST_BUILD
вместо ручного вычисления выходного пути. Это информация о конфигурации. Пример:
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")