在 CMake 配置文件中查找次要依赖项
Find secondary dependencies in CMake config files
遵循现代 CMake 指南(例如,参见 https://www.slideshare.net/DanielPfeifer1/effective-cmake,特别是幻灯片 46),我正在尝试为我的 Pkg
.
编写一个 PkgConfig.cmake
文件
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_ROOT
和 [=29= 再次指定 Foo
和 Bar
包的位置,是否会破坏构建传递依赖关系的目的] 或 CMAKE_PREFIX_PATH
?
我的 Pkg 已经知道它是在哪里找到的,所以我是否应该 parse/set Foo_ROOT
和 Bar_ROOT
并将其放入我的 PkgConfig.cmake
文件中?
My question is how can I avoid other packages importing Pkg
into their project from having to specify where Foo
and more importantly where Bar
is to be found?
完全允许 PkgConfig.cmake
指定(提示)其依赖项的位置。
My Pkg already knows where it was found, so should I parse/set Foo_ROOT
and Bar_ROOT
and put it into my PkgConfig.cmake
file?
请注意,XXXConfig.cmake
文件通常是为安装的项目准备的 移动 到 构建机器上的其他目录 或者,更重要的是,被 复制 到 其他机器 并在那里使用。
因为 Foo
和 Bar
在 其他机器上的 位置 可能不同 来自 构建机器 上的一个,知道它们在构建机器上的位置无助于在目标机器上找到它们。
不过,由您(作为项目的开发人员)指定项目的使用限制。例如,您可以指定该项目只能在构建它的那台机器上使用。在那种情况下,在 PkgConfig.cmake
脚本中重用 Foo
和 Bar
的构建位置是合理的。
此外,即使允许将已安装的项目复制到其他机器上,您仍然可以使用 Foo
和 Bar
的构建位置作为 提示在 PkgConfig.cmake
中搜索它们。因此,如果项目将在构建它的 同一台机器 上使用,则无需用户干预即可找到依赖项。如果项目将被复制到 other machine,它有 Foo
和 Bar
在与 build 相同的位置机器.
遵循现代 CMake 指南(例如,参见 https://www.slideshare.net/DanielPfeifer1/effective-cmake,特别是幻灯片 46),我正在尝试为我的 Pkg
.
PkgConfig.cmake
文件
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_ROOT
和 [=29= 再次指定 Foo
和 Bar
包的位置,是否会破坏构建传递依赖关系的目的] 或 CMAKE_PREFIX_PATH
?
我的 Pkg 已经知道它是在哪里找到的,所以我是否应该 parse/set Foo_ROOT
和 Bar_ROOT
并将其放入我的 PkgConfig.cmake
文件中?
My question is how can I avoid other packages importing
Pkg
into their project from having to specify whereFoo
and more importantly whereBar
is to be found?
完全允许 PkgConfig.cmake
指定(提示)其依赖项的位置。
My Pkg already knows where it was found, so should I parse/set
Foo_ROOT
andBar_ROOT
and put it into myPkgConfig.cmake
file?
请注意,XXXConfig.cmake
文件通常是为安装的项目准备的 移动 到 构建机器上的其他目录 或者,更重要的是,被 复制 到 其他机器 并在那里使用。
因为 Foo
和 Bar
在 其他机器上的 位置 可能不同 来自 构建机器 上的一个,知道它们在构建机器上的位置无助于在目标机器上找到它们。
不过,由您(作为项目的开发人员)指定项目的使用限制。例如,您可以指定该项目只能在构建它的那台机器上使用。在那种情况下,在 PkgConfig.cmake
脚本中重用 Foo
和 Bar
的构建位置是合理的。
此外,即使允许将已安装的项目复制到其他机器上,您仍然可以使用 Foo
和 Bar
的构建位置作为 提示在 PkgConfig.cmake
中搜索它们。因此,如果项目将在构建它的 同一台机器 上使用,则无需用户干预即可找到依赖项。如果项目将被复制到 other machine,它有 Foo
和 Bar
在与 build 相同的位置机器.