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] 会尝试默认启用 Xcode
的 New 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
报错:
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