1#!/usr/bin/env bash
2
3# Copyright 2016 The Fuchsia Authors
4# Copyright (c) 2008 Travis Geiselbrecht
5#
6# Use of this source code is governed by a MIT-style
7# license that can be found in the LICENSE file or at
8# https://opensource.org/licenses/MIT
9
10function HELP {
11    echo "help:"
12    echo "-a arg              : Pass arg to make"
13    echo "-f                  : Exit on first failure"
14    echo "-r                  : Also build release mode builds"
15    echo "-c                  : Also build with clang"
16    echo "-A                  : Also build with ASan"
17    echo "-q                  : Build quietly"
18    echo "-h for help"
19    exit 1
20}
21
22FAIL_FAST=0
23DO_RELEASE=0
24DO_CLANG=0
25DO_ASAN=0
26MAKE_ARGS=
27QUIET=0
28
29while getopts Aa:fhrcq FLAG; do
30    case $FLAG in
31        A) DO_ASAN=1;;
32        a) MAKE_ARGS="${MAKE_ARGS} ${OPTARG}";;
33        f) FAIL_FAST=1;;
34        h) HELP;;
35        r) DO_RELEASE=1;;
36        c) DO_CLANG=1;;
37        q) QUIET=1;;
38        \?)
39            echo unrecognized option
40            HELP
41    esac
42done
43shift $((OPTIND-1))
44
45PROJECTS=
46# build everything in the projects directory
47for p in kernel/project/*.mk; do
48    p=${p##*/}
49    p=${p%.mk}
50    case "$p" in
51    user-*|zircon-*) ;;
52    *) PROJECTS="$PROJECTS $p"
53    esac
54done
55
56FAILED=""
57
58DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
59STATUS=0
60export QUIET
61
62for p in $PROJECTS; do
63  echo building $p
64  nice $DIR/make-parallel $p ${MAKE_ARGS}
65  STATUS=$?
66  if [ "$STATUS" -ne 0 ]; then
67    FAILED="$FAILED $p"
68    if [ "$FAIL_FAST" -eq 1 ]; then
69      break
70    fi
71  fi
72
73  if [ "$DO_CLANG" -eq 1 ]; then
74    echo building $p with clang
75    nice $DIR/make-parallel $p ${MAKE_ARGS} USE_CLANG=true
76    STATUS=$?
77    if [ "$STATUS" -ne 0 ]; then
78      FAILED="$FAILED $p-clang"
79      if [ "$FAIL_FAST" -eq 1 ]; then
80        break
81      fi
82    fi
83  fi
84
85  if [ "$DO_ASAN" -eq 1 ]; then
86    echo building $p with ASan
87    nice $DIR/make-parallel $p ${MAKE_ARGS} USE_ASAN=true
88    STATUS=$?
89    if [ "$STATUS" -ne 0 ]; then
90      FAILED="$FAILED $p-asan"
91      if [ "$FAIL_FAST" -eq 1 ]; then
92        break
93      fi
94    fi
95  fi
96
97  if [ "$DO_RELEASE" -eq 1 ]; then
98    echo building $p with release
99    nice $DIR/make-release $p ${MAKE_ARGS}
100    STATUS=$?
101    if [ "$STATUS" -ne 0 ]; then
102      FAILED="$FAILED $p-release"
103      if [ "$FAIL_FAST" -eq 1 ]; then
104        break
105      fi
106    fi
107    if [ "$DO_CLANG" -eq 1 ]; then
108      echo building $p with release and clang
109      nice $DIR/make-release $p ${MAKE_ARGS} USE_CLANG=true
110      STATUS=$?
111      if [ "$STATUS" -ne 0 ]; then
112        FAILED="$FAILED $p-clang-release"
113        if [ "$FAIL_FAST" -eq 1 ]; then
114          break
115        fi
116      fi
117    fi
118  fi
119done
120
121if [ "$FAILED" != "" ]; then
122  echo
123  echo some projects have failed to build:
124  echo $FAILED
125fi
126
127exit $STATUS
128