CMake构建失败,Xcode为12,并且CMake_IOS_INSTALL_COMBED=YES



EDIT这是一个已知的CMake问题。


使用Xcode 11(特别是Xcode 11.2.1(,我过去可以使用以下命令交叉编译我的iOS项目:

cd /path/to/project
mkdir build
cd build
cmake .. -G Xcode -DCMAKE_SYSTEM_NAME=iOS 
"-DCMAKE_OSX_ARCHITECTURES=arm64;x86_64" 
-DCMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH=NO 
-DCMAKE_IOS_INSTALL_COMBINED=YES 
-DCMAKE_INSTALL_PREFIX=install
cmake --build . --config Release --target install

这创建了一个包含两个切片的构建,一个切片用于arm64体系结构(用于在实际设备上运行(,另一个切片则用于x86_64体系结构(在基于英特尔的开发环境上的模拟器中运行(。

在升级到Xcode 12(特别是Xcode 12.3(后,它不再工作。构建始终失败,并显示以下错误消息(我添加了换行符(:

error: unable to attach DB: error: accessing build database "/path/to/project/build/ios/build/XCBuildData/build.db":
database is locked Possibly there are two concurrent builds running in the same filesystem location.

问题似乎是CMake为install目标创建的构建后规则。在该后构建规则中,在第一次构建仍在进行时启动第二次构建。

if test "$CONFIGURATION" = "Release"; then :
cd /path/to/project/build/ios
/usr/local/Cellar/cmake/3.19.2/bin/cmake -DBUILD_TYPE=$CONFIGURATION -DEFFECTIVE_PLATFORM_NAME=$EFFECTIVE_PLATFORM_NAME -P cmake_install.cmake
fi

当我不再将CMAKE_IOS_INSTALL_COMBINED设置为YES,但生成的构建只包含一个切片(在我的情况下是arm64,可能是因为这是CMAKE_OSX_ARCHITECTURES中列出的第一个体系结构(时,构建成功。

我正在考虑为每个体系结构制作一个单独的构建,然后手动将切片缝合在一起。在我走上这条路之前,有人能找到一个更优雅的解决方案吗?

环境:macOS 11.1,Xcode 12.3,CMake 3.19.2

CMake 3.19发行说明包含以下提示:

Xcode生成器现在在为Xcode 12.0或更高版本生成时使用Xcode"新建系统"。请参阅CMAKE_XCODE_BUILD_SYSTEM变量。可以使用CCD_ 9来切换到传统构建系统。

因此,目前的解决方法是将-T选项添加到构建系统生成命令行:

cmake .. -G Xcode -T buildsystem=1
-DCMAKE_SYSTEM_NAME=iOS 
"-DCMAKE_OSX_ARCHITECTURES=arm64;x86_64" 
-DCMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH=NO 
-DCMAKE_IOS_INSTALL_COMBINED=YES 
-DCMAKE_INSTALL_PREFIX=install

只要Xcode仍然支持遗留的构建系统,这就应该起作用。Xcode 12发行说明中有这样一句话:

旧版构建系统已弃用,并将在将来的版本中删除。(62742902(

因此,-T buildsystem=1选项只能被视为临时解决方案。

相关内容

  • 没有找到相关文章

最新更新