【问题标题】:How can I make find_package search with config mode and fallback on module mode?如何使用配置模式进行 find_package 搜索并回退到模块模式?
【发布时间】:2018-12-01 09:18:20
【问题描述】:

当一个库用 CMake 定义了一个构建并且遇到了为自己构建一个安装包的麻烦时,将会有一个XXXConfig.cmake

如果一个库无法将其目标导出到 CMake,CMake 会尝试通过提供尝试定位此类库的 FindXXX.cmake 脚本来弥合差距。

在文档中,首先尝试使用FindXXX.cmake(模块模式),并且只有在失败时才会尝试使用XXXConfig.cmake(配置模式)。但这对我来说似乎真的倒退了。

问题是,例如,我从源代码构建了 CURL,而 ConfigXXX 生成的目标名称与 FindXXX 不同,因此,当尝试使用它时,它失败了,因为 FindXXX 负责 find_package 请求并加载了不同的目标名称超出了我的预期。

我至少可以告诉 CMake 以相反的方式做事吗?先配置模式。

我知道我可以完全禁用模块模式,但我宁愿将其作为备用选项。

【问题讨论】:

    标签: c++ cmake


    【解决方案1】:

    3.15 版中的新功能:

    CMAKE_FIND_PACKAGE_PREFER_CONFIG 设置为TRUE 以告诉find_package() 在返回到模块模式之前先使用配置模式进行搜索。

    参考:12

    【讨论】:

      【解决方案2】:

      只需在 CONFIG 模式下使用find_package,检查其结果,如果结果为假,则以 MODULE 模式重复调用:

      # First time do not use common *REQUIRED* but use QUIET for do not output error messages on fail.
      find_package(XXX CONFIG QUIET)
      if(NOT XXX_FOUND)
          # Previous call has been failed. Fallback with MODULE mode.
          find_package(XXX MODULE REQUIRED) # Now it is OK to use REQUIRED if needed.
          # ... There could be additional actions for wrap result "as if" CONFIG mode.
      endif()
      # ... use XXX
      

      【讨论】:

      • 我想这将是一个很好的宏来编写,覆盖 find_package,让它看起来很惯用?
      • 如果CONFIGMODULE 模式结果的格式相同,那么宏可以很容易编写。但是,如果真的需要There could be additional actions for wrap result "as if" CONFIG mode. 描述的操作.. 实现通用宏可能并非易事。无论如何,如果您发现此功能对您的项目有用,只需编写宏并使用它。
      • 听起来不错。目前,我有大约 15 个 find_package(lib CONFIG REQUIRED) 调用,感觉这只是切断了在安装中丢失它们时在系统上找到东西的可能性。 (没有您描述的解决方法)
      【解决方案3】:

      你可以试试这个find_package(XXX CONFIG REQUIRED)

      查看链接:CMake: Of what use is find_package() if you need to specify CMAKE_MODULE_PATH anyway?

      【讨论】:

      • 是的,“CONFIG”允许我覆盖搜索行为,但我希望仍然可以在 MODULE 模式下进行后备。不过我喜欢这个链接。
      • 一方面,大多数库只是“find_package(lib REQUIRED)”,它没有指定模块或配置,但如果我提供“CMAKE_MODULE_PATH”并且系统上有一个,我有如果不编辑第 3 方 cmake,就无法覆盖它。
      • 对于 CMake 3.10.2,这行得通!首先在 XXX_DIR 中寻找一个 XXXConfig.cmake;如果没有找到这样的配置,它会恢复到 Modul 模式(即在 CMAKE_MODULE_PATH 中查找并执行 FindXXX.cmake)
      猜你喜欢
      • 1970-01-01
      • 2018-11-18
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-12
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多