Month: September 2012

  • Build Google protobuf 2.4.1 for iOS development

    Although iOS5 shipped with a private version of protobuf but it is too old for me.
    Here is the script I used to build protobuf.
    1. Download the newest protobuf(2.4.1 at the moment) and unpack.
    2. Run this in the unpacked directory. It will create a folder named “protobuf_dist” on desktop.
    3. Copy or add protobuf_dist to xcode project. That’s all.
    #!/bin/bash

    TMP_DIR=/tmp/protobuf_$$

    ###################################################
    # Build i386 version first,
    # Because arm needs it binary.
    ###################################################

    CFLAGS=-m32 CPPFLAGS=-m32 CXXFLAGS=-m32 LDFLAGS=-m32 ./configure --prefix=${TMP_DIR}/i386 \
    --disable-shared \
    --enable-static || exit 1
    make clean || exit 2
    make -j8 || exit 3
    make install || exit 4

    ###################################################
    # Build armv7 version,
    ###################################################

    SDKROOT=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk
    DEVROOT=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer

    export CC=${DEVROOT}/usr/bin/llvm-gcc
    export CFLAGS="-arch armv7 -isysroot $SDKROOT"

    export CXX=${DEVROOT}/usr/bin/llvm-g++
    export CXXFLAGS="$CFLAGS"
    export LDFLAGS="-isysroot $SDKROOT -Wl,-syslibroot $SDKROOT"

    ./configure --prefix=$TMP_DIR/armv7 \
    --with-protoc=${TMP_DIR}/i386/bin/protoc \
    --disable-shared \
    --enable-static \
    -host=arm-apple-darwin10 || exit 1
    make clean || exit 2
    make -j8 || exit 3
    make install || exit 4

    ###################################################
    # Packing
    ###################################################

    DIST_DIR=$HOME/Desktop/protobuf_dist
    rm -rf ${DIST_DIR}
    mkdir -p ${DIST_DIR}
    mkdir ${DIST_DIR}/{bin,lib}
    cp -r ${TMP_DIR}/armv7/include ${DIST_DIR}/
    cp ${TMP_DIR}/i386/bin/protoc ${DIST_DIR}/bin/
    lipo -arch i386 ${TMP_DIR}/i386/lib/libprotobuf.a -arch armv7 ${TMP_DIR}/armv7/lib/libprotobuf.a -output ${DIST_DIR}/lib/libprotobuf.a -create

    This is tested on OSX Lion with Xcode 4.2.1