Найти вторичные зависимости в конфигурационных файлах CMake - PullRequest
0 голосов
/ 30 января 2020

Следуя современным рекомендациям CMake (например, см. https://www.slideshare.net/DanielPfeifer1/effective-cmake, особенно слайд 46), я пытаюсь записать файл PkgConfig.cmake для моих Pkg.

Pkg зависит от Foo, что в свою очередь зависит от Bar. Ни Foo, ни Bar не имеют конфигурационных файлов - скорее я использую FindFoo.cmake и FindBar.cmake для их поиска.

Мой PkgConfig.cmake файл выглядит так

set(Pkg_LIBRARIES Pkg::Pkg)

include(CMakeFindDependencyMacro)

find_dependency(Foo)  # Use FindFoo.cmake find and import as target Foo::Foo
                      # Foo depends on Bar which is similarly imported using
                      # FindBar.cmake as target Bar::Bar

include("${CMAKE_CURRENT_LIST_DIR}/PkgTargets.cmake")

Мой результат PkgTargets.cmake выглядит следующим образом:

add_library(Pkg::Pkg STATIC IMPORTED_
set_target_properties(Pkg::Pkg PROPERTIES
  INTERFACE_LINK_LIBRARIES "Foo::Foo")

# Load information for each installed configuration
.
.
.

Мой вопрос заключается в том, как можно избежать того, чтобы другие пакеты, импортирующие Pkg в их проект, не указывали, где Foo и, что более важно, где Bar можно найти?

Разве это не противоречит цели построения транзитивных зависимостей, если местоположения пакетов Foo и Bar нужно снова указывать либо с помощью переменных Foo_ROOT и Bar_ROOT или CMAKE_PREFIX_PATH?

Мой Pkg уже знает, где он был найден, поэтому я должен разобрать / установить Foo_ROOT и Bar_ROOT и поместить его в мой файл PkgConfig.cmake?

1 Ответ

1 голос
/ 30 января 2020

Мой вопрос: как можно избежать того, чтобы другие пакеты, импортирующие Pkg в свой проект, не указывали, где Foo и, что более важно, где Bar можно найти?

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Я не знаю, где * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * он не может быть найден ”. 1014 * и Bar_ROOT и поместить его в мой PkgConfig.cmake файл?

Обратите внимание, что файлы XXXConfig.cmake, как правило, подготовлены для установленного проекта, который будет перемещен в другой каталог на сборочной машине или, что более важно, для копирования на другую машину и использования там.

, поскольку расположение из Foo и Bar на другой машине может отличаться от единицы на сборочной машине , зная, что их расположение на сборочной машине не может помочь чтобы найти их на целевой машине.

Тем не менее, это зависит от вас (как проект разработчик), чтобы указать ограничения использования проекта. Вы можете, например, указать, что проект может использоваться только на той машине, где он был построен. В этом случае повторное использование местоположений сборки Foo и Bar в сценарии PkgConfig.cmake оправдано.

Более того, даже когда вы разрешаете копировать установленный проект на другой компьютер, вы все равно можете использовать местоположения сборки: Foo и Bar в качестве подсказки для поиска их в PkgConfig.cmake. Таким образом, если проект будет использоваться на той же машине , где он был построен, то зависимости будут найдены без вмешательства пользователя. То же самое верно, если проект будет скопирован на другую машину , которая имеет Foo и Bar в тех же местах, что и на сборочной машине .

...