blob: fac2fbe9de4e516ae20da376569a489d49c504f4 [file] [log] [blame]
#!/bin/bash
# Copyright 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# This a simple script to make building/testing Mojo components easier (on
# Linux).
# TODO(vtl): Maybe make the test runner smart and not run unchanged test
# binaries.
# TODO(vtl) Maybe also provide a way to pass command-line arguments to the test
# binaries.
do_help() {
cat << EOF
Usage: $(basename "$0") [command|option ...]
command should be one of:
build - Build.
test - Run unit tests (does not build).
perftest - Run perf tests (does not build).
pytest - Run Python unit tests (does not build).
gn - Run gn for mojo (does not sync).
sync - Sync using gclient (does not run gn).
show-bash-alias - Outputs an appropriate bash alias for mojob. In bash do:
\$ eval \`mojo/tools/mojob.sh show-bash-alias\`
option (which will only apply to commands which follow) should be one of:
General options (specify before everything):
--debug / --release - Debug (default) / Release build.
gn options (specify before gn):
--clang / --gcc - Use clang (default) / gcc.
--goma / --no-goma - Use goma (if \$GOMA_DIR is set or \$HOME/goma exists;
default) / don't use goma.
Note: It will abort on the first failure (if any).
EOF
}
get_gn_arg_value() {
grep -m 1 "^[[:space:]]*\<$2\>" "$1/args.gn" | \
sed -n 's/.* = "\?\([^"]*\)"\?$/\1/p'
}
get_outdir() {
if [ $TARGET != linux ]; then
echo "out/${TARGET}_$1"
else
echo "out/$1"
fi
}
do_build() {
local out_dir=$(get_outdir $1)
echo "Building in ${out_dir} ..."
if [ "$(get_gn_arg_value ${out_dir} use_goma)" = "true" ]; then
# Use the configured goma directory.
local goma_dir="$(get_gn_arg_value ${out_dir} goma_dir)"
echo "Ensuring goma (in ${goma_dir}) started ..."
"${goma_dir}/goma_ctl.py" ensure_start
ninja -j 1000 -l 100 -C "${out_dir}" root || exit 1
else
ninja -C "${out_dir}" root || exit 1
fi
}
do_unittests() {
local out_dir=$(get_outdir $1)
echo "Running unit tests in ${out_dir} ..."
./testing/xvfb.py "${out_dir}" mojo/tools/test_runner.py \
mojo/tools/data/unittests "${out_dir}" mojob_test_successes || exit 1
}
do_perftests() {
local out_dir=$(get_outdir $1)
echo "Running perf tests in ${out_dir} ..."
"${out_dir}/mojo_public_system_perftests" || exit 1
}
do_pytests() {
local out_dir=$(get_outdir $1)
echo "Running python tests in ${out_dir} ..."
python mojo/tools/run_mojo_python_tests.py || exit 1
python mojo/tools/run_mojo_python_bindings_tests.py \
"--build-dir=${out_dir}" || exit 1
}
do_skytests() {
local out_dir=$(get_outdir $1)
if [ $TARGET == linux ]; then
./testing/xvfb.py "${out_dir}" sky/tools/test_sky -t $1 \
--no-new-test-results --no-show-results --verbose || exit 1
fi
}
do_gn() {
local gn_args="$(make_gn_args $1)"
local out_dir="$(get_outdir $1)"
echo "Running gn gen ${out_dir} with --args=\"${gn_args}\" ..."
gn gen --args="${gn_args}" "${out_dir}"
}
do_sync() {
gclient sync || exit 1
}
# Valid values: Debug or Release.
BUILD_TYPE=Debug
# Valid values: clang or gcc.
COMPILER=clang
# Valid values: linux, android or chromeos
TARGET=linux
# Valid values: auto or disabled.
GOMA=auto
make_gn_args() {
local args=()
# TODO(vtl): It's a bit of a hack to infer the build type from the output
# directory name, but it's what we have right now (since we support "debug and
# release" mode).
case "$1" in
Debug)
args+=("is_debug=true")
;;
Release)
args+=("is_debug=false")
;;
esac
case "$COMPILER" in
clang)
args+=("is_clang=true")
;;
gcc)
args+=("is_clang=false")
;;
esac
case "$GOMA" in
auto)
if [ -v GOMA_DIR ]; then
args+=("use_goma=true" "goma_dir=\"${GOMA_DIR}\"")
elif [ -d "${HOME}/goma" ]; then
args+=("use_goma=true" "goma_dir=\"${HOME}/goma\"")
else
args+=("use_goma=false")
fi
;;
disabled)
args+=("use_goma=false")
;;
esac
case "$TARGET" in
android)
args+=("os=\"android\"" "cpu_arch=\"arm\"")
;;
chromeos)
args+=("os=\"chromeos\"" "ui_base_build_ime=false" \
"use_system_harfbuzz=false")
;;
esac
echo "${args[*]}"
}
# We're in src/mojo/tools. We want to get to src.
cd "$(readlink -e "$(dirname "$0")")/../.."
if [ $# -eq 0 ]; then
do_help
exit 0
fi
for arg in "$@"; do
case "$arg" in
# Commands -----------------------------------------------------------------
help|--help)
do_help
exit 0
;;
build)
do_build "$BUILD_TYPE"
;;
test)
do_unittests "$BUILD_TYPE"
do_pytests "$BUILD_TYPE"
do_skytests "$BUILD_TYPE"
;;
perftest)
do_perftests "$BUILD_TYPE"
;;
pytest)
do_pytests "$BUILD_TYPE"
;;
gn)
do_gn "$BUILD_TYPE"
;;
sync)
do_sync
;;
show-bash-alias)
# You want to type something like:
# alias mojob=\
# '"$(pwd | sed '"'"'s/\(.*\/src\).*/\1/'"'"')/mojo/tools/mojob.sh"'
# This is quoting hell, so we simply escape every non-alphanumeric
# character.
echo alias\ mojob\=\'\"\$\(pwd\ \|\ sed\ \'\"\'\"\'s\/\\\(\.\*\\\/src\\\)\
\.\*\/\\1\/\'\"\'\"\'\)\/mojo\/tools\/mojob\.sh\"\'
;;
# Options ------------------------------------------------------------------
--debug)
BUILD_TYPE=Debug
;;
--release)
BUILD_TYPE=Release
;;
--clang)
COMPILER=clang
;;
--gcc)
COMPILER=gcc
;;
--goma)
GOMA=auto
;;
--no-goma)
GOMA=disabled
;;
--android)
TARGET=android
COMPILER=gcc
;;
--chromeos)
TARGET=chromeos
;;
*)
echo "Unknown command \"${arg}\". Try \"$(basename "$0") help\"."
exit 1
;;
esac
done
exit 0