Run virtual machines on iOS
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

392 lines
11 KiB

#!/bin/sh
# Based off of https://github.com/szanni/ios-autotools/blob/master/iconfigure
# Copyright (c) 2014, Angelo Haller
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
set -e
# Include URL list
source "$(dirname $0)/sources"
# Directories
BUILD_DIR="build"
PATCHES_DIR="patches"
SYSROOT_DIR="sysroot"
# Printing coloured lines
GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m'
# Build environment
CHOST=
SDK=
SDKMINVER="8.0"
NCPU=$(sysctl -n hw.ncpu)
command -v realpath >/dev/null 2>&1 || realpath() {
[[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}
[ -d "$SYSROOT_DIR" ] || mkdir -p "$SYSROOT_DIR"
PREFIX="$(realpath "$SYSROOT_DIR")"
usage () {
echo "Usage: [VARIABLE...] $(basename $0) [-a architecture] [-d] [-r] [-q]"
echo ""
echo " -a architecture Target architecture. Default arm64. [armv7|armv7s|arm64|i386|x86_64]"
echo " -d, --download Force re-download of source even if already downloaded."
echo " -r, --rebuild Build only. Do not download, patch, configure."
echo " -q, --qemu Build qemu only. Do not build other projects."
echo ""
echo " VARIABLEs are:"
echo " SDKVERSION Target a specific SDK version."
echo " CHOST Configure host, set if not deducable by ARCH."
echo " SDK SDK target, set if not deducable by ARCH. [iphoneos|iphonesimulator]"
echo ""
echo " CFLAGS CPPFLAGS CXXFLAGS LDFLAGS PKG_CONFIG_PATH"
echo ""
exit 1
}
check_env () {
command -v pkg-config >/dev/null 2>&1 || { echo >&2 "${RED}You must install 'pkg-config' on your host machine.${NC}"; exit 1; }
command -v msgfmt >/dev/null 2>&1 || { echo >&2 "${RED}You must install 'gettext' on your host machine.\n\t'msgfmt' needs to be in your \$PATH as well.${NC}"; exit 1; }
command -v glib-mkenums >/dev/null 2>&1 || { echo >&2 "${RED}You must install 'glib' on your host machine.\n\t'glib-mkenums' needs to be in your \$PATH as well.${NC}"; exit 1; }
command -v gpg-error-config >/dev/null 2>&1 || { echo >&2 "${RED}You must install 'libgpg-error' on your host machine.\n\t'gpg-error-config' needs to be in your \$PATH as well.${NC}"; exit 1; }
command -v xcrun >/dev/null 2>&1 || { echo >&2 "${RED}'xcrun' is not found. Make sure you are running on OSX."; exit 1; }
command -v otool >/dev/null 2>&1 || { echo >&2 "${RED}'otool' is not found. Make sure you are running on OSX."; exit 1; }
command -v install_name_tool >/dev/null 2>&1 || { echo >&2 "${RED}'install_name_tool' is not found. Make sure you are running on OSX."; exit 1; }
# TODO: check bison version >= 2.4
}
download () {
URL=$1
FILE="$(basename $URL)"
NAME="${FILE%.tar.*}"
TARGET="$BUILD_DIR/$FILE"
DIR="$BUILD_DIR/$NAME"
PATCH="$PATCHES_DIR/${NAME}.patch"
if [ -f "$TARGET" -a -z "$REDOWNLOAD" ]; then
echo "${GREEN}$TARGET already downloaded! Run with -d to force re-download.${NC}"
else
echo "${GREEN}Downloading ${URL}...${NC}"
curl -L -O "$URL"
mv "$FILE" "$TARGET"
fi
if [ -d "$DIR" ]; then
echo "${GREEN}Deleting existing build directory ${DIR}...${NC}"
rm -rf "$DIR"
fi
echo "${GREEN}Unpacking ${NAME}...${NC}"
tar -xf "$TARGET" -C "$BUILD_DIR"
if [ -f "$PATCH" ]; then
echo "${GREEN}Patching ${NAME}...${NC}"
patch -d "$DIR" -p1 < "$PATCH"
fi
}
download_all () {
[ -d "$BUILD_DIR" ] || mkdir -p "$BUILD_DIR"
download $FFI_SRC
download $ICONV_SRC
download $GETTEXT_SRC
download $PNG_SRC
download $JPEG_TURBO_SRC
download $GLIB_SRC
download $GPG_ERROR_SRC
download $GCRYPT_SRC
download $PIXMAN_SRC
download $OPENSSL_SRC
download $OPUS_SRC
download $SPICE_PROTOCOL_SRC
download $SPICE_SERVER_SRC
download $NCURSES_SRC
download $JSON_GLIB_SRC
download $GST_SRC
download $GST_BASE_SRC
download $GST_GOOD_SRC
download $SPICE_CLIENT_SRC
download $QEMU_SRC
}
build_openssl() {
URL=$1
shift 1
FILE="$(basename $URL)"
NAME="${FILE%.tar.*}"
DIR="$BUILD_DIR/$NAME"
pwd="$(pwd)"
TOOLCHAIN_PATH="$(dirname $(xcrun --sdk $SDK -find clang))"
PATH="$PATH:$TOOLCHAIN_PATH"
CROSS_TOP="$(xcrun --sdk $SDK --show-sdk-platform-path)/Developer" # for openssl
CROSS_SDK="$SDKNAME.$SDKVERSION.sdk" # for openssl
export CROSS_TOP
export CROSS_SDK
export PATH
case $ARCH in
armv7 | armv7s )
OPENSSL_CROSS=iphoneos-cross
;;
arm64 )
OPENSSL_CROSS=ios64-cross
;;
i386 )
OPENSSL_CROSS=darwin-i386-cc
;;
x86_64 )
OPENSSL_CROSS=darwin64-x86_64-cc
;;
esac
cd "$DIR"
if [ -z "$REBUILD" ]; then
echo "${GREEN}Configuring ${NAME}...${NC}"
./Configure $OPENSSL_CROSS no-dso no-hw no-engine --prefix="$PREFIX" $@
fi
echo "${GREEN}Building ${NAME}...${NC}"
make "$MAKEFLAGS"
echo "${GREEN}Installing ${NAME}...${NC}"
make "$MAKEFLAGS" install
cd "$pwd"
}
build () {
URL=$1
shift 1
FILE="$(basename $URL)"
NAME="${FILE%.tar.*}"
DIR="$BUILD_DIR/$NAME"
pwd="$(pwd)"
cd "$DIR"
if [ -z "$REBUILD" ]; then
echo "${GREEN}Configuring ${NAME}...${NC}"
./configure --prefix="$PREFIX" --host="$CHOST" $@
fi
echo "${GREEN}Building ${NAME}...${NC}"
make "$MAKEFLAGS"
echo "${GREEN}Installing ${NAME}...${NC}"
make "$MAKEFLAGS" install
cd "$pwd"
}
build_qemu_dependencies () {
build $FFI_SRC
build $ICONV_SRC
build $GETTEXT_SRC
build $PNG_SRC
build $JPEG_TURBO_SRC
build $GLIB_SRC glib_cv_stack_grows=no glib_cv_uscore=no --with-pcre=internal
build $GPG_ERROR_SRC
build $GCRYPT_SRC
build $PIXMAN_SRC
build_openssl $OPENSSL_SRC
build $OPUS_SRC
build $SPICE_PROTOCOL_SRC
build $SPICE_SERVER_SRC
build $NCURSES_SRC --without-debug --enable-overwrite --enable-widec --with-ospeed=int16_t --without-progs --without-tack --without-tests
}
build_qemu () {
#QEMU_DIR="$BUILD_DIR/qemu"
#if [ ! -d "$QEMU_DIR" ]; then
# echo "${GREEN}Cloning qemu...${NC}"
# git clone --depth 1 --recursive --shallow-submodules "$QEMU_GIT" "$QEMU_DIR"
#fi
QEMU_CFLAGS="$CFLAGS"
QEMU_CXXFLAGS="$CXXFLAGS"
QEMU_LDFLAGS="$LDFLAGS"
export QEMU_CFLAGS
export QEMU_CXXFLAGS
export QEMU_LDFLAGS
CFLAGS=
CXXFLAGS=
LDFLAGS=
build $QEMU_SRC --enable-shared-lib
CFLAGS="$QEMU_CFLAGS"
CXXFLAGS="$QEMU_CXXFLAGS"
LDFLAGS="$QEMU_LDFLAGS"
}
steal_libucontext () {
# HACK: use the libucontext built by qemu
FILE="$(basename $QEMU_SRC)"
NAME="${FILE%.tar.*}"
cp "$BUILD_DIR/$NAME/libucontext/libucontext.a" "$PREFIX/lib/libucontext.a"
cp "$BUILD_DIR/$NAME/libucontext/include/libucontext.h" "$PREFIX/include/libucontext.h"
}
build_spice_client () {
build $JSON_GLIB_SRC
build $GST_SRC --enable-static --enable-static-plugins --disable-registry
build $GST_BASE_SRC --enable-static --disable-fatal-warnings
build $GST_GOOD_SRC --enable-static
build $SPICE_CLIENT_SRC --with-gtk=no
}
fixup () {
FILE=$1
LIST=$(otool -L "$FILE" | tail -n +3 | cut -d ' ' -f 1 | awk '{$1=$1};1')
OLDIFS=$IFS
IFS=$'\n'
echo "${GREEN}Fixing up $FILE...${NC}"
install_name_tool -id "@rpath/$(basename "$FILE")" "$FILE"
for f in $LIST
do
base=$(basename "$f")
dir=$(dirname "$f")
if [ "$dir" == "$PREFIX/lib" ]; then
install_name_tool -change "$f" "@rpath/$base" "$FILE"
fi
done
IFS=$OLDIFS
}
fixup_all () {
FILES=$(find "$SYSROOT_DIR/lib" -type f -name "*.dylib")
OLDIFS=$IFS
IFS=$'\n'
for f in $FILES
do
fixup $f
done
IFS=$OLDIFS
}
remove_shared_gst_plugins () {
find "$SYSROOT_DIR/lib/gstreamer-1.0" \( -name '*.so' -or -name '*.la' \) -exec rm \{\} \;
}
# parse args
ARCH=
REBUILD=
QEMU_ONLY=
REDOWNLOAD=
while [ "x$1" != "x" ]; do
case $1 in
-a )
ARCH=$2
shift
;;
-d | --download )
REDOWNLOAD=y
;;
-r | --rebuild )
REBUILD=y
;;
-q | --qemu )
QEMU_ONLY=y
;;
* )
usage
;;
esac
shift
done
if [ "x$ARCH" == "x" ]; then
ARCH=arm64
fi
export ARCH
# Export supplied CHOST or deduce by ARCH
if [ -z "$CHOST" ]; then
case $ARCH in
armv7 | armv7s )
CHOST=arm-apple-darwin
;;
arm64 )
CHOST=aarch64-apple-darwin
;;
i386 | x86_64 )
CHOST=$ARCH-apple-darwin
;;
* )
usage
;;
esac
fi
export CHOST
# Export supplied SDK or deduce by ARCH
if [ -z "$SDK" ]; then
case $ARCH in
armv7 | armv7s | arm64 )
SDK=iphoneos
;;
i386 | x86_64 )
SDK=iphonesimulator
;;
* )
usage
;;
esac
fi
# Export supplied SDKVERSION or use system default
if [ ! -z "$SDKVERSION" ]; then
SDKNAME=$(basename $(xcrun --sdk $SDK --show-sdk-platform-path) .platform)
SDKROOT=$(xcrun --sdk $SDK --show-sdk-platform-path)"/Developer/SDKs/$SDKNAME.$SDKVERSION.sdk"
else
SDKVERSION=$(xcrun --sdk $SDK --show-sdk-version) # current version
SDKROOT=$(xcrun --sdk $SDK --show-sdk-path) # current version
fi
if [ -z "$SDKMINVER" ]; then
SDKMINVER="$SDKVERSION"
fi
# Export tools
CC=$(xcrun --sdk $SDK --find gcc)
CPP=$(xcrun --sdk $SDK --find gcc)" -E"
CXX=$(xcrun --sdk $SDK --find g++)
LD=$(xcrun --sdk $SDK --find ld)
export CC
export CPP
export CXX
export LD
export PREFIX
# Flags
CFLAGS="$CFLAGS -arch $ARCH -isysroot $SDKROOT -I$PREFIX/include -miphoneos-version-min=$SDKMINVER"
CPPFLAGS="$CPPFLAGS -arch $ARCH -isysroot $SDKROOT -I$PREFIX/include -miphoneos-version-min=$SDKMINVER"
CXXFLAGS="$CXXFLAGS -arch $ARCH -isysroot $SDKROOT -I$PREFIX/include"
LDFLAGS="$LDFLAGS -arch $ARCH -isysroot $SDKROOT -L$PREFIX/lib"
MAKEFLAGS="-j$NCPU"
PKG_CONFIG_PATH="$PKG_CONFIG_PATH":"$SDKROOT/usr/lib/pkgconfig":"$PREFIX/lib/pkgconfig":"$PREFIX/share/pkgconfig"
PKG_CONFIG_LIBDIR=""
export CFLAGS
export CPPFLAGS
export CXXFLAGS
export LDFLAGS
export MAKEFLAGS
export PKG_CONFIG_PATH
export PKG_CONFIG_LIBDIR
check_env
if [ -z "$REBUILD" ]; then
download_all
fi
if [ -z "$QEMU_ONLY" ]; then
build_qemu_dependencies
fi
build_qemu
if [ -z "$QEMU_ONLY" ]; then
steal_libucontext # should be a better way...
build_spice_client
fi
fixup_all
remove_shared_gst_plugins # another hack...
echo "${GREEN}All done!${NC}"