Как добавить пользовательскую команду к целевым объектам, зависящим от конкретной цели

#cmake

#cmake

Вопрос:

У меня есть цель, которая создает общую библиотеку, назовите ее A, и она зависит от другой общей библиотеки, назовите ее B.

У меня есть несколько целей, которые зависят от A, называйте их C, D и E.

Я хочу скопировать A и B рядом с тем местом, где каждый C, D и E лежат на диске.

Формально говоря, я хочу скопировать разделяемую библиотеку A и любую другую разделяемую библиотеку, от которой зависит A, в местоположения любой цели, которая зависит от A.

Как я могу добиться этого в cmake? возможно ли это вообще?

Ответ №1:

Предполагая, что у вас есть полный контроль над всеми CMakeLists.txt файлами, создающими все 5 целевых объектов, вы можете установить местоположение.dll или файлы .so создаются для . Вы можете отдельно указать место установки, предполагая, что вы хотите указать это место после этапа установки.

Команды, ссылающиеся на цель, должны быть размещены после создания цели с помощью add_library / add_executable .

 set_target_properies(A PROPERTIES 
     ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" # import libraries
     LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" # .so files
     RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" # .dll files/programs
)

# similar as above, but specifying the path relative to CMAKE_INSTALL_PREFIX
install(TARGETS A
    ARCHIVE DESTINATION lib
    LIBRARY DESTINATION bin
    RUNTIME DESTINATION bin
)
 

В зависимости от ваших потребностей вам нужна только одна из команд, и для обеих можно было бы заменить target A списком целей. Таким образом, вы могли бы избежать повторения команды (команд) 5 раз. Однако я рекомендую сделать это в CMakeLists.txt файле, в котором вы создаете цель.

Несмотря на то, что выходные каталоги относятся к текущему каталогу в приведенном выше примере, мы обошли это, используя абсолютный путь к каталогу сборки ( CMAKE_BINARY_DIR ) как часть имени каталога.

Комментарии:

1. к сожалению, это не совсем ответ на мой вопрос. хотя это может быть хорошим обходным маневром.