This repository has been archived by the owner on Feb 11, 2021. It is now read-only.
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Adds a simple command line utility (iosbuild.sh) to create iOS binari…
…es for armv6, armv7 and i386
- Loading branch information
Showing
2 changed files
with
297 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,277 @@ | ||
#!/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" | ||
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 */build/.libs/libSDL2.a && | ||
lipo -create -o $output/libSDL2main.a */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 |