Edit

kc3-lang/SDL/build-scripts/iosbuild.sh

Branch :

  • Show log

    Commit

  • Author : Philipp Wiesemann
    Date : 2015-06-21 17:33:46
    Hash : 0e45984f
    Message : Fixed crash if initialization of EGL failed but was tried again later. The internal function SDL_EGL_LoadLibrary() did not delete and remove a mostly uninitialized data structure if loading the library first failed. A later try to use EGL then skipped initialization and assumed it was previously successful because the data structure now already existed. This led to at least one crash in the internal function SDL_EGL_ChooseConfig() because a NULL pointer was dereferenced to make a call to eglBindAPI().

  • build-scripts/iosbuild.sh
  • #!/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