511f28b73a
- Always generated into a temp directory so we can see if things changed. - Add a flag to control exiting with error when stale vs updating. This should let the continuous builds error out when ObjC needs to have the checked in sources updated.
272 lines
7.8 KiB
Bash
Executable File
272 lines
7.8 KiB
Bash
Executable File
#!/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
|
|
Run generate_descriptor_proto.sh to regenerate all the checked in
|
|
proto sources.
|
|
-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_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-descriptors )
|
|
REGEN_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_DESCRIPTORS}" == "yes" ]] ; then
|
|
header "Regenerating the 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
|
|
|
|
# Ensure the WKT sources checked in are current.
|
|
objectivec/generate_well_known_types.sh --check-only -j "${NUM_MAKE_JOBS}"
|
|
|
|
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.1* )
|
|
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
|
|
)
|
|
;;
|
|
7.3* )
|
|
XCODEBUILD_TEST_BASE_IOS+=(
|
|
-destination "platform=iOS Simulator,name=iPhone 4s,OS=8.1" # 32bit
|
|
-destination "platform=iOS Simulator,name=iPhone 6,OS=9.3" # 64bit
|
|
-destination "platform=iOS Simulator,name=iPad 2,OS=8.1" # 32bit
|
|
-destination "platform=iOS Simulator,name=iPad Air,OS=9.3" # 64bit
|
|
)
|
|
;;
|
|
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.2" # 64bit
|
|
-destination "platform=iOS Simulator,name=iPad 2,OS=8.1" # 32bit
|
|
-destination "platform=iOS Simulator,name=iPad Air,OS=9.2" # 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
|