CMake生成的依赖WebP的Xcode项目如何适配Fastlane构建
问题:CMake生成iOS项目后Fastlane归档失败(依赖WebP)
我有一个C++项目,使用CMake生成包含iOS在内的多平台构建系统,项目依赖WebP。使用以下CMake命令生成iOS的Xcode构建系统:
cmake -G Xcode -DCMAKE_TOOLCHAIN_FILE=third_party/ios-cmake/ios.toolchain.cmake -DPLATFORM=OS64 -DDEPLOYMENT_TARGET=15.0 -DENABLE_BITCODE=0 -S . -B cmake-build-release
进入生成的cmake-build-release目录,执行bundle exec fastlane ios beta尝试构建/归档应用时失败,报错无法找到多个WebP目标文件(但日志显示此前已成功编译这些文件):
... ▸ Compiling buffer_dec.c ▸ Compiling alpha_dec.c ▸ Building library libwebpdsp.a ... ** ARCHIVE FAILED ** ▸ The following build commands failed: ▸ Libtool /Users/dbotha/Library/Developer/Xcode/DerivedData/CMakeFastlaneWebpTest-dlwvukebfiwjqvaqiepshuxqklhh/ArchiveIntermediates/CMakeFastlaneWebpTest/IntermediateBuildFilesPath/UninstalledProducts/iphoneos/libwebpdecoder.a normal (in target 'webpdecoder' from project 'CMakeFastlaneWebpTest') ▸ (1 failure) ▸ ❌ error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool: can't open file: /Users/dbotha/CLionProjects/CMakeFastlaneWebpTest/cmake-build-release/third_party/libwebp/CMakeFastlaneWebpTest.build/Release-iphoneos/webpdecode.build/Objects-normal/arm64/alpha_dec.o (No such file or directory) ▸ ❌ error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool: can't open file: /Users/dbotha/CLionProjects/CMakeFastlaneWebpTest/cmake-build-release/third_party/libwebp/CMakeFastlaneWebpTest.build/Release-iphoneos/webpdecode.build/Objects-normal/arm64/buffer_dec.o (No such file or directory) ...
Fastlane内部执行的构建命令为:
xcodebuild -scheme CMakeFastlaneWebpTest -project ./CMakeFastlaneWebpTest.xcodeproj -configuration Release -destination 'generic/platform=iOS' -archivePath ./out.xcarchive archive
但使用带-target参数的xcodebuild命令可成功生成归档:
xcodebuild -project CMakeFastlaneWebpTest.xcodeproj archive -target CMakeFastlaneWebpTest -configuration Release
执行该成功命令后,bundle exec fastlane ios beta也能正常运行,因为编译后的目标文件已在预期位置。
实际项目构建耗时极长,重复构建在CI平台上成本过高,请问如何让Fastlane首次构建就成功?或如何让Fastlane复用已构建产物避免重复编译?
CMakeLists.txt
cmake_minimum_required(VERSION 3.23) project(CMakeFastlaneWebpTest) set(CMAKE_CXX_STANDARD 14) add_executable(CMakeFastlaneWebpTest src/main.cpp) # Skip building of unused webp tools which fail for me under ios: set(WEBP_BUILD_ANIM_UTILS OFF) set(WEBP_BUILD_CWEBP OFF) set(WEBP_BUILD_DWEBP OFF) set(WEBP_BUILD_GIF2WEBP OFF) set(WEBP_BUILD_IMG2WEBP OFF) set(WEBP_BUILD_VWEBP OFF) set(WEBP_BUILD_WEBPINFO OFF) set(WEBP_BUILD_WEBPMUX OFF) set(WEBP_BUILD_EXTRAS OFF) set(WEBP_BUILD_WEBP_JS OFF) add_subdirectory(third_party/libwebp EXCLUDE_FROM_ALL) target_link_libraries(CMakeFastlaneWebpTest PRIVATE webpdecoder webpdemux) include_directories(SYSTEM ${CMAKE_SOURCE_DIR}/third_party/libwebp/src) configure_file(${CMAKE_SOURCE_DIR}/fastlane/Appfile ${CMAKE_BINARY_DIR}/fastlane/Appfile COPYONLY) configure_file(${CMAKE_SOURCE_DIR}/fastlane/Fastfile ${CMAKE_BINARY_DIR}/fastlane/Fastfile COPYONLY) configure_file(${CMAKE_SOURCE_DIR}/Gemfile ${CMAKE_BINARY_DIR}/Gemfile COPYONLY) configure_file(${CMAKE_SOURCE_DIR}/Gemfile.lock ${CMAKE_BINARY_DIR}/Gemfile.lock COPYONLY) set_target_properties(CMakeFastlaneWebpTest PROPERTIES XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET ${DEPLOYMENT_TARGET} MACOSX_BUNDLE TRUE MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/src/iOS-Info.plist.in MACOSX_BUNDLE_GUI_IDENTIFIER com.dbotha.CMakeFastlaneWebpTest MACOSX_BUNDLE_BUNDLE_NAME CMakeFastlaneWebpTest MACOSX_BUNDLE_BUNDLE_VERSION "0.1" MACOSX_BUNDLE_SHORT_VERSION_STRING "0.1" ) set_xcode_property(CMakeFastlaneWebpTest PRODUCT_BUNDLE_IDENTIFIER "com.dbotha.CMakeFastlaneWebpTest" All) set_xcode_property(CMakeFastlaneWebpTest CODE_SIGN_IDENTITY "iPhone Developer" All) set_xcode_property(CMakeFastlaneWebpTest DEVELOPMENT_TEAM "GFP63373B2" All)
fastlane/Appfile
app_identifier("com.dbotha.CMakeFastlaneWebpTest") # The bundle identifier of your app apple_id("REPLACE_ME") # Your Apple Developer Portal username itc_team_id("REPLACE_ME") # App Store Connect Team ID team_id("REPLACE_ME") # Developer Portal Team ID
fastlane/Fastfile
default_platform(:ios) platform :ios do desc "Push a new beta build to TestFlight" lane :beta do build_app(scheme: "CMakeFastlaneWebpTest", configuration: "Release") upload_to_testflight end end
src/main.cpp
#include <iostream> #include <webp/demux.h> int main() { WebPAnimDecoderOptions decOptions; (void)decOptions; std::cout << "Hello, World!" << std::endl; return 0; }
内容的提问来源于stack exchange,提问作者dbotha
相关产品推荐
相关产品推荐

