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)

説明

  1. cmake_minimum_required コマンドで、必要な CMake の最小バージョンを指定します。
  2. project コマンドで、プロジェクトの名前を設定します。
  3. set コマンドで、ソースファイルのリストを設定します。
  4. add_library コマンドで、ライブラリを作成します。
  5. target_link_libraries コマンドで、ライブラリのリンク先ライブラリを設定します。
  6. set_target_properties コマンドで、"IOS_INSTALL_COMBINED" プロパティを TRUE に設定します。
  7. install コマンドで、ライブラリをインストールします。

このコードを実行すると、my_library という名前のユニバーサルライブラリが /lib ディレクトリにインストールされます。このライブラリは、iOS デバイスとシミュレータの両方で使用できます。

  • ユニバーサルバイナリを生成するには、Xcode 6 以降が必要です。
  • ライブラリに依存関係がある場合は、target_link_libraries コマンドで追加できます。
  • この例では、静的ライブラリを作成しています。共有ライブラリを作成するには、add_shared_library コマンドを使用します。


xcframeworks の使用

xcframeworks は、iOS アプリケーション用のバイナリとメタデータを格納するフレームワーク形式です。xcframeworks は、さまざまなプラットフォームとアーキテクチャをサポートするように設計されており、コードの再利用と配布を容易にします。

xcframeworks を使用するには、以下の手順が必要です。

  1. ターゲットの CMakeLists.txt ファイルで xcframework モジュールを使用します。
  2. xcframework を生成するために xcodebuild コマンドを使用します。
  3. 生成された 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" プロパティを使用しない場合は、手動でユニバーサルバイナリを生成することもできます。これを行うには、以下の手順が必要です。

  1. ターゲットの 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 アプリケーション用のユニバーサルバイナリを簡単に作成できるツールです。