4

我需要编写一个 CMake FindXYZ 类型的模块。谷歌搜索,我找到了这个指南:

https://cmake.org/Wiki/CMake:How_To_Find_Libraries

来自 Kitware,但有一个关于它被弃用的免责声明。在过去,比如 6 到 7 年,这些模块的编写方式发生了哪些重大变化(如果有的话)?

4

2 回答 2

4

是的,CMake Wiki 的内容现已正式移入 CMake 的文档中,因此“已弃用”警告更像是不再关注 Wiki 的一般警告。

在您的情况下, CMake Wiki: How To Find Libraries的主要部分移至 CMake 的文档cmake-packages章节。

发生了什么变化?

我认为过去几年的主要变化是斯蒂芬凯利在他的“拥抱现代 CMake”演讲中所说的:

现代 CMake 包定义IMPORTED目标

find_package(Foo REQUIRED)

add_executable(hello main.cpp)
target_link_libraries(hello
    Foo::Core
)

在 CMake 的文档 cmake-developer- Find Modules章节中可以找到相同的基本色调:

传统方法是对所有内容使用变量,包括库和可执行文件。这是 CMake 提供的大多数现有查找模块所做的。

更现代的方法是通过提供导入的目标来尽可能地表现得像配置文件包文件。这具有向消费者传播传递性使用需求的优势。

细节

您可以将这种“现代方法”视为以前方法的扩展(如“FindZLIB:添加导入的目标和文档”提交)。

绝对应该存在的(多年来所有“查找模块”的核心)是find_package_handle_standard_args()。这个宏是围绕..._FOUND缓存的变量处理构建的。

我的建议是专注于导入的目标,而..._INCLUDE_DIRSand..._LIBRARIES变量只是必须在某处缓存查找结果的副作用。

于 2018-02-26T20:28:28.580 回答
1

不,我不认为有任何重大变化。我仍然使用它。

我认为他们只是想让您查看他们的其他文档,例如find_package

在编写新的 Find 模块时,我通常只是将其他 FindXXX.cmake 视为示例/模板,然后从那里开始。

于 2018-02-26T17:15:06.627 回答