我听说有些人声称,如果您在
find_package(<PackageName>_FOUND)
中运行 CMakeLists.txt
,则包维护者可以决定如何命名 结果变量。还有人声称保证是<PackageName>_FOUND
。
还有其他常用的变量,如
<PackageName>_INCLUDE_DIRS
、<PackageName>_LIBRARIES
等
按照我对文档的理解,似乎
<PackageName>_FOUND
确实是严格执行和强制性的,而偏离其他变量是可能的。但我不太确定,写得有点含糊。
那么
find_package
可以设置什么?
显然对于某些包,某些变量可能没有意义(例如
<PackageName>_LIBRARIES
对于仅标头库)。但这是例如吗?由 CMake 强制执行(在为包编写 Find<PackageName>.cmake
文件时),if 根本有库文件,则必须设置 <PackageName>_LIBRARIES
?或者这只是一个建议,如果是这样,软件包维护者真的会偏离它吗?
事实上,没有什么是可以保证的,因为 find_package 所做的唯一事情就是查找并包含/处理 CMake 配置文件。该文件(通常生成)的作者需要确保它正确设置必要的变量以便可以使用它们。任何永远不会使用的变量都不需要设置。
CMake 并不是某种确保正确生成所有包的权威,这只是一个标准,说明如何命名变量以与其他 CMake 功能兼容。如果您不遵守它,您将需要处理由此产生的任何问题,但如果您认为自己知道自己在做什么,则不必这样做。
Find<PackageName>.cmake
的一个常见组件是find_package_handle_standard_args()
(source),它负责设置<PackageName>_FOUND
变量。因此您不必直接自行设置。如果你什么都不做,它就会丢失,这可能会在以后造成麻烦,但没关系。
简而言之,答案是:没有什么是真正需要的。您的
Find<PackageName>.cmake
可能实际上是空的。没什么用处,但只要它在 CMAKE_MODULE_PATH
上就不会导致错误。
当然,感谢所有辅助函数和生成器,不设置基本变量实际上是相当困难的。