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 Release and Debug perf tests (does not build).
     22   gyp - Run gyp for mojo (does not sync), with clang.
     23   sync - Sync using gclient (does not run gyp).
     24   show-bash-alias - Outputs an appropriate bash alias for mojob. In bash do:
     25       \$ eval \`mojo/tools/mojob.sh show-bash-alias\`
     26 
     27 option (which will only apply to following commands) should be one of:
     28   Build/test options (specified before build/test/perftest):
     29     --debug - Build/test in Debug mode.
     30     --release - Build/test in Release mode.
     31     --debug-and-release - Build/test in both Debug and Release modes (default).
     32   Compiler options (specified before gyp):
     33     --clang - Use clang (default).
     34     --gcc - Use gcc.
     35   Component options:
     36     --shared Build components as shared libraries (default).
     37     --static Build components as static libraries.
     38 
     39 Note: It will abort on the first failure (if any).
     40 EOF
     41 }
     42 
     43 do_build() {
     44   echo "Building in out/$1 ..."
     45   ninja -C "out/$1" mojo || exit 1
     46 }
     47 
     48 do_unittests() {
     49   echo "Running unit tests in out/$1 ..."
     50   "out/$1/mojo_bindings_unittests" || exit 1
     51   "out/$1/mojo_common_unittests" || exit 1
     52   "out/$1/mojo_js_unittests" || exit 1
     53   "out/$1/mojo_public_unittests" || exit 1
     54   "out/$1/mojo_system_unittests" || exit 1
     55   "out/$1/mojo_utility_unittests" || exit 1
     56 }
     57 
     58 do_perftests() {
     59   echo "Running perf tests in out/$1 ..."
     60   "out/$1/mojo_public_perftests" || exit 1
     61 }
     62 
     63 do_gyp() {
     64   local gyp_defines="$(make_gyp_defines)"
     65   echo "Running gyp with GYP_DEFINES=$gyp_defines ..."
     66   GYP_DEFINES="$gyp_defines" build/gyp_chromium mojo/mojo.gyp
     67 }
     68 
     69 # Valid values: Debug, Release, or Debug_and_Release.
     70 BUILD_TEST_TYPE=Debug_and_Release
     71 should_do_Debug() {
     72   test "$BUILD_TEST_TYPE" = Debug -o "$BUILD_TEST_TYPE" = Debug_and_Release
     73 }
     74 should_do_Release() {
     75   test "$BUILD_TEST_TYPE" = Release -o "$BUILD_TEST_TYPE" = Debug_and_Release
     76 }
     77 
     78 # Valid values: clang or gcc.
     79 COMPILER=clang
     80 # Valid values: shared or static.
     81 COMPONENT=shared
     82 make_gyp_defines() {
     83   local options=()
     84   # Always include these options.
     85   options+=("use_aura=1")
     86   case "$COMPILER" in
     87     clang)
     88       options+=("clang=1")
     89       ;;
     90     gcc)
     91       options+=("clang=0")
     92       ;;
     93   esac
     94   case "$COMPONENT" in
     95     shared)
     96       options+=("component=shared_library")
     97       ;;
     98     static)
     99       options+=("component=static_library")
    100       ;;
    101   esac
    102   echo ${options[*]}
    103 }
    104 
    105 # We're in src/mojo/tools. We want to get to src.
    106 cd "$(realpath "$(dirname "$0")")/../.."
    107 
    108 if [ $# -eq 0 ]; then
    109   do_help
    110   exit 0
    111 fi
    112 
    113 for arg in "$@"; do
    114   case "$arg" in
    115     # Commands -----------------------------------------------------------------
    116     help|--help)
    117       do_help
    118       exit 0
    119       ;;
    120     build)
    121       should_do_Debug && do_build Debug
    122       should_do_Release && do_build Release
    123       ;;
    124     test)
    125       should_do_Debug && do_unittests Debug
    126       should_do_Release && do_unittests Release
    127       ;;
    128     perftest)
    129       should_do_Debug && do_perftests Debug
    130       should_do_Release && do_perftests Release
    131       ;;
    132     gyp)
    133       do_gyp
    134       ;;
    135     sync)
    136       # Note: sync only (with hooks, but no gyp-ing).
    137       GYP_CHROMIUM_NO_ACTION=1 gclient sync
    138       ;;
    139     show-bash-alias)
    140       # You want to type something like:
    141       #   alias mojob=\
    142       #       '"$(pwd | sed '"'"'s/\(.*\/src\).*/\1/'"'"')/mojo/tools/mojob.sh"'
    143       # This is quoting hell, so we simply escape every non-alphanumeric
    144       # character.
    145       echo alias\ mojob\=\'\"\$\(pwd\ \|\ sed\ \'\"\'\"\'s\/\\\(\.\*\\\/src\\\)\
    146 \.\*\/\\1\/\'\"\'\"\'\)\/mojo\/tools\/mojob\.sh\"\'
    147       ;;
    148     # Options ------------------------------------------------------------------
    149     --debug)
    150       BUILD_TEST_TYPE=Debug
    151       ;;
    152     --release)
    153       BUILD_TEST_TYPE=Release
    154       ;;
    155     --debug-and-release)
    156       BUILD_TEST_TYPE=Debug_and_Release
    157       ;;
    158     --clang)
    159       COMPILER=clang
    160       ;;
    161     --gcc)
    162       COMPILER=gcc
    163       ;;
    164     --shared)
    165       COMPONENT=shared
    166       ;;
    167     --static)
    168       COMPONENT=static
    169       ;;
    170     *)
    171       echo "Unknown command \"${arg}\". Try \"$(basename "$0") help\"."
    172       exit 1
    173       ;;
    174   esac
    175 done
    176