Updated Note
The macOS 10.14 SDK no longer contains support for compiling 32-bit applications. If developers need to compile for i386, Xcode 9.4 or earlier is required.
(1) Download boost 1.62.0 and extract source
- shell script Select all
# download boost source
cd $HOME/Downloads
curl -O https://nchc.dl.sourceforge.net/project/boost/boost/1.62.0/boost_1_62_0.tar.bz2
tar xjvf boost_1_62_0.tar.bz2
cd boost_1_62_0
# create the following user-config.jam at ~/Downloads/boost_1_62_0/tools/build/src/
cat > tools/build/src/user-config.jam << 'EOF'
# ------------------
# darwin iphone configuration.
# ------------------
local XCODE_ROOT = /Applications/Xcode.app/Contents/Developer ;
# xcrun --sdk iphoneos --show-sdk-path
local IPHONESDK = iPhoneOS.sdk ;
local MACOSXSDK = MacOSX.sdk ;
# xcrun --show-sdk-path
# xcrun --sdk iphonesimulator --show-sdk-path
local IPHONESIMULATORSDK = iPhoneSimulator.sdk ;
using darwin : armv7
:
$(XCODE_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++
:
<striper>$(XCODE_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip
<root>$(XCODE_ROOT)/Platforms/iPhoneOS.platform/Developer/SDKs/$(IPHONESDK)
<compileflags>"-isysroot $(XCODE_ROOT)/Platforms/iPhoneOS.platform/Developer/SDKs/$(IPHONESDK)"
<compileflags>"-arch armv7"
<compileflags>-fexceptions
<compileflags>-frtti
<compileflags>-fpic
<compileflags>-DBOOST_SP_USE_SPINLOCK
<compileflags>-std=c++11
<compileflags>-stdlib=libc++
<compileflags>-miphoneos-version-min=7.0
<compileflags>-fvisibility=hidden
<compileflags>-fvisibility-inlines-hidden
<compileflags>-O2
<compileflags>-g
<compileflags>-Os
<compileflags>-Wno-long-long
<compileflags>-Wno-missing-field-initializers
<compileflags>-Wno-unused-variable
<linkflags>-stdlib=libc++
<architecture>arm
<address-model>32
<target-os>iphone
;
using darwin : armv7s
:
$(XCODE_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++
:
<striper>$(XCODE_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip
<root>$(XCODE_ROOT)/Platforms/iPhoneOS.platform/Developer/SDKs/$(IPHONESDK)
<compileflags>"-isysroot $(XCODE_ROOT)/Platforms/iPhoneOS.platform/Developer/SDKs/$(IPHONESDK)"
<compileflags>"-arch armv7s"
<compileflags>-fexceptions
<compileflags>-frtti
<compileflags>-fpic
<compileflags>-DBOOST_SP_USE_SPINLOCK
<compileflags>-std=c++11
<compileflags>-stdlib=libc++
<compileflags>-miphoneos-version-min=7.0
<compileflags>-fvisibility=hidden
<compileflags>-fvisibility-inlines-hidden
<compileflags>-O2
<compileflags>-g
<compileflags>-Os
<compileflags>-Wno-long-long
<compileflags>-Wno-missing-field-initializers
<compileflags>-Wno-unused-variable
<linkflags>-stdlib=libc++
<architecture>arm
<address-model>32
<target-os>iphone
;
using darwin : arm64
:
$(XCODE_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++
:
<striper>$(XCODE_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip
<root>$(XCODE_ROOT)/Platforms/iPhoneOS.platform/Developer/SDKs/$(IPHONESDK)
<compileflags>"-isysroot $(XCODE_ROOT)/Platforms/iPhoneOS.platform/Developer/SDKs/$(IPHONESDK)"
#lt;root>$(XCODE_ROOT)/Platforms/MacOSX.platform/Developer/SDKs/$(MACOSXSDK)
#lt;compileflags>"-isysroot $(XCODE_ROOT)/Platforms/MacOSX.platform/Developer/SDKs/$(MACOSXSDK)"
<compileflags>"-arch arm64"
<compileflags>-fexceptions
<compileflags>-frtti
<compileflags>-fpic
<compileflags>-DBOOST_SP_USE_SPINLOCK
<compileflags>-std=c++11
<compileflags>-stdlib=libc++
<compileflags>-miphoneos-version-min=7.0
#<compileflags>-mmacosx-version-min=10.9
<compileflags>-fvisibility=hidden
<compileflags>-fvisibility-inlines-hidden
<compileflags>-O2
<compileflags>-g
<compileflags>-Os
<compileflags>-Wno-long-long
<compileflags>-Wno-missing-field-initializers
<compileflags>-Wno-unused-variable
<linkflags>-stdlib=libc++
<architecture>arm
<address-model>64
<target-os>iphone
;
using darwin : i386
:
$(XCODE_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++
:
<striper>$(XCODE_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip
<root>$(XCODE_ROOT)/Platforms/iPhoneSimulator.platform/Developer/SDKs/$(IPHONESIMULATORSDK)
<compileflags>"-arch i386"
<compileflags>"-isysroot $(XCODE_ROOT)/Platforms/iPhoneSimulator.platform/Developer/SDKs/$(IPHONESIMULATORSDK)"
<compileflags>-fexceptions
<compileflags>-frtti
<compileflags>-fpic
<compileflags>-DBOOST_SP_USE_SPINLOCK
<compileflags>-std=c++11
<compileflags>-stdlib=libc++
<compileflags>-miphoneos-version-min=7.0
<compileflags>-fvisibility=hidden
<compileflags>-fvisibility-inlines-hidden
<compileflags>-O2
<compileflags>-g
<compileflags>-Os
<compileflags>-Wno-long-long
<compileflags>-Wno-missing-field-initializers
<compileflags>-Wno-unused-variable
<linkflags>-stdlib=libc++
<architecture>x86
<address-model>32
<target-os>iphone
;
using darwin : x86_64
:
$(XCODE_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++
:
<striper>$(XCODE_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip
<root>$(XCODE_ROOT)/Platforms/iPhoneSimulator.platform/Developer/SDKs/$(IPHONESIMULATORSDK)
<compileflags>"-isysroot $(XCODE_ROOT)/Platforms/iPhoneSimulator.platform/Developer/SDKs/$(IPHONESIMULATORSDK)"
#lt;root>$(XCODE_ROOT)/Platforms/MacOSX.platform/Developer/SDKs/$(MACOSXSDK)
#lt;compileflags>"-isysroot $(XCODE_ROOT)/Platforms/MacOSX.platform/Developer/SDKs/$(MACOSXSDK)"
<compileflags>"-arch x86_64"
<compileflags>-fexceptions
<compileflags>-frtti
<compileflags>-fpic
<compileflags>-DBOOST_SP_USE_SPINLOCK
<compileflags>-std=c++11
<compileflags>-stdlib=libc++
<compileflags>-miphoneos-version-min=7.0
#<compileflags>-mmacosx-version-min=10.9
<compileflags>-fvisibility=hidden
<compileflags>-fvisibility-inlines-hidden
<compileflags>-O2
<compileflags>-g
<compileflags>-Os
<compileflags>-Wno-long-long
<compileflags>-Wno-missing-field-initializers
<compileflags>-Wno-unused-variable
<linkflags>-stdlib=libc++
<architecture>x86
<address-model>64
<target-os>iphone
;
EOF
(2) patch boost_1_62_0/tools/build/src/tools/darwin.jam
- ~/Downloads/boost_1_62_0/tools/build/src/tools/darwin.jam Select all
#change from
case arm :
{
if $(instruction-set) {
options = -arch$(_)$(instruction-set) ;
} else {
options = -arch arm ;
}
}
#to
case arm :
{
if $(instruction-set) {
options = -arch$(_)$(instruction-set) ;
} else if $(address-model) = 64 {
options = -arch arm64 ;
} else {
options = -arch arm ;
}
}
(3) build boost libraries for iOS
- shell script Select all
# bootstrap
cd $HOME/Downloads/boost_1_62_0
# apply this patch if bootstrap error: pushd tools/build; wget https://github.com/boostorg/build/commit/48e9017139dd94446633480661e5447c7e0d8b1b.patch; patch -p1 < 48e9017139dd94446633480661e5447c7e0d8b1b.patch; popd
./bootstrap.sh --with-libraries=atomic,chrono,date_time,exception,filesystem,graph,iostreams,math,program_options,random,regex,serialization,signals,system,test,thread,wave
# clean and build for iOS, j option is num of cores x 1.5
rm -fr ios-build
./b2 -j6 --build-dir=ios-build --stagedir=ios-build/armv7 toolset=darwin-armv7 architecture=arm instruction-set=armv7 address-model=32 target-os=iphone threading=multi link=static stage
./b2 -j6 --build-dir=ios-build --stagedir=ios-build/armv7s toolset=darwin-armv7s architecture=arm instruction-set=armv7s address-model=32 target-os=iphone threading=multi link=static stage
./b2 -j6 --build-dir=ios-build --stagedir=ios-build/arm64 toolset=darwin-arm64 architecture=arm address-model=64 target-os=iphone threading=multi link=static stage
./b2 -j6 --build-dir=ios-build --stagedir=ios-build/i386 toolset=darwin-i386 architecture=x86 address-model=32 target-os=iphone threading=multi link=static stage
./b2 -j6 --build-dir=ios-build --stagedir=ios-build/x86_64 toolset=darwin-x86_64 architecture=x86 address-model=64 target-os=iphone threading=multi link=static stage
# create libboost.a archive for each architecture
cd $HOME/Downloads/boost_1_62_0
cd ios-build
xcrun ar crus armv7/libboost.a boost/bin.v2/libs/*/build/darwin-armv7/release/instruction-set-armv7/link-static/target-os-iphone/threading-multi/*/*.o
xcrun ar crus armv7s/libboost.a boost/bin.v2/libs/*/build/darwin-armv7s/release/instruction-set-armv7s/link-static/target-os-iphone/threading-multi/*/*.o
xcrun ar crus arm64/libboost.a boost/bin.v2/libs/*/build/darwin-arm64/release/link-static/target-os-iphone/threading-multi/*/*.o
xcrun ar crus i386/libboost.a boost/bin.v2/libs/*/build/darwin-i386/release/link-static/target-os-iphone/threading-multi/*/*.o
xcrun ar crus x86_64/libboost.a boost/bin.v2/libs/*/build/darwin-x86_64/release/link-static/target-os-iphone/threading-multi/*/*.o
# create FAT libboost.a archive
mkdir -p lib
xcrun lipo \
-arch armv7 "armv7/libboost.a" \
-arch armv7s "armv7s/libboost.a" \
-arch arm64 "arm64/libboost.a" \
-arch i386 "i386/libboost.a" \
-arch x86_64 "x86_64/libboost.a" \
-output "lib/libboost.a" \
-create
# create link for include folder
mkdir include
cd include
ln -s ../../boost .
(4) Create boost Framework for iOS
- shell script Select all
cd $HOME/Downloads/boost_1_62_0
cd ios-build
#Create the following shell script for build-boostframework.sh
cat > build-boostframework.sh << 'boostFrameworkEOF'
#!/bin/bash
# build-boostframework.sh
VERSION_TYPE=Alpha
FRAMEWORK_NAME=boost
FRAMEWORK_VERSION=A
FRAMEWORKDIR=.
FRAMEWORK_CURRENT_VERSION=1.62.0
FRAMEWORK_COMPATIBILITY_VERSION=1.62.0
FRAMEWORK_BUNDLE=${FRAMEWORKDIR}/${FRAMEWORK_NAME}.framework
rm -rf ${FRAMEWORK_BUNDLE}
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
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}
echo "Framework: Lipoing library into ${FRAMEWORK_INSTALL_NAME}"
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo \
-arch armv7 "armv7/libboost.a" \
-arch armv7s "armv7s/libboost.a" \
-arch arm64 "arm64/libboost.a" \
-arch i386 "i386/libboost.a" \
-arch x86_64 "x86_64/libboost.a" \
-output "${FRAMEWORK_INSTALL_NAME}" \
-create
echo "Framework: Copying includes..."
cp -r include/${FRAMEWORK_NAME}/* ${FRAMEWORK_BUNDLE}/Headers/
cat > ${FRAMEWORK_BUNDLE}/Resources/Info.plist <<InfoplistEOF
<?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>${FRAMEWORK_NAME}.org</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>
InfoplistEOF
echo "Done: ${FRAMEWORK_BUNDLE}"
boostFrameworkEOF
# build framework
sh build-boostframework.sh
(5) Download and build QuantLib 1.12 for iOS
- shell script Select all
# download quantlib source
cd $HOME/Downloads
# latest is https://jaist.dl.sourceforge.net/project/quantlib/QuantLib/1.12/QuantLib-1.12.tar.gz (February 1st, 2018)
export QL_VERSION=1.12
curl -O https://jaist.dl.sourceforge.net/project/quantlib/QuantLib/${QL_VERSION}/QuantLib-${QL_VERSION}.tar.gz
# curl -O https://jaist.dl.sourceforge.net/project/quantlib/QuantLib/1.9/QuantLib-1.9.tar.gz
tar xzvf QuantLib-${QL_VERSION}.tar.gz
cd QuantLib-${QL_VERSION}
#Create the following shell script for armv7
cat > ~/Downloads/QuantLib-${QL_VERSION}/build-armv7.sh << 'armv7EOF'
#!/bin/bash
# build-armv7.sh
BUILD_DIR=ios-build
mkdir -p ${BUILD_DIR}
INSTALL_DIR="`pwd`/${BUILD_DIR}"
YOUR_PATH_TO_INSTALL_DIR="`cd "${INSTALL_DIR}";pwd`"
# XCODE_VERSION=Xcode-9.0
# XCODE_ROOT=/Applications/${XCODE_VERSION}.app/Contents/Developer
XCODE_ROOT=/Applications/Xcode.app/Contents/Developer
YOUR_TOOLCHAIN=${XCODE_ROOT}/Toolchains/XcodeDefault.xctoolchain/usr/bin
# xcrun --sdk iphoneos --show-sdk-path
# sysroot=${XCODE_ROOT}/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk
sysroot="`xcrun --sdk iphoneos --show-sdk-path`"
export CC=${YOUR_TOOLCHAIN}/clang
export CXX=${YOUR_TOOLCHAIN}/clang++
export CPP=${YOUR_TOOLCHAIN}/cpp
export AR=${YOUR_TOOLCHAIN}/ar
export RANLIB=${YOUR_TOOLCHAIN}/ranlib
export LD=${YOUR_TOOLCHAIN}/ld
export CFLAGS="-arch armv7 -std=c99 -miphoneos-version-min=7.0 -isysroot ${sysroot}"
export CXXFLAGS="-arch armv7 -fexceptions -frtti -fpic -std=c++11 -stdlib=libc++ -miphoneos-version-min=7.0 -O2 -g -fvisibility=hidden -fvisibility-inlines-hidden -Os -isysroot ${sysroot}"
export LDFLAGS="-stdlib=libc++"
boost_include="`cd "../boost_1_62_0/${BUILD_DIR}/include";pwd`"
boost_lib="`cd "../boost_1_62_0/${BUILD_DIR}/armv7/lib";pwd`"
make distclean
./configure --prefix=/armv7 --host=arm-apple-darwin10 --with-sysroot=${sysroot} --with-boost-include=${boost_include} --with-boost-lib=${boost_lib} --enable-static --enable-shared=no --disable-examples
make -j6
make install DESTDIR=${YOUR_PATH_TO_INSTALL_DIR}
armv7EOF
#Create the following shell script for armv7s
cat > ~/Downloads/QuantLib-${QL_VERSION}/build-armv7s.sh << 'armv7sEOF'
#!/bin/bash
# build-armv7s.sh
BUILD_DIR=ios-build
mkdir -p ${BUILD_DIR}
INSTALL_DIR="`pwd`/${BUILD_DIR}"
YOUR_PATH_TO_INSTALL_DIR="`cd "${INSTALL_DIR}";pwd`"
# XCODE_VERSION=Xcode-9.0
# XCODE_ROOT=/Applications/${XCODE_VERSION}.app/Contents/Developer
XCODE_ROOT=/Applications/Xcode.app/Contents/Developer
YOUR_TOOLCHAIN=${XCODE_ROOT}/Toolchains/XcodeDefault.xctoolchain/usr/bin
# xcrun --sdk iphoneos --show-sdk-path
# sysroot=${XCODE_ROOT}/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk
sysroot="`xcrun --sdk iphoneos --show-sdk-path`"
export CC=${YOUR_TOOLCHAIN}/clang
export CXX=${YOUR_TOOLCHAIN}/clang++
export CPP=${YOUR_TOOLCHAIN}/cpp
export AR=${YOUR_TOOLCHAIN}/ar
export RANLIB=${YOUR_TOOLCHAIN}/ranlib
export LD=${YOUR_TOOLCHAIN}/ld
export CFLAGS="-arch armv7s -std=c99 -miphoneos-version-min=7.0 -isysroot ${sysroot}"
export CXXFLAGS="-arch armv7s -fexceptions -frtti -fpic -std=c++11 -stdlib=libc++ -miphoneos-version-min=7.0 -O2 -g -fvisibility=hidden -fvisibility-inlines-hidden -Os -isysroot ${sysroot}"
export LDFLAGS="-stdlib=libc++"
boost_include="`cd "../boost_1_62_0/${BUILD_DIR}/include";pwd`"
boost_lib="`cd "../boost_1_62_0/${BUILD_DIR}/armv7s/lib";pwd`"
make distclean
./configure --prefix=/armv7s --host=arm-apple-darwin10 --with-sysroot=${sysroot} --with-boost-include=${boost_include} --with-boost-lib=${boost_lib} --enable-static --enable-shared=no --disable-examples
make -j6
make install DESTDIR=${YOUR_PATH_TO_INSTALL_DIR}
armv7sEOF
#Create the following shell script for arm64
cat > ~/Downloads/QuantLib-${QL_VERSION}/build-arm64.sh << 'arm64EOF'
#!/bin/bash
# build-arm64.sh
ARCH=arm64
BOOST_FOLDER=boost_1_62_0
BUILD_DIR=ios-build
mkdir -p ${BUILD_DIR}
INSTALL_DIR="`pwd`/${BUILD_DIR}"
YOUR_PATH_TO_INSTALL_DIR="`cd "${INSTALL_DIR}";pwd`"
XCODE_ROOT=/Applications/Xcode.app/Contents/Developer
YOUR_TOOLCHAIN=${XCODE_ROOT}/Toolchains/XcodeDefault.xctoolchain/usr/bin
# xcrun --sdk iphoneos --show-sdk-path
# sysroot=${XCODE_ROOT}/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk
# sysroot="`xcrun --show-sdk-path`"
sysroot="`xcrun --sdk iphoneos --show-sdk-path`"
export CC=${YOUR_TOOLCHAIN}/clang
export CXX=${YOUR_TOOLCHAIN}/clang++
export CPP=${YOUR_TOOLCHAIN}/cpp
export AR=${YOUR_TOOLCHAIN}/ar
export RANLIB=${YOUR_TOOLCHAIN}/ranlib
export LD=${YOUR_TOOLCHAIN}/ld
export CFLAGS="-arch ${ARCH} -std=c99 -miphoneos-version-min=7.0 -isysroot ${sysroot}"
export CXXFLAGS="-arch ${ARCH} -fexceptions -frtti -fpic -std=c++11 -stdlib=libc++ -miphoneos-version-min=7.0 -O2 -g -fvisibility=hidden -fvisibility-inlines-hidden -Os -isysroot ${sysroot}"
export LDFLAGS="-stdlib=libc++"
boost_include="`cd "../${BOOST_FOLDER}/${BUILD_DIR}/include";pwd`"
boost_lib="`cd "../${BOOST_FOLDER}/${BUILD_DIR}/arm64/lib";pwd`"
make distclean
./configure --prefix=/${ARCH} --host=${ARCH}-apple-darwin10 --with-sysroot=${sysroot} --with-boost-include=${boost_include} --with-boost-lib=${boost_lib} --enable-static --enable-shared=no --disable-examples
make -j6
make install DESTDIR=${YOUR_PATH_TO_INSTALL_DIR}
arm64EOF
#Create the following shell script for i386
cat > ~/Downloads/QuantLib-${QL_VERSION}/build-i386.sh << 'i386EOF'
#!/bin/bash
# build-i386.sh
BUILD_DIR=ios-build
mkdir -p ${BUILD_DIR}
INSTALL_DIR="`pwd`/${BUILD_DIR}"
YOUR_PATH_TO_INSTALL_DIR="`cd "${INSTALL_DIR}";pwd`"
# XCODE_VERSION=Xcode-9.0
# XCODE_ROOT=/Applications/${XCODE_VERSION}.app/Contents/Developer
XCODE_ROOT=/Applications/Xcode.app/Contents/Developer
YOUR_TOOLCHAIN=${XCODE_ROOT}/Toolchains/XcodeDefault.xctoolchain/usr/bin
# xcrun --sdk iphonesimulator --show-sdk-path
# sysroot=${XCODE_ROOT}/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk
sysroot="`xcrun --sdk iphonesimulator --show-sdk-path`"
export CC=${YOUR_TOOLCHAIN}/clang
export CXX=${YOUR_TOOLCHAIN}/clang++
export CPP=${YOUR_TOOLCHAIN}/cpp
export AR=${YOUR_TOOLCHAIN}/ar
export RANLIB=${YOUR_TOOLCHAIN}/ranlib
export LD=${YOUR_TOOLCHAIN}/ld
export CFLAGS="-arch i386 -std=c99 -miphoneos-version-min=7.0 -isysroot ${sysroot}"
export CXXFLAGS="-arch i386 -fexceptions -frtti -fpic -std=c++11 -stdlib=libc++ -miphoneos-version-min=7.0 -O2 -g -fvisibility=hidden -fvisibility-inlines-hidden -Os -isysroot ${sysroot}"
export LDFLAGS="-stdlib=libc++"
boost_include="`cd "../boost_1_62_0/${BUILD_DIR}/include";pwd`"
boost_lib="`cd "../boost_1_62_0/${BUILD_DIR}/i386/lib";pwd`"
make distclean
./configure --prefix=/i386 --host=i386-apple-darwin10 --with-sysroot=${sysroot} --with-boost-include=${boost_include} --with-boost-lib=${boost_lib} --enable-static --enable-shared=no --disable-examples
make -j6
make install DESTDIR=${YOUR_PATH_TO_INSTALL_DIR}
i386EOF
#Create the following shell script for x86_64
cat > ~/Downloads/QuantLib-${QL_VERSION}/build-x86_64.sh << 'x86_64EOF'
#!/bin/bash
# build-x86_64.sh
ARCH=x86_64
BOOST_FOLDER=boost_1_62_0
BUILD_DIR=ios-build
mkdir -p ${BUILD_DIR}
INSTALL_DIR="`pwd`/${BUILD_DIR}"
YOUR_PATH_TO_INSTALL_DIR="`cd "${INSTALL_DIR}";pwd`"
XCODE_ROOT=/Applications/Xcode.app/Contents/Developer
YOUR_TOOLCHAIN=${XCODE_ROOT}/Toolchains/XcodeDefault.xctoolchain/usr/bin
# xcrun --sdk iphonesimulator --show-sdk-path
# sysroot=${XCODE_ROOT}/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk
# sysroot="`xcrun --show-sdk-path`"
sysroot="`xcrun --sdk iphonesimulator --show-sdk-path`"
export CC=${YOUR_TOOLCHAIN}/clang
export CXX=${YOUR_TOOLCHAIN}/clang++
export CPP=${YOUR_TOOLCHAIN}/cpp
export AR=${YOUR_TOOLCHAIN}/ar
export RANLIB=${YOUR_TOOLCHAIN}/ranlib
export LD=${YOUR_TOOLCHAIN}/ld
export CFLAGS="-arch ${ARCH} -std=c99 -miphoneos-version-min=7.0 -isysroot ${sysroot}"
export CXXFLAGS="-arch ${ARCH} -fexceptions -frtti -fpic -std=c++11 -stdlib=libc++ -miphoneos-version-min=7.0 -O2 -g -fvisibility=hidden -fvisibility-inlines-hidden -Os -isysroot ${sysroot}"
export LDFLAGS="-stdlib=libc++"
boost_include="`cd "../${BOOST_FOLDER}/${BUILD_DIR}/include";pwd`"
boost_lib="`cd "../${BOOST_FOLDER}/${BUILD_DIR}/x86_64/lib";pwd`"
make distclean
./configure --prefix=/${ARCH} --host=${ARCH}-apple-darwin10 --with-sysroot=${sysroot} --with-boost-include=${boost_include} --with-boost-lib=${boost_lib} --enable-static --enable-shared=no --disable-examples
make -j6
make install DESTDIR=${YOUR_PATH_TO_INSTALL_DIR}
x86_64EOF
#run shell scripts to clean and build for iOS
cd $HOME/Downloads
cd QuantLib-${QL_VERSION}
rm -fr ios-build
sh build-armv7.sh
sh build-armv7s.sh
sh build-arm64.sh
sh build-i386.sh
sh build-x86_64.sh
# create FAT libQuantLib.a archive
cd $HOME/Downloads/QuantLib-${QL_VERSION}
cd ios-build
mkdir -p lib
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo \
-arch armv7 "armv7/lib/libQuantLib.a" \
-arch armv7s "armv7s/lib/libQuantLib.a" \
-arch arm64 "arm64/lib/libQuantLib.a" \
-arch i386 "i386/lib/libQuantLib.a" \
-arch x86_64 "x86_64/lib/libQuantLib.a" \
-output "lib/libQuantLib.a" \
-create
# create link for include folder
mkdir include
cd include
ln -s ../arm64/include/ql .
(6) Create QuantLib Framework for iOS
- shell script Select all
export QL_VERSION=1.12
cd $HOME/Downloads/QuantLib-${QL_VERSION}
cd ios-build
#Create the following shell script for build-qlframework.sh
cat > build-qlframework.sh << 'qlFrameworkEOF'
#!/bin/bash
# build-qlframework.sh
VERSION_TYPE=Alpha
FRAMEWORK_NAME=ql
FRAMEWORK_VERSION=A
FRAMEWORKDIR=.
FRAMEWORK_CURRENT_VERSION=${QL_VERSION}
FRAMEWORK_COMPATIBILITY_VERSION=${QL_VERSION}
FRAMEWORK_BUNDLE=${FRAMEWORKDIR}/${FRAMEWORK_NAME}.framework
rm -rf ${FRAMEWORK_BUNDLE}
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
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}
echo "Framework: Lipoing library into ${FRAMEWORK_INSTALL_NAME}"
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo \
-arch armv7 "armv7/lib/libQuantLib.a" \
-arch armv7s "armv7s/lib/libQuantLib.a" \
-arch arm64 "arm64/lib/libQuantLib.a" \
-arch i386 "i386/lib/libQuantLib.a" \
-arch x86_64 "x86_64/lib/libQuantLib.a" \
-output "${FRAMEWORK_INSTALL_NAME}" \
-create
echo "Framework: Copying includes..."
cp -r include/${FRAMEWORK_NAME}/* ${FRAMEWORK_BUNDLE}/Headers/
cat > ${FRAMEWORK_BUNDLE}/Resources/Info.plist <<InfoplistEOF
<?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>quantlib.org</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>
InfoplistEOF
echo "Done: ${FRAMEWORK_BUNDLE}"
qlFrameworkEOF
# build framework
sh build-qlframework.sh
(7) Test build x86_64 for iOS frameworks with
- shell script Select all
#Create testql.cpp
cd $HOME/Downloads
cat > testql.cpp << 'testqlEOF'
#include <ql/quantlib.hpp>
int main() {
std::cout << "BOOST version is " << BOOST_VERSION << std::endl;
std::cout << "QL version is " << QL_VERSION << std::endl;
#if __x86_64__ || __WORDSIZE == 64
std::cout << "This is 64 bits" << std::endl;
#elif __i386__ || __WORDSIZE == 32
std::cout << "This is 32 bits" << std::endl;
#else
std::cout << "This is something else" << std::endl;
#endif
return 0;
}
testqlEOF
# test build example using iOS frameworks
export QL_VERSION=1.12
xcrun clang++ -std=c++11 -stdlib=libc++ -F $HOME/Downloads/QuantLib-${QL_VERSION}/ios-build -F $HOME/Downloads/boost_1_62_0/ios-build -framework ql -isysroot `xcrun --sdk iphonesimulator --show-sdk-path` -arch x86_64 -miphoneos-version-min=7.0 -fvisibility=hidden -o testql testql.cpp
./testql
(8) Build frameworks for macosx and build RQuantLib package from source
- shell script Select all
cd $HOME/Downloads/boost_1_62_0
# Append the following user-config.jam at ~/Downloads/boost_1_62_0/tools/build/src/
cat >> tools/build/src/user-config.jam << 'EOF'
# ------------------
# darwin macosx configuration.
# ------------------
local XCODE_ROOT = /Applications/Xcode.app/Contents/Developer ;
# xcrun --sdk macosx --show-sdk-path
local MACOSXSDK = MacOSX.sdk ;
using darwin : i386~macosx
:
$(XCODE_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++
:
<striper>$(XCODE_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip
<root>$(XCODE_ROOT)/Platforms/MacOSX.platform/Developer/SDKs/$(MACOSXSDK)
<compileflags>"-arch i386"
<compileflags>"-isysroot $(XCODE_ROOT)/Platforms/MacOSX.platform/Developer/SDKs/$(MACOSXSDK)"
<compileflags>-fexceptions
<compileflags>-frtti
<compileflags>-fpic
<compileflags>-DBOOST_SP_USE_SPINLOCK
<compileflags>-std=c++11
<compileflags>-stdlib=libc++
<compileflags>-mmacosx-version-min=10.9
<compileflags>-O2
<compileflags>-g
<compileflags>-Os
<compileflags>-Wno-long-long
<compileflags>-Wno-missing-field-initializers
<compileflags>-Wno-unused-variable
<linkflags>-stdlib=libc++
<linkflags>-mmacosx-version-min=10.9
<architecture>x86
<address-model>32
<target-os>darwin
;
using darwin : x86_64~macosx
:
$(XCODE_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++
:
<striper>$(XCODE_ROOT)/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip
<root>$(XCODE_ROOT)/Platforms/MacOSX.platform/Developer/SDKs/$(MACOSXSDK)
<compileflags>"-arch x86_64"
<compileflags>"-isysroot $(XCODE_ROOT)/Platforms/MacOSX.platform/Developer/SDKs/$(MACOSXSDK)"
<compileflags>-fexceptions
<compileflags>-frtti
<compileflags>-fpic
<compileflags>-DBOOST_SP_USE_SPINLOCK
<compileflags>-std=c++11
<compileflags>-stdlib=libc++
<compileflags>-mmacosx-version-min=10.9
<compileflags>-O2
<compileflags>-g
<compileflags>-Os
<compileflags>-Wno-long-long
<compileflags>-Wno-missing-field-initializers
<compileflags>-Wno-unused-variable
<linkflags>-stdlib=libc++
<linkflags>-mmacosx-version-min=10.9
<architecture>x86
<address-model>64
<target-os>darwin
;
EOF
# build boost libraries for macosx
./bootstrap.sh --with-libraries=atomic,chrono,date_time,exception,filesystem,graph,iostreams,math,program_options,random,regex,serialization,signals,system,test,thread,wave
# clean and build for macosx, j option is num of cores x 1.5
rm -fr macosx-build
./b2 -j6 --build-dir=macosx-build --stagedir=macosx-build/i386 toolset=darwin-i386~macosx architecture=x86 address-model=32 target-os=darwin threading=multi link=static stage
./b2 -j6 --build-dir=macosx-build --stagedir=macosx-build/x86_64 toolset=darwin-x86_64~macosx architecture=x86 address-model=64 target-os=darwin threading=multi link=static stage
# create libboost.a archive for each architecture
cd $HOME/Downloads/boost_1_62_0/macosx-build
xcrun --sdk macosx ar crus i386/libboost.a boost/bin.v2/libs/*/build/darwin-i386~macosx/release/link-static/threading-multi/*/*.o
xcrun --sdk macosx ar crus x86_64/libboost.a boost/bin.v2/libs/*/build/darwin-x86_64~macosx/release/link-static/threading-multi/*/*.o
# create FAT libboost.a archive
mkdir -p lib
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo \
-arch i386 "i386/libboost.a" \
-arch x86_64 "x86_64/libboost.a" \
-output "lib/libboost.a" \
-create
# create link for include folder
mkdir include
cd include
ln -s ../../boost .
# build Boost Framework for macosx
#Create the following shell script for build-boostframework.sh
cd $HOME/Downloads/boost_1_62_0/macosx-build
cat > build-boostframework.sh << 'boostFrameworkEOF'
#!/bin/bash
# build-boostframework.sh
VERSION_TYPE=Alpha
FRAMEWORK_NAME=boost
FRAMEWORK_VERSION=A
FRAMEWORKDIR=.
FRAMEWORK_CURRENT_VERSION=1.62.0
FRAMEWORK_COMPATIBILITY_VERSION=1.62.0
FRAMEWORK_BUNDLE=${FRAMEWORKDIR}/${FRAMEWORK_NAME}.framework
rm -rf ${FRAMEWORK_BUNDLE}
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
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}
echo "Framework: Lipoing library into ${FRAMEWORK_INSTALL_NAME}"
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo \
-arch i386 "i386/libboost.a" \
-arch x86_64 "x86_64/libboost.a" \
-output "${FRAMEWORK_INSTALL_NAME}" \
-create
echo "Framework: Copying includes..."
cp -r include/${FRAMEWORK_NAME}/* ${FRAMEWORK_BUNDLE}/Headers/
cat > ${FRAMEWORK_BUNDLE}/Resources/Info.plist <<InfoplistEOF
<?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>${FRAMEWORK_NAME}.org</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>
InfoplistEOF
echo "Done: ${FRAMEWORK_BUNDLE}"
boostFrameworkEOF
# build framework
sh build-boostframework.sh
# build QuantLib libraries for macosx
export QL_VERSION=1.12
cd $HOME/Downloads/QuantLib-${QL_VERSION}
#Create the following shell script for i386
cat > ~/Downloads/QuantLib-${QL_VERSION}/build-i386-macosx.sh << 'i386EOF'
#!/bin/bash
# build-i386-macosx.sh
BUILD_DIR=macosx-build
mkdir -p ${BUILD_DIR}
INSTALL_DIR="`pwd`/${BUILD_DIR}"
YOUR_PATH_TO_INSTALL_DIR="`cd "${INSTALL_DIR}";pwd`"
# XCODE_VERSION=Xcode-9.0
# XCODE_ROOT=/Applications/${XCODE_VERSION}.app/Contents/Developer
XCODE_ROOT=/Applications/Xcode.app/Contents/Developer
YOUR_TOOLCHAIN=${XCODE_ROOT}/Toolchains/XcodeDefault.xctoolchain/usr/bin
# xcrun --sdk macosx --show-sdk-path
# sysroot=${XCODE_ROOT}/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
sysroot="`xcrun --sdk macosx --show-sdk-path`"
export CC=${YOUR_TOOLCHAIN}/clang
export CXX=${YOUR_TOOLCHAIN}/clang++
export CPP=${YOUR_TOOLCHAIN}/cpp
export AR=${YOUR_TOOLCHAIN}/ar
export RANLIB=${YOUR_TOOLCHAIN}/ranlib
export LD=${YOUR_TOOLCHAIN}/ld
export CFLAGS="-arch i386 -std=c99 -mmacosx-version-min=10.7 -isysroot ${sysroot}"
export CXXFLAGS="-arch i386 -fexceptions -frtti -fpic -std=c++11 -stdlib=libc++ -mmacosx-version-min=10.9 -O2 -g -Os -isysroot ${sysroot}"
export LDFLAGS="-stdlib=libc++ -mmacosx-version-min=10.9"
boost_include="`cd "../boost_1_62_0/${BUILD_DIR}/include";pwd`"
boost_lib="`cd "../boost_1_62_0/${BUILD_DIR}/i386/lib";pwd`"
make distclean
./configure --prefix=/i386 --host=i386-apple-darwin10 --with-sysroot=${sysroot} --with-boost-include=${boost_include} --with-boost-lib=${boost_lib} --enable-intraday --enable-static --enable-shared=no --disable-examples
make -j6
make install DESTDIR=${YOUR_PATH_TO_INSTALL_DIR}
i386EOF
#Create the following shell script for x86_64
cat > ~/Downloads/QuantLib-${QL_VERSION}/build-x86_64-macosx.sh << 'x86_64EOF'
#!/bin/bash
# build-x86_64-macosx.sh
BUILD_DIR=macosx-build
mkdir -p ${BUILD_DIR}
INSTALL_DIR="`pwd`/${BUILD_DIR}"
YOUR_PATH_TO_INSTALL_DIR="`cd "${INSTALL_DIR}";pwd`"
XCODE_ROOT=/Applications/Xcode.app/Contents/Developer
YOUR_TOOLCHAIN=${XCODE_ROOT}/Toolchains/XcodeDefault.xctoolchain/usr/bin
# xcrun --sdk macosx --show-sdk-path
# sysroot=${XCODE_ROOT}/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
sysroot="`xcrun --sdk macosx --show-sdk-path`"
export CC=${YOUR_TOOLCHAIN}/clang
export CXX=${YOUR_TOOLCHAIN}/clang++
export CPP=${YOUR_TOOLCHAIN}/cpp
export AR=${YOUR_TOOLCHAIN}/ar
export RANLIB=${YOUR_TOOLCHAIN}/ranlib
export LD=${YOUR_TOOLCHAIN}/ld
export CFLAGS="-arch x86_64 -std=c99 -mmacosx-version-min=10.7 -isysroot ${sysroot}"
export CXXFLAGS="-arch x86_64 -fexceptions -frtti -fpic -std=c++11 -stdlib=libc++ -mmacosx-version-min=10.9 -O2 -g -Os -isysroot ${sysroot}"
export LDFLAGS="-stdlib=libc++ -mmacosx-version-min=10.9"
boost_include="`cd "../boost_1_62_0/${BUILD_DIR}/include";pwd`"
boost_lib="`cd "../boost_1_62_0/${BUILD_DIR}/x86_64/lib";pwd`"
make distclean
./configure --prefix=/x86_64 --host=x86_64-apple-darwin10 --with-sysroot=${sysroot} --with-boost-include=${boost_include} --with-boost-lib=${boost_lib} --enable-intraday --enable-static --enable-shared=no --disable-examples
make -j6
make install DESTDIR=${YOUR_PATH_TO_INSTALL_DIR}
x86_64EOF
#run shell scripts to clean and build for macosx
cd $HOME/Downloads/QuantLib-${QL_VERSION}
rm -fr macosx-build
sh build-i386-macosx.sh
sh build-x86_64-macosx.sh
# create FAT libQuantLib.a archive
cd $HOME/Downloads/QuantLib-${QL_VERSION}
cd macosx-build
mkdir -p lib
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo \
-arch i386 "i386/lib/libQuantLib.a" \
-arch x86_64 "x86_64/lib/libQuantLib.a" \
-output "lib/libQuantLib.a" \
-create
# create link for include folder
mkdir include
cd include
ln -s ../x86_64/include/ql .
cd $HOME/Downloads/QuantLib-${QL_VERSION}/macosx-build
# build QuantLib Framework for macosx
#Create the following shell script for build-qlframework.sh
cat > build-qlframework.sh << 'qlFrameworkEOF'
#!/bin/bash
# build-qlframework.sh
VERSION_TYPE=Alpha
FRAMEWORK_NAME=ql
FRAMEWORK_VERSION=A
FRAMEWORKDIR=.
FRAMEWORK_CURRENT_VERSION=${QL_VERSION}
FRAMEWORK_COMPATIBILITY_VERSION=${QL_VERSION}
FRAMEWORK_BUNDLE=${FRAMEWORKDIR}/${FRAMEWORK_NAME}.framework
rm -rf ${FRAMEWORK_BUNDLE}
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
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}
echo "Framework: Lipoing library into ${FRAMEWORK_INSTALL_NAME}"
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo \
-arch i386 "i386/lib/libQuantLib.a" \
-arch x86_64 "x86_64/lib/libQuantLib.a" \
-output "${FRAMEWORK_INSTALL_NAME}" \
-create
echo "Framework: Copying includes..."
cp -r include/${FRAMEWORK_NAME}/* ${FRAMEWORK_BUNDLE}/Headers/
cat > ${FRAMEWORK_BUNDLE}/Resources/Info.plist <<InfoplistEOF
<?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>quantlib.org</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>
InfoplistEOF
echo "Done: ${FRAMEWORK_BUNDLE}"
qlFrameworkEOF
# build framework
sh build-qlframework.sh
# Test build example using macosx frameworks
export QL_VERSION=1.12
clang++ -std=c++11 -stdlib=libc++ -F $HOME/Downloads/QuantLib-${QL_VERSION}/macosx-build -F $HOME/Downloads/boost_1_62_0/macosx-build -framework ql -arch x86_64 -o testql testql.cpp
./testql
# Build RQuantLib for Mac OSX 10.12.6
(1) Build the above macosx x86_64 libraries for QuantLib and Boost. For Quantlib, it should be version >=1.8 and with --enable-intraday option. For Boost and QuantLib, should remove -fvisibility=hidden -fvisibility-inlines-hidden
(2) Install R 3.4.4 from https://cran.r-project.org/bin/macosx/ and optionally install RStudio
(3) Install clang 4.0 from http://r.research.att.com/libs/
sudo tar xzvf ${HOME}/Downloads/clang-4.0.0-darwin15.6-Release.tar.gz -C /
(4) Create R/Makevars
mkdir -p ${HOME}/.R
cat > ${HOME}/.R/Makevars << 'EOF'
CC=/usr/local/clang4/bin/clang
CXX=/usr/local/clang4/bin/clang++
CXXFLAGS=-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -Wno-nonportable-include-path -Wno-unused-variable -I${HOME}/Downloads/QuantLib-1.12/macosx-build/x86_64/include
LDFLAGS=-L/usr/local/clang4/lib -L${HOME}/Downloads/QuantLib-1.12/macosx-build/x86_64/lib
EOF
# if compile using clang6 under the latest R 3.5.0, should change path to /usr/local/clang6 accordingly.
(5) Install QuantLib 1.12 to /usr/local
export QL_VERSION=1.12
cd ${HOME}/Downloads/QuantLib-${QL_VERSION}/macosx-build/x86_64; tar czvf ../ql-${QL_VERSION}.tgz bin include lib share
cd ${HOME}/Downloads/QuantLib-${QL_VERSION}/macosx-build
sudo tar xzvf ql-${QL_VERSION}.tgz -C /usr/local
(6) Build RQuantLib with R terminal session from source and install
R
install.packages("RQuantLib", configure.args = "--with-boost-include=${HOME}/Downloads/boost_1_62_0/macosx-build/include --with-boost-lib=${HOME}/Downloads/boost_1_62_0/macosx-build/x86_64/lib", type = "source")
# installing to /Library/Frameworks/R.framework/Versions/3.4/Resources/library/RQuantLib/libs
# build binary package (should install dependencies Rcpp and zoo first) using the following
# curl -O https://cran.cnr.berkeley.edu/src/contrib/RQuantLib_0.4.4.tar.gz
# R CMD INSTALL --build --configure-args="--with-boost-include=${HOME}/Downloads/boost_1_62_0/macosx-build/include --with-boost-lib=${HOME}/Downloads/boost_1_62_0/macosx-build/x86_64/lib" RQuantLib_0.4.4.tar.gz
(7) Optionally, install https://www.xquartz.org/ if want to remove warning on : unable to load shared object '/Library/Frameworks/R.framework/Resources/modules//R_X11.so'
# Install dependencies for testing RQuantLib
R
install.packages(c("Rcpp","zoo"))
install.packages(c("rgl","RUnit"))
(9) Test RQuantLib binary package for R version 3.4.4 on Mac OSX 10.12.6
- bond1.R Select all
#Simple call with a flat curve
require(RQuantLib)
bond <- list(faceAmount=100,
settlementDays=1,
issueDate=as.Date("2014-11-30"),
redemption=100)
scheduleparams <- list(effectiveDate=as.Date("2014-11-30"),
maturityDate=as.Date("2018-11-30"),
period=2,
calendar="UnitedStates",
businessDayConvention = 4,
terminationDateConvention=4,
dateGeneration=1,
endOfMonth=1,
dayCounter = 'Thirty360')
coupon.rate <- c(0.02875)
params <- list(tradeDate=as.Date('2014-2-15'),
settleDate=as.Date('2014-2-19'),
dt=.25,
interpWhat="discount",
interpHow="loglinear")
setEvaluationDate(as.Date("2014-11-22"))
discountCurve.flat <- DiscountCurve(params, list(flat=0.05))
FixedRateBond(bond=bond, rates=coupon.rate, schedule=scheduleparams, calc=list(dayCounter='ActualActual.ISMA',compounding='Compounded', freq='Annual', durationType='Modified'),discountCurve=discountCurve.flat)
FixedRateBondPriceByYield(
settlementDays=1,
yield=0.05127,
faceAmount=100,
effectiveDate=as.Date("2014-11-30"),
maturityDate=as.Date("2018-11-30"),
period=2,
calendar="UnitedStates",
rates=c(0.05),
dayCounter=2,
businessDayConvention=4,
compound=0,
redemption=100,
issueDate=as.Date("2014-11-30"))
FixedRateBondYield(
settlementDays=1,
price=99.54593,
faceAmount=100,
effectiveDate=as.Date("2014-11-30"),
maturityDate=as.Date("2018-11-30"),
period=2,
calendar="UnitedStates",
rates=c(0.05),
dayCounter=2,
businessDayConvention=4,
compound=0,
redemption=100,
issueDate=as.Date("2014-11-30"))