Подтвердить что ты не робот

Скопируйте целевой файл в другое место на этапе пост-сборки в 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.

Примечание. Мне нужно, чтобы библиотека была помещена в дополнительный каталог, который служит в качестве выходного каталога для нескольких других проектов, которые зависят от этой библиотеки, чтобы эти проекты могли загружать библиотеку в во время выполнения. Альтернативным решением, которое было бы приемлемым, было бы создание настраиваемой цели, которая выполняет копирование, так что другие проекты могут зависеть от этого проекта, который, в свою очередь, зависит от библиотеки.

4b9b3361

Ответ 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")