Home | History | Annotate | Download | only in tools
      1 #!/bin/bash
      2 # Copyright 2013 The Chromium Authors. All rights reserved.
      3 # Use of this source code is governed by a BSD-style license that can be
      4 # found in the LICENSE file.
      5 
      6 # This a simple script to make building/testing Mojo components easier (on
      7 # Linux).
      8 
      9 # TODO(vtl): Maybe make the test runner smart and not run unchanged test
     10 # binaries.
     11 # TODO(vtl) Maybe also provide a way to pass command-line arguments to the test
     12 # binaries.
     13 
     14 do_help() {
     15   cat << EOF
     16 Usage: $(basename "$0") [command|option ...]
     17 
     18 command should be one of:
     19   build - Build.
     20   test - Run unit tests (does not build).
     21   perftest - Run perf tests (does not build).
     22   pytest - Run Python unit tests.
     23   gyp - Run gyp for mojo (does not sync).
     24   gypall - Run gyp for all of chromium (does not sync).
     25   sync - Sync using gclient (does not run gyp).
     26   show-bash-alias - Outputs an appropriate bash alias for mojob. In bash do:
     27       \$ eval \`mojo/tools/mojob.sh show-bash-alias\`
     28 
     29 option (which will only apply to following commands) should be one of:
     30   Build/test options (specified before build/test/perftest):
     31     --debug - Build/test in Debug mode.
     32     --release - Build/test in Release mode.
     33     --debug-and-release - Build/test in both Debug and Release modes (default).
     34   Compiler options (specified before gyp):
     35     --clang - Use clang (default).
     36     --gcc - Use gcc.
     37   Component options:
     38     --shared Build components as shared libraries (default).
     39     --static Build components as static libraries.
     40   Use goma:
     41     --use-goma - Use goma if \$GOMA_DIR is set or \$HOME/goma exists (default).
     42     --no-use-goma - Do not use goma.
     43 
     44 Note: It will abort on the first failure (if any).
     45 EOF
     46 }
     47 
     48 do_build() {
     49   echo "Building in out/$1 ..."
     50   if [ "$GOMA" = "auto" -a -v GOMA_DIR ]; then
     51     ninja -j 1000 -C "out/$1" mojo || exit 1
     52   else
     53     ninja -C "out/$1" mojo || exit 1
     54   fi
     55 }
     56 
     57 do_unittests() {
     58   echo "Running unit tests in out/$1 ..."
     59   mojo/tools/test_runner.py mojo/tools/data/unittests "out/$1" \
     60       mojob_test_successes || exit 1
     61 }
     62 
     63 do_perftests() {
     64   echo "Running perf tests in out/$1 ..."
     65   "out/$1/mojo_public_system_perftests" || exit 1
     66 }
     67 
     68 do_pytests() {
     69   python mojo/tools/run_mojo_python_tests.py || exit 1
     70 }
     71 
     72 do_gyp() {
     73   local gyp_defines="$(make_gyp_defines)"
     74   echo "Running gyp for mojo with GYP_DEFINES=$gyp_defines ..."
     75   GYP_DEFINES="$gyp_defines" build/gyp_chromium mojo/mojo.gyp || exit 1
     76 }
     77 
     78 do_gypall() {
     79   local gyp_defines="$(make_gyp_defines)"
     80   echo "Running gyp for everything with GYP_DEFINES=$gyp_defines ..."
     81   GYP_DEFINES="$gyp_defines" build/gyp_chromium || exit 1
     82 }
     83 
     84 do_sync() {
     85   # Note: sync only (with hooks, but no gyp-ing).
     86   GYP_CHROMIUM_NO_ACTION=1 gclient sync || exit 1
     87 }
     88 
     89 # Valid values: Debug, Release, or Debug_and_Release.
     90 BUILD_TEST_TYPE=Debug_and_Release
     91 should_do_Debug() {
     92   test "$BUILD_TEST_TYPE" = Debug -o "$BUILD_TEST_TYPE" = Debug_and_Release
     93 }
     94 should_do_Release() {
     95   test "$BUILD_TEST_TYPE" = Release -o "$BUILD_TEST_TYPE" = Debug_and_Release
     96 }
     97 
     98 # Valid values: clang or gcc.
     99 COMPILER=clang
    100 # Valid values: shared or static.
    101 COMPONENT=shared
    102 # Valid values: auto or disabled.
    103 GOMA=auto
    104 make_gyp_defines() {
    105   local options=()
    106   # Always include these options.
    107   options+=("use_aura=1")
    108   case "$COMPILER" in
    109     clang)
    110       options+=("clang=1")
    111       ;;
    112     gcc)
    113       options+=("clang=0")
    114       ;;
    115   esac
    116   case "$COMPONENT" in
    117     shared)
    118       options+=("component=shared_library")
    119       ;;
    120     static)
    121       options+=("component=static_library")
    122       ;;
    123   esac
    124   case "$GOMA" in
    125     auto)
    126       if [ -v GOMA_DIR ]; then
    127         options+=("use_goma=1" "gomadir=\"${GOMA_DIR}\"")
    128       else
    129         options+=("use_goma=0")
    130       fi
    131       ;;
    132     disabled)
    133       options+=("use_goma=0")
    134       ;;
    135   esac
    136   echo "${options[*]}"
    137 }
    138 
    139 set_goma_dir_if_necessary() {
    140   if [ "$GOMA" = "auto" -a ! -v GOMA_DIR ]; then
    141     if [ -d "${HOME}/goma" ]; then
    142       GOMA_DIR="${HOME}/goma"
    143     fi
    144   fi
    145 }
    146 
    147 start_goma_if_necessary() {
    148   if [ "$GOMA" = "auto" -a -v GOMA_DIR ]; then
    149     "${GOMA_DIR}/goma_ctl.py" ensure_start
    150   fi
    151 }
    152 
    153 # We're in src/mojo/tools. We want to get to src.
    154 cd "$(realpath "$(dirname "$0")")/../.."
    155 
    156 if [ $# -eq 0 ]; then
    157   do_help
    158   exit 0
    159 fi
    160 
    161 for arg in "$@"; do
    162   case "$arg" in
    163     # Commands -----------------------------------------------------------------
    164     help|--help)
    165       do_help
    166       exit 0
    167       ;;
    168     build)
    169       set_goma_dir_if_necessary
    170       start_goma_if_necessary
    171       should_do_Debug && do_build Debug
    172       should_do_Release && do_build Release
    173       ;;
    174     test)
    175       should_do_Debug && do_unittests Debug
    176       should_do_Release && do_unittests Release
    177       ;;
    178     perftest)
    179       should_do_Debug && do_perftests Debug
    180       should_do_Release && do_perftests Release
    181       ;;
    182     pytest)
    183       do_pytests
    184       ;;
    185     gyp)
    186       set_goma_dir_if_necessary
    187       do_gyp
    188       ;;
    189     gypall)
    190       set_goma_dir_if_necessary
    191       do_gypall
    192       ;;
    193     sync)
    194       do_sync
    195       ;;
    196     show-bash-alias)
    197       # You want to type something like:
    198       #   alias mojob=\
    199       #       '"$(pwd | sed '"'"'s/\(.*\/src\).*/\1/'"'"')/mojo/tools/mojob.sh"'
    200       # This is quoting hell, so we simply escape every non-alphanumeric
    201       # character.
    202       echo alias\ mojob\=\'\"\$\(pwd\ \|\ sed\ \'\"\'\"\'s\/\\\(\.\*\\\/src\\\)\
    203 \.\*\/\\1\/\'\"\'\"\'\)\/mojo\/tools\/mojob\.sh\"\'
    204       ;;
    205     # Options ------------------------------------------------------------------
    206     --debug)
    207       BUILD_TEST_TYPE=Debug
    208       ;;
    209     --release)
    210       BUILD_TEST_TYPE=Release
    211       ;;
    212     --debug-and-release)
    213       BUILD_TEST_TYPE=Debug_and_Release
    214       ;;
    215     --clang)
    216       COMPILER=clang
    217       ;;
    218     --gcc)
    219       COMPILER=gcc
    220       ;;
    221     --shared)
    222       COMPONENT=shared
    223       ;;
    224     --static)
    225       COMPONENT=static
    226       ;;
    227     --use-goma)
    228       GOMA=auto
    229       ;;
    230     --no-use-goma)
    231       GOMA=disabled
    232       ;;
    233     *)
    234       echo "Unknown command \"${arg}\". Try \"$(basename "$0") help\"."
    235       exit 1
    236       ;;
    237   esac
    238 done
    239