【问题标题】:CMake's find_package ignores the PATHS option when building for iOSCMake 的 find_package 在为 iOS 构建时会忽略 PATHS 选项
【发布时间】:2021-04-06 04:57:42
【问题描述】:

库“foo”依赖于库“bar”。这两个库的构建系统都基于 CMake。库“bar”提供了下游项目可以使用的 CMake 包,例如库“foo”。

“foo”通过 Git 子模块集成“bar”。 "foo" 期望 "bar" 被构建并安装在特定位置的子模块路径中。文件夹结构如下所示:

/path/to/foo
+-- bar                  <-- "bar" Git submodule
|   +-- build            <-- "bar" out-of-source build folder
|       +-- install      <-- "bar" installation folder
+-- build                <-- "foo" out-of-source build folder
+-- CMakeLists.txt

这是“foo”的简约 CMakeLists.txt,显示了我正在使用的 find_package 调用:

project ( foo )
set ( BAR_INSTALLATION_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/bar/build/install" )
find_package (
  bar
  0.1
  EXACT
  QUIET
  PATHS ${BAR_INSTALLATION_PREFIX}
)

这很好用,即find_package 找到“bar”,只要我为主机平台 macOS 构建“foo”。但是,当我尝试为 iOS 交叉编译“foo”时,find_package 找不到“bar”。

我使用-DCMAKE_FIND_DEBUG_MODE=ON 来诊断问题,看来find_package 只是忽略了为PATHS 选项指定的文件夹。这是我在诊断期间遇到的仍然存在问题的简约命令行:

cmake .. -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_FIND_DEBUG_MODE=ON

这是我看到的输出的相关部分:

  [...]
  Paths specified by the find_package PATHS option.
    /Users/patrick/dev/foo/bar/build/install

  find_package considered the following locations for the Config module:

    /Applications/Xcode-11.2.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/barConfig.cmake
    /Applications/Xcode-11.2.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/bar-config.cmake
    /Applications/Xcode-11.2.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/barConfig.cmake
    /Applications/Xcode-11.2.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/bar-config.cmake
    /Applications/Xcode-11.2.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/barConfig.cmake
    /Applications/Xcode-11.2.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/bar-config.cmake
    /Applications/Xcode-11.2.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/System/Library/Frameworks/barConfig.cmake
    /Applications/Xcode-11.2.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/System/Library/Frameworks/bar-config.cmake
    /Applications/Xcode-11.2.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/System/Library/Frameworks/barConfig.cmake
    /Applications/Xcode-11.2.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/System/Library/Frameworks/bar-config.cmake

  The file was not found.
  [...]

可以看出find_package 最初识别PATHS 选项值,但随后它在文件系统中实际执行包搜索时忽略了该文件夹。

如何告诉find_package 在交叉编译iOS 时不要忽略PATHS 选项指定的文件夹?

环境:macOS 10.14.6、Xcode 11.2.1、CMake 3.19.2(通过 Homebrew 安装)。

【问题讨论】:

    标签: ios cmake cross-compiling


    【解决方案1】:

    我目前已将此添加到我的 CMakeLists.txt 中,介于我设置 BAR_INSTALLATION_PREFIX 和调用 find_package 的位置之间:

    if (${CMAKE_SYSTEM_NAME} STREQUAL "iOS")
      set ( bar_DIR "${BAR_INSTALLATION_PREFIX}/lib/bar" )
    endif()
    

    这会将 &lt;PackageName&gt;_DIR 变量设置为包的配置文件 (bar-config.cmake) 所在的具体文件夹。根据CMake docs,这也可以设置为环境变量。

    它并不漂亮,它把项目“foo”耦合到它的依赖项“bar”比我想要的要多,但作为一种解决方法,它暂时可以做。

    我不会将此答案标记为“已接受”,以防有更多 CMake 知识的人提出真正的解决方案。

    【讨论】:

      【解决方案2】:

      对于 iOS 和 Android,CMake 默认将 CMAKE_FIND_ROOT_PATH_MODE_PACKAGE CMake 变量设置为 ONLY。也就是说,你设置的所有PATHS都只在CMAKE_FIND_ROOT_PATH内解析。

      如果您希望find_package() 也将路径解析为主机路径,则必须手动将CMAKE_FIND_ROOT_PATH_MODE_PACKAGE 设置为NEVERBOTH

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-20
        相关资源
        最近更新 更多