mirror of
https://github.com/Relintai/sdl2_frt.git
synced 2024-11-21 20:47:19 +01:00
0e45984fa0
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().
278 lines
7.7 KiB
Bash
Executable File
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
|