技術開発日記

技術やら日々思ったことを綴ってます。

xcodebuildで32bit、64bitのライブラリをビルドするスクリプト

xcodebuildを使って32bitと64bitの静的ライブラリをビルドする簡単なスクリプトを作りました。

最終的な成果物としては、指定した出力先に、ビルドしてlipoでくっつけた32bitと64bitの静的ライブラリが配布される感じです。

#!/bin/sh
#----------------------------編集項目----------------------------#
#成果物の出力先
OUTPUT_PATH="/Users/xxx/Desktop"

#プロジェクトのrootパス
ROOT="/Users/xxx/Sample/"

#Xcodeのプロジェクト
PROJECT_PATH="${ROOT}/SampleSDK.xcodeproj"

#Target名
TARGET_NAME="SampleSDK"
#----------------------------------------------------------------#
#実機用
IOS_SDK="iphoneos"

#シミュレーター用
SIMULATOR_SDK="iphonesimulator"

#Deployment Target for 32bit
DEPLOYMENT_TARGET_32="4.3"

#Deployment Target for 64bit
DEPLOYMENT_TARGET_64="7.0"

#Config("Release""Debug")
CONFIG="Release"

#32bitアーキテクチャ
ARCHS_IOS_32BIT="armv7 armv7s"

#64bitアーキテクチャ
ARCHS_IOS_64BIT="armv7 armv7s arm64"

#32bitシュミレータアーキテクチャ
ARCHS_SIM_32BIT="i386"

#64bitシュミレータアーキテクチャ(i386も追加しないとシュミレータで動作しない)
ARCHS_SIM_64BIT="x86_64 i386"
#------------------------------#
#前準備                        #
#------------------------------#
#tmpディレクトリを作成
ios32=`mktemp -d ios32.XXXXXX`
sim32=`mktemp -d sim32.XXXXXX`
ios64=`mktemp -d ios64.XXXXXX`
sim64=`mktemp -d sim64.XXXXXX`
#現在のパスを取得
currentPath=`pwd`
#------------------------------#
#ビルド                        #
#------------------------------#
#32bit用にビルド
xcodebuild -project "${PROJECT_PATH}" -target "${TARGET_NAME}" -sdk "${IOS_SDK}" IPHONEOS_DEPLOYMENT_TARGET="${DEPLOYMENT_TARGET_32}" ARCHS="${ARCHS_IOS_32BIT}"  ONLY_ACTIVE_ARCH=NO clean build TARGET_BUILD_DIR="${currentPath}/${ios32}"
xcodebuild -project "${PROJECT_PATH}" -target "${TARGET_NAME}" -sdk "${SIMULATOR_SDK}" IPHONEOS_DEPLOYMENT_TARGET="${DEPLOYMENT_TARGET_32}" ARCHS="${ARCHS_SIM_32BIT}"  ONLY_ACTIVE_ARCH=NO clean build TARGET_BUILD_DIR="${currentPath}/${sim32}"

#64bit用にビルド
xcodebuild -project "${PROJECT_PATH}" -target "${TARGET_NAME}" -sdk "${IOS_SDK}" IPHONEOS_DEPLOYMENT_TARGET="${DEPLOYMENT_TARGET_64}" ARCHS="${ARCHS_IOS_64BIT}"  ONLY_ACTIVE_ARCH=NO clean build TARGET_BUILD_DIR="${currentPath}/${ios64}"
xcodebuild -project "${PROJECT_PATH}" -target "${TARGET_NAME}" -sdk "${SIMULATOR_SDK}" IPHONEOS_DEPLOYMENT_TARGET="${DEPLOYMENT_TARGET_64}" ARCHS="${ARCHS_SIM_64BIT}"  ONLY_ACTIVE_ARCH=NO clean build TARGET_BUILD_DIR="${currentPath}/${sim64}"
#------------------------------#
#ライブラリ生成                #
#------------------------------#
#32bitライブラリを作成
lipo ${currentPath}/${ios32}/lib${TARGET_NAME}.a ${currentPath}/${sim32}/lib${TARGET_NAME}.a -create -output ${OUTPUT_PATH}/lib${TARGET_NAME}.a

#64bitライブラリを作成
lipo ${currentPath}/${ios64}/lib${TARGET_NAME}.a ${currentPath}/${sim64}/lib${TARGET_NAME}.a -create -output ${OUTPUT_PATH}/lib${TARGET_NAME}.a
#------------------------------#
#後始末                        #
#------------------------------#
#tmpディレクトリを削除
rm -r ${ios32}
rm -r ${sim32}
rm -r ${ios64}
rm -r ${sim64}

exit 0


あと、最終的に生成されたライブラリがどんなアーキテクチャに対応しているかは、以下のコマンドで確認できるとのこと。

xcrun lipo -info xxxx/libSample.a


参考:
Static libs with support to iOS 5 and arm64 - Doing things the hard way...
【iPhone】64bitの静的ライブラリをビルドする方法