| #!/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 |