CMake, как правильно создавать зависимости между целями

Я пытаюсь использовать CMake для настройки некоторых простых зависимостей между проектом С++ и библиотеками, которые он использует.

Настройка выполняется следующим образом

  • Project
    • Зависимость

Сам проект содержит исходные файлы, содержащие заголовки Dependency, и когда исполняемый файл построен, он должен быть связан с статической библиотекой Dependency.

До сих пор я могу заставить это работать, но я должен указать каталоги include Dependency в файле CMakeLists для Project вручную. Я хочу, чтобы это было вытащено автоматически, и я изучил возможность использования команды find_package(), чтобы сделать это с ограниченным успехом и сделать вещи намного сложнее.

Все, что я хочу сделать, это иметь зависимость, созданная до проекта, и иметь ссылку Project против библиотеки и иметь свои каталоги include. Есть ли простой краткий способ достижения этого?

Мои текущие файлы cmake:

ПРОЕКТ, CMakeLists.txt:

cmake_minimum_required (VERSION 2.6)
project (Project)
include_directories ("${PROJECT_SOURCE_DIR}/Project")
add_subdirectory (Dependency)
add_executable (Project main.cpp)
target_link_libraries (Project Dependency)
add_dependencies(Project Dependency)

DEPENDENCY, CMakeLists.txt

project(Dependency)
add_library(Dependency SomethingToCompile.cpp)
target_link_libraries(Dependency)

Ответ 1

Так как CMake 2.8.11 вы можете использовать target_include_directories. Просто добавьте в проект DEPENDENCY эту функцию и заполните включенные каталоги, которые вы хотите увидеть в главном проекте. CMake позаботится обо всем остальном.

ПРОЕКТ, CMakeLists.txt:

cmake_minimum_required (VERSION 2.8.11)
project (Project)
include_directories (Project)
add_subdirectory (Dependency)
add_executable (Project main.cpp)
target_link_libraries (Project Dependency)

DEPENDENCY, CMakeLists.txt

project (Dependency)
add_library (Dependency SomethingToCompile.cpp)
target_include_directories (Dependency PUBLIC include)

Ответ 2

Не совсем понятно, что вы хотите сделать, и почему Project и Depency необходимо создавать отдельно.

Мой первый, хотя на вашем примере будет

  • В ПРОЕКТЕ, CMakeLists.txt

    • Удалить add_dependencies (зависимость от проекта) Нет необходимости указывать зависимость, target_link_libraries() уже делает это.
  • В DEPENDENCY, CMakeLists.txt

    • Удалить проект (зависимость) Он создает библиотеку, поэтому зачем иметь собственный проект?
    • Удалить target_link_libraries (Dependency) Потому что ничего не делает