Architectures in the fat file: framework/ql.framework/ql are: armv7 i386 x86_64 arm64
Pre-built framework and libraries prefix for QuantLib 1.6 can be downloaded from here.
Below is the bash script (modified from http://github.com/philipbarnes/quantlib-on-iOS) to build the framework (compile with -std=c++11 -stdlib=libc++).
Requires Boost 1.58.0 pre-built binary which can be downloaded from here.
- build-ql.sh Select all
#!/bin/bash
#===============================================================================
# Filename: build-ql.sh
#===============================================================================
# Changes:
#
# Builds a quantlib framework for iOS & MacOSX
#
# Requires a pre-built version of boost built using the boost.sh script by
# Pete Goodliffe. The structure of this script is based on Pete's boost.sh
#
# This takes a brute-force approach to the build and builds the arm6, arm7, arm64 and
# i386 and x86_64 versions of quantlib one after the other. It makes clean between builds.
#
# To configure the script, change the variables below to point to the build of
# boost lib, include and SYSROOT
#===============================================================================
: ${CURRENTDIR:=`pwd`/}
: ${BOOST_HOME:=$CURRENTDIR/../ofxiOSBoost-master/usr/local/lib}
: ${BOOST_SRC:=$CURRENTDIR/../ofxiOSBoost-master/usr/local/include}
: ${ARMV6_SYSROOT:=/Applications/Xcode431.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk}
: ${ARMV7_SYSROOT:=/Applications/Xcode501.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk}
: ${ARMV7S_SYSROOT:=/Applications/Xcode501.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk}
: ${ARM64_SYSROOT:=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk}
: ${iPhoneSimulator_SYSROOT:=/Applications/Xcode501.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.0.sdk}
: ${MacOSX_SYSROOT:=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk}
#===============================================================================
# The number of jobs for make to run. On a 2.8 Mac Pro 8 core it takes around
# 31 minutes with 9 jobs to build all the libraries and framework.
#===============================================================================
: ${JOBS:=3}
#===============================================================================
# No need to change these variables.
# Xcode 4.x and 5.x are used to build the libraries. This now resides in
# /Applications/Xcode???.app/Contents
#===============================================================================
: ${ARM_DEV_DIR:=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer}
: ${SIM_DEV_DIR:=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer}
: ${SRCDIR:=`pwd`/src}
: ${BUILDDIR:=`pwd`/build}
: ${PREFIXDIR:=`pwd`/prefix}
: ${FRAMEWORKDIR:=`pwd`/framework}
#===============================================================================
# Utility functions for reporting
#===============================================================================
displayConfiguration()
{
echo
echo " ================================================================="
echo
echo " Configuration"
echo " SRCDIR :" $SRCDIR
echo " BUILDDIR :" $BUILDDIR
echo " PREFIXDIR :" $PREFIXDIR
echo " FRAMEWORKDIR :" $FRAMEWORKDIR
echo
echo " BOOST_HOME :" $BOOST_HOME
echo " BOOST_SRC :" $BOOST_SRC
echo
echo " JOBS :" $JOBS
echo
echo " ARM_DEV_DIR :" $ARM_DEV_DIR
echo " SIM_DEV_DIR :" $SIM_DEV_DIR
}
displayMessage()
{
echo
echo " ================================================================="
echo " $@"
echo
}
doneSection()
{
echo
echo " ================================================================="
echo " Done: $@"
echo
}
abort()
{
echo
echo "Aborted: $@"
exit 1
}
#===============================================================================
# Prepare the directory structures
#===============================================================================
cleanEverythingReadyToStart()
{
displayMessage "Cleaning everything ready to start"
rm -rf $BUILDDIR
#rm -rf $PREFIXDIR
#rm -rf $FRAMEWORKDIR
doneSection
}
#===============================================================================
# Prepare the directory structures
#===============================================================================
createDirectoryStructure()
{
displayMessage "Creating directory structure"
[ -d $BUILDDIR ] || mkdir -p $BUILDDIR
[ -d $PREFIXDIR ] || mkdir -p $PREFIXDIR
[ -d $FRAMEWORKDIR ] || mkdir -p $FRAMEWORKDIR
doneSection
}
#===============================================================================
# Build the armv6 quantlib libraries
#===============================================================================
buildArmv6()
{
displayMessage "Configuring armv6 libraries"
rm -rf $PREFIXDIR/armv6
make distclean > /dev/null
# requires clang 3.1 lib in Xcode 4.3.1 for building armv6 binary
CC="/Applications/Xcode431.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" \
CXX="/Applications/Xcode431.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++" \
CPP="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cpp" \
CXXCPP="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cpp" \
CXXFLAGS="-arch armv6 -std=c++11 -stdlib=libc++ -isysroot $ARMV6_SYSROOT" \
CFLAGS="-arch armv6 -std=c99 -isysroot $ARMV6_SYSROOT" \
LDFLAGS="-stdlib=libc++" \
./configure --with-boost-include=$BOOST_SRC \
--with-boost-lib=$BOOST_HOME \
--host=arm-apple-darwin10 \
--target=arm-apple-darwin10 \
--with-sysroot=$ARMV6_SYSROOT \
--prefix=/usr/local \
--disable-shared --enable-static
displayMessage "Making Armv6 libraries"
make -j $JOBS && make DESTDIR=$PREFIXDIR/armv6 install || abort "make armv6 failed"
doneSection "armv6 done"
}
#===============================================================================
# Build the armv7 quantlib libraries
#===============================================================================
buildArmv7()
{
displayMessage "Configuring armv7 libraries"
rm -rf $PREFIXDIR/armv7
make distclean > /dev/null
CC="xcrun --sdk iphoneos clang" \
CXX="xcrun --sdk iphoneos clang++" \
CPP="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cpp" \
CXXCPP="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cpp" \
CXXFLAGS="-arch armv7 -std=c++11 -stdlib=libc++ -isysroot $ARMV7_SYSROOT" \
CFLAGS="-arch armv7 -std=c99 -isysroot $ARMV7_SYSROOT" \
LDFLAGS="-stdlib=libc++" \
./configure --with-boost-include=$BOOST_SRC \
--with-boost-lib=$BOOST_HOME \
--host=arm-apple-darwin10 \
--target=arm-apple-darwin10 \
--with-sysroot=$ARMV7_SYSROOT \
--prefix=/usr/local \
--disable-shared --enable-static
displayMessage "making armv7 libraries"
make -j $JOBS && make DESTDIR=$PREFIXDIR/armv7 install || abort "make armv7 failed"
doneSection "armv7 done"
}
#===============================================================================
# Build the armv7s quantlib libraries
#===============================================================================
buildArmv7s()
{
displayMessage "Configuring armv7s libraries"
rm -rf $PREFIXDIR/armv7s
make distclean > /dev/null
CC="xcrun --sdk iphoneos clang" \
CXX="xcrun --sdk iphoneos clang++" \
CPP="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cpp" \
CXXCPP="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cpp" \
CXXFLAGS="-arch armv7s -std=c++11 -stdlib=libc++ -isysroot $ARMV7S_SYSROOT" \
CFLAGS="-arch armv7s -std=c99 -isysroot $ARMV7S_SYSROOT" \
LDFLAGS="-stdlib=libc++" \
./configure --with-boost-include=$BOOST_SRC \
--with-boost-lib=$BOOST_HOME \
--host=arm-apple-darwin10 \
--target=arm-apple-darwin10 \
--with-sysroot=$ARMV7S_SYSROOT \
--prefix=/usr/local \
--disable-shared --enable-static
displayMessage "making armv7s libraries"
make -j $JOBS && make DESTDIR=$PREFIXDIR/armv7s install || abort "make armv7s failed"
doneSection "armv7s done"
}
#===============================================================================
# Build the arm64 quantlib libraries
#===============================================================================
buildArm64()
{
displayMessage "Configuring arm64 libraries"
rm -rf $PREFIXDIR/arm64
make distclean > /dev/null
CC="xcrun --sdk iphoneos clang" \
CXX="xcrun --sdk iphoneos clang++" \
CPP="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cpp" \
CXXCPP="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cpp" \
CXXFLAGS="-arch arm64 -std=c++11 -stdlib=libc++ -isysroot $ARM64_SYSROOT" \
CFLAGS="-arch arm64 -std=c99 -isysroot $ARM64_SYSROOT" \
LDFLAGS="-stdlib=libc++" \
./configure --with-boost-include=$BOOST_SRC \
--with-boost-lib=$BOOST_HOME \
--host=arm-apple-darwin10 \
--target=arm-apple-darwin10 \
--with-sysroot=$ARM64_SYSROOT \
--prefix=/usr/local \
--disable-shared --enable-static
displayMessage "making arm64 libraries"
make -j $JOBS && make DESTDIR=$PREFIXDIR/arm64 install || abort "make arm64 failed"
doneSection "arm64 done"
}
#===============================================================================
# Build the i386 quantlib libraries
#===============================================================================
buildi386()
{
displayMessage "Configuring i386 libraries"
rm -rf $PREFIXDIR/i386
make distclean > /dev/null
CC="xcrun --sdk iphonesimulator clang" \
CXX="xcrun --sdk iphonesimulator clang++" \
CPP="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cpp" \
CXXCPP="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cpp" \
CXXFLAGS="-arch i386 -std=c++11 -stdlib=libc++ -isysroot $iPhoneSimulator_SYSROOT" \
CFLAGS="-arch i386 -isysroot $iPhoneSimulator_SYSROOT" \
LDFLAGS="-stdlib=libc++" \
./configure --with-boost-include=$BOOST_SRC \
--with-boost-lib=$BOOST_HOME \
--with-sysroot=$iPhoneSimulator_SYSROOT \
--prefix=/usr/local \
--disable-shared --enable-static
displayMessage "Building i386 libraries"
make -j $JOBS && make DESTDIR=$PREFIXDIR/i386 install || abort "make i386 failed"
doneSection "i386 done"
}
#===============================================================================
# Build the x86_64 quantlib libraries
#===============================================================================
buildx86_64()
{
displayMessage "Configuring x86_64 libraries"
rm -rf $PREFIXDIR/x86_64
make distclean > /dev/null
CC="xcrun --sdk macosx clang" \
CXX="xcrun --sdk macosx clang++" \
CPP="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cpp" \
CXXCPP="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cpp" \
CXXFLAGS="-arch x86_64 -std=c++11 -stdlib=libc++ -mmacosx-version-min=10.7 -isysroot $MacOSX_SYSROOT" \
CFLAGS="-arch x86_64 -mmacosx-version-min=10.7 -isysroot $MacOSX_SYSROOT" \
LDFLAGS="-stdlib=libc++" \
./configure --with-boost-include=$BOOST_SRC \
--with-boost-lib=$BOOST_HOME \
--with-sysroot=$MacOSX_SYSROOT \
--prefix=/usr/local \
--disable-shared --enable-static
displayMessage "Building x86_64 libraries"
make -j $JOBS && make DESTDIR=$PREFIXDIR/x86_64 install || abort "make x86_64 failed"
doneSection "x86_64 done"
}
#===============================================================================
# Build the framework
#
# Unlike the boost build by Pete Goodliffe, all the libraries are created
# individually and so do not need to be unpacked and scrunched together.
#
# Create the framework libraries in-site
#===============================================================================
buildFramework()
{
VERSION_TYPE=Alpha
FRAMEWORK_NAME=ql
FRAMEWORK_VERSION=A
FRAMEWORK_CURRENT_VERSION=1.6
FRAMEWORK_COMPATIBILITY_VERSION=1.6
FRAMEWORK_BUNDLE=$FRAMEWORKDIR/$FRAMEWORK_NAME.framework
rm -rf $FRAMEWORKDIR
displayMessage "Framework: Setting up directories..."
mkdir -p $FRAMEWORK_BUNDLE
mkdir -p $FRAMEWORK_BUNDLE/Versions
mkdir -p $FRAMEWORK_BUNDLE/Versions/$FRAMEWORK_VERSION
mkdir -p $FRAMEWORK_BUNDLE/Versions/$FRAMEWORK_VERSION/Resources
mkdir -p $FRAMEWORK_BUNDLE/Versions/$FRAMEWORK_VERSION/Headers
mkdir -p $FRAMEWORK_BUNDLE/Versions/$FRAMEWORK_VERSION/Documentation
displayMessage "Framework: Creating symlinks..."
ln -s $FRAMEWORK_VERSION $FRAMEWORK_BUNDLE/Versions/Current
ln -s Versions/Current/Headers $FRAMEWORK_BUNDLE/Headers
ln -s Versions/Current/Resources $FRAMEWORK_BUNDLE/Resources
ln -s Versions/Current/Documentation $FRAMEWORK_BUNDLE/Documentation
ln -s Versions/Current/$FRAMEWORK_NAME $FRAMEWORK_BUNDLE/$FRAMEWORK_NAME
FRAMEWORK_INSTALL_NAME=$FRAMEWORK_BUNDLE/Versions/$FRAMEWORK_VERSION/$FRAMEWORK_NAME
displayMessage "Framework: Lipoing library into $FRAMEWORK_INSTALL_NAME"
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo \
-arch armv7 "$PREFIXDIR/armv7/usr/local/lib/libQuantLib.a" \
-arch armv7s "$PREFIXDIR/armv7s/usr/local/lib/libQuantLib.a" \
-arch arm64 "$PREFIXDIR/arm64/usr/local/lib/libQuantLib.a" \
-arch i386 "$PREFIXDIR/i386/usr/local/lib/libQuantLib.a" \
-arch x86_64 "$PREFIXDIR/x86_64/usr/local/lib/libQuantLib.a" \
-output "$FRAMEWORK_INSTALL_NAME" \
-create || abort "Lipo $1 failed"
displayMessage "Framework: Copying includes..."
cp -r $PREFIXDIR/x86_64/usr/local/include/ql/* $FRAMEWORK_BUNDLE/Headers/
displayMessage "Framework: Creating plist..."
cat > $FRAMEWORK_BUNDLE/Resources/Info.plist <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>${FRAMEWORK_NAME}</string>
<key>CFBundleIdentifier</key>
<string>org.quantlib</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>${FRAMEWORK_CURRENT_VERSION}</string>
</dict>
</plist>
EOF
doneSection "$FRAMEWORK_BUNDLE"
}
#===============================================================================
# Execution starts here
#===============================================================================
displayConfiguration
cleanEverythingReadyToStart
createDirectoryStructure
buildArmv7
buildArm64
buildi386
buildx86_64
buildFramework
displayMessage "Completed successfully"
Note: QuantLib 1.5 is incompatible with Boost 1.58. Use Boost 1.57 instead.
Here is the framework and prefix for Quantlib 1.6+1.5
Here is the framework and prefix for Boost 1.58+1.57