CMake 的 find_package 在为 iOS 构建时忽略 PATHS 选项

her*_*ube 5 cmake cross-compiling ios

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

“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
Run Code Online (Sandbox Code Playgroud)

这是“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}
)
Run Code Online (Sandbox Code Playgroud)

这工作正常,即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
Run Code Online (Sandbox Code Playgroud)

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

  [...]
  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.
  [...]
Run Code Online (Sandbox Code Playgroud)

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

在针对 iOS 进行交叉编译时,如何判断find_package不要忽略为该选项指定的文件夹?PATHS

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

her*_*ube 1

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

if (${CMAKE_SYSTEM_NAME} STREQUAL "iOS")
  set ( bar_DIR "${BAR_INSTALLATION_PREFIX}/lib/bar" )
endif()
Run Code Online (Sandbox Code Playgroud)

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

它并不漂亮,而且它将项目“foo”与其依赖项“bar”的耦合程度超出了我的预期,但作为一种解决方法,它暂时可以做到。

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