Index: third_party/protobuf/objectivec/DevTools/full_mac_build.sh |
diff --git a/third_party/protobuf/objectivec/DevTools/full_mac_build.sh b/third_party/protobuf/objectivec/DevTools/full_mac_build.sh |
new file mode 100755 |
index 0000000000000000000000000000000000000000..709aae0a4935baf99479159aced657c82e06f369 |
--- /dev/null |
+++ b/third_party/protobuf/objectivec/DevTools/full_mac_build.sh |
@@ -0,0 +1,275 @@ |
+#!/bin/bash |
+# |
+# Helper to do build so you don't have to remember all the steps/args. |
+ |
+ |
+set -eu |
+ |
+# Some base locations. |
+readonly ScriptDir=$(dirname "$(echo $0 | sed -e "s,^\([^/]\),$(pwd)/\1,")") |
+readonly ProtoRootDir="${ScriptDir}/../.." |
+ |
+printUsage() { |
+ NAME=$(basename "${0}") |
+ cat << EOF |
+usage: ${NAME} [OPTIONS] |
+ |
+This script does the common build steps needed. |
+ |
+OPTIONS: |
+ |
+ General: |
+ |
+ -h, --help |
+ Show this message |
+ -c, --clean |
+ Issue a clean before the normal build. |
+ -a, --autogen |
+ Start by rerunning autogen & configure. |
+ -r, --regenerate-cpp-descriptors |
+ The descriptor.proto is checked in generated, cause it to regenerate. |
+ -j #, --jobs # |
+ Force the number of parallel jobs (useful for debugging build issues). |
+ --core-only |
+ Skip some of the core protobuf build/checks to shorten the build time. |
+ --skip-xcode |
+ Skip the invoke of Xcode to test the runtime on both iOS and OS X. |
+ --skip-xcode-ios |
+ Skip the invoke of Xcode to test the runtime on iOS. |
+ --skip-xcode-osx |
+ Skip the invoke of Xcode to test the runtime on OS X. |
+ --skip-objc-conformance |
+ Skip the Objective C conformance tests (run on OS X). |
+ |
+EOF |
+} |
+ |
+header() { |
+ echo "" |
+ echo "========================================================================" |
+ echo " ${@}" |
+ echo "========================================================================" |
+} |
+ |
+# Thanks to libtool, builds can fail in odd ways and since it eats some output |
+# it can be hard to spot, so force error output if make exits with a non zero. |
+wrapped_make() { |
+ set +e # Don't stop if the command fails. |
+ make $* |
+ MAKE_EXIT_STATUS=$? |
+ if [ ${MAKE_EXIT_STATUS} -ne 0 ]; then |
+ echo "Error: 'make $*' exited with status ${MAKE_EXIT_STATUS}" |
+ exit ${MAKE_EXIT_STATUS} |
+ fi |
+ set -e |
+} |
+ |
+NUM_MAKE_JOBS=$(/usr/sbin/sysctl -n hw.ncpu) |
+if [[ "${NUM_MAKE_JOBS}" -lt 4 ]] ; then |
+ NUM_MAKE_JOBS=4 |
+fi |
+ |
+DO_AUTOGEN=no |
+DO_CLEAN=no |
+REGEN_CPP_DESCRIPTORS=no |
+CORE_ONLY=no |
+DO_XCODE_IOS_TESTS=yes |
+DO_XCODE_OSX_TESTS=yes |
+DO_OBJC_CONFORMANCE_TESTS=yes |
+while [[ $# != 0 ]]; do |
+ case "${1}" in |
+ -h | --help ) |
+ printUsage |
+ exit 0 |
+ ;; |
+ -c | --clean ) |
+ DO_CLEAN=yes |
+ ;; |
+ -a | --autogen ) |
+ DO_AUTOGEN=yes |
+ ;; |
+ -r | --regenerate-cpp-descriptors ) |
+ REGEN_CPP_DESCRIPTORS=yes |
+ ;; |
+ -j | --jobs ) |
+ shift |
+ NUM_MAKE_JOBS="${1}" |
+ ;; |
+ --core-only ) |
+ CORE_ONLY=yes |
+ ;; |
+ --skip-xcode ) |
+ DO_XCODE_IOS_TESTS=no |
+ DO_XCODE_OSX_TESTS=no |
+ ;; |
+ --skip-xcode-ios ) |
+ DO_XCODE_IOS_TESTS=no |
+ ;; |
+ --skip-xcode-osx ) |
+ DO_XCODE_OSX_TESTS=no |
+ ;; |
+ --skip-objc-conformance ) |
+ DO_OBJC_CONFORMANCE_TESTS=no |
+ ;; |
+ -*) |
+ echo "ERROR: Unknown option: ${1}" 1>&2 |
+ printUsage |
+ exit 1 |
+ ;; |
+ *) |
+ echo "ERROR: Unknown argument: ${1}" 1>&2 |
+ printUsage |
+ exit 1 |
+ ;; |
+ esac |
+ shift |
+done |
+ |
+# Into the proto dir. |
+cd "${ProtoRootDir}" |
+ |
+# if no Makefile, force the autogen. |
+if [[ ! -f Makefile ]] ; then |
+ DO_AUTOGEN=yes |
+fi |
+ |
+if [[ "${DO_AUTOGEN}" == "yes" ]] ; then |
+ header "Running autogen & configure" |
+ ./autogen.sh |
+ ./configure \ |
+ CPPFLAGS="-mmacosx-version-min=10.9 -Wunused-const-variable -Wunused-function" \ |
+ CXXFLAGS="-Wnon-virtual-dtor -Woverloaded-virtual" |
+fi |
+ |
+if [[ "${DO_CLEAN}" == "yes" ]] ; then |
+ header "Cleaning" |
+ wrapped_make clean |
+ if [[ "${DO_XCODE_IOS_TESTS}" == "yes" ]] ; then |
+ XCODEBUILD_CLEAN_BASE_IOS=( |
+ xcodebuild |
+ -project objectivec/ProtocolBuffers_iOS.xcodeproj |
+ -scheme ProtocolBuffers |
+ ) |
+ "${XCODEBUILD_CLEAN_BASE_IOS[@]}" -configuration Debug clean |
+ "${XCODEBUILD_CLEAN_BASE_IOS[@]}" -configuration Release clean |
+ fi |
+ if [[ "${DO_XCODE_OSX_TESTS}" == "yes" ]] ; then |
+ XCODEBUILD_CLEAN_BASE_OSX=( |
+ xcodebuild |
+ -project objectivec/ProtocolBuffers_OSX.xcodeproj |
+ -scheme ProtocolBuffers |
+ ) |
+ "${XCODEBUILD_CLEAN_BASE_OSX[@]}" -configuration Debug clean |
+ "${XCODEBUILD_CLEAN_BASE_OSX[@]}" -configuration Release clean |
+ fi |
+fi |
+ |
+if [[ "${REGEN_CPP_DESCRIPTORS}" == "yes" ]] ; then |
+ header "Regenerating the C++ descriptor sources." |
+ ./generate_descriptor_proto.sh -j "${NUM_MAKE_JOBS}" |
+fi |
+ |
+if [[ "${CORE_ONLY}" == "yes" ]] ; then |
+ header "Building core Only" |
+ wrapped_make -j "${NUM_MAKE_JOBS}" |
+else |
+ header "Building" |
+ # Can't issue these together, when fully parallel, something sometimes chokes |
+ # at random. |
+ wrapped_make -j "${NUM_MAKE_JOBS}" all |
+ wrapped_make -j "${NUM_MAKE_JOBS}" check |
+ # Fire off the conformance tests also. |
+ cd conformance |
+ wrapped_make -j "${NUM_MAKE_JOBS}" test_cpp |
+ cd .. |
+fi |
+ |
+header "Ensuring the ObjC descriptors are current." |
+# Find the newest input file (protos, compiler, and the generator script). |
+# (these patterns catch some extra stuff, but better to over sample than under) |
+readonly NewestInput=$(find \ |
+ src/google/protobuf/*.proto \ |
+ src/.libs src/*.la src/protoc \ |
+ objectivec/generate_descriptors_proto.sh \ |
+ -type f -print0 \ |
+ | xargs -0 stat -f "%m %N" \ |
+ | sort -n | tail -n1 | cut -f2- -d" ") |
+# Find the oldest output file. |
+readonly OldestOutput=$(find \ |
+ "${ProtoRootDir}/objectivec/google" \ |
+ -type f -print0 \ |
+ | xargs -0 stat -f "%m %N" \ |
+ | sort -n -r | tail -n1 | cut -f2- -d" ") |
+# If the newest input is newer than the oldest output, regenerate. |
+if [[ "${NewestInput}" -nt "${OldestOutput}" ]] ; then |
+ echo ">> Newest input is newer than oldest output, regenerating." |
+ objectivec/generate_descriptors_proto.sh -j "${NUM_MAKE_JOBS}" |
+else |
+ echo ">> Newest input is older than oldest output, no need to regenerating." |
+fi |
+ |
+header "Checking on the ObjC Runtime Code" |
+objectivec/DevTools/pddm_tests.py |
+if ! objectivec/DevTools/pddm.py --dry-run objectivec/*.[hm] objectivec/Tests/*.[hm] ; then |
+ echo "" |
+ echo "Update by running:" |
+ echo " objectivec/DevTools/pddm.py objectivec/*.[hm] objectivec/Tests/*.[hm]" |
+ exit 1 |
+fi |
+ |
+if [[ "${DO_XCODE_IOS_TESTS}" == "yes" ]] ; then |
+ XCODEBUILD_TEST_BASE_IOS=( |
+ xcodebuild |
+ -project objectivec/ProtocolBuffers_iOS.xcodeproj |
+ -scheme ProtocolBuffers |
+ ) |
+ # Don't need to worry about form factors or retina/non retina; |
+ # just pick a mix of OS Versions and 32/64 bit. |
+ # NOTE: Different Xcode have different simulated hardware/os support. |
+ readonly XCODE_VERSION_LINE="$(xcodebuild -version | grep Xcode\ )" |
+ readonly XCODE_VERSION="${XCODE_VERSION_LINE/Xcode /}" # drop the prefix. |
+ IOS_SIMULATOR_NAME="Simulator" |
+ case "${XCODE_VERSION}" in |
+ 6.* ) |
+ echo "ERROR: Xcode 6.3/6.4 no longer supported for building, please use 7.0 or higher." 1>&2 |
+ exit 10 |
+ ;; |
+ 7.* ) |
+ XCODEBUILD_TEST_BASE_IOS+=( |
+ -destination "platform=iOS Simulator,name=iPhone 4s,OS=8.1" # 32bit |
+ -destination "platform=iOS Simulator,name=iPhone 6,OS=9.0" # 64bit |
+ -destination "platform=iOS Simulator,name=iPad 2,OS=8.1" # 32bit |
+ -destination "platform=iOS Simulator,name=iPad Air,OS=9.0" # 64bit |
+ ) |
+ ;; |
+ * ) |
+ echo "Time to update the simulator targets for Xcode ${XCODE_VERSION}" |
+ exit 2 |
+ ;; |
+ esac |
+ header "Doing Xcode iOS build/tests - Debug" |
+ "${XCODEBUILD_TEST_BASE_IOS[@]}" -configuration Debug test |
+ header "Doing Xcode iOS build/tests - Release" |
+ "${XCODEBUILD_TEST_BASE_IOS[@]}" -configuration Release test |
+ # Don't leave the simulator in the developer's face. |
+ killall "${IOS_SIMULATOR_NAME}" |
+fi |
+if [[ "${DO_XCODE_OSX_TESTS}" == "yes" ]] ; then |
+ XCODEBUILD_TEST_BASE_OSX=( |
+ xcodebuild |
+ -project objectivec/ProtocolBuffers_OSX.xcodeproj |
+ -scheme ProtocolBuffers |
+ # Since the ObjC 2.0 Runtime is required, 32bit OS X isn't supported. |
+ -destination "platform=OS X,arch=x86_64" # 64bit |
+ ) |
+ header "Doing Xcode OS X build/tests - Debug" |
+ "${XCODEBUILD_TEST_BASE_OSX[@]}" -configuration Debug test |
+ header "Doing Xcode OS X build/tests - Release" |
+ "${XCODEBUILD_TEST_BASE_OSX[@]}" -configuration Release test |
+fi |
+ |
+if [[ "${DO_OBJC_CONFORMANCE_TESTS}" == "yes" ]] ; then |
+ cd conformance |
+ wrapped_make -j "${NUM_MAKE_JOBS}" test_objc |
+ cd .. |
+fi |