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