Introduction
Integrating CocoaPods into CMake-based iOS or macOS projects can be challenging. Developers often encounter issues where CocoaPods dependencies aren’t correctly linked, leading to build failures or incomplete archives. This blog post explores common problems in such integrations and provides solutions to ensure a smooth development experience.
Common Issues Encountered
1. CocoaPods Frameworks Not Found
After running pod install, you might notice that CocoaPods frameworks aren’t correctly linked in your CMake-generated Xcode project. This often results from incorrect FRAMEWORK_SEARCH_PATHS or LIBRARY_SEARCH_PATHS.
2. Empty Archives
When archiving the project in Xcode, the resulting .xcarchive might be empty or missing the .app bundle. This typically stems from misconfigured SKIP_INSTALL and INSTALL_PATH settings.
Steps Taken to Resolve the Issues
1. Adjusting Search Paths
To ensure that CocoaPods frameworks are correctly located, we set the FRAMEWORK_SEARCH_PATHS and LIBRARY_SEARCH_PATHS to point to the appropriate build directory:
set(POD_FRAMEWORK_PATH "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)")
set_target_properties(${PROJECT_NAME} PROPERTIES
XCODE_ATTRIBUTE_FRAMEWORK_SEARCH_PATHS "${POD_FRAMEWORK_PATH}"
XCODE_ATTRIBUTE_LIBRARY_SEARCH_PATHS "${POD_FRAMEWORK_PATH}")
2. Configuring Build Location
To utilize Xcode’s DerivedData for build outputs, we set the following CMake attributes:
set(CMAKE_XCODE_ATTRIBUTE_SYMROOT "") set(CMAKE_XCODE_ATTRIBUTE_OBJROOT "") set(CMAKE_XCODE_ATTRIBUTE_CONFIGURATION_BUILD_DIR "") set(CMAKE_XCODE_ATTRIBUTE_BUILD_LOCATION_STYLE "0") # 0 = DerivedData
3. Ensuring Proper Archiving
To include the .app bundle in the archive, we configured the SKIP_INSTALL and INSTALL_PATH settings:
set_target_properties(${PROJECT_NAME} PROPERTIES
XCODE_ATTRIBUTE_SKIP_INSTALL "NO"
XCODE_ATTRIBUTE_INSTALL_PATH "$(LOCAL_APPS_DIR)"
This ensures that the application is correctly packaged during the archiving process.
Final Solution
By implementing the above configurations, we achieved a seamless integration of CocoaPods into our CMake-based Xcode project. The project now builds and archives correctly, with all dependencies properly linked and the .app bundle included in the archive.
Bonus: Recommended Xcode Attributes in CMake
For optimal integration, consider setting the following Xcode attributes in your CMakeLists.txt:
set_target_properties(${PROJECT_NAME} PROPERTIES
XCODE_ATTRIBUTE_SKIP_INSTALL “NO”
XCODE_ATTRIBUTE_INSTALL_PATH “$(LOCAL_APPS_DIR)”
XCODE_ATTRIBUTE_FRAMEWORK_SEARCH_PATHS “$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)”
XCODE_ATTRIBUTE_LIBRARY_SEARCH_PATHS “$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)”
XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME “AppIcon”
XCODE_ATTRIBUTE_MARKETING_VERSION “1.0”
XCODE_ATTRIBUTE_CURRENT_PROJECT_VERSION “100”
)