From 1a2794237ebe4ac47e6fd7fc37e7f5124380909c Mon Sep 17 00:00:00 2001
From: Yifei Teng <yifeit@google.com>
Date: Mon, 22 Apr 2019 21:47:57 +0000
Subject: [PATCH] [fx build] Emulate -k 0 behavior across zircon and fuchsia
 builds

The `-k 0` switch would instruct the build to keep going in case of
errors. This patch emulates that behavior across two invocations of
ninja, for zircon and fuchsia.

TEST: run builds with errors and verify that the build continues and
also returns an error code

Change-Id: I105e2cfbea61c24a503cd70570d5c3ad129c4cba
---
 tools/devshell/build | 27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/tools/devshell/build b/tools/devshell/build
index fe4ab8732af..0ac946564d6 100755
--- a/tools/devshell/build
+++ b/tools/devshell/build
@@ -22,8 +22,25 @@ source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.
 fx-config-read
 
 function run-ninja {
+  local continue_on_error=false
+  for (( i=1; i<=$#; i++)); do
+    j=$((i+1))
+    if [ "${!i}" = "-k" ] && [ "${!j}" = "0" ]; then
+      continue_on_error=true
+    fi
+  done
   # Use a subshell because fx-cmd-locked locks until exit, not function return.
-  (fx-run-ninja "${FUCHSIA_DIR}/buildtools/ninja" "$@") || exit
+  if [ "$continue_on_error" = false ]; then
+    (fx-run-ninja "${FUCHSIA_DIR}/buildtools/ninja" "$@") || exit
+  else
+    local status
+    (fx-run-ninja "${FUCHSIA_DIR}/buildtools/ninja" "$@")
+    status=$?
+    if [ "${status}" -ne 0 ]; then
+      fx-warn "Build outputs may be inconsistent and may remain so; a clean build is recommended."
+    fi
+    return "${status}"
+  fi
 }
 
 function main {
@@ -58,14 +75,22 @@ function main {
   if [ ${#fuchsia_targets[@]} -ne 0 ]; then
     zircon_targets+=(default)
   fi
+  local status
   run-ninja -C "${ZIRCON_BUILDROOT}" "${switches[@]}" "${zircon_targets[@]}"
+  status=$?
 
   # If there were explicit Zircon targets and no other explicit targets,
   # the Zircon run was enough by itself.  Otherwise Zircon default is
   # a prerequisite for any Fuchsia target (including implicit default).
   if [ ${#fuchsia_targets[@]} -ne 0 -o ${#zircon_targets[@]} -eq 0 ]; then
     run-ninja -C "${FUCHSIA_BUILD_DIR}" "${switches[@]}" "${fuchsia_targets[@]}"
+    fuchsia_status=$?
+    if [ "${status}" -eq 0 ]; then
+      status="${fuchsia_status}"
+    fi
   fi
+
+  return "${status}"
 }
 
 main "$@"
-- 
GitLab