Xcode 新构建系统与 cmake 3.19版本兼容性解决方案

2021-03-03 15:35:48 浏览数 (1)

Xcode 新构建系统 与 cmake 的兼容性解决方案

什么是 Xcode 构建系统

`build system`[1] 是一套将源码和资源文件转为 APP 的工具。

比如,当我们进行点击下图的运行按钮(Run Button)** (▶️)时,Xcode就会调用 Build System 进行 APP 的构建过程 。

工具栏

除此外,当我们使用命令行通过 xcodebuild 进行 build archive 操作时,都依赖 build system 完成工作。

Xcode 目前支持两套 build system, 因为New Build System 的构建速度更快和错误检测更多。所以,从 Legacy Build System切换到 New Build System 后,可能会存在无法构建的情况。

如何切换 构建系统

我们可以通过下面两图所示的方法切换 build system

image-20210212230726382

image-20210212230749061

什么是 cmake

CMake 是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。它能够输出各种各样的 makefile 或者 projec t文件,能测试编译器所支持的C 特性,类似UNIX下的automake。

cmake 兼容性问题

cmake 3.19[2] 版本开始,`Xcode generator`[3] 会尝试默认启用 XcodeNew Build System

对于部分不支持new build system 的项目,会出现下面的警告或者报错:

Policy CMP0114 is not set to NEW [4] 警告:

代码语言:javascript复制
    "Policy CMP0114 is not set to NEW.  "
      "In order to support the Xcode "new build system", "
      "this project must be updated to set policy CMP0114 to NEW."
      "n"
      "Since CMake is generating for the Xcode "new build system", "
      "ExternalProject_Add will use policy CMP0114's NEW behavior anyway, "
      "but the generated build system may not match what the project intends."

构建 compiler-rt 报错:

代码语言:javascript复制
CMake Error in ~/swift-source/llvm-project/pstl/CMakeLists.txt:
  The custom command generating

    ~/swift-source/build/Xcode-2023/llvm-macosx-x86_64/projects/compiler-rt/lib/builtins/outline_atomic_helpers.dir/outline_atomic_cas1_1.S

  is attached to multiple targets:

    clang_rt.cc_kext_arm64e_osx
    clang_rt.builtins_arm64e_osx
    clang_rt.cc_kext_arm64_osx
    clang_rt.builtins_arm64_osx

  but none of these is a common dependency of the other(s).  This is not
  allowed by the Xcode "new build system".

兼容性解决方案

为了避免报错,我们可以通过添加参数 -T buildsystem=1 避免

示例:

image-20210212225559559

参考资料

[1]

build system: https://help.apple.com/xcode/mac/11.4/#/dev5948b27d3

[2]

3.19: https://cmake.org/cmake/help/v3.19/release/3.19.html#id8

[3]

Xcode generator: https://cmake.org/cmake/help/v3.19/generator/Xcode.html#generator:Xcode

[4]

Policy CMP0114 is not set to NEW. : https://github.com/Kitware/CMake/blob/acb33d0904121f10891cb3aa0622b11d4e527304/Modules/ExternalProject.cmake

0 人点赞