CMakeの「Properties: Targets」における「IOS_INSTALL_COMBINED」プロパティとは? 詳細解説とサンプルコード
導入経緯と注意点
このプロパティは CMake 3.5 で導入されましたが、CMake 3.28 で非推奨となり、現在は xcframeworks の使用が推奨されています。xcframeworks は、さまざまなプラットフォーム用のバイナリを個別に格納できるため、より柔軟なアーキテクチャサポートを提供します。
機能
設定方法
このプロパティは、ターゲットの CMakeLists.txt ファイルで以下のように設定できます。
set_target_properties(my_target PROPERTIES IOS_INSTALL_COMBINED TRUE)
- xcframeworks は、より柔軟なアーキテクチャサポートとバージョン管理を提供するため、多くの場合、ユニバーサルバイナリよりも推奨されます。
- ユニバーサルバイナリは、すべての対象アーキテクチャで実行可能な単一のファイルです。
- 対象となるアーキテクチャがデバイス SDK とシミュレータ SDK の両方で利用可能である場合、そのアーキテクチャは CMAKE_OSX_SYSROOT で選択された SDK に対してのみビルドされます。
cmake_minimum_required(VERSION 3.5)
project(my_library)
set(SOURCE_FILES main.cpp helper.c)
add_library(my_library STATIC ${SOURCE_FILES})
target_link_libraries(my_library mbedTLS)
set_target_properties(my_library PROPERTIES
IOS_INSTALL_COMBINED TRUE
)
install(TARGETS my_library DESTINATION lib)
説明
cmake_minimum_required
コマンドで、必要な CMake の最小バージョンを指定します。project
コマンドで、プロジェクトの名前を設定します。set
コマンドで、ソースファイルのリストを設定します。add_library
コマンドで、ライブラリを作成します。target_link_libraries
コマンドで、ライブラリのリンク先ライブラリを設定します。set_target_properties
コマンドで、"IOS_INSTALL_COMBINED" プロパティをTRUE
に設定します。install
コマンドで、ライブラリをインストールします。
このコードを実行すると、my_library
という名前のユニバーサルライブラリが /lib
ディレクトリにインストールされます。このライブラリは、iOS デバイスとシミュレータの両方で使用できます。
- ユニバーサルバイナリを生成するには、Xcode 6 以降が必要です。
- ライブラリに依存関係がある場合は、
target_link_libraries
コマンドで追加できます。 - この例では、静的ライブラリを作成しています。共有ライブラリを作成するには、
add_shared_library
コマンドを使用します。
xcframeworks の使用
xcframeworks は、iOS アプリケーション用のバイナリとメタデータを格納するフレームワーク形式です。xcframeworks は、さまざまなプラットフォームとアーキテクチャをサポートするように設計されており、コードの再利用と配布を容易にします。
xcframeworks を使用するには、以下の手順が必要です。
- ターゲットの CMakeLists.txt ファイルで
xcframework
モジュールを使用します。 - xcframework を生成するために
xcodebuild
コマンドを使用します。 - 生成された xcframework をプロジェクトに追加します。
例:xcframework を使用したユニバーサルライブラリの作成
cmake_minimum_required(VERSION 3.28)
project(my_library)
set(SOURCE_FILES main.cpp helper.c)
add_library(my_library STATIC ${SOURCE_FILES})
target_link_libraries(my_library mbedTLS)
# xcframework モジュールを使用します
add_xcframework(my_xcframework LIBRARY my_library)
# xcframework を生成するために xcodebuild コマンドを使用します
set_property(TARGET my_xcframework XCODE_ATTRIBUTE_TARGET_IPHONE_OS_DEPLOYMENT_TARGET 10.0)
set_property(TARGET my_xcframework XCODE_ATTRIBUTE_SDK_FRAMEWORK_NAME my_framework)
set_property(TARGET my_xcframework XCODE_ATTRIBUTE_CURRENT_VERSION 1.0)
# 生成された xcframework をプロジェクトに追加します
install(TARGETS my_xcframework DESTINATION Frameworks)
手動でユニバーサルバイナリを生成する
"IOS_INSTALL_COMBINED" プロパティを使用しない場合は、手動でユニバーサルバイナリを生成することもできます。これを行うには、以下の手順が必要です。
- ターゲットの CMakeLists.txt ファイルで、すべての対象アーキテクチャに対してターゲットをビルドします。
例:手動でユニバーサルバイナリを生成する
cmake_minimum_required(VERSION 3.5)
project(my_library)
set(SOURCE_FILES main.cpp helper.c)
# デバイス SDK とシミュレータ SDK の両方に対してターゲットをビルドします
add_executable(my_target_arm64 arm64 ${SOURCE_FILES})
add_executable(my_target_armv7 armv7 ${SOURCE_FILES})
add_executable(my_target_x86_64 x86_64 ${SOURCE_FILES})
add_executable(my_target_i386 i386 ${SOURCE_FILES})
# lipo ツールを使用してユニバーサルバイナリを生成します
set(UNIVERSAL_BINARY ${CMAKE_BINARY_DIR}/my_library)
list(APPEND LIPO_ARGS ${CMAKE_BINARY_DIR}/my_target_arm64)
list(APPEND LIPO_ARGS ${CMAKE_BINARY_DIR}/my_target_armv7)
list(APPEND LIPO_ARGS ${CMAKE_BINARY_DIR}/my_target_x86_64)
list(APPEND LIPO_ARGS ${CMAKE_BINARY_DIR}/my_target_i386)
add_custom_command(TARGET my_library COMMAND lipo ${LIPO_ARGS} -o ${UNIVERSAL_BINARY})
# ユニバーサルバイナリをインストールします
install(TARGETS my_library DESTINATION bin)
上記以外にも、"IOS_INSTALL_COMBINED" プロパティの代替方法はいくつかあります。
- Bitcode を使用する: Bitcode は、Apple が提供するバイナリコードの中間表現です。Bitcode を使用すると、後で異なるアーキテクチャ用にアプリを再コンパイルできます。
- Fat Ninja を使用する: Fat Ninja は、iOS アプリケーション用のユニバーサルバイナリを簡単に作成できるツールです。