Thursday, June 25, 2015

QuantLib 1.6 framework (libc++) for iOS and Mac OS X

QuantLib 1.6 framework (compile with -std=c++11 -stdlib=libc++) and prefix pre-built binary.
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

No comments: