|  | #!/bin/sh | 
|  | # | 
|  | # Build a fat binary for iOS | 
|  | # Based on fatbuild.sh and code from the Ignifuga Game Engine | 
|  |  | 
|  | # Number of CPUs (for make -j) | 
|  | NCPU=`sysctl -n hw.ncpu` | 
|  | if test x$NJOB = x; then | 
|  | NJOB=$NCPU | 
|  | fi | 
|  |  | 
|  | # SDK path | 
|  | XCODE_PATH=`xcode-select --print-path` | 
|  | if [ -z "$XCODE_PATH" ]; then | 
|  | echo "Could not find XCode location (use xcode-select -switch to set the correct path)" | 
|  | exit 1 | 
|  | fi | 
|  |  | 
|  | prepare_environment() { | 
|  | ARCH=$1 | 
|  |  | 
|  | if test x$SDK_VERSION = x; then | 
|  | export SDK_VERSION=`xcodebuild -showsdks | grep iphoneos | sed "s|.*iphoneos||"` | 
|  | if [ -z "$XCODE_PATH" ]; then | 
|  | echo "Could not find a valid iOS SDK" | 
|  | exit 1 | 
|  | fi | 
|  | fi | 
|  |  | 
|  | case $ARCH in | 
|  | armv6) | 
|  | DEV_PATH="$XCODE_PATH/Platforms/iPhoneOS.platform/Developer" | 
|  | SDK_PATH="$DEV_PATH/SDKs/iPhoneOS$SDK_VERSION.sdk" | 
|  | ;; | 
|  | armv7) | 
|  | DEV_PATH="$XCODE_PATH/Platforms/iPhoneOS.platform/Developer" | 
|  | SDK_PATH="$DEV_PATH/SDKs/iPhoneOS$SDK_VERSION.sdk" | 
|  | ;; | 
|  | i386) | 
|  | DEV_PATH="$XCODE_PATH/Platforms/iPhoneSimulator.platform/Developer" | 
|  | SDK_PATH="$DEV_PATH/SDKs/iPhoneSimulator$SDK_VERSION.sdk" | 
|  | ;; | 
|  | *) | 
|  | echo "Unknown Architecture $ARCH" | 
|  | exit 1 | 
|  | ;; | 
|  | esac | 
|  |  | 
|  | if [ ! -d "$SDK_PATH" ]; then | 
|  | echo "Could not find iOS SDK at $SDK_PATH" | 
|  | exit 1 | 
|  | fi | 
|  |  | 
|  | if test x$MIN_OS_VERSION = x; then | 
|  | export MIN_OS_VERSION="3.0" | 
|  | fi | 
|  |  | 
|  | # Environment flags | 
|  | CFLAGS="-g -O2 -pipe -no-cpp-precomp -isysroot $SDK_PATH \ | 
|  | -miphoneos-version-min=$MIN_OS_VERSION -I$SDK_PATH/usr/include/" | 
|  | LDFLAGS="-L$SDK_PATH/usr/lib/ -isysroot $SDK_PATH \ | 
|  | -miphoneos-version-min=$MIN_OS_VERSION -static-libgcc" | 
|  | export CXXFLAGS="$CFLAGS" | 
|  | export CXXCPP="$DEV_PATH/usr/bin/llvm-cpp-4.2" | 
|  | export CPP="$CXXCPP" | 
|  | export CXX="$DEV_PATH/usr/bin/llvm-g++-4.2" | 
|  | export CC="$DEV_PATH/usr/bin/llvm-gcc-4.2" | 
|  | export LD="$DEV_PATH/usr/bin/ld" | 
|  | export AR="$DEV_PATH/usr/bin/ar" | 
|  | export AS="$DEV_PATH/usr/bin/ls" | 
|  | export NM="$DEV_PATH/usr/bin/nm" | 
|  | export RANLIB="$DEV_PATH/usr/bin/ranlib" | 
|  | export STRIP="$DEV_PATH/usr/bin/strip" | 
|  |  | 
|  | # We dynamically load X11, so using the system X11 headers is fine. | 
|  | CONFIG_FLAGS="--disable-shared --enable-static" | 
|  |  | 
|  | case $ARCH in | 
|  | armv6) | 
|  | export CONFIG_FLAGS="$CONFIG_FLAGS --host=armv6-apple-darwin" | 
|  | export CFLAGS="$CFLAGS -arch armv6" | 
|  | export LDFLAGS="$LDFLAGS -arch armv6" | 
|  | ;; | 
|  | armv7) | 
|  | export CONFIG_FLAGS="$CONFIG_FLAGS --host=armv7-apple-darwin" | 
|  | export CFLAGS="$CFLAGS -arch armv7" | 
|  | export LDFLAGS="$LDFLAGS -arch armv7" | 
|  | ;; | 
|  | i386) | 
|  | export CONFIG_FLAGS="$CONFIG_FLAGS --host=i386-apple-darwin" | 
|  | export CFLAGS="$CFLAGS -arch i386" | 
|  | export LDFLAGS="$LDFLAGS -arch i386" | 
|  | ;; | 
|  | *) | 
|  | echo "Unknown Architecture $ARCH" | 
|  | exit 1 | 
|  | ;; | 
|  | esac | 
|  | } | 
|  |  | 
|  | prepare_environment "armv6" | 
|  | echo "Building with iOS SDK v$SDK_VERSION for iOS >= $MIN_OS_VERSION" | 
|  |  | 
|  | # | 
|  | # Find the configure script | 
|  | # | 
|  | srcdir=`dirname $0`/.. | 
|  | srcdir=`cd $srcdir && pwd` | 
|  | auxdir=$srcdir/build-scripts | 
|  | cd $srcdir | 
|  |  | 
|  | # | 
|  | # Figure out which phase to build: | 
|  | # all, | 
|  | # configure, configure-armv6, configure-armv7, configure-i386 | 
|  | # make, make-armv6, make-armv7, make-i386, merge | 
|  | # clean | 
|  | if test x"$1" = x; then | 
|  | phase=all | 
|  | else | 
|  | phase="$1" | 
|  | fi | 
|  | case $phase in | 
|  | all) | 
|  | configure_armv6="yes" | 
|  | configure_armv7="yes" | 
|  | configure_i386="yes" | 
|  | make_armv6="yes" | 
|  | make_armv7="yes" | 
|  | make_i386="yes" | 
|  | merge="yes" | 
|  | ;; | 
|  | configure) | 
|  | configure_armv6="yes" | 
|  | configure_armv7="yes" | 
|  | configure_i386="yes" | 
|  | ;; | 
|  | configure-armv6) | 
|  | configure_armv6="yes" | 
|  | ;; | 
|  | configure-armv7) | 
|  | configure_armv7="yes" | 
|  | ;; | 
|  | configure-i386) | 
|  | configure_i386="yes" | 
|  | ;; | 
|  | make) | 
|  | make_armv6="yes" | 
|  | make_armv7="yes" | 
|  | make_i386="yes" | 
|  | merge="yes" | 
|  | ;; | 
|  | make-armv6) | 
|  | make_armv6="yes" | 
|  | ;; | 
|  | make-armv7) | 
|  | make_armv7="yes" | 
|  | ;; | 
|  | make-i386) | 
|  | make_i386="yes" | 
|  | ;; | 
|  | merge) | 
|  | merge="yes" | 
|  | ;; | 
|  | clean) | 
|  | clean_armv6="yes" | 
|  | clean_armv7="yes" | 
|  | clean_i386="yes" | 
|  | ;; | 
|  | clean-armv6) | 
|  | clean_armv6="yes" | 
|  | ;; | 
|  | clean-armv7) | 
|  | clean_armv7="yes" | 
|  | ;; | 
|  | clean-i386) | 
|  | clean_i386="yes" | 
|  | ;; | 
|  | *) | 
|  | echo "Usage: $0 [all|configure[-armv6|-armv7|-i386]|make[-armv6|-armv7|-i386]|merge|clean[-armv6|-armv7|-i386]]" | 
|  | exit 1 | 
|  | ;; | 
|  | esac | 
|  |  | 
|  | # | 
|  | # Create the build directories | 
|  | # | 
|  | for dir in build build/armv6 build/armv7 build/i386; do | 
|  | if test -d $dir; then | 
|  | : | 
|  | else | 
|  | mkdir $dir || exit 1 | 
|  | fi | 
|  | done | 
|  |  | 
|  | # | 
|  | # Build the armv6 binary | 
|  | # | 
|  | prepare_environment "armv6" | 
|  | if test x$configure_armv6 = xyes; then | 
|  | (cd build/armv6 && \ | 
|  | sh ../../configure $CONFIG_FLAGS CC="$CC" CXX="$CXX" CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS") || exit 2 | 
|  | # configure is not yet fully ready for iOS, some manual patching is required | 
|  | cp include/* build/armv6/include | 
|  | cp include/SDL_config_iphoneos.h build/armv6/include/SDL_config.h || exit 2 | 
|  | sed -i "" -e "s|^EXTRA_CFLAGS.*|EXTRA_CFLAGS=-I./include|g" build/armv6/Makefile || exit 2 | 
|  | sed -i "" -e "s|^EXTRA_LDFLAGS.*|EXTRA_LDFLAGS=-lm|g" build/armv6/Makefile || exit 2 | 
|  | fi | 
|  | if test x$make_armv6 = xyes; then | 
|  | (cd build/armv6 && make -j$NJOB) || exit 3 | 
|  | fi | 
|  | # | 
|  | # Build the armv7 binary | 
|  | # | 
|  | prepare_environment "armv7" | 
|  | if test x$configure_armv7 = xyes; then | 
|  | (cd build/armv7 && \ | 
|  | sh ../../configure $CONFIG_FLAGS CC="$CC" CXX="$CXX" CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS") || exit 2 | 
|  | # configure is not yet fully ready for iOS, some manual patching is required | 
|  | cp include/* build/armv7/include | 
|  | cp include/SDL_config_iphoneos.h build/armv7/include/SDL_config.h || exit 2 | 
|  | sed -i "" -e "s|^EXTRA_CFLAGS.*|EXTRA_CFLAGS=-I./include|g" build/armv7/Makefile || exit 2 | 
|  | sed -i "" -e "s|^EXTRA_LDFLAGS.*|EXTRA_LDFLAGS=-lm|g" build/armv7/Makefile || exit 2 | 
|  | fi | 
|  | if test x$make_armv7 = xyes; then | 
|  | (cd build/armv7 && make -j$NJOB) || exit 3 | 
|  | fi | 
|  | # | 
|  | # Build the i386 binary | 
|  | # | 
|  | prepare_environment "i386" | 
|  | if test x$configure_i386 = xyes; then | 
|  | (cd build/i386 && \ | 
|  | sh ../../configure $CONFIG_FLAGS CC="$CC" CXX="$CXX" CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS") || exit 2 | 
|  | # configure is not yet fully ready for iOS, some manual patching is required | 
|  | cp include/* build/i386/include | 
|  | cp include/SDL_config_iphoneos.h build/i386/include/SDL_config.h || exit 2 | 
|  | sed -i "" -e "s|^EXTRA_CFLAGS.*|EXTRA_CFLAGS=-I./include|g" build/i386/Makefile || exit 2 | 
|  | sed -i "" -e "s|^EXTRA_LDFLAGS.*|EXTRA_LDFLAGS=-lm|g" build/i386/Makefile || exit 2 | 
|  | fi | 
|  | if test x$make_i386 = xyes; then | 
|  | (cd build/i386 && make -j$NJOB) || exit 3 | 
|  | fi | 
|  |  | 
|  | # | 
|  | # Combine into fat binary | 
|  | # | 
|  | if test x$merge = xyes; then | 
|  | output=ios/lib | 
|  | sh $auxdir/mkinstalldirs build/$output | 
|  | cd build | 
|  | target=`find . -mindepth 4 -maxdepth 4 -type f -name '*.dylib' | head -1 | sed 's|.*/||'` | 
|  | (lipo -create -o $output/libSDL2.a armv6/build/.libs/libSDL2.a armv7/build/.libs/libSDL2.a i386/build/.libs/libSDL2.a && | 
|  | lipo -create -o $output/libSDL2main.a armv6/build/libSDL2main.a armv7/build/libSDL2main.a i386/build/libSDL2main.a && | 
|  | cp -r armv6/include ios | 
|  | echo "Build complete!" && | 
|  | echo "Files can be found under the build/ios directory.") || exit 4 | 
|  | cd .. | 
|  | fi | 
|  |  | 
|  | # | 
|  | # Clean up | 
|  | # | 
|  | do_clean() | 
|  | { | 
|  | echo $* | 
|  | $* || exit 6 | 
|  | } | 
|  | if test x$clean_armv6 = xyes; then | 
|  | do_clean rm -r build/armv6 | 
|  | fi | 
|  | if test x$clean_armv7 = xyes; then | 
|  | do_clean rm -r build/armv7 | 
|  | fi | 
|  | if test x$clean_i386 = xyes; then | 
|  | do_clean rm -r build/i386 | 
|  | fi |