Filename: boost.sh

April 8, 2015 · View on GitHub

#===============================================================================

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.

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. 5.1)

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.

#===============================================================================

: BOOSTLIBS:="randomregexgraphrandomchronothreadsignalsfilesystemsystemdatetime":{BOOST_LIBS:="random regex graph random chrono thread signals filesystem system date_time"} : {IPHONE_SDKVERSION:=xcodebuild -showsdks | grep iphoneos | egrep "[[:digit:]]+\.[[:digit:]]+" -o | tail -1} : OSXSDKVERSION:=10.8:{OSX_SDKVERSION:=10.8} : {XCODE_ROOT:=xcode-select -print-path} : ${EXTRA_CPPFLAGS:="-DBOOST_AC_USE_PTHREADS -DBOOST_SP_USE_PTHREADS -std=c++11 -stdlib=libc++"}

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

: TARBALLDIR:=pwd:{TARBALLDIR:=`pwd`} : {SRCDIR:=pwd/src} : IOSBUILDDIR:=pwd/ios/build:{IOSBUILDDIR:=`pwd`/ios/build} : {OSXBUILDDIR:=pwd/osx/build} : PREFIXDIR:=pwd/ios/prefix:{PREFIXDIR:=`pwd`/ios/prefix} : {IOSFRAMEWORKDIR:=pwd/ios/framework} : OSXFRAMEWORKDIR:=pwd/osx/framework:{OSXFRAMEWORKDIR:=`pwd`/osx/framework} : {COMPILER:="clang++"}

: BOOSTVERSION:=1.55.0:{BOOST_VERSION:=1.55.0} : {BOOST_VERSION2:=1_55_0}

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" OSX_DEV_CMD="xcrun --sdk macosx"

ARM_COMBINED_LIB=IOSBUILDDIR/libboostarm.aSIMCOMBINEDLIB=IOSBUILDDIR/lib_boost_arm.a SIM_COMBINED_LIB=IOSBUILDDIR/lib_boost_x86.a

#===============================================================================

#===============================================================================

Functions

#===============================================================================

abort() { echo echo "Aborted: $@" exit 1 }

doneSection() { echo echo "=================================================================" echo "Done" echo }

#===============================================================================

cleanEverythingReadyToStart() { echo Cleaning everything before we start to build...

rm -rf iphone-build iphonesim-build osx-build
rm -rf $IOSBUILDDIR
rm -rf $OSXBUILDDIR
rm -rf $PREFIXDIR
rm -rf $IOSFRAMEWORKDIR/$FRAMEWORK_NAME.framework
rm -rf $OSXFRAMEWORKDIR/$FRAMEWORK_NAME.framework

doneSection

}

#===============================================================================

