iOSおよびAndroid用の自己構築cURL

こんにちは

私はcURLライブラリを使用するiOS / Android用のアプリケーションを開発しています。

最近まで、既製のlibcurlビルドを使用していました。



同時に、ライブラリのバージョンは異なりましたが、ヘッダーファイルは同じでした。

順序を復元するために、ライブラリを独自にアセンブルすることが決定されました。





モバイルプラットフォームの次のバージョンのサポートが期待されています。



IOSビルド


cURLダウンロードページには、iOSのライブラリバージョンへのリンクがあります。

その後、著者がiOS用のcURLの構築方法を詳細に説明しているページを見つけました。

iOS向けのビルドは、簡単な手順になります。

export CC="__llvm-gcc" export CFLAGS="-arch armv7 -arch armv7s -pipe -Os -gdwarf-2 -isysroot __iPhoneOS.sdk" export LDFLAGS="-arch armv7 -arch armv7s -isysroot __iPhoneOS.sdk" curl -O http://curl.haxx.se/download/curl-7.31.0.tar.gz tar -xzf curl-7.31.0.tar.gz cd curl-7.31.0 ./configure --disable-shared --enable-static --disable-dependency-tracking --host=armv7-apple-darwin make
      
      





iOSでHTTPSをサポートするには、-with-darwinsslスイッチを使用してcURLを構成するだけで十分です(iOS5以降のみ)。

以前のバージョンでは、OpenSSLを使用する必要があります。



Androidビルド


cURLのドキュメントには、Android用の2つのビルドメソッドがあります。



Android向けのビルドでは、2番目の方法が決定されました。

これを行うには、最初にmake-standalone-toolchain.shスクリプトを実行してツールチェーンを生成する必要があります

詳細については、Android NDK STANDALONE-TOOLCHAIN.htmlドキュメントをご覧ください。

私の場合、ツールチェーンのビルドは次のようになりました(MAC OS X、Android NDK r8e、android-14、gcc4.7):

 $NDK_ROOT/build/tools/make-standalone-toolchain.sh \ --platform=android-14 \ --install-dir=android-toolchain-gcc4.7 \ --toolchain=arm-linux-androideabi-4.7 \ --system=darwin-x86_64 #   NDK_ROOT       Android NDK
      
      





その結果、アームandroid-14およびツールチェーンgcc4.7のsysrootのコピーを含むディレクトリandroid-toolchain-gcc4.7が作成されます。

このツールチェーンは、Autotoolsビルドシステムを使用してAndroidプロジェクト用にビルドできます。

cURLアセンブリは次のようになります。

 $NDK_ROOT/build/tools/make-standalone-toolchain.sh --install-dir=toolchain bla-bla-bla export PATH=`pwd`/toolchain/bin:$PATH export CC=arm-linux-androideabi-gcc curl -O http://curl.haxx.se/download/curl-7.31.0.tar.gz tar -xzf curl-7.31.0.tar.gz cd curl-7.31.0 ./configure --disable-shared --enable-static --host=arm-linux-androideabi make
      
      





HTTPSをサポートするには、ソースからOpenSSLをさらにコンパイルする必要があります。



HTTPおよびHTTPSプロトコル(MAC OS X、Xcode 4.6.3、iOS SDK 6.1)をサポートするiOSおよびAndroid用のlibcurlを作成するためのスクリプトを次に示します。

build.sh
 #!/bin/bash mkdir -p include mkdir -p prebuilt/ios/device mkdir -p prebuilt/ios/simulator mkdir -p prebuilt/android/armeabi-v7a # 0. Make "standalone toolchain" for android if [ ! -d android-toolchain-gcc4.7 ] then $NDK_ROOT/build/tools/make-standalone-toolchain.sh --platform=android-14 --install-dir=android-toolchain-gcc4.7 --toolchain=arm-linux-androideabi-4.7 --system=darwin-x86_64 fi # 1. Get sources LIBCURL_SRC=curl-7.31.0 OPENSSL_SRC=openssl-1.0.1e LIBCURL_PAGE=http://curl.haxx.se/download OPENSSL_PAGE=http://www.openssl.org/source LIBCURL_ROOT=curl OPENSSL_ROOT=openssl # param 1: lib name # param 2: download page # param 3: symlink to source dir # exit with status 1 if downloading failed function download_and_unpack() { TARBALL=$1.tar.gz echo $TARBALL if [ ! -f $TARBALL ] then curl -O $2/$TARBALL || exit 1 rm -rf $1 tar -xzf $TARBALL rm $3 ln -s $1 $3 fi } download_and_unpack $LIBCURL_SRC $LIBCURL_PAGE $LIBCURL_ROOT download_and_unpack $OPENSSL_SRC $OPENSSL_PAGE $OPENSSL_ROOT # 2. Build sources CURL_EXTRA="--enable-ipv6 --disable-ftp --disable-file --disable-ldap --disable-ldaps --disable-rtsp --disable-proxy --disable-dict --disable-telnet --disable-tftp --disable-pop3 --disable-imap --disable-smtp --disable-gopher --disable-sspi --disable-manual" LIBCURL_BINARY=lib/.libs/libcurl.a CPU_COUNT=`sysctl -n hw.logicalcpu_max` export IPHONEOS_DEPLOYMENT_TARGET="5.0" # 2.1 Build cURL for iOS device (armv7, armv7s) pushd $LIBCURL_ROOT export CC="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-gcc-4.2" export CFLAGS="-arch armv7 -arch armv7s -pipe -Os -gdwarf-2 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk" export LDFLAGS="-arch armv7 -arch armv7s -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk" ./configure --disable-shared --enable-static --disable-dependency-tracking --host=armv7-apple-darwin --with-darwinssl $CURL_EXTRA || exit 1 make clean && make -j $CPU_COUNT || exit 1 cp -f $LIBCURL_BINARY ../prebuilt/ios/device popd # 2.2 Build cURL for iOS simulator (i386) pushd $LIBCURL_ROOT export CC="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/llvm-gcc-4.2" export CFLAGS="-arch i386 -pipe -Os -gdwarf-2 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk" export CPPFLAGS="-D__IPHONE_OS_VERSION_MIN_REQUIRED=${IPHONEOS_DEPLOYMENT_TARGET%%.*}0000" export LDFLAGS="-arch i386 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk" ./configure --disable-shared --enable-static --disable-dependency-tracking --host=i386-apple-darwin --with-darwinssl $CURL_EXTRA || exit 1 make clean && make -j $CPU_COUNT || exit 1 cp -f $LIBCURL_BINARY ../prebuilt/ios/simulator popd # 2.3.1 Build OpenSSL for Android pushd $OPENSSL_ROOT # See 0 above export PATH=`pwd`/../android-toolchain-gcc4.7/bin:$PATH export CC=arm-linux-androideabi-gcc export CXX=arm-linux-androideabi-g++ export AR=arm-linux-androideabi-ar export RANLIB=arm-linux-androideabi-ranlib ./Configure android-armv7 no-shared || exit 1 make clean && make build_crypto build_ssl -j $CPU_COUNT || exit 1 cp -f libcrypto.a ../prebuilt/android/armeabi-v7a cp -f libssl.a ../prebuilt/android/armeabi-v7a popd # 2.3.2 Build CURL for Android pushd $LIBCURL_ROOT OPENSSL=`pwd`/../openssl export CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16" export CPPFLAGS=-DANDROID export LDFLAGS="-march=armv7-a -Wl,--fix-cortex-a8 -L$OPENSSL" ./configure --disable-shared --enable-static --host=arm-linux-androideabi --with-random=/dev/urandom --with-ssl=$OPENSSL --without-ca-bundle --without-ca-path --with-zlib $CURL_EXTRA || exit 1 make clean && make -j $CPU_COUNT || exit 1 cp -f $LIBCURL_BINARY ../prebuilt/android/armeabi-v7a popd # 3 Copy headers cp -f ./curl/include/curl/*.h ./include
      
      







主な手順:



コンパイルされたライブラリは、ビルド済みディレクトリにコピーされ、ヘッダーファイルがインクルードされます。

Androidの以前のバージョンをサポートするには、適切なスタンドアロンツールチェーンを構築する必要があります。



関連リンク:

cURLの公式アセンブリドキュメント

iOSのCURLビルド手順

Android NDKスタンドアロンツールチェーン



All Articles