ICU を iOS 向けにビルドする方法について説明します。

https://github.com/zhm/icu-ios というリポジトリに armv7 や x86_64 向けの universal binary を生成するスクリプトと icu のソースコードが付属しているので、簡単にビルドすることができます。

CMakeLists.txt は以下のようになります。googletest の設定や Linux 向けに ICU をビルドする設定は無視してください。

cmake_minimum_required(VERSION 3.0.0)

project(MyGreatProject)

include(ExternalProject)

ExternalProject_Add(gtest_project
    PREFIX "${CMAKE_SOURCE_DIR}/vendor/gtest"
    URL "https://googletest.googlecode.com/files/gtest-1.7.0.zip"
    CONFIGURE_COMMAND ${CMAKE_COMMAND} . -DCMAKE_CXX_FLAGS=-std=c++11
    BUILD_COMMAND ${CMAKE_MAKE_PROGRAM}
    INSTALL_COMMAND sh -c "install -d <INSTALL_DIR>/include/gtest/internal <INSTALL_DIR>/lib"
    COMMAND sh -c "install -m 644 <SOURCE_DIR>/include/gtest/*.h <INSTALL_DIR>/include/gtest/"
    COMMAND sh -c "install -m 644 <SOURCE_DIR>/include/gtest/internal/*.h <INSTALL_DIR>/include/gtest/internal/"
    COMMAND sh -c "install -m 644 <BINARY_DIR>/libgtest.a <INSTALL_DIR>/lib/"
    BUILD_IN_SOURCE 1
    )

set(ICU_PREFIX ${CMAKE_SOURCE_DIR}/vendor/icu)
set(ICU_CONFIGURE_OPTIONS "--prefix <INSTALL_DIR> --enable-static --disable-shared")
if (Apple)
    set(ICU_IOS_SOURCE_DIR "<SOURCE_DIR>/icu/source/")
    ExternalProject_Add(icu_project
        GIT_REPOSITORY https://github.com/zhm/icu-ios.git
        GIT_TAG master
        PREFIX ${ICU_PREFIX}
        CONFIGURE_COMMAND cd ${ICU_IOS_SOURCE_DIR} && ./runConfigureICU MacOSX ${ICU_CONFIGURE_OPTIONS}
        BUILD_COMMAND ./build.sh && cd ${ICU_IOS_SOURCE_DIR} && ${CMAKE_MAKE_PROGRAM}
        INSTALL_COMMAND cd ${ICU_IOS_SOURCE_DIR} && ${CMAKE_MAKE_PROGRAM} install
        COMMAND sh -c "install -d <INSTALL_DIR>/lib"
        COMMAND sh -c "install -m 644 build-universal/*.a <INSTALL_DIR>/lib/"
        BUILD_IN_SOURCE 1
        )
else(Linux)
    ExternalProject_Add(icu_project
        SVN_REPOSITORY http://source.icu-project.org/repos/icu/icu/tags/release-54-1/
        PREFIX ${ICU_PREFIX}
        CONFIGURE_COMMAND cd <SOURCE_DIR>/source/ && ./runConfigureICU Linux ${ICU_CONFIGURE_OPTIONS}
        BUILD_COMMAND cd <SOURCE_DIR>/source && ${CMAKE_MAKE_PROGRAM}
        INSTALL_COMMAND cd <SOURCE_DIR>/source && ${CMAKE_MAKE_PROGRAM} install
        BUILD_IN_SOURCE 1
        )
endif()

set(SOURCES ${CMAKE_SOURCE_DIR}/src/main.cpp)

include_directories(
  ${CMAKE_SOURCE_DIR}/vendor/icu/include
  )

link_directories(
  ${CMAKE_SOURCE_DIR}/vendor/icu/lib
  )

add_library(MyGreatProject SHARED ${SOURCES})

target_link_libraries(MyGreatProject SHARED icuuc)

add_dependencies(MyGreatProject gtest_project icu_project)

ヘッダーをインストールするためだけに一度余分に ICU をビルドしていることもあり、ビルドにはそれなりに時間がかかります。

インストールできたら XCode の include ディレクトリと lib ディレクトリの設定に、${CMAKE_SOURCE_DIR}/vendor/include, ${CMAKE_SOURCE_DIR}/vendor/lib をそれぞれ追加します。icu-ios/build-universal ディレクトリにバイナリが生成されるので、直接そのディレクトリを指定してもよいでしょう。

ポイントとしては、

  • ICU を static ライブラリとしてビルドしていること(iOS アプリは基本的には dynamic link が許可されていません。iOS 8 では dynamic link できるようになったという話もありますが。)
  • ヘッダーファイルをインストールするために runConfigureICU で ICU を独自にビルドしていること

でしょうか。

以上、icu-ios を cmake でビルドする方法について紹介しました。