downloadBoost() { if [ ! -s TARBALLDIR/boost_{BOOST_VERSION2}.tar.bz2 ]; then echo "Downloading boost BOOSTVERSION"curlLo{BOOST_VERSION}" curl -L -o TARBALLDIR/boost_BOOSTVERSION2.tar.bz2http://sourceforge.net/projects/boost/files/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 BOOSTSRC/tools/build/v2/userconfig.jambkBOOST_SRC/tools/build/v2/user-config.jam-bk BOOST_SRC/tools/build/v2/user-config.jam }

#===============================================================================

updateBoost() { echo Updating boost into $BOOST_SRC...

cp $BOOST_SRC/tools/build/v2/user-config.jam $BOOST_SRC/tools/build/v2/user-config.jam-bk

cat >> $BOOST_SRC/tools/build/v2/user-config.jam <<EOF

using darwin : IPHONESDKVERSION iphone:{IPHONE_SDKVERSION}~iphone : XCODE_ROOT/Toolchains/XcodeDefault.xctoolchain/usr/bin/COMPILERarcharmv6archarmv7archarmv7sarcharm64fvisibility=hiddenfvisibilityinlineshiddenCOMPILER -arch armv6 -arch armv7 -arch armv7s -arch arm64 -fvisibility=hidden -fvisibility-inlines-hidden EXTRA_CPPFLAGS : XCODEROOT/Platforms/iPhoneOS.platform/Developer:<architecture>arm<targetos>iphone;usingdarwin:XCODE_ROOT/Platforms/iPhoneOS.platform/Developer : <architecture>arm <target-os>iphone ; using darwin : {IPHONE_SDKVERSION}~iphonesim : XCODEROOT/Toolchains/XcodeDefault.xctoolchain/usr/bin/XCODE_ROOT/Toolchains/XcodeDefault.xctoolchain/usr/bin/COMPILER -arch i386 -arch x86_64 -fvisibility=hidden -fvisibility-inlines-hidden EXTRACPPFLAGS:<striper><root>EXTRA_CPPFLAGS : <striper> <root>XCODE_ROOT/Platforms/iPhoneSimulator.platform/Developer : x86 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

}

#===============================================================================

buildBoostForIPhoneOS() { cd $BOOST_SRC

# Install this one so we can copy the includes for the frameworks...
./bjam -j16 --with-system --with-date_time --with-random --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

}

#===============================================================================

scrunchAllLibsTogetherInOneLibPerPlatform() { cd $BOOST_SRC

mkdir -p $IOSBUILDDIR/armv6/obj
mkdir -p $IOSBUILDDIR/armv7/obj
mkdir -p $IOSBUILDDIR/armv7s/obj
mkdir -p $IOSBUILDDIR/arm64/obj
mkdir -p $IOSBUILDDIR/i386/obj
mkdir -p $IOSBUILDDIR/x86_64/obj

mkdir -p $OSXBUILDDIR/i386/obj
mkdir -p $OSXBUILDDIR/x86_64/obj

ALL_LIBS=""

echo Splitting all existing fat binaries...

for NAME in $BOOST_LIBS; do
    ALL_LIBS="$ALL_LIBS libboost_$NAME.a"

    $ARM_DEV_CMD lipo "iphone-build/stage/lib/libboost_$NAME.a" -thin armv6 -o $IOSBUILDDIR/armv6/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

	$ARM_DEV_CMD lipo "iphonesim-build/stage/lib/libboost_$NAME.a" -thin i386 -o $IOSBUILDDIR/i386/libboost_$NAME.a
	$ARM_DEV_CMD lipo "iphonesim-build/stage/lib/libboost_$NAME.a" -thin x86_64 -o $IOSBUILDDIR/x86_64/libboost_$NAME.a

    $ARM_DEV_CMD lipo "osx-build/stage/lib/libboost_$NAME.a" -thin i386 -o $OSXBUILDDIR/i386/libboost_$NAME.a
    $ARM_DEV_CMD lipo "osx-build/stage/lib/libboost_$NAME.a" -thin x86_64 -o $OSXBUILDDIR/x86_64/libboost_$NAME.a
done

echo "Decomposing each architecture's .a files"

for NAME in $ALL_LIBS; do
    echo Decomposing $NAME...
    (cd $IOSBUILDDIR/armv6/obj; ar -x ../$NAME );
    (cd $IOSBUILDDIR/armv7/obj; ar -x ../$NAME );
    (cd $IOSBUILDDIR/armv7s/obj; ar -x ../$NAME );
	(cd $IOSBUILDDIR/arm64/obj; ar -x ../$NAME );
    (cd $IOSBUILDDIR/i386/obj; ar -x ../$NAME );
	(cd $IOSBUILDDIR/x86_64/obj; ar -x ../$NAME );

    (cd $OSXBUILDDIR/i386/obj; ar -x ../$NAME );
    (cd $OSXBUILDDIR/x86_64/obj; ar -x ../$NAME );
done

echo "Linking each architecture into an uberlib ($ALL_LIBS => libboost.a )"

rm $IOSBUILDDIR/*/libboost.a

echo ...armv6
(cd $IOSBUILDDIR/armv6; $ARM_DEV_CMD ar crus libboost.a obj/*.o; )
echo ...armv7
(cd $IOSBUILDDIR/armv7; $ARM_DEV_CMD ar crus libboost.a obj/*.o; )
echo ...armv7s
(cd $IOSBUILDDIR/armv7s; $ARM_DEV_CMD ar crus libboost.a obj/*.o; )
echo ...arm64
(cd $IOSBUILDDIR/arm64; $ARM_DEV_CMD ar crus libboost.a obj/*.o; )
echo ...i386
(cd $IOSBUILDDIR/i386;  $SIM_DEV_CMD ar crus libboost.a obj/*.o; )
echo ...x86_64
(cd $IOSBUILDDIR/x86_64;  $SIM_DEV_CMD ar crus libboost.a obj/*.o; )

rm $OSXBUILDDIR/*/libboost.a
echo ...osx-i386
(cd $OSXBUILDDIR/i386;  $SIM_DEV_CMD ar crus libboost.a obj/*.o; )

echo ...x86_64
(cd $OSXBUILDDIR/x86_64;  $SIM_DEV_CMD ar crus libboost.a obj/*.o; )

}

#=============================================================================== 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
CFBundleDevelopmentRegion English CFBundleExecutable ${FRAMEWORK_NAME} CFBundleIdentifier org.boost CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType FMWK CFBundleSignature ???? CFBundleVersion ${FRAMEWORK_CURRENT_VERSION} EOF
doneSection

}

#===============================================================================

Execution starts here

#===============================================================================

mkdir -p $IOSBUILDDIR

cleanEverythingReadyToStart #may want to comment if repeatedly running during dev restoreBoost

echo "BOOST_VERSION: BOOSTVERSION"echo"BOOSTLIBS:BOOST_VERSION" echo "BOOST_LIBS: BOOST_LIBS" echo "BOOST_SRC: BOOSTSRC"echo"IOSBUILDDIR:BOOST_SRC" echo "IOSBUILDDIR: IOSBUILDDIR" echo "OSXBUILDDIR: OSXBUILDDIR"echo"PREFIXDIR:OSXBUILDDIR" echo "PREFIXDIR: PREFIXDIR" echo "IOSFRAMEWORKDIR: IOSFRAMEWORKDIR"echo"OSXFRAMEWORKDIR:IOSFRAMEWORKDIR" echo "OSXFRAMEWORKDIR: OSXFRAMEWORKDIR" echo "IPHONE_SDKVERSION: IPHONESDKVERSION"echo"XCODEROOT:IPHONE_SDKVERSION" echo "XCODE_ROOT: XCODE_ROOT" echo "COMPILER: $COMPILER" echo

downloadBoost unpackBoost

bootstrapBoost updateBoost buildBoostForIPhoneOS

restoreBoost

echo "Completed successfully"

#===============================================================================