#iOS toolchain#
- Current llvm+clang version: 3.7.1
- Current cctools-port version: 4f8ad519f7fa49e3c6374263c9bc223690b09fc1
- Current ldid version: 3064ed628108da4b9a52cfbe5d4c1a5817811400
Based on work by cjacker and yetist and work by tpoechtrager.
The toolchain can be built using the build scripts found in the root of this
repository. They each require different environment variables to be set. The
most important variable is IOS_TOOLCHAIN_BASE. This variable specifies the
base directory where the toolchain shall be installed. It is required for all
build scripts.
Building clang is done by executing the build-clang.sh script. This script
allows the following configuration variables:
PARALLELISM: Allows to specify the number of jobsmakeshall run simultaneously. This is directly passed tomakevia the-jparameter. Default: 2.NATIVE_ARCH: If you are not on x86/amd64, you will need to specify the host type you are running with this variable. It takes llvm's target options. Default: X86.
Example:
export IOS_TOOLCHAIN_BASE=~/toolchains/ios
export PARALLELISM=9
./build-clang.sh
Building Apple's cctools is done by executing build-cctools-port.sh. This
builds a custom cctools version modified to work on non Darwin systems. The
build can be configured with the following variables:
PARALLELISM: Allows to specify the number of jobsmakeshall run simultaneously. This is directly passed tomakevia the-jparameter. Default: 2.LLVM_CONFIG: The llvm-config executable to be used to setup the build. Default: The executable found bywhich llvm-config.
Example:
export IOS_TOOLCHAIN_BASE=~/toolchains/ios
export LLVM_CONFIG="$IOS_TOOLCHAIN_BASE/bin/llvm-config"
export PARALLELISM=9
./build-cctools-port.sh
To build the ldid tool, which is used to fake sign executables, the
build-ldid.sh script is used. Configuration can be done with the following
variables:
PARALLELISM: Allows to specify the number of jobsmakeshall run simultaneously. This is directly passed tomakevia the-jparameter. Default: 2.
Example:
export IOS_TOOLCHAIN_BASE=~/toolchains/ios
export PARALLELISM=9
./build-ldid.sh
The clang-wrapper tool is a simple wrapper around clang which takes care of
passing the proper flags to clang to build an iOS application. This tool has
support to configure a default iOS target on compilation time, but also allows
to configure the setup on run time. Configuration works by setting the
following variables to appropriate values:
TARGET: The target to configure the wrapper for.build-cctools-port.shbuilds binutils for the following targets: -arm-apple-darwin9-arm-apple-darwin11IOS_SDK: The path to the iOS SDK which will be used by default. The SDK's basename needs to include the iOS version the SDK is for.PARALLELISM: Allows to specify the number of jobsmakeshall run simultaneously. This is directly passed tomakevia the-jparameter. Default: 2.IOS_MIN_VER: The minimum iOS version the build is targeting. Default: Version of the default iOS SDK.CLANG_VERSION: A version suffix for the clang/clang++ executables wrapped. This allows to use clang executables which are versioned, for example,clang-3.7. Default: Empty.
Example:
export IOS_TOOLCHAIN_BASE=~/toolchains/ios
export PARALLELISM=9
TARGET=arm-apple-darwin9 IOS_SDK="$IOS_TOOLCHAIN_BASE/sdks/iPhoneOS4.2.sdk/" IOS_MIN_VER=3.1 ./build-clang-wrapper.sh
TARGET=arm-apple-darwin11 IOS_SDK="$IOS_TOOLCHAIN_BASE/sdks/iPhoneOS7.1.sdk/" ./build-clang-wrapper.sh
NOTE: It may be possible to use an existing llvm/clang build. However, since llvm/clang 3.7.1 (and possibly other versions) contain a bug which prevents compiling for ARMv6 targets it is suggested to use the supplied clang version.
Using the toolchain is really straightforward. The basic steps for compiling a program targeting iOS are as follows:
- Set up
PATHto include your clang compiler executable, the cctools executables, theldidexecutable, and theclang-wrapperexecutables. - Set
CCand/orCXXto the wrapper you want to use for building.
clang-wrapper allows you to override the SDK and minimum iOS version
targeted by setting the following environment variables accordingly:
IOS_SDK: Path to the root of the SDK.IPHONEOS_DEPLOYMENT_TARGET: Minimum iOS version targeted.
Example:
export IOS_TOOLCHAIN_BASE=~/toolchains/ios
export PATH="$IOS_TOOLCHAIN_BASE/bin:$IOS_TOOLCHAIN_BASE/arm-apple-darwin9/bin:$PATH"
export CXX=arm-apple-darwin9-clang++
$CXX -O3 my-compilation-unit.cpp -o my-ios-binary
NOTE: Using -g to generate debugging information does not work at the
time of writing. This is because it requires Apple's dsymutil.
NOTE: Using strip on iOS executables makes you require to re-sign the
binary. This can be done by running ldid -S /path/to/binary.
NOTE: Specifying -miphoneos-version-min=xx.yy manually on command line
overrides any clang-wrapper defaults and the IPHONEOS_DEPLOYMENT_TARGET
variable.
This toolchain was primarily brought into existence to build ScummVM for iOS. We include simple build scripts to setup libraries required by ScummVM. Some of this information can be useful when building libraries yourself.
A lot of libraries build systems utilize pkg-config. If your standard
system's pkg-config is picked up, this can break build settings. To prevent
this, we build pkg-config to be used for the targets of the toolchain.
The build-pkg-config.sh script takes care of installing pkg-config for the
two targets arm-apple-darwin9 and arm-apple-darwin11. It requires
IOS_TOOLCHAIN_BASE to point at the base directory of the toolchain.
PARALLELISM can be used to specify the number of jobs make runs in
parallel.
When building libraries yourself, you can either make sure that the
pkg-config binary of the target gets picked over your system's or you simply
set PKG_CONFIG to either arm-apple-darwin9-pkg-config or
arm-apple-darwin11-pkg-config.
The script build-scummvm-libraries.sh takes care of everything for you.
It requires IOS_TOOLCHAIN_BASE to point at the base directory of the
toolchain. PARALLELISM can be used to specify the number of jobs make
runs in parallel.
The script will install the libraries in usr/ residing in the target's
folder. For example, for arm-apple-darwin9 this means the libraries are
stored in $IOS_TOOLCHAIN_BASE/arm-apple-darwin9/usr.
- patches/clang/legacy-ios-sdk-support.patch
Allows clang++ to pick up C++ headers for ancient 3.1.3 SDKs.
- patches/clang/macho-armv6k-sub-type.patch
Fixes a bug which causes llvm to generate ARMv7 MachO files when using an armv6k target.
clang will automatically select an armv6k target when building for
-arch armv6 for iOS. Due to a missing check, llvm will generate armv7 files.
This breaks linking.
- patches/libmad-0.15.1b/0001-configure-optimize.patch
Removes libmad configure's fine tuning of optimization parameters. It sets parameters clang does not recognize, which breaks building.
- patches/libmpeg2-0.5.1/0001-disable-arm-assembly.patch
Disable ARM architecture detection in configure. This prevents ARM assembly
from being used, which would otherwise break compilation in some settings
(like armv7).
- patches/libmpeg2-0.5.1/0002-disable-always-inline-check.patch
Prevents libmpeg2 from #defineing inline in a way which breaks system
headers for modern iOS SDKs.
- Integrate
dsymutilsupport to allow compilation with debugging information. - Test toolchain setup on non-Linux/amd64 hosts.
- Cleanup build scripts to have consistent style.
- Try to refactor build scripts to simplify scripts and improve updating to newer tool/library versions(?)