| #!/bin/bash |
| # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| # |
| # Bash functions used by buildbot annotator scripts for the android |
| # build of chromium. Executing this script should not perform actions |
| # other than setting variables and defining of functions. |
| |
| # Number of jobs on the compile line; e.g. make -j"${JOBS}" |
| JOBS="${JOBS:-4}" |
| |
| # Clobber build? Overridden by bots with BUILDBOT_CLOBBER. |
| NEED_CLOBBER="${NEED_CLOBBER:-0}" |
| |
| # Setup environment for Android build. |
| # Called from bb_baseline_setup. |
| # Moved to top of file so it is easier to find. |
| function bb_setup_environment { |
| export ANDROID_SDK_ROOT=/usr/local/google/android-sdk-linux |
| export ANDROID_NDK_ROOT=/usr/local/google/android-ndk-r7 |
| } |
| |
| # Install the build deps by running |
| # build/install-build-deps-android-sdk.sh. This may update local tools. |
| # $1: source root. |
| function bb_install_build_deps { |
| echo "@@@BUILD_STEP install build deps android@@@" |
| local script="$1/build/install-build-deps-android-sdk.sh" |
| if [[ -f "$script" ]]; then |
| "$script" |
| else |
| echo "Cannot find $script; why?" |
| fi |
| } |
| |
| # Function to force-green a bot. |
| function bb_force_bot_green_and_exit { |
| echo "@@@BUILD_STEP Bot forced green.@@@" |
| exit 0 |
| } |
| |
| # Basic setup for all bots to run after a source tree checkout. |
| # $1: source root. |
| function bb_baseline_setup { |
| echo "@@@BUILD_STEP cd into source root@@@" |
| SRC_ROOT="$1" |
| if [ ! -d "${SRC_ROOT}" ] ; then |
| echo "Please specify a valid source root directory as an arg" |
| echo '@@@STEP_FAILURE@@@' |
| return 1 |
| fi |
| cd $SRC_ROOT |
| |
| if [ ! -f build/android/envsetup.sh ] ; then |
| echo "No envsetup.sh" |
| echo "@@@STEP_FAILURE@@@" |
| return 1 |
| fi |
| |
| echo "@@@BUILD_STEP Basic setup@@@" |
| bb_setup_environment |
| |
| for mandatory_directory in $(dirname "${ANDROID_SDK_ROOT}") \ |
| $(dirname "${ANDROID_NDK_ROOT}") ; do |
| if [[ ! -d "${mandatory_directory}" ]]; then |
| echo "Directory ${mandatory_directory} does not exist." |
| echo "Build cannot continue." |
| echo "@@@STEP_FAILURE@@@" |
| return 1 |
| fi |
| done |
| |
| if [ ! "$BUILDBOT_CLOBBER" = "" ]; then |
| NEED_CLOBBER=1 |
| fi |
| |
| # Setting up a new bot? Must do this before envsetup.sh |
| if [ ! -d "${ANDROID_NDK_ROOT}" ] ; then |
| bb_install_build_deps $1 |
| fi |
| |
| echo "@@@BUILD_STEP Configure with envsetup.sh@@@" |
| . build/android/envsetup.sh |
| |
| if [ "$NEED_CLOBBER" -eq 1 ]; then |
| echo "@@@BUILD_STEP Clobber@@@" |
| rm -rf "${SRC_ROOT}"/out |
| if [ -e "${SRC_ROOT}"/out ] ; then |
| echo "Clobber appeared to fail? ${SRC_ROOT}/out still exists." |
| echo "@@@STEP_WARNINGS@@@" |
| fi |
| fi |
| |
| echo "@@@BUILD_STEP android_gyp@@@" |
| android_gyp |
| } |
| |
| |
| # Setup goma. Used internally to buildbot_functions.sh. |
| function bb_setup_goma_internal { |
| |
| # Quick bail if I messed things up and can't wait for the CQ to |
| # flush out. |
| # TODO(jrg): remove this condition when things are |
| # proven stable (4/1/12 or so). |
| if [ -f /usr/local/google/DISABLE_GOMA ]; then |
| echo "@@@STEP_WARNINGS@@@" |
| echo "Goma disabled with a local file" |
| return |
| fi |
| |
| goma_dir=${goma_dir:-/b/build/goma} |
| if [ -f ${goma_dir}/goma.key ]; then |
| export GOMA_API_KEY_FILE=${GOMA_DIR}/goma.key |
| fi |
| local goma_ctl=$(which goma_ctl.sh) |
| if [ "${goma_ctl}" != "" ]; then |
| local goma_dir=$(dirname ${goma_ctl}) |
| fi |
| |
| if [ ! -f ${goma_dir}/goma_ctl.sh ]; then |
| echo "@@@STEP_WARNINGS@@@" |
| echo "Goma not found on this machine; defaulting to make" |
| return |
| fi |
| export GOMA_DIR=${goma_dir} |
| echo "GOMA_DIR: " $GOMA_DIR |
| |
| export GOMA_COMPILER_PROXY_DAEMON_MODE=true |
| export GOMA_COMPILER_PROXY_RPC_TIMEOUT_SECS=300 |
| export PATH=$GOMA_DIR:$PATH |
| |
| echo "Starting goma" |
| if [ "$NEED_CLOBBER" -eq 1 ]; then |
| ${GOMA_DIR}/goma_ctl.sh restart |
| else |
| ${GOMA_DIR}/goma_ctl.sh ensure_start |
| fi |
| trap bb_stop_goma_internal SIGHUP SIGINT SIGTERM |
| } |
| |
| # Stop goma. |
| function bb_stop_goma_internal { |
| echo "Stopping goma" |
| ${GOMA_DIR}/goma_ctl.sh stop |
| } |
| |
| # $@: make args. |
| # Use goma if possible; degrades to non-Goma if needed. |
| function bb_goma_make { |
| bb_setup_goma_internal |
| |
| if [ "${GOMA_DIR}" = "" ]; then |
| make -j${JOBS} "$@" |
| return |
| fi |
| |
| HOST_CC=$GOMA_DIR/gcc |
| HOST_CXX=$GOMA_DIR/g++ |
| TARGET_CC=$(/bin/ls $ANDROID_TOOLCHAIN/*-gcc | head -n1) |
| TARGET_CXX=$(/bin/ls $ANDROID_TOOLCHAIN/*-g++ | head -n1) |
| TARGET_CC="$GOMA_DIR/gomacc $TARGET_CC" |
| TARGET_CXX="$GOMA_DIR/gomacc $TARGET_CXX" |
| COMMON_JAVAC="$GOMA_DIR/gomacc /usr/bin/javac -J-Xmx512M \ |
| -target 1.5 -Xmaxerrs 9999999" |
| |
| command make \ |
| -j100 \ |
| -l20 \ |
| HOST_CC="$HOST_CC" \ |
| HOST_CXX="$HOST_CXX" \ |
| TARGET_CC="$TARGET_CC" \ |
| TARGET_CXX="$TARGET_CXX" \ |
| CC.host="$HOST_CC" \ |
| CXX.host="$HOST_CXX" \ |
| CC.target="$TARGET_CC" \ |
| CXX.target="$TARGET_CXX" \ |
| LINK.target="$TARGET_CXX" \ |
| COMMON_JAVAC="$COMMON_JAVAC" \ |
| "$@" |
| |
| bb_stop_goma_internal |
| } |
| |
| # Compile step |
| function bb_compile { |
| echo "@@@BUILD_STEP Compile@@@" |
| bb_goma_make |
| } |
| |
| # Re-gyp and compile with unit test bundles configured as shlibs for |
| # the native test runner. Experimental for now. Once the native test |
| # loader is on by default, this entire function becomes obsolete. |
| function bb_native_test_compile_run_tests { |
| echo "@@@BUILD_STEP Re-gyp for the native test runner@@@" |
| GYP_DEFINES="$GYP_DEFINES gtest_target_type=shared_library" android_gyp |
| |
| echo "@@@BUILD_STEP Native test runner compile@@@" |
| bb_goma_make |
| |
| # Make sure running the template prints an expected failure. |
| echo "@@@BUILD_STEP Native test runner template test@@@" |
| tempfile=/tmp/tempfile-$$.txt |
| build/android/run_tests.py --xvfb --verbose \ |
| -s out/Release/replaceme_apk/ChromeNativeTests-debug.apk \ |
| | sed 's/@@@STEP_FAILURE@@@//g' | tee $tempfile |
| happy_failure=$(cat $tempfile | grep RUNNER_FAILED | wc -l) |
| if [[ $happy_failure -eq 0 ]] ; then |
| echo "@@@STEP_FAILURE@@@" |
| fi |
| } |
| |
| # Experimental compile step; does not turn the tree red if it fails. |
| function bb_compile_experimental { |
| # Linking DumpRenderTree appears to hang forever? |
| EXPERIMENTAL_TARGETS="android_experimental" |
| for target in ${EXPERIMENTAL_TARGETS} ; do |
| echo "@@@BUILD_STEP Experimental Compile $target @@@" |
| set +e |
| bb_goma_make -k "${target}" |
| if [ $? -ne 0 ] ; then |
| echo "@@@STEP_WARNINGS@@@" |
| fi |
| set -e |
| done |
| } |
| |
| # Run tests on an emulator. |
| function bb_run_tests_emulator { |
| echo "@@@BUILD_STEP Run Tests on an Emulator@@@" |
| build/android/run_tests.py -e --xvfb --verbose |
| } |
| |
| # Run tests on an actual device. (Better have one plugged in!) |
| function bb_run_tests { |
| echo "@@@BUILD_STEP Run Tests on actual hardware@@@" |
| build/android/run_tests.py --xvfb --verbose |
| } |