Создание библиотеки CMake доступной для других пакетов CMake автоматически
У меня есть один проект, который производит библиотеку:
project (myCoolLibrary)
ADD_LIBRARY(my_cool_library SHARED ${mysources_SRC})
И еще один проект, который должен использовать эту библиотеку:
find_package (myCoolLibrary REQUIRED)
INCLUDE_DIRECTORIES("${myCoolLibrary_INCLUDE_DIRS}" )
add_executable(myCoolExe ${my_sources_SRC} )
TARGET_LINK_LIBRARIES(myCoolExe ${myCoolLibrary_LIBRARIES} )
Есть ли способ, которым я могу изменить первый файл, чтобы второй файл работал автоматически? Что, запустив CMake в первом файле и затем запустив make на выходе, затем запустив CMake во втором файле, CMake сможет найти пакет?
Ответ, где я просто даю адрес, где первый проект построен для второго пакета, также приемлем.
1 ответ
Взяв код, найденный в сообщении блога @daniperez - Используйте библиотеки с поддержкой CMake в вашем проекте CMake (III) - я нашел следующее минимальное решение:
myCoolLibrary / CMakeLists.txt
cmake_minimum_required(VERSION 3.3)
project(myCoolLibrary)
function(my_export_target _target _include_dir)
file(
WRITE "${CMAKE_CURRENT_BINARY_DIR}/${_target}Config.cmake"
"
include(\"\$\{CMAKE_CURRENT_LIST_DIR\}/${_target}Targets.cmake\")
set_property(
TARGET ${_target}
APPEND PROPERTY
INTERFACE_INCLUDE_DIRECTORIES \"${_include_dir}\"
)
"
)
export(TARGETS ${_target} FILE "${CMAKE_CURRENT_BINARY_DIR}/${_target}Targets.cmake")
# NOTE: The following call can pollute your PC's CMake package registry
# See comments/alternatives below
export(PACKAGE ${_target})
endfunction(my_export_target)
...
add_library(${PROJECT_NAME} SHARED ${mysources_SRC})
my_export_target(${PROJECT_NAME} "${CMAKE_CURRENT_SOURCE_DIR}")
myCoolExe / CMakeLists.txt
cmake_minimum_required(VERSION 3.3)
project(myCoolExe)
find_package(myCoolLibrary REQUIRED)
...
add_executable(${PROJECT_NAME} ${my_sources_SRC})
target_link_libraries(${PROJECT_NAME} myCoolLibrary)
Чтобы сделать его многоразовым, я упаковал все в my_export_target()
, И я друг самораспространяющихся свойств, таких как INTERFACE_INCLUDE_DIRECTORIES
,
Как прокомментировал @ruslo, используя export(PACKAGE ...)
может загрязнить реестр вашего пакета. В качестве альтернативы вы можете:
Записать целевые файлы конфигурации напрямую в какое-то выделенное место, специфичное для определенной цепочки инструментов
См., Например, Как установить пользовательский модуль CMake-Find и 0003659: улучшения команды FIND_PACKAGE.
Задавать
CMAKE_MODULE_PATH
через командную строку CMake второго проекта (ввод пути поиска извне). Если вы все равно строите два проекта с помощью сценария сборки, то это самый прямой способ распространения пути поиска модулей.
Дополнительные ссылки