Advertisement
Guest User

Untitled

a guest
Sep 21st, 2015
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 12.97 KB | None | 0 0
  1. #===============================================================================
  2. # Filename:  boost.sh
  3. # Author:    Pete Goodliffe
  4. # Copyright: (c) Copyright 2009 Pete Goodliffe
  5. # Licence:   Please feel free to use this, with attribution
  6. # Modified version
  7. #===============================================================================
  8. #
  9. # Builds a Boost framework for the iPhone, iPhone Simulator, and OSX.
  10. # Creates a set of universal libraries that can be used on an iPhone and in the
  11. # iPhone simulator. Then creates a pseudo-framework to make using boost in Xcode
  12. # less painful.
  13. #
  14. # To configure the script, define:
  15. #    BOOST_LIBS:        which libraries to build
  16. #    IPHONE_SDKVERSION: iPhone SDK version (e.g. 8.1)
  17. #    OSX_SDKVERSION: OSX SDK version (e.g. 10.10)
  18. #
  19. # Then go get the source tar.bz of the boost you want to build, shove it in the
  20. # same directory as this script, and run "./boost.sh". Grab a cuppa. And voila.
  21. #
  22. #===============================================================================
  23.  
  24. : ${BOOST_VERSION:=1.58.0}
  25. : ${BOOST_VERSION2:=1_58_0}
  26.  
  27. : ${BOOST_LIBS:="atomic chrono date_time exception filesystem program_options random signals system test thread"}
  28.  
  29. # Minimum IOS target version.
  30. : ${MIN_IOS_VERSION:=8.0}
  31.  
  32. # Current iPhone SDK
  33. : ${IPHONE_SDKVERSION:=`xcodebuild -showsdks | grep iphoneos | egrep "[[:digit:]]+\.[[:digit:]]+" -o | tail -1`}
  34. # Specific iPhone SDK
  35. # : ${IPHONE_SDKVERSION:=9.0}
  36.  
  37. : ${XCODE_ROOT:=`xcode-select -print-path`}
  38.  
  39. # The EXTRA_CPPFLAGS definition works around a thread race issue in
  40. # shared_ptr. I encountered this historically and have not verified that
  41. # the fix is no longer required. Without using the posix thread primitives
  42. # an invalid compare-and-swap ARM instruction (non-thread-safe) was used for the
  43. # shared_ptr use count causing nasty and subtle bugs.
  44. #
  45. # Should perhaps also consider/use instead: -BOOST_SP_USE_PTHREADS
  46. : ${EXTRA_CPPFLAGS:="-DBOOST_AC_USE_PTHREADS -DBOOST_SP_USE_PTHREADS -g -DNDEBUG -std=c++11 -stdlib=libc++ -fvisibility=hidden -fvisibility-inlines-hidden"}
  47. : ${EXTRA_IOS_CPPFLAGS:="$EXTRA_CPPFLAGS -mios-version-min=$MIN_IOS_VERSION"}
  48.  
  49. : ${TARBALLDIR:=`pwd`}
  50. : ${SRCDIR:=$TARBALLDIR/src}
  51. : ${IOSOUTPUTDIR:=$TARBALLDIR/ios}
  52. : ${IOSBUILDDIR:=$IOSOUTPUTDIR/build}
  53. : ${PREFIXDIR:=$IOSOUTPUTDIR/prefix}
  54. : ${IOSFRAMEWORKDIR:=$IOSOUTPUTDIR/framework}
  55.  
  56. BOOST_TARBALL=$TARBALLDIR/boost_$BOOST_VERSION2.tar.bz2
  57. BOOST_SRC=$SRCDIR/boost_${BOOST_VERSION2}
  58.  
  59. ARM_DEV_CMD="xcrun --sdk iphoneos"
  60. SIM_DEV_CMD="xcrun --sdk iphonesimulator"
  61.  
  62. #===============================================================================
  63. # Functions
  64. #===============================================================================
  65.  
  66. abort()
  67. {
  68.     echo
  69.     echo "Aborted: $@"
  70.     exit 1
  71. }
  72.  
  73. doneSection()
  74. {
  75.     echo
  76.     echo "Done"
  77.     echo "================================================================="
  78.     echo
  79. }
  80.  
  81. #===============================================================================
  82.  
  83. cleanup()
  84. {
  85.     echo Cleaning everything before we start to build...
  86.  
  87.     rm -rf $BOOST_SRC/iphone-build $BOOST_SRC/iphonesim-build
  88.     rm -rf $IOSOUTPUTDIR
  89.  
  90.     doneSection
  91. }
  92.  
  93. #===============================================================================
  94.  
  95. downloadBoost()
  96. {
  97.     if [ ! -s $TARBALLDIR/boost_${BOOST_VERSION2}.tar.bz2 ]; then
  98.         echo "Downloading boost ${BOOST_VERSION}"
  99.         curl -L -o $TARBALLDIR/boost_${BOOST_VERSION2}.tar.bz2 http://sourceforge.net/projects/boost/files/boost/${BOOST_VERSION}/boost_${BOOST_VERSION2}.tar.bz2/download
  100.     fi
  101.  
  102.     doneSection
  103. }
  104.  
  105. #===============================================================================
  106.  
  107. unpackBoost()
  108. {
  109.     [ -f "$BOOST_TARBALL" ] || abort "Source tarball missing."
  110.  
  111.     echo Unpacking boost into $SRCDIR...
  112.  
  113.     [ -d $SRCDIR ]    || mkdir -p $SRCDIR
  114.     [ -d $BOOST_SRC ] || ( cd $SRCDIR; tar xfj $BOOST_TARBALL )
  115.     [ -d $BOOST_SRC ] && echo "    ...unpacked as $BOOST_SRC"
  116.  
  117.     doneSection
  118. }
  119.  
  120. #===============================================================================
  121.  
  122. restoreBoost()
  123. {
  124.     cp $BOOST_SRC/tools/build/src/user-config.jam-bk $BOOST_SRC/tools/build/src/user-config.jam
  125. }
  126.  
  127. #===============================================================================
  128.  
  129. updateBoost()
  130. {
  131.     echo Updating boost into $BOOST_SRC...
  132.  
  133.     mv $BOOST_SRC/tools/build/src/user-config.jam $BOOST_SRC/tools/build/src/user-config.jam-bk
  134.  
  135.     cat >> $BOOST_SRC/tools/build/src/user-config.jam <<EOF
  136. using darwin : ${IPHONE_SDKVERSION}~iphone
  137. : $XCODE_ROOT/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch armv7 -arch armv7s -arch arm64 $EXTRA_IOS_CPPFLAGS
  138. : <striper> <root>$XCODE_ROOT/Platforms/iPhoneOS.platform/Developer
  139. : <architecture>arm <target-os>iphone
  140. ;
  141. using darwin : ${IPHONE_SDKVERSION}~iphonesim
  142. : g++ -arch i386 -arch x86_64 $EXTRA_IOS_CPPFLAGS
  143. : <striper> <root>$XCODE_ROOT/Platforms/iPhoneSimulator.platform/Developer
  144. : <architecture>x86 <target-os>iphone
  145. ;
  146. EOF
  147.  
  148.     doneSection
  149. }
  150.  
  151. #===============================================================================
  152.  
  153. inventMissingHeaders()
  154. {
  155.     # These files are missing in the ARM iPhoneOS SDK, but they are in the simulator.
  156.     # They are supported on the device, so we copy them from x86 SDK to a staging area
  157.     # to use them on ARM, too.
  158.     echo Invent missing headers
  159.  
  160.     cp $XCODE_ROOT/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator${IPHONE_SDKVERSION}.sdk/usr/include/{crt_externs,bzlib}.h $BOOST_SRC
  161. }
  162.  
  163. #===============================================================================
  164.  
  165. bootstrapBoost()
  166. {
  167.     cd $BOOST_SRC
  168.  
  169.     BOOST_LIBS_COMMA=$(echo $BOOST_LIBS | sed -e "s/ /,/g")
  170.     echo "Bootstrapping (with libs $BOOST_LIBS_COMMA)"
  171.     ./bootstrap.sh --with-libraries=$BOOST_LIBS_COMMA
  172.  
  173.     doneSection
  174. }
  175.  
  176. #===============================================================================
  177.  
  178. buildBoost()
  179. {
  180.     cd $BOOST_SRC
  181.  
  182.     echo Building Boost for iPhone
  183.     # Install this one so we can copy the includes for the frameworks...
  184.     ./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
  185.     ./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
  186.     doneSection
  187.  
  188.     echo Building Boost for iPhoneSimulator
  189.     ./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
  190.     doneSection
  191. }
  192.  
  193. #===============================================================================
  194.  
  195. unpackArchive()
  196. {
  197.     BUILDDIR=$1
  198.     LIBNAME=$2
  199.  
  200.     echo "Unpacking $LIBNAME"
  201.  
  202.     mkdir -p $BUILDDIR/$LIBNAME
  203.     rm $BUILDDIR/$LIBNAME/*.o
  204.     rm $BUILDDIR/$LIBNAME/*.SYMDEF*
  205.  
  206.     (
  207.         cd $BUILDDIR/$NAME; ar -x ../../libboost_$NAME.a;
  208.         for FILE in *.o; do
  209.             NEW_FILE="${NAME}_${FILE}"
  210.             mv $FILE $NEW_FILE
  211.         done
  212.     )
  213. }
  214.  
  215. scrunchAllLibsTogetherInOneLibPerPlatform()
  216. {
  217.     cd $BOOST_SRC
  218.  
  219.     # iOS Device
  220.     mkdir -p $IOSBUILDDIR/armv7/obj
  221.     mkdir -p $IOSBUILDDIR/armv7s/obj
  222.     mkdir -p $IOSBUILDDIR/arm64/obj
  223.  
  224.     # iOS Simulator
  225.     mkdir -p $IOSBUILDDIR/i386/obj
  226.     mkdir -p $IOSBUILDDIR/x86_64/obj
  227.  
  228.     ALL_LIBS=""
  229.  
  230.     echo Splitting all existing fat binaries...
  231.  
  232.     for NAME in $BOOST_LIBS; do
  233.         if [ "$NAME" == "test" ]; then
  234.             NAME="unit_test_framework"
  235.         fi
  236.  
  237.         ALL_LIBS="$ALL_LIBS libboost_$NAME.a"
  238.  
  239.         $ARM_DEV_CMD lipo "iphone-build/stage/lib/libboost_$NAME.a" -thin armv7 -o $IOSBUILDDIR/armv7/libboost_$NAME.a
  240.         $ARM_DEV_CMD lipo "iphone-build/stage/lib/libboost_$NAME.a" -thin armv7s -o $IOSBUILDDIR/armv7s/libboost_$NAME.a
  241.         $ARM_DEV_CMD lipo "iphone-build/stage/lib/libboost_$NAME.a" -thin arm64 -o $IOSBUILDDIR/arm64/libboost_$NAME.a
  242.  
  243.         $SIM_DEV_CMD lipo "iphonesim-build/stage/lib/libboost_$NAME.a" -thin i386 -o $IOSBUILDDIR/i386/libboost_$NAME.a
  244.         $SIM_DEV_CMD lipo "iphonesim-build/stage/lib/libboost_$NAME.a" -thin x86_64 -o $IOSBUILDDIR/x86_64/libboost_$NAME.a
  245.     done
  246.  
  247.     echo "Decomposing each architecture's .a files"
  248.  
  249.     for NAME in $BOOST_LIBS; do
  250.         if [ "$NAME" == "test" ]; then
  251.             NAME="unit_test_framework"
  252.         fi
  253.  
  254.         echo "Decomposing libboost_${NAME}.a"
  255.         unpackArchive "$IOSBUILDDIR/armv7/obj" $NAME
  256.         unpackArchive "$IOSBUILDDIR/armv7s/obj" $NAME
  257.         unpackArchive "$IOSBUILDDIR/arm64/obj" $NAME
  258.  
  259.         unpackArchive "$IOSBUILDDIR/i386/obj" $NAME
  260.         unpackArchive "$IOSBUILDDIR/x86_64/obj" $NAME
  261.     done
  262.  
  263.     echo "Linking each architecture into an uberlib ($ALL_LIBS => libboost.a )"
  264.     rm $IOSBUILDDIR/*/libboost.a
  265.  
  266.     for NAME in $BOOST_LIBS; do
  267.         if [ "$NAME" == "test" ]; then
  268.             NAME="unit_test_framework"
  269.         fi
  270.  
  271.         echo $NAME
  272.  
  273.         echo ...armv7
  274.         (cd $IOSBUILDDIR/armv7; $ARM_DEV_CMD ar crus libboost.a obj/$NAME/*.o; )
  275.         echo ...armv7s
  276.         (cd $IOSBUILDDIR/armv7s; $ARM_DEV_CMD ar crus libboost.a obj/$NAME/*.o; )
  277.         echo ...arm64
  278.         (cd $IOSBUILDDIR/arm64; $ARM_DEV_CMD ar crus libboost.a obj/$NAME/*.o; )
  279.  
  280.         echo ...i386
  281.         (cd $IOSBUILDDIR/i386;  $SIM_DEV_CMD ar crus libboost.a obj/$NAME/*.o; )
  282.         echo ...x86_64
  283.         (cd $IOSBUILDDIR/x86_64;  $SIM_DEV_CMD ar crus libboost.a obj/$NAME/*.o; )
  284.     done
  285. }
  286.  
  287. #===============================================================================
  288. buildFramework()
  289. {
  290.     : ${1:?}
  291.     FRAMEWORKDIR=$1
  292.     BUILDDIR=$2
  293.  
  294.     VERSION_TYPE=Alpha
  295.     FRAMEWORK_NAME=boost
  296.     FRAMEWORK_VERSION=A
  297.  
  298.     FRAMEWORK_CURRENT_VERSION=$BOOST_VERSION
  299.     FRAMEWORK_COMPATIBILITY_VERSION=$BOOST_VERSION
  300.  
  301.     FRAMEWORK_BUNDLE=$FRAMEWORKDIR/$FRAMEWORK_NAME.framework
  302.     echo "Framework: Building $FRAMEWORK_BUNDLE from $BUILDDIR..."
  303.  
  304.     rm -rf $FRAMEWORK_BUNDLE
  305.  
  306.     echo "Framework: Setting up directories..."
  307.     mkdir -p $FRAMEWORK_BUNDLE
  308.     mkdir -p $FRAMEWORK_BUNDLE/Versions
  309.     mkdir -p $FRAMEWORK_BUNDLE/Versions/$FRAMEWORK_VERSION
  310.     mkdir -p $FRAMEWORK_BUNDLE/Versions/$FRAMEWORK_VERSION/Resources
  311.     mkdir -p $FRAMEWORK_BUNDLE/Versions/$FRAMEWORK_VERSION/Headers
  312.     mkdir -p $FRAMEWORK_BUNDLE/Versions/$FRAMEWORK_VERSION/Documentation
  313.  
  314.     echo "Framework: Creating symlinks..."
  315.     ln -s $FRAMEWORK_VERSION               $FRAMEWORK_BUNDLE/Versions/Current
  316.     ln -s Versions/Current/Headers         $FRAMEWORK_BUNDLE/Headers
  317.     ln -s Versions/Current/Resources       $FRAMEWORK_BUNDLE/Resources
  318.     ln -s Versions/Current/Documentation   $FRAMEWORK_BUNDLE/Documentation
  319.     ln -s Versions/Current/$FRAMEWORK_NAME $FRAMEWORK_BUNDLE/$FRAMEWORK_NAME
  320.  
  321.     FRAMEWORK_INSTALL_NAME=$FRAMEWORK_BUNDLE/Versions/$FRAMEWORK_VERSION/$FRAMEWORK_NAME
  322.  
  323.     echo "Lipoing library into $FRAMEWORK_INSTALL_NAME..."
  324.     $ARM_DEV_CMD lipo -create $BUILDDIR/*/libboost.a -o "$FRAMEWORK_INSTALL_NAME" || abort "Lipo $1 failed"
  325.  
  326.     echo "Framework: Copying includes..."
  327.     cp -r $PREFIXDIR/include/boost/*  $FRAMEWORK_BUNDLE/Headers/
  328.  
  329.     echo "Framework: Creating plist..."
  330.     cat > $FRAMEWORK_BUNDLE/Resources/Info.plist <<EOF
  331. <?xml version="1.0" encoding="UTF-8"?>
  332. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  333. <plist version="1.0">
  334. <dict>
  335. <key>CFBundleDevelopmentRegion</key>
  336. <string>English</string>
  337. <key>CFBundleExecutable</key>
  338. <string>${FRAMEWORK_NAME}</string>
  339. <key>CFBundleIdentifier</key>
  340. <string>org.boost</string>
  341. <key>CFBundleInfoDictionaryVersion</key>
  342. <string>6.0</string>
  343. <key>CFBundlePackageType</key>
  344. <string>FMWK</string>
  345. <key>CFBundleSignature</key>
  346. <string>????</string>
  347. <key>CFBundleVersion</key>
  348. <string>${FRAMEWORK_CURRENT_VERSION}</string>
  349. </dict>
  350. </plist>
  351. EOF
  352.  
  353.     doneSection
  354. }
  355.  
  356. #===============================================================================
  357. # Execution starts here
  358. #===============================================================================
  359.  
  360. # may want to comment if repeatedly running during dev
  361. cleanup
  362.  
  363. echo "BOOST_VERSION:     $BOOST_VERSION"
  364. echo "IPHONE_SDKVERSION: $IPHONE_SDKVERSION"
  365. echo "MIN_IOS_VERSION:   $MIN_IOS_VERSION"
  366. echo "BOOST_LIBS:        $BOOST_LIBS"
  367. echo "BOOST_SRC:         $BOOST_SRC"
  368. echo "IOSBUILDDIR:       $IOSBUILDDIR"
  369. echo "PREFIXDIR:         $PREFIXDIR"
  370. echo "IOSFRAMEWORKDIR:   $IOSFRAMEWORKDIR"
  371. echo "XCODE_ROOT:        $XCODE_ROOT"
  372. echo
  373.  
  374. downloadBoost
  375. unpackBoost
  376. inventMissingHeaders
  377. bootstrapBoost
  378. updateBoost
  379. buildBoost
  380. scrunchAllLibsTogetherInOneLibPerPlatform
  381. buildFramework $IOSFRAMEWORKDIR $IOSBUILDDIR
  382.  
  383. restoreBoost
  384.  
  385. echo "Completed successfully"
  386.  
  387. #===============================================================================
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement