Создание библиотеки 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 ...) может загрязнить реестр вашего пакета. В качестве альтернативы вы можете:

  1. Записать целевые файлы конфигурации напрямую в какое-то выделенное место, специфичное для определенной цепочки инструментов

    См., Например, Как установить пользовательский модуль CMake-Find и 0003659: улучшения команды FIND_PACKAGE.

  2. Задавать CMAKE_MODULE_PATH через командную строку CMake второго проекта (ввод пути поиска извне). Если вы все равно строите два проекта с помощью сценария сборки, то это самый прямой способ распространения пути поиска модулей.

Дополнительные ссылки

Другие вопросы по тегам