From 1dcc329427fd103a0abd96ab787270f5d0a31861 Mon Sep 17 00:00:00 2001 From: Thomas Van Lenten Date: Thu, 21 May 2015 17:14:52 -0400 Subject: Objective C Second Alpha Drop - Style fixups in the code. - map<> serialization fixes and more tests. - Autocreation of map<> fields (to match repeated fields). - @@protoc_insertion_point(global_scope|imports). - Fixup proto2 syntax extension support. - Move all startup code to +initialize so it happen on class usage and not app startup. - Have generated headers use forward declarations and move imports into generated code, reduces what is need at compile time to speed up compiled and avoid pointless rippling of rebuilds. --- objectivec/DevTools/check_version_stamps.sh | 4 +- objectivec/DevTools/full_mac_build.sh | 228 ++++++++++++++++++++++ objectivec/DevTools/generate_descriptors_proto.sh | 36 ---- 3 files changed, 230 insertions(+), 38 deletions(-) create mode 100755 objectivec/DevTools/full_mac_build.sh delete mode 100755 objectivec/DevTools/generate_descriptors_proto.sh (limited to 'objectivec/DevTools') diff --git a/objectivec/DevTools/check_version_stamps.sh b/objectivec/DevTools/check_version_stamps.sh index 7fc44265..325b71dd 100755 --- a/objectivec/DevTools/check_version_stamps.sh +++ b/objectivec/DevTools/check_version_stamps.sh @@ -29,7 +29,7 @@ readonly PluginVersion=$( \ ) if [[ -z "${PluginVersion}" ]] ; then - die "Failed to fine ${ConstantName} in the plugin source (${PluginSrc})." + die "Failed to find ${ConstantName} in the plugin source (${PluginSrc})." fi # Collect version from runtime sources. @@ -41,7 +41,7 @@ readonly RuntimeVersion=$( \ ) if [[ -z "${RuntimeVersion}" ]] ; then - die "Failed to fine ${ConstantName} in the runtime source (${RuntimeSrc})." + die "Failed to find ${ConstantName} in the runtime source (${RuntimeSrc})." fi # Compare them. diff --git a/objectivec/DevTools/full_mac_build.sh b/objectivec/DevTools/full_mac_build.sh new file mode 100755 index 00000000..57c4f438 --- /dev/null +++ b/objectivec/DevTools/full_mac_build.sh @@ -0,0 +1,228 @@ +#!/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-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). + --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. + +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 +DO_XCODE_IOS_TESTS=yes +DO_XCODE_OSX_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}" + ;; + --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 + ;; + -*) + 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. +pushd "${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 CXXFLAGS="-mmacosx-version-min=10.9 -Wnon-virtual-dtor -Woverloaded-virtual -Wunused-const-variable -Wunused-function" +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 + +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 + +header "Ensuring the ObjC descriptors are current." +# Find the newest input file (protos, compiler, and this 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. + -destination "platform=iOS Simulator,name=iPhone 4s,OS=7.1" # 32bit + -destination "platform=iOS Simulator,name=iPhone 6,OS=8.3" # 64bit + -destination "platform=iOS Simulator,name=iPad 2,OS=7.1" # 32bit + -destination "platform=iOS Simulator,name=iPad Air,OS=8.3" # 64bit + ) + 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" +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 diff --git a/objectivec/DevTools/generate_descriptors_proto.sh b/objectivec/DevTools/generate_descriptors_proto.sh deleted file mode 100755 index 42502bfe..00000000 --- a/objectivec/DevTools/generate_descriptors_proto.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash - -# This script will generate the common descriptors needed by the Objective C -# runtime. - -# HINT: Flags passed to generate_descriptor_proto.sh will be passed directly -# to make when building protoc. This is particularly useful for passing -# -j4 to run 4 jobs simultaneously. - -set -eu - -readonly ScriptDir=$(dirname "$(echo $0 | sed -e "s,^\([^/]\),$(pwd)/\1,")") -readonly ProtoRootDir="${ScriptDir}/../.." -readonly ProtoC="${ProtoRootDir}/src/protoc" - -pushd "${ProtoRootDir}" > /dev/null - -# Compiler build fails if config.h hasn't been made yet (even if configure/etc. -# have been run, so get that made first). -make $@ config.h - -# Make sure the compiler is current. -cd src -make $@ protoc - -# These really should only be run when the inputs or compiler are newer than -# the outputs. - -# Needed by the runtime. -./protoc --objc_out="${ProtoRootDir}/objectivec" google/protobuf/descriptor.proto - -# Well known types that the library provides helpers for. -./protoc --objc_out="${ProtoRootDir}/objectivec" google/protobuf/timestamp.proto -./protoc --objc_out="${ProtoRootDir}/objectivec" google/protobuf/duration.proto - -popd > /dev/null -- cgit v1.2.3