Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #===============================================================================
- # Filename: boost.sh
- # Author: Pete Goodliffe
- # Copyright: (c) Copyright 2009 Pete Goodliffe
- # Licence: Please feel free to use this, with attribution
- # Modified version
- #===============================================================================
- #
- # Builds a Boost framework for the iPhone, iPhone Simulator, and OSX.
- # Creates a set of universal libraries that can be used on an iPhone and in the
- # iPhone simulator. Then creates a pseudo-framework to make using boost in Xcode
- # less painful.
- #
- # To configure the script, define:
- # BOOST_LIBS: which libraries to build
- # IPHONE_SDKVERSION: iPhone SDK version (e.g. 8.1)
- # OSX_SDKVERSION: OSX SDK version (e.g. 10.10)
- #
- # Then go get the source tar.bz of the boost you want to build, shove it in the
- # same directory as this script, and run "./boost.sh". Grab a cuppa. And voila.
- #
- #===============================================================================
- : ${BOOST_VERSION:=1.58.0}
- : ${BOOST_VERSION2:=1_58_0}
- : ${BOOST_LIBS:="atomic chrono date_time exception filesystem program_options random signals system test thread"}
- # Minimum IOS target version.
- : ${MIN_IOS_VERSION:=8.0}
- # Current iPhone SDK
- : ${IPHONE_SDKVERSION:=`xcodebuild -showsdks | grep iphoneos | egrep "[[:digit:]]+\.[[:digit:]]+" -o | tail -1`}
- # Specific iPhone SDK
- # : ${IPHONE_SDKVERSION:=9.0}
- : ${XCODE_ROOT:=`xcode-select -print-path`}
- # The EXTRA_CPPFLAGS definition works around a thread race issue in
- # shared_ptr. I encountered this historically and have not verified that
- # the fix is no longer required. Without using the posix thread primitives
- # an invalid compare-and-swap ARM instruction (non-thread-safe) was used for the
- # shared_ptr use count causing nasty and subtle bugs.
- #
- # Should perhaps also consider/use instead: -BOOST_SP_USE_PTHREADS
- : ${EXTRA_CPPFLAGS:="-DBOOST_AC_USE_PTHREADS -DBOOST_SP_USE_PTHREADS -g -DNDEBUG -std=c++11 -stdlib=libc++ -fvisibility=hidden -fvisibility-inlines-hidden"}
- : ${EXTRA_IOS_CPPFLAGS:="$EXTRA_CPPFLAGS -mios-version-min=$MIN_IOS_VERSION"}
- : ${TARBALLDIR:=`pwd`}
- : ${SRCDIR:=$TARBALLDIR/src}
- : ${IOSOUTPUTDIR:=$TARBALLDIR/ios}
- : ${IOSBUILDDIR:=$IOSOUTPUTDIR/build}
- : ${PREFIXDIR:=$IOSOUTPUTDIR/prefix}
- : ${IOSFRAMEWORKDIR:=$IOSOUTPUTDIR/framework}
- BOOST_TARBALL=$TARBALLDIR/boost_$BOOST_VERSION2.tar.bz2
- BOOST_SRC=$SRCDIR/boost_${BOOST_VERSION2}
- ARM_DEV_CMD="xcrun --sdk iphoneos"
- SIM_DEV_CMD="xcrun --sdk iphonesimulator"
- #===============================================================================
- # Functions
- #===============================================================================
- abort()
- {
- echo
- echo "Aborted: $@"
- exit 1
- }
- doneSection()
- {
- echo
- echo "Done"
- echo "================================================================="
- echo
- }
- #===============================================================================
- cleanup()
- {
- echo Cleaning everything before we start to build...
- rm -rf $BOOST_SRC/iphone-build $BOOST_SRC/iphonesim-build
- rm -rf $IOSOUTPUTDIR
- doneSection
- }
- #===============================================================================
- downloadBoost()
- {
- if [ ! -s $TARBALLDIR/boost_${BOOST_VERSION2}.tar.bz2 ]; then
- echo "Downloading boost ${BOOST_VERSION}"
- curl -L -o $TARBALLDIR/boost_${BOOST_VERSION2}.tar.bz2 http://sourceforge.net/projects/boost/files/boost/${BOOST_VERSION}/boost_${BOOST_VERSION2}.tar.bz2/download
- fi
- doneSection
- }
- #===============================================================================
- unpackBoost()
- {
- [ -f "$BOOST_TARBALL" ] || abort "Source tarball missing."
- echo Unpacking boost into $SRCDIR...
- [ -d $SRCDIR ] || mkdir -p $SRCDIR
- [ -d $BOOST_SRC ] || ( cd $SRCDIR; tar xfj $BOOST_TARBALL )
- [ -d $BOOST_SRC ] && echo " ...unpacked as $BOOST_SRC"
- doneSection
- }
- #===============================================================================
- restoreBoost()
- {
- cp $BOOST_SRC/tools/build/src/user-config.jam-bk $BOOST_SRC/tools/build/src/user-config.jam
- }
- #===============================================================================
- updateBoost()
- {
- echo Updating boost into $BOOST_SRC...
- mv $BOOST_SRC/tools/build/src/user-config.jam $BOOST_SRC/tools/build/src/user-config.jam-bk
- cat >> $BOOST_SRC/tools/build/src/user-config.jam <<EOF
- using darwin : ${IPHONE_SDKVERSION}~iphone
- : $XCODE_ROOT/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch armv7 -arch armv7s -arch arm64 $EXTRA_IOS_CPPFLAGS
- : <striper> <root>$XCODE_ROOT/Platforms/iPhoneOS.platform/Developer
- : <architecture>arm <target-os>iphone
- ;
- using darwin : ${IPHONE_SDKVERSION}~iphonesim
- : g++ -arch i386 -arch x86_64 $EXTRA_IOS_CPPFLAGS
- : <striper> <root>$XCODE_ROOT/Platforms/iPhoneSimulator.platform/Developer
- : <architecture>x86 <target-os>iphone
- ;
- EOF
- doneSection
- }
- #===============================================================================
- inventMissingHeaders()
- {
- # These files are missing in the ARM iPhoneOS SDK, but they are in the simulator.
- # They are supported on the device, so we copy them from x86 SDK to a staging area
- # to use them on ARM, too.
- echo Invent missing headers
- cp $XCODE_ROOT/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator${IPHONE_SDKVERSION}.sdk/usr/include/{crt_externs,bzlib}.h $BOOST_SRC
- }
- #===============================================================================
- bootstrapBoost()
- {
- cd $BOOST_SRC
- BOOST_LIBS_COMMA=$(echo $BOOST_LIBS | sed -e "s/ /,/g")
- echo "Bootstrapping (with libs $BOOST_LIBS_COMMA)"
- ./bootstrap.sh --with-libraries=$BOOST_LIBS_COMMA
- doneSection
- }
- #===============================================================================
- buildBoost()
- {
- cd $BOOST_SRC
- echo Building Boost for iPhone
- # Install this one so we can copy the includes for the frameworks...
- ./b2 -j16 --build-dir=iphone-build --stagedir=iphone-build/stage --prefix=$PREFIXDIR toolset=darwin architecture=arm target-os=iphone macosx-version=iphone-${IPHONE_SDKVERSION} define=_LITTLE_ENDIAN link=static stage
- ./b2 -j16 --build-dir=iphone-build --stagedir=iphone-build/stage --prefix=$PREFIXDIR toolset=darwin architecture=arm target-os=iphone macosx-version=iphone-${IPHONE_SDKVERSION} define=_LITTLE_ENDIAN link=static install
- doneSection
- echo Building Boost for iPhoneSimulator
- ./b2 -j16 --build-dir=iphonesim-build --stagedir=iphonesim-build/stage toolset=darwin-${IPHONE_SDKVERSION}~iphonesim architecture=x86 target-os=iphone macosx-version=iphonesim-${IPHONE_SDKVERSION} link=static stage
- doneSection
- }
- #===============================================================================
- unpackArchive()
- {
- BUILDDIR=$1
- LIBNAME=$2
- echo "Unpacking $LIBNAME"
- mkdir -p $BUILDDIR/$LIBNAME
- rm $BUILDDIR/$LIBNAME/*.o
- rm $BUILDDIR/$LIBNAME/*.SYMDEF*
- (
- cd $BUILDDIR/$NAME; ar -x ../../libboost_$NAME.a;
- for FILE in *.o; do
- NEW_FILE="${NAME}_${FILE}"
- mv $FILE $NEW_FILE
- done
- )
- }
- scrunchAllLibsTogetherInOneLibPerPlatform()
- {
- cd $BOOST_SRC
- # iOS Device
- mkdir -p $IOSBUILDDIR/armv7/obj
- mkdir -p $IOSBUILDDIR/armv7s/obj
- mkdir -p $IOSBUILDDIR/arm64/obj
- # iOS Simulator
- mkdir -p $IOSBUILDDIR/i386/obj
- mkdir -p $IOSBUILDDIR/x86_64/obj
- ALL_LIBS=""
- echo Splitting all existing fat binaries...
- for NAME in $BOOST_LIBS; do
- if [ "$NAME" == "test" ]; then
- NAME="unit_test_framework"
- fi
- ALL_LIBS="$ALL_LIBS libboost_$NAME.a"
- $ARM_DEV_CMD lipo "iphone-build/stage/lib/libboost_$NAME.a" -thin armv7 -o $IOSBUILDDIR/armv7/libboost_$NAME.a
- $ARM_DEV_CMD lipo "iphone-build/stage/lib/libboost_$NAME.a" -thin armv7s -o $IOSBUILDDIR/armv7s/libboost_$NAME.a
- $ARM_DEV_CMD lipo "iphone-build/stage/lib/libboost_$NAME.a" -thin arm64 -o $IOSBUILDDIR/arm64/libboost_$NAME.a
- $SIM_DEV_CMD lipo "iphonesim-build/stage/lib/libboost_$NAME.a" -thin i386 -o $IOSBUILDDIR/i386/libboost_$NAME.a
- $SIM_DEV_CMD lipo "iphonesim-build/stage/lib/libboost_$NAME.a" -thin x86_64 -o $IOSBUILDDIR/x86_64/libboost_$NAME.a
- done
- echo "Decomposing each architecture's .a files"
- for NAME in $BOOST_LIBS; do
- if [ "$NAME" == "test" ]; then
- NAME="unit_test_framework"
- fi
- echo "Decomposing libboost_${NAME}.a"
- unpackArchive "$IOSBUILDDIR/armv7/obj" $NAME
- unpackArchive "$IOSBUILDDIR/armv7s/obj" $NAME
- unpackArchive "$IOSBUILDDIR/arm64/obj" $NAME
- unpackArchive "$IOSBUILDDIR/i386/obj" $NAME
- unpackArchive "$IOSBUILDDIR/x86_64/obj" $NAME
- done
- echo "Linking each architecture into an uberlib ($ALL_LIBS => libboost.a )"
- rm $IOSBUILDDIR/*/libboost.a
- for NAME in $BOOST_LIBS; do
- if [ "$NAME" == "test" ]; then
- NAME="unit_test_framework"
- fi
- echo $NAME
- echo ...armv7
- (cd $IOSBUILDDIR/armv7; $ARM_DEV_CMD ar crus libboost.a obj/$NAME/*.o; )
- echo ...armv7s
- (cd $IOSBUILDDIR/armv7s; $ARM_DEV_CMD ar crus libboost.a obj/$NAME/*.o; )
- echo ...arm64
- (cd $IOSBUILDDIR/arm64; $ARM_DEV_CMD ar crus libboost.a obj/$NAME/*.o; )
- echo ...i386
- (cd $IOSBUILDDIR/i386; $SIM_DEV_CMD ar crus libboost.a obj/$NAME/*.o; )
- echo ...x86_64
- (cd $IOSBUILDDIR/x86_64; $SIM_DEV_CMD ar crus libboost.a obj/$NAME/*.o; )
- done
- }
- #===============================================================================
- buildFramework()
- {
- : ${1:?}
- FRAMEWORKDIR=$1
- BUILDDIR=$2
- VERSION_TYPE=Alpha
- FRAMEWORK_NAME=boost
- FRAMEWORK_VERSION=A
- FRAMEWORK_CURRENT_VERSION=$BOOST_VERSION
- FRAMEWORK_COMPATIBILITY_VERSION=$BOOST_VERSION
- FRAMEWORK_BUNDLE=$FRAMEWORKDIR/$FRAMEWORK_NAME.framework
- echo "Framework: Building $FRAMEWORK_BUNDLE from $BUILDDIR..."
- rm -rf $FRAMEWORK_BUNDLE
- echo "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
- echo "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
- echo "Lipoing library into $FRAMEWORK_INSTALL_NAME..."
- $ARM_DEV_CMD lipo -create $BUILDDIR/*/libboost.a -o "$FRAMEWORK_INSTALL_NAME" || abort "Lipo $1 failed"
- echo "Framework: Copying includes..."
- cp -r $PREFIXDIR/include/boost/* $FRAMEWORK_BUNDLE/Headers/
- echo "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.boost</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
- }
- #===============================================================================
- # Execution starts here
- #===============================================================================
- # may want to comment if repeatedly running during dev
- cleanup
- echo "BOOST_VERSION: $BOOST_VERSION"
- echo "IPHONE_SDKVERSION: $IPHONE_SDKVERSION"
- echo "MIN_IOS_VERSION: $MIN_IOS_VERSION"
- echo "BOOST_LIBS: $BOOST_LIBS"
- echo "BOOST_SRC: $BOOST_SRC"
- echo "IOSBUILDDIR: $IOSBUILDDIR"
- echo "PREFIXDIR: $PREFIXDIR"
- echo "IOSFRAMEWORKDIR: $IOSFRAMEWORKDIR"
- echo "XCODE_ROOT: $XCODE_ROOT"
- echo
- downloadBoost
- unpackBoost
- inventMissingHeaders
- bootstrapBoost
- updateBoost
- buildBoost
- scrunchAllLibsTogetherInOneLibPerPlatform
- buildFramework $IOSFRAMEWORKDIR $IOSBUILDDIR
- restoreBoost
- echo "Completed successfully"
- #===============================================================================
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement