1434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org#!/bin/sh 2434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# Copyright (c) 2012 Google Inc. 3434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# All rights reserved. 4434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# 5434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# Redistribution and use in source and binary forms, with or without 6434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# modification, are permitted provided that the following conditions are 7434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# met: 8434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# 9434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# * Redistributions of source code must retain the above copyright 10434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# notice, this list of conditions and the following disclaimer. 11434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# * Redistributions in binary form must reproduce the above 12434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# copyright notice, this list of conditions and the following disclaimer 13434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# in the documentation and/or other materials provided with the 14434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# distribution. 15434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# * Neither the name of Google Inc. nor the names of its 16434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# contributors may be used to endorse or promote products derived from 17434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# this software without specific prior written permission. 18434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# 19434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 31434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# Sanitize the environment 32434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgexport LANG=C 33434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgexport LC_ALL=C 34434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 35434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgif [ "$BASH_VERSION" ]; then 36434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org set -o posix 37434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgfi 38434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 39434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgPROGDIR=$(dirname "$0") 40434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgPROGDIR=$(cd "$PROGDIR" && pwd) 41434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgPROGNAME=$(basename "$0") 42434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 43e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org. $PROGDIR/common-functions.sh 44434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 45a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.orgDEFAULT_ABI="armeabi" 46a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.orgVALID_ABIS="armeabi armeabi-v7a x86 mips" 47a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org 48a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.orgABI= 49434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgADB= 50e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.orgALL_TESTS= 51434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgENABLE_M32= 52434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgHELP= 53434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgHELP_ALL= 54434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgNDK_DIR= 55434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgNO_CLEANUP= 56434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgNO_DEVICE= 57434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgNUM_JOBS=$(get_core_count) 58434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgTMPDIR= 59434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 60434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgfor opt do 61434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org # The following extracts the value if the option is like --name=<value>. 62434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org optarg=$(expr -- $opt : '^--[^=]*=\(.*\)$') 63434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org case $opt in 64a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org --abi=*) ABI=$optarg;; 65434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org --adb=*) ADB=$optarg;; 66e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org --all-tests) ALL_TESTS=true;; 67434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org --enable-m32) ENABLE_M32=true;; 68434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org --help|-h|-?) HELP=TRUE;; 69434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org --help-all) HELP_ALL=true;; 70434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org --jobs=*) NUM_JOBS=$optarg;; 71434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org --ndk-dir=*) NDK_DIR=$optarg;; 72434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org --tmp-dir=*) TMPDIR=$optarg;; 73434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org --no-cleanup) NO_CLEANUP=true;; 74434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org --no-device) NO_DEVICE=true;; 75e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org --quiet) decrease_verbosity;; 76e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org --verbose) increase_verbosity;; 77434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org -*) panic "Invalid option '$opt', see --help for details.";; 78434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org *) panic "This script doesn't take any parameters. See --help for details." 79434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org ;; 80434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org esac 81434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgdone 82434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 83434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgif [ "$HELP" -o "$HELP_ALL" ]; then 84434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org echo "\ 85434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org Usage: $PROGNAME [options] 86434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 87434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org This script is used to check that your Google Breakpad source tree can 88434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org be properly built for Android, and that the client library and host tools 89434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org work properly together. 90434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org" 91434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org if [ "$HELP_ALL" ]; then 92434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org echo "\ 93434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org In more details, this script will: 94434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 95434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org - Rebuild the host version of Google Breakpad in a temporary 96434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org directory (with the Auto-tools based build system). 97434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 98434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org - Rebuild the Android client library with the Google Breakpad build 99434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org system (using autotools/configure). This requires that you define 100434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org ANDROID_NDK_ROOT in your environment to point to a valid Android NDK 101434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org installation directory, or use the --ndk-dir=<path> option. 102434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 103434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org - Rebuild the Android client library and a test crashing program with the 104434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org Android NDK build system (ndk-build). 105434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 106434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org - Require an Android device connected to your machine, and the 'adb' 107434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org tool in your path. They are used to: 108434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 109434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org - Install and run a test crashing program. 110434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org - Extract the corresponding minidump from the device. 111434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org - Dump the symbols from the test program on the host with 'dump_syms' 112434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org - Generate a stack trace with 'minidump_stackwalk' 113434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org - Check the stack trace content for valid source file locations. 114434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 115434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org You can however skip this requirement and only test the builds by using 116434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org the --no-device flag. 117434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 118434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org By default, all generated files will be created in a temporary directory 119434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org that is removed when the script completion. If you want to inspect the 120434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org files, use the --no-cleanup option. 121434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 122434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org Finally, use --verbose to increase the verbosity level, this will help 123434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org you see which exact commands are being issues and their result. Use the 124434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org flag twice for even more output. Use --quiet to decrease verbosity 125434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org instead and run the script silently. 126a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org 127a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org If you have a device connected, the script will probe it to determine 128a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org its primary CPU ABI, and build the test program for it. You can however 129a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org use the --abi=<name> option to override this (this can be useful to check 130a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org the secondary ABI, e.g. using --abi=armeabi to check that such a program 131a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org works correctly on an ARMv7-A device). 132a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org 133a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org If you don't have a device connected, the test program will be built (but 134a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org not run) with the default '$DEFAULT_ABI' ABI. Again, you can use 135a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org --abi=<name> to override this. Valid ABI names are: 136a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org 137a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org $VALID_ABIS 138e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org 139e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org The script will only run the client library unit test on the device 140e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org by default. You can use --all-tests to also build and run the unit 141e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org tests for the Breakpad tools and processor, but be warned that this 142e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org adds several minutes of testing time. --all-tests will also run the 143e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org host unit tests suite. 144434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org" 145434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 146434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org fi # HELP_ALL 147434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 148434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org echo "\ 149434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org Valid options: 150434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 151434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org --help|-h|-? Display this message. 152434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org --help-all Display extended help. 153434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org --enable-m32 Build 32-bit version of host tools. 154a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org --abi=<name> Specify target CPU ABI [auto-detected]. 155434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org --jobs=<count> Run <count> build tasks in parallel [$NUM_JOBS]. 156434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org --ndk-dir=<path> Specify NDK installation directory. 157434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org --tmp-dir=<path> Specify temporary directory (will be wiped-out). 158434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org --adb=<path> Specify adb program path. 159434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org --no-cleanup Don't remove temporary directory after completion. 160434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org --no-device Do not try to detect devices, nor run crash test. 161e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org --all-tests Run all unit tests (i.e. tools and processor ones too). 162434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org --verbose Increase verbosity. 163434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org --quiet Decrease verbosity." 164434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 165e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org exit 0 166434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgfi 167434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 168434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgTESTAPP_DIR=$PROGDIR/sample_app 169434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 170434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# Select NDK install directory. 171434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgif [ -z "$NDK_DIR" ]; then 172434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org if [ -z "$ANDROID_NDK_ROOT" ]; then 173434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org panic "Please define ANDROID_NDK_ROOT in your environment, or use \ 174434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org--ndk-dir=<path>." 175434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org fi 176434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org NDK_DIR="$ANDROID_NDK_ROOT" 177434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org log "Found NDK directory: $NDK_DIR" 178434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgelse 179434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org log "Using NDK directory: $NDK_DIR" 180434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgfi 181434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# Small sanity check. 182434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgNDK_BUILD="$NDK_DIR/ndk-build" 183434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgif [ ! -f "$NDK_BUILD" ]; then 184434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org panic "Your NDK directory is not valid (missing ndk-build): $NDK_DIR" 185434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgfi 186434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 187e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org# Ensure the temporary directory is deleted on exit, except if the --no-cleanup 188e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org# option is used. 189e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org 190e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.orgclean_tmpdir () { 191e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org if [ "$TMPDIR" ]; then 192e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org if [ -z "$NO_CLEANUP" ]; then 193e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org log "Cleaning up: $TMPDIR" 194e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org rm -rf "$TMPDIR" 195e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org else 196e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org dump "Temporary directory contents preserved: $TMPDIR" 197e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org fi 198e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org fi 199e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org exit "$@" 200e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org} 201e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org 202e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.orgatexit clean_tmpdir 203e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org 204434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# If --tmp-dir=<path> is not used, create a temporary directory. 205434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# Otherwise, start by cleaning up the user-provided path. 206434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgif [ -z "$TMPDIR" ]; then 207434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org TMPDIR=$(mktemp -d /tmp/$PROGNAME.XXXXXXXX) 208434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org fail_panic "Can't create temporary directory!" 209434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org log "Using temporary directory: $TMPDIR" 210434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgelse 211434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org if [ ! -d "$TMPDIR" ]; then 212434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org mkdir -p "$TMPDIR" 213434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org fail_panic "Can't create temporary directory: $TMPDIR" 214434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org else 215434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org log "Cleaning up temporary directory: $TMPDIR" 216434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org rm -rf "$TMPDIR"/* 217434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org fail_panic "Cannot cleanup temporary directory!" 218434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org fi 219434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgfi 220434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 221434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgif [ -z "$NO_DEVICE" ]; then 222e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org if ! adb_check_device $ADB; then 223e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org echo "$(adb_get_error)" 224e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org echo "Use --no-device to build the code without running any tests." 225e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org exit 1 226e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org fi 227434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgfi 228434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 229434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgBUILD_LOG="$TMPDIR/build.log" 230434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgRUN_LOG="$TMPDIR/run.log" 231434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgCRASH_LOG="$TMPDIR/crash.log" 232434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 233e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.orgset_run_log "$RUN_LOG" 234e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org 235434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgTMPHOST="$TMPDIR/host-local" 236434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 237434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgcd "$TMPDIR" 238434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 239434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# Build host version of the tools 240e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.orgdump "Building host binaries." 241434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgCONFIGURE_FLAGS= 242434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgif [ "$ENABLE_M32" ]; then 243434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-m32" 244434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgfi 245434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org( 246434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org run mkdir "$TMPDIR/build-host" && 247434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org run cd "$TMPDIR/build-host" && 248434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org run2 "$PROGDIR/../configure" --prefix="$TMPHOST" $CONFIGURE_FLAGS && 249434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org run2 make -j$NUM_JOBS install 250434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org) 251e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.orgfail_panic "Can't build host binaries!" 252e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org 253e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.orgif [ "$ALL_TESTS" ]; then 254e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org dump "Running host unit tests." 255e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org ( 256e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org run cd "$TMPDIR/build-host" && 257e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org run2 make -j$NUM_JOBS check 258e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org ) 259e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org fail_panic "Host unit tests failed!!" 260e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.orgfi 261434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 262434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgTMPBIN=$TMPHOST/bin 263434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 264434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# Generate a stand-alone NDK toolchain 265434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 266a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org# Extract CPU ABI and architecture from device, if any. 267e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.orgif adb_check_device; then 268a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org DEVICE_ABI=$(adb_shell getprop ro.product.cpu.abi) 269a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org DEVICE_ABI2=$(adb_shell getprop ro.product.cpu.abi2) 270a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org if [ -z "$DEVICE_ABI" ]; then 271434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org panic "Can't extract ABI from connected device!" 272434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org fi 273a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org if [ "$DEVICE_ABI2" ]; then 274a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org dump "Found device ABIs: $DEVICE_ABI $DEVICE_ABI2" 275a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org else 276a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org dump "Found device ABI: $DEVICE_ABI" 277a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org DEVICE_ABI2=$DEVICE_ABI 278a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org fi 279a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org 280a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org # If --abi=<name> is used, check that the device supports it. 281a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org if [ "$ABI" -a "$DEVICE_ABI" != "$ABI" -a "$DEVICE_ABI2" != "$ABI" ]; then 282a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org dump "ERROR: Device ABI(s) do not match --abi command-line value ($ABI)!" 283a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org panic "Please use --no-device to skip device tests." 284a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org fi 285a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org 286a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org if [ -z "$ABI" ]; then 287a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org ABI=$DEVICE_ABI 288a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org dump "Using CPU ABI: $ABI (device)" 289a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org else 290a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org dump "Using CPU ABI: $ABI (command-line)" 291a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org fi 292434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgelse 293a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org if [ -z "$ABI" ]; then 294a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org # No device connected, choose default ABI 295a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org ABI=$DEFAULT_ABI 296a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org dump "Using CPU ABI: $ABI (default)" 297a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org else 298a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org dump "Using CPU ABI: $ABI (command-line)" 299a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org fi 300a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.orgfi 301a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org 302a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org# Check the ABI value 303a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.orgVALID= 304a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.orgfor VALID_ABI in $VALID_ABIS; do 305a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org if [ "$ABI" = "$VALID_ABI" ]; then 306a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org VALID=true 307a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org break 308a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org fi 309a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.orgdone 310a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org 311a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.orgif [ -z "$VALID" ]; then 312a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org panic "Unknown CPU ABI '$ABI'. Valid values are: $VALID_ABIS" 313434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgfi 314434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 315a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org# Extract architecture name from ABI 316434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgcase $ABI in 317a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org armeabi*) ARCH=arm;; 318a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.org *) ARCH=$ABI;; 319434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgesac 320434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 321434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# Extract GNU configuration name 322434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgcase $ARCH in 323047752b26a2d1a9ba291a6a47d88a08894e1d5f6digit@chromium.org arm) 324047752b26a2d1a9ba291a6a47d88a08894e1d5f6digit@chromium.org GNU_CONFIG=arm-linux-androideabi 325047752b26a2d1a9ba291a6a47d88a08894e1d5f6digit@chromium.org ;; 326047752b26a2d1a9ba291a6a47d88a08894e1d5f6digit@chromium.org x86) 327047752b26a2d1a9ba291a6a47d88a08894e1d5f6digit@chromium.org GNU_CONFIG=i686-linux-android 328047752b26a2d1a9ba291a6a47d88a08894e1d5f6digit@chromium.org ;; 3298c88c3e5233bf798426121d4606a7afd5b7e6afadigit@chromium.org mips) 3308c88c3e5233bf798426121d4606a7afd5b7e6afadigit@chromium.org GNU_CONFIG=mipsel-linux-android 3318c88c3e5233bf798426121d4606a7afd5b7e6afadigit@chromium.org ;; 332047752b26a2d1a9ba291a6a47d88a08894e1d5f6digit@chromium.org *) 333047752b26a2d1a9ba291a6a47d88a08894e1d5f6digit@chromium.org GNU_CONFIG="$ARCH-linux-android" 334047752b26a2d1a9ba291a6a47d88a08894e1d5f6digit@chromium.org ;; 335434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgesac 336434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 337434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# Generate standalone NDK toolchain installation 338434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgNDK_STANDALONE="$TMPDIR/ndk-$ARCH-toolchain" 339434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgecho "Generating NDK standalone toolchain installation" 340434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgmkdir -p "$NDK_STANDALONE" 341e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org# NOTE: The --platform=android-9 is required to provide <regex.h> for GTest. 342434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgrun "$NDK_DIR/build/tools/make-standalone-toolchain.sh" \ 343434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org --arch="$ARCH" \ 344e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org --platform=android-9 \ 345434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org --install-dir="$NDK_STANDALONE" 346434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgfail_panic "Can't generate standalone NDK toolchain installation!" 347434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 348047752b26a2d1a9ba291a6a47d88a08894e1d5f6digit@chromium.org# Rebuild the client library, processor and tools with the auto-tools based 349047752b26a2d1a9ba291a6a47d88a08894e1d5f6digit@chromium.org# build system. Even though it's not going to be used, this checks that this 350047752b26a2d1a9ba291a6a47d88a08894e1d5f6digit@chromium.org# still works correctly. 351e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.orgecho "Building full Android binaries with configure/make" 352434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgTMPTARGET="$TMPDIR/target-local" 353434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org( 354434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org PATH="$NDK_STANDALONE/bin:$PATH" 355434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org run mkdir "$TMPTARGET" && 356434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org run mkdir "$TMPDIR"/build-target && 357434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org run cd "$TMPDIR"/build-target && 358434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org run2 "$PROGDIR"/../configure --prefix="$TMPTARGET" \ 359047752b26a2d1a9ba291a6a47d88a08894e1d5f6digit@chromium.org --host="$GNU_CONFIG" && 360434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org run2 make -j$NUM_JOBS install 361434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org) 362047752b26a2d1a9ba291a6a47d88a08894e1d5f6digit@chromium.orgfail_panic "Could not rebuild Android binaries!" 363434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 364e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org# Build and/or run unit test suite. 365e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org# If --no-device is used, only rebuild it, otherwise, run in on the 366e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org# connected device. 367e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.orgif [ "$NO_DEVICE" ]; then 368e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org ACTION="Building" 369e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org # This is a trick to force the Makefile to ignore running the scripts. 370e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org TESTS_ENVIRONMENT="TESTS_ENVIRONMENT=true" 371e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.orgelse 372e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org ACTION="Running" 373e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org TESTS_ENVIRONMENT= 374e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.orgfi 375e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org 376e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org( 377e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org PATH="$NDK_STANDALONE/bin:$PATH" 378e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org run cd "$TMPDIR"/build-target && 37971a856a8c026189cd7f8fd9a3cb0b8dc80a30969digit@chromium.org # Reconfigure to only run the client unit test suite. 38071a856a8c026189cd7f8fd9a3cb0b8dc80a30969digit@chromium.org # This one should _never_ fail. 38171a856a8c026189cd7f8fd9a3cb0b8dc80a30969digit@chromium.org dump "$ACTION Android client library unit tests." 38271a856a8c026189cd7f8fd9a3cb0b8dc80a30969digit@chromium.org run2 "$PROGDIR"/../configure --prefix="$TMPTARGET" \ 38371a856a8c026189cd7f8fd9a3cb0b8dc80a30969digit@chromium.org --host="$GNU_CONFIG" \ 38471a856a8c026189cd7f8fd9a3cb0b8dc80a30969digit@chromium.org --disable-tools \ 38571a856a8c026189cd7f8fd9a3cb0b8dc80a30969digit@chromium.org --disable-processor && 38671a856a8c026189cd7f8fd9a3cb0b8dc80a30969digit@chromium.org run make -j$NUM_JOBS check $TESTS_ENVIRONMENT || exit $? 38771a856a8c026189cd7f8fd9a3cb0b8dc80a30969digit@chromium.org 38871a856a8c026189cd7f8fd9a3cb0b8dc80a30969digit@chromium.org if [ "$ALL_TESTS" ]; then 38971a856a8c026189cd7f8fd9a3cb0b8dc80a30969digit@chromium.org dump "$ACTION Tools and processor unit tests." 39071a856a8c026189cd7f8fd9a3cb0b8dc80a30969digit@chromium.org # Reconfigure to run the processor and tools tests. 39171a856a8c026189cd7f8fd9a3cb0b8dc80a30969digit@chromium.org # Most of these fail for now, so do not worry about it. 392e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org run2 "$PROGDIR"/../configure --prefix="$TMPTARGET" \ 39371a856a8c026189cd7f8fd9a3cb0b8dc80a30969digit@chromium.org --host="$GNU_CONFIG" && 39471a856a8c026189cd7f8fd9a3cb0b8dc80a30969digit@chromium.org run make -j$NUM_JOBS check $TESTS_ENVIRONMENT 39571a856a8c026189cd7f8fd9a3cb0b8dc80a30969digit@chromium.org if [ $? != 0 ]; then 39671a856a8c026189cd7f8fd9a3cb0b8dc80a30969digit@chromium.org dump "Tools and processor unit tests failed as expected. \ 39771a856a8c026189cd7f8fd9a3cb0b8dc80a30969digit@chromium.orgUse --verbose for results." 39871a856a8c026189cd7f8fd9a3cb0b8dc80a30969digit@chromium.org fi 39971a856a8c026189cd7f8fd9a3cb0b8dc80a30969digit@chromium.org fi 400e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org) 40171a856a8c026189cd7f8fd9a3cb0b8dc80a30969digit@chromium.orgfail_panic "Client library unit test suite failed!" 402e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org 403434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# Copy sources to temporary directory 404434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgPROJECT_DIR=$TMPDIR/project 405434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgdump "Copying test program sources to: $PROJECT_DIR" 406434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgrun cp -r "$TESTAPP_DIR" "$PROJECT_DIR" && 407434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgrun rm -rf "$PROJECT_DIR/obj" && 408434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgrun rm -rf "$PROJECT_DIR/libs" 409434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgfail_panic "Could not copy test program sources to: $PROJECT_DIR" 410434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 411434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# Build the test program with ndk-build. 412434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgdump "Building test program with ndk-build" 413434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgexport NDK_MODULE_PATH="$PROGDIR" 414434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgNDK_BUILD_FLAGS="-j$NUM_JOBS" 415e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.orgif verbosity_is_higher_than 1; then 416434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org NDK_BUILD_FLAGS="$NDK_BUILD_FLAGS NDK_LOG=1 V=1" 417434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgfi 418a5cbe2adb0cec125a33140cbfc18abbab6e972dadigit@chromium.orgrun "$NDK_DIR/ndk-build" -C "$PROJECT_DIR" $NDK_BUILD_FLAGS APP_ABI=$ABI 419434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgfail_panic "Can't build test program!" 420434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 421434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# Unless --no-device was used, stop right here if ADB isn't in the path, 422434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# or there is no connected device. 423434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgif [ "$NO_DEVICE" ]; then 424434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org dump "Done. Please connect a device to run all tests!" 425434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org clean_exit 0 426434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgfi 427434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 428434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# Push the program to the device. 429434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgTESTAPP=test_google_breakpad 430434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgTESTAPP_FILE="$PROJECT_DIR/libs/$ABI/test_google_breakpad" 431434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgif [ ! -f "$TESTAPP_FILE" ]; then 432434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org panic "Device requires '$ABI' binaries. None found!" 433434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgfi 434434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 435434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# Run the program there 436434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgdump "Installing test program on device" 437434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgDEVICE_TMP=/data/local/tmp 438e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.orgadb_push "$TESTAPP_FILE" "$DEVICE_TMP/" 439434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgfail_panic "Cannot push test program to device!" 440434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 441434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgdump "Running test program on device" 442434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgadb_shell cd "$DEVICE_TMP" "&&" ./$TESTAPP > "$CRASH_LOG" 2>/dev/null 443434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgif [ $? = 0 ]; then 444434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org panic "Test program did *not* crash as expected!" 445434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgfi 446e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.orgif verbosity_is_higher_than 0; then 447434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org echo -n "Crash log: " 448434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org cat "$CRASH_LOG" 449434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgfi 450434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 451434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# Extract minidump from device 452434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgMINIDUMP_NAME=$(awk '$1 == "Dump" && $2 == "path:" { print $3; }' "$CRASH_LOG") 453434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgMINIDUMP_NAME=$(basename "$MINIDUMP_NAME") 454434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgif [ -z "$MINIDUMP_NAME" ]; then 455434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org panic "Test program didn't write minidump properly!" 456434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgfi 457434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 458434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgdump "Extracting minidump: $MINIDUMP_NAME" 459e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.orgadb_pull "$DEVICE_TMP/$MINIDUMP_NAME" . 460434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgfail_panic "Can't extract minidump!" 461434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 462434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgdump "Parsing test program symbols" 463e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.orgif verbosity_is_higher_than 1; then 464434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org log "COMMAND: $TMPBIN/dump_syms \ 465434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org $PROJECT_DIR/obj/local/$ABI/$TESTAPP >$TESTAPP.sym" 466434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgfi 467434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org"$TMPBIN/dump_syms" "$PROJECT_DIR/obj/local/$ABI/$TESTAPP" > $TESTAPP.sym 468434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgfail_panic "dump_syms doesn't work!" 469434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 470434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgVERSION=$(awk '$1 == "MODULE" { print $4; }' $TESTAPP.sym) 471434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgdump "Found module version: $VERSION" 472434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgif [ -z "$VERSION" ]; then 473434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org echo "ERROR: Can't find proper module version from symbol dump!" 474434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org head -n5 $TESTAPP.sym 475434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org clean_exit 1 476434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgfi 477434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 478434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgrun mkdir -p "$TMPDIR/symbols/$TESTAPP/$VERSION" 479434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgrun mv $TESTAPP.sym "$TMPDIR/symbols/$TESTAPP/$VERSION/" 480434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 481434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgdump "Generating stack trace" 482434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# Don't use 'run' to be able to send stdout and stderr to two different files. 483434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orglog "COMMAND: $TMPBIN/minidump_stackwalk $MINIDUMP_NAME symbols" 484434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org"$TMPBIN/minidump_stackwalk" $MINIDUMP_NAME \ 485434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org "$TMPDIR/symbols" \ 486434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org > "$BUILD_LOG" 2>>"$RUN_LOG" 487434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgfail_panic "minidump_stackwalk doesn't work!" 488434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 489434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgdump "Checking stack trace content" 490434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 491e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.orgif verbosity_is_higher_than 1; then 492434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org cat "$BUILD_LOG" 493434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgfi 494434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 495434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# The generated stack trace should look like the following: 496434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# 497434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# Thread 0 (crashed) 498434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# 0 test_google_breakpad!crash [test_breakpad.cpp : 17 + 0x4] 499434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# r4 = 0x00015530 r5 = 0xbea2cbe4 r6 = 0xffffff38 r7 = 0xbea2cb5c 500434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# r8 = 0x00000000 r9 = 0x00000000 r10 = 0x00000000 fp = 0x00000000 501434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# sp = 0xbea2cb50 lr = 0x00009025 pc = 0x00008f84 502434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# Found by: given as instruction pointer in context 503434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# 1 test_google_breakpad!main [test_breakpad.cpp : 25 + 0x3] 504434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# r4 = 0x00015530 r5 = 0xbea2cbe4 r6 = 0xffffff38 r7 = 0xbea2cb5c 505434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# r8 = 0x00000000 r9 = 0x00000000 r10 = 0x00000000 fp = 0x00000000 506434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# sp = 0xbea2cb50 pc = 0x00009025 507434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# Found by: call frame info 508434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# 2 libc.so + 0x164e5 509434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# r4 = 0x00008f64 r5 = 0xbea2cc34 r6 = 0x00000001 r7 = 0xbea2cc3c 510434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# r8 = 0x00000000 r9 = 0x00000000 r10 = 0x00000000 fp = 0x00000000 511434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# sp = 0xbea2cc18 pc = 0x400c34e7 512434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# Found by: call frame info 513434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# ... 514434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# 515434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# The most important part for us is ensuring that the source location could 516434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# be extracted, so look at the 'test_breakpad.cpp' references here. 517434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# 518434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# First, extract all the lines with test_google_breakpad! in them, and 519434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# dump the corresponding crash location. 520434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# 521434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# Note that if the source location can't be extracted, the second field 522434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# will only be 'test_google_breakpad' without the exclamation mark. 523434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# 524434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgLOCATIONS=$(awk '$2 ~ "^test_google_breakpad!.*" { print $3; }' "$BUILD_LOG") 525434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 526434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgif [ -z "$LOCATIONS" ]; then 527e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org if verbosity_is_lower_than 1; then 528434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org cat "$BUILD_LOG" 529434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org fi 530434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org panic "No source location found in stack trace!" 531434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgfi 532434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 533434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org# Now check that they all match "[<source file>" 534434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgBAD_LOCATIONS= 535434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgfor LOCATION in $LOCATIONS; do 536434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org case $LOCATION in 537434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org # Escape the opening bracket, or some shells like Dash will not 538434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org # match them properly. 539434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org \[*.cpp|\[*.cc|\[*.h) # These are valid source locations in our executable 540434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org ;; 541434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org *) # Everything else is not! 542434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org BAD_LOCATIONS="$BAD_LOCATIONS $LOCATION" 543434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org ;; 544434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org esac 545434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgdone 546434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 547434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgif [ "$BAD_LOCATIONS" ]; then 548434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org dump "ERROR: Generated stack trace doesn't contain valid source locations:" 549434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org cat "$BUILD_LOG" 550434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org echo "Bad locations are: $BAD_LOCATIONS" 551e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org exit 1 552434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgfi 553434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.org 554434eeea2ce9b8fdb9fd1a8098edf584bdd4b53a3digit@chromium.orgecho "All clear! Congratulations." 555e542fe298b636258c28459972e2cbdf28258ae85digit@chromium.org 556