Guest User

boost.sh

a guest
Dec 27th, 2011
220
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 12.63 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. #===============================================================================
  7. #
  8. # Builds a Boost framework for the iPhone.
  9. # Creates a set of universal libraries that can be used on an iPhone and in the
  10. # iPhone simulator. Then creates a pseudo-framework to make using boost in Xcode
  11. # less painful.
  12. #
  13. # To configure the script, define:
  14. #    BOOST_LIBS:        which libraries to build
  15. #    BOOST_VERSION:     version number of the boost library (e.g. 1_41_0)
  16. #    IPHONE_SDKVERSION: iPhone SDK version (e.g. 3.0)
  17. #
  18. # Then go get the source tar.bz of the boost you want to build, shove it in the
  19. # same directory as this script, and run "./boost.sh". Grab a cuppa. And voila.
  20. #===============================================================================
  21.  
  22. : ${BOOST_VERSION:=1_48_0}
  23. : ${BOOST_LIBS:="thread filesystem system"}
  24. : ${IPHONE_SDKVERSION:=5.0}
  25. : ${EXTRA_CPPFLAGS:="-DBOOST_AC_USE_PTHREADS -DBOOST_SP_USE_PTHREADS"}
  26.  
  27. # The EXTRA_CPPFLAGS definition works around a thread race issue in
  28. # shared_ptr. I encountered this historically and have not verified that
  29. # the fix is no longer required. Without using the posix thread primitives
  30. # an invalid compare-and-swap ARM instruction (non-thread-safe) was used for the
  31. # shared_ptr use count causing nasty and subtle bugs.
  32. #
  33. # Should perhaps also consider/use instead: -BOOST_SP_USE_PTHREADS
  34.  
  35. : ${TARBALLDIR:=`pwd`}
  36. : ${SRCDIR:=`pwd`/src}
  37. : ${BUILDDIR:=`pwd`/build}
  38. : ${PREFIXDIR:=`pwd`/prefix}
  39. : ${FRAMEWORKDIR:=`pwd`/framework}
  40.  
  41. BOOST_TARBALL=$TARBALLDIR/boost_$BOOST_VERSION.tar.bz2
  42.     BOOST_SRC=$SRCDIR/boost_${BOOST_VERSION}
  43.  
  44. #===============================================================================
  45.  
  46. ARM_DEV_DIR=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/
  47. SIM_DEV_DIR=/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/
  48.  
  49. ARM_COMBINED_LIB=$BUILDDIR/lib_boost_arm.a
  50. SIM_COMBINED_LIB=$BUILDDIR/lib_boost_x86.a
  51.  
  52. #===============================================================================
  53.  
  54. echo "BOOST_VERSION:     $BOOST_VERSION"
  55. echo "BOOST_LIBS:        $BOOST_LIBS"
  56. echo "BOOST_TARBALL:     $BOOST_TARBALL"
  57. echo "BOOST_SRC:         $BOOST_SRC"
  58. echo "BUILDDIR:          $BUILDDIR"
  59. echo "PREFIXDIR:         $PREFIXDIR"
  60. echo "FRAMEWORKDIR:      $FRAMEWORKDIR"
  61. echo "IPHONE_SDKVERSION: $IPHONE_SDKVERSION"
  62. echo
  63.  
  64. #===============================================================================
  65. # Functions
  66. #===============================================================================
  67.  
  68. abort()
  69. {
  70.     echo
  71.     echo "Aborted: $@"
  72.     exit 1
  73. }
  74.  
  75. doneSection()
  76. {
  77.     echo
  78.     echo "    ================================================================="
  79.     echo "    Done"
  80.     echo
  81. }
  82.  
  83. #===============================================================================
  84.  
  85. cleanEverythingReadyToStart()
  86. {
  87.     echo Cleaning everything before we start to build...
  88.     rm -rf $BOOST_SRC
  89.     rm -rf $BUILDDIR
  90.     rm -rf $PREFIXDIR
  91.     rm -rf $FRAMEWORKDIR
  92.     doneSection
  93. }
  94.  
  95. #===============================================================================
  96. unpackBoost()
  97. {
  98.     echo Unpacking boost into $SRCDIR...
  99.     [ -d $SRCDIR ]    || mkdir -p $SRCDIR
  100.     [ -d $BOOST_SRC ] || ( cd $SRCDIR; tar xfj $BOOST_TARBALL )
  101.     [ -d $BOOST_SRC ] && echo "    ...unpacked as $BOOST_SRC"
  102.     doneSection
  103. }
  104.  
  105. #===============================================================================
  106.  
  107. writeBjamUserConfig()
  108. {
  109.     # You need to do this to point bjam at the right compiler
  110.     # ONLY SEEMS TO WORK IN HOME DIR GRR
  111.     echo Writing usr-config
  112.     #mkdir -p $BUILDDIR
  113.     #cat > ~/user-config.jam <<EOF
  114.     cat >> $BOOST_SRC/tools/build/v2/user-config.jam <<EOF
  115. using darwin : 4.2.1~iphone
  116.    : /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc -arch armv7 -mthumb -fvisibility=hidden -fvisibility-inlines-hidden $EXTRA_CPPFLAGS
  117.    : <striper>
  118.    : <architecture>arm <target-os>iphone
  119.    ;
  120. using darwin : 4.2.1~iphonesim
  121.    : /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc -arch i386 -fvisibility=hidden -fvisibility-inlines-hidden $EXTRA_CPPFLAGS
  122.    : <striper>
  123.    : <architecture>x86 <target-os>iphone
  124.    ;
  125. EOF
  126.     doneSection
  127. }
  128.  
  129. addMacOsXVersions()
  130. {
  131.     # You need to do this to allow to target macosx-versions
  132.     echo Editing darwin.jam
  133.     cat >> $BOOST_SRC/tools/build/v2/tools/darwin.jam <<EOF
  134. ## The MacOSX versions we can target.
  135. .macosx-versions =
  136.     iphone-$IPHONE_SDKVERSION iphonesim-$IPHONE_SDKVERSION
  137.     ;
  138. EOF
  139.     doneSection
  140. }
  141.  
  142. #===============================================================================
  143.  
  144. inventMissingHeaders()
  145. {
  146.     # These files are missing in the ARM iPhoneOS SDK, but they are in the simulator.
  147.     # They are supported on the device, so we copy them from x86 SDK to a staging area
  148.     # to use them on ARM, too.
  149.     echo Invent missing headers
  150.     cp /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator${IPHONE_SDKVERSION}.sdk/usr/include/{crt_externs,bzlib}.h $BOOST_SRC
  151. }
  152.  
  153. #===============================================================================
  154.  
  155. bootstrapBoost()
  156. {
  157.     cd $BOOST_SRC
  158.     BOOST_LIBS_COMMA=$(echo $BOOST_LIBS | sed -e "s/ /,/g")
  159.     echo "Bootstrapping (with libs $BOOST_LIBS_COMMA)"
  160.     ./bootstrap.sh --with-libraries=$BOOST_LIBS_COMMA
  161.     doneSection
  162. }
  163.  
  164. #===============================================================================
  165.  
  166. buildBoostForiPhoneOS()
  167. {
  168.     cd $BOOST_SRC
  169.    
  170.     ./bjam --prefix="$PREFIXDIR" toolset=darwin architecture=arm target-os=iphone macosx-version=iphone-${IPHONE_SDKVERSION} define=_LITTLE_ENDIAN link=static install
  171.     doneSection
  172.  
  173.     ./bjam toolset=darwin architecture=x86 target-os=iphone macosx-version=iphonesim-${IPHONE_SDKVERSION} link=static stage
  174.     doneSection
  175. }
  176.  
  177.  
  178. #===============================================================================
  179.  
  180. # $1: Name of a boost library to lipoficate (technical term)
  181. lipoficate()
  182. {
  183.     : ${1:?}
  184.     NAME=$1
  185.     echo lipoficate: $1
  186.     ARMV6=$BOOST_SRC/bin.v2/libs/$NAME/build/darwin-4.2.1~iphone/release/architecture-arm/link-static/macosx-version-iphone-$IPHONE_SDKVERSION/target-os-iphone/threading-multi/libboost_*.a
  187.     I386=$BOOST_SRC/bin.v2/libs/$NAME/build/darwin-4.2.1~iphonesim/release/architecture-x86/link-static/macosx-version-iphonesim-$IPHONE_SDKVERSION/target-os-iphone/threading-multi/libboost_*.a
  188.  
  189.     NAMES=""
  190.  
  191.     for nm in $ARMV6
  192.     do
  193.     BASE=basename $nm
  194.     NAMES="$NAMES $BASE"
  195.     done
  196.  
  197.     mkdir -p $PREFIXDIR/lib
  198.     for nm in $NAMES
  199.     do
  200.         lipo -create \
  201.             $BOOST_SRC/bin.v2/libs/$NAME/build/darwin-4.2.1~iphonesim/release/architecture-x86/link-static/macosx-version-iphonesim-$IPHONE_SDKVERSION/target-os-iphone/threading-multi/$nm \
  202.             $BOOST_SRC/bin.v2/libs/$NAME/build/darwin-4.2.1~iphonesim/release/architecture-x86/link-static/macosx-version-iphonesim-$IPHONE_SDKVERSION/target-os-iphone/threading-multi/$nm \
  203.             -o          "$PREFIXDIR/lib/$nm" \
  204.         || abort "Lipo $1 failed"
  205.     done
  206. }
  207.  
  208. # This creates universal versions of each individual boost library
  209. lipoAllBoostLibraries()
  210. {
  211.     for i in $BOOST_LIBS; do lipoficate $i; done;
  212.  
  213.     doneSection
  214. }
  215.  
  216. scrunchAllLibsTogetherInOneLibPerPlatform()
  217. {
  218.     ALL_LIBS_ARM=""
  219.     ALL_LIBS_SIM=""
  220.     for NAME in $BOOST_LIBS; do
  221.         ALL_LIBS_ARM="$ALL_LIBS_ARM $BOOST_SRC/bin.v2/libs/$NAME/build/darwin-4.2.1~iphone/release/architecture-arm/link-static/macosx-version-iphone-$IPHONE_SDKVERSION/target-os-iphone/threading-multi/libboost_$NAME.a";
  222.         ALL_LIBS_SIM="$ALL_LIBS_SIM $BOOST_SRC/bin.v2/libs/$NAME/build/darwin-4.2.1~iphonesim/release/architecture-x86/link-static/macosx-version-iphonesim-$IPHONE_SDKVERSION/target-os-iphone/threading-multi/libboost_$NAME.a";
  223.     done;
  224.  
  225.     mkdir -p $BUILDDIR/armv6/obj
  226.     mkdir -p $BUILDDIR/armv7/obj
  227.     mkdir -p $BUILDDIR/i386/obj
  228.  
  229.     ALL_LIBS=""
  230.  
  231.     echo Splitting all existing fat binaries...
  232.     for NAME in $BOOST_LIBS; do
  233.         ALL_LIBS="$ALL_LIBS libboost_$NAME.a"
  234.         lipo "$BOOST_SRC/bin.v2/libs/$NAME/build/darwin-4.2.1~iphone/release/architecture-arm/link-static/macosx-version-iphone-$IPHONE_SDKVERSION/target-os-iphone/threading-multi/libboost_$NAME.a" -thin armv6 -o $BUILDDIR/armv6/libboost_$NAME.a
  235.         lipo "$BOOST_SRC/bin.v2/libs/$NAME/build/darwin-4.2.1~iphone/release/architecture-arm/link-static/macosx-version-iphone-$IPHONE_SDKVERSION/target-os-iphone/threading-multi/libboost_$NAME.a" -thin armv7 -o $BUILDDIR/armv7/libboost_$NAME.a
  236.         cp "$BOOST_SRC/bin.v2/libs/$NAME/build/darwin-4.2.1~iphonesim/release/architecture-x86/link-static/macosx-version-iphonesim-$IPHONE_SDKVERSION/target-os-iphone/threading-multi/libboost_$NAME.a" $BUILDDIR/i386/
  237.     done
  238.  
  239.     echo "Decomposing each architecture's .a files"
  240.     for NAME in $ALL_LIBS; do
  241.         echo Decomposing $NAME...
  242.         (cd $BUILDDIR/armv6/obj; ar -x ../$NAME );
  243.         (cd $BUILDDIR/armv7/obj; ar -x ../$NAME );
  244.         (cd $BUILDDIR/i386/obj; ar -x ../$NAME );
  245.     done
  246.  
  247.     echo "Linking each architecture into an uberlib ($ALL_LIBS => libboost.a )"
  248.     rm $BUILDDIR/*/libboost.a
  249.     echo ...armv6
  250.     (cd $BUILDDIR/armv6; $ARM_DEV_DIR/ar crus libboost.a obj/*.o; )
  251.     echo ...armv7
  252.     (cd $BUILDDIR/armv7; $ARM_DEV_DIR/ar crus libboost.a obj/*.o; )
  253.     echo ...i386
  254.     (cd $BUILDDIR/i386;  $SIM_DEV_DIR/ar crus libboost.a obj/*.o; )
  255. }
  256.  
  257. #===============================================================================
  258.  
  259.                     VERSION_TYPE=Alpha
  260.                   FRAMEWORK_NAME=boost
  261.                FRAMEWORK_VERSION=A
  262.  
  263.        FRAMEWORK_CURRENT_VERSION=$BOOST_VERSION
  264.  FRAMEWORK_COMPATIBILITY_VERSION=$BOOST_VERSION
  265.  
  266. buildFramework()
  267. {
  268.     FRAMEWORK_BUNDLE=$FRAMEWORKDIR/$FRAMEWORK_NAME.framework
  269.  
  270.     rm -rf $FRAMEWORK_BUNDLE
  271.  
  272.     echo "Framework: Setting up directories..."
  273.     mkdir -p $FRAMEWORK_BUNDLE
  274.     mkdir -p $FRAMEWORK_BUNDLE/Versions
  275.     mkdir -p $FRAMEWORK_BUNDLE/Versions/$FRAMEWORK_VERSION
  276.     mkdir -p $FRAMEWORK_BUNDLE/Versions/$FRAMEWORK_VERSION/Resources
  277.     mkdir -p $FRAMEWORK_BUNDLE/Versions/$FRAMEWORK_VERSION/Headers
  278.     mkdir -p $FRAMEWORK_BUNDLE/Versions/$FRAMEWORK_VERSION/Documentation
  279.  
  280.     echo "Framework: Creating symlinks..."
  281.     ln -s $FRAMEWORK_VERSION               $FRAMEWORK_BUNDLE/Versions/Current
  282.     ln -s Versions/Current/Headers         $FRAMEWORK_BUNDLE/Headers
  283.     ln -s Versions/Current/Resources       $FRAMEWORK_BUNDLE/Resources
  284.     ln -s Versions/Current/Documentation   $FRAMEWORK_BUNDLE/Documentation
  285.     ln -s Versions/Current/$FRAMEWORK_NAME $FRAMEWORK_BUNDLE/$FRAMEWORK_NAME
  286.  
  287.     FRAMEWORK_INSTALL_NAME=$FRAMEWORK_BUNDLE/Versions/$FRAMEWORK_VERSION/$FRAMEWORK_NAME
  288.  
  289.     echo "Lipoing library into $FRAMEWORK_INSTALL_NAME..."
  290.     lipo \
  291.         -create \
  292.         -arch armv6 "$BUILDDIR/armv6/libboost.a" \
  293.         -arch armv7 "$BUILDDIR/armv7/libboost.a" \
  294.         -arch i386  "$BUILDDIR/i386/libboost.a" \
  295.         -o          "$FRAMEWORK_INSTALL_NAME" \
  296.     || abort "Lipo $1 failed"
  297.  
  298.     echo "Framework: Copying includes..."
  299.     cp -r $PREFIXDIR/include/boost/*  $FRAMEWORK_BUNDLE/Headers/
  300.  
  301.     echo "Framework: Creating plist..."
  302.     cat > $FRAMEWORK_BUNDLE/Resources/Info.plist <<EOF
  303. <?xml version="1.0" encoding="UTF-8"?>
  304. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  305. <plist version="1.0">
  306. <dict>
  307.     <key>CFBundleDevelopmentRegion</key>
  308.     <string>English</string>
  309.     <key>CFBundleExecutable</key>
  310.     <string>${FRAMEWORK_NAME}</string>
  311.     <key>CFBundleIdentifier</key>
  312.     <string>org.boost</string>
  313.     <key>CFBundleInfoDictionaryVersion</key>
  314.     <string>6.0</string>
  315.     <key>CFBundlePackageType</key>
  316.     <string>FMWK</string>
  317.     <key>CFBundleSignature</key>
  318.     <string>????</string>
  319.     <key>CFBundleVersion</key>
  320.     <string>${FRAMEWORK_CURRENT_VERSION}</string>
  321. </dict>
  322. </plist>
  323. EOF
  324.     doneSection
  325. }
  326.  
  327. #===============================================================================
  328. # Execution starts here
  329. #===============================================================================
  330.  
  331. [ -f "$BOOST_TARBALL" ] || abort "Source tarball missing."
  332.  
  333. mkdir -p $BUILDDIR
  334.  
  335. cleanEverythingReadyToStart
  336. unpackBoost
  337. inventMissingHeaders
  338. writeBjamUserConfig
  339. addMacOsXVersions
  340. bootstrapBoost
  341. buildBoostForiPhoneOS
  342. scrunchAllLibsTogetherInOneLibPerPlatform
  343. lipoAllBoostLibraries
  344. buildFramework
  345.  
  346. echo "Completed successfully"
  347.  
  348. #===============================================================================
Advertisement
Add Comment
Please, Sign In to add comment