SDL/build-scripts/iosbuild.sh
Philipp Wiesemann 0e45984fa0 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().
2015-06-21 17:33:46 +02:00

278 lines
7.7 KiB
Bash
Executable file

#!/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