【问题标题】:How to make FeatureSummary include packages found by pkg_check_modules如何使 FeatureSummary 包含 pkg_check_modules 找到的包
【发布时间】:2016-07-24 17:24:35
【问题描述】:

我的CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project (foo)
include(FeatureSummary)
find_package(OpenSSL REQUIRED)
find_package(PkgConfig QUIET)
pkg_check_modules(JSON REQUIRED json-c)
feature_summary(WHAT ALL)

运行cmake . 给了我:

-- The following REQUIRED packages have been found:

 * OpenSSL

谁能解释使FeatureSummary 也包含pkg_check_modules 找到的包的技巧?

更新

如果我使用以下代码创建一个名为 FindJSON.cmake 的文件:

find_package(PkgConfig QUIET)
# --> Still using pkg_check_modules
pkg_check_modules(JSON REQUIRED QUIET json-c)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(
  JSON
  DEFAULT_MSG
  JSON_LIBRARIES
  JSON_INCLUDE_DIRS)

并将CMakeLists.txt 更改为:

cmake_minimum_required(VERSION 2.8)
project (foo)
include(FeatureSummary)
find_package(OpenSSL REQUIRED)
set(CMAKE_MODULE_PATH . ${CMAKE_MODULE_PATH})
# --> Now using find_package which still uses pkg_check_modules
find_package(JSON REQUIRED)
feature_summary(WHAT ALL)

我明白了:

-- The following REQUIRED packages have been found:

 * OpenSSL
 * JSON

没关系。发生了什么变化?

我使用find_package_handle_standard_args。好吧,我把FindJSON.cmake的内容复制到CMakeLists.txt,而不是通过find_package使用。

新的CMakeLists.txt 将如下所示:

cmake_minimum_required(VERSION 2.8)
project (foo)
include(FeatureSummary)
find_package(OpenSSL REQUIRED)
# --> The code from from FindJSON.cmake
find_package(PkgConfig QUIET)
# --> Still using pkg_check_modules
pkg_check_modules(JSON REQUIRED QUIET json-c)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(
  JSON
  DEFAULT_MSG
  JSON_LIBRARIES
  JSON_INCLUDE_DIRS)
# <-- end of code from FindJSON.cmake
feature_summary(WHAT ALL)

和输出:

-- The following REQUIRED packages have been found:

 * OpenSSL

JSON又消失了。

所以find_package 做了一些我不知道的魔法。

【问题讨论】:

    标签: cmake pkg-config


    【解决方案1】:

    find_package 内部发生了魔法。它将包的名称存储到全局属性中。

    你可以自己弄乱这些属性:

    set_property(GLOBAL APPEND PROPERTY PACKAGES_FOUND MyJunkPackage)
    

    检查FeatureSummary.cmake 的来源以查看它引用了哪些其他属性和变量以便生成。例如,要让这个包出现在“必需”列表中,

    set_property(GLOBAL APPEND PROPERTY _CMAKE_MyJunkPackage_TYPE REQUIRED)
    

    【讨论】:

      【解决方案2】:

      使用find_package_handle_standard_args 并从find_package 传递相应的变量。

      pkg_check_modules(FOO)
      find_package_handle_standard_args(FOO
        DEFAULT_MSG
        FOO_FOUND
        )
      

      在您的情况下,将 FOO 替换为 SQLITE3

      文档: https://cmake.org/cmake/help/v3.6/module/FindPackageHandleStandardArgs.html

      或者,要向功能摘要添加自定义条目,请使用add_feature_info

      文档说明:

      add_feature_info(<name> <enabled> <description>)
      

      使用此宏添加 有关具有给定&lt;name&gt; 的功能的信息。 &lt;enabled&gt; 包含 无论是否启用此功能,&lt;description&gt; 是一个文本 描述功能。[..]

      设置功能信息的示例:

      option(WITH_FOO "Help for foo" ON)
      add_feature_info(Foo WITH_FOO "The Foo feature provides very cool stuff.")
      

      https://cmake.org/cmake/help/v3.6/module/FeatureSummary.html

      【讨论】:

      • 如果您查看FindOpenSSL.cmake,则没有使用optionadd_feature_info。我已经使用了您描述的切换功能的方法。据我所知,这不一样。
      • 我认为你在那儿有所作为。以后有空我再看看。
      • 这一切都发生在find_package 内部,我怀疑这是一种内部方法。我已经简要阅读了FeatureSummary.cmake 它检查的变量。到目前为止,我空手而归。
      • 查看我的更新。你更新的问题没有帮助,恕我直言。
      • 此次更新旨在强调find_package_handle_standard_args 不足以让我的实验中的任何东西都表现得像find_package
      猜你喜欢
      • 2019-05-23
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多