blob: 8d742460612b8a881ad8a6f8d6e2bf710b7908f0 [file] [log] [blame]
James Lemieux2a2559e2018-01-28 02:56:27 -08001#!/bin/bash
2#
3# A simple script to wrap the execution of a command so that it stores its
4# output and return value into a file and then process it to later on.
5#
6# This is meant to be used in a makefile, specifically to allow for the output
7# of a command to be stored in a file and added to the dist list, even if the
8# command actually failed.
9#
10# For example, your makefile might include:
11#
12# my_target := lint
13# my_target_output := $(OUT_DIR)/lint-output.txt
14# my_target_retval := $(OUT_DIR)/lint-retval.txt
15#
16# $(my_target_output) $(my_target_retval): PRIVATE_MODULE := $(my_target)
17# $(my_target_output) $(my_target_retval): PRIVATE_OUTPUT := $(my_target_output)
18# $(my_target_output) $(my_target_retval): PRIVATE_RETVAL := $(my_target_retval)
19# $(my_target_output) $(my_target_retval):
20# $(PATH)/wrapper.sh \
21# $(PRIVATE_MODULE) \
22# $(PRIVATE_OUTPUT) \
23# $(PRIVATE_RETVAL) \
24# wrap \
25# $(PATH)/run-list.sh $(LOCAL_PATH)/src
26#
27# $(my_target): PRIVATE_MODULE := $(my_target)
28# $(my_target): PRIVATE_OUTPUT := $(my_target_output)
29# $(my_target): PRIVATE_RETVAL := $(my_target_retval)
30# $(my_target): $(my_target_output) $(my_target_retval)
31# $(PATH)/wrapper.sh \
32# $(PRIVATE_MODULE) \
33# $(PRIVATE_OUTPUT) \
34# $(PRIVATE_RETVAL) \
35# eval
36
37set -euo pipefail
38
39# Terminate with a fatal error.
40function fatal() {
41 echo "Fatal: $*"
42 exit 113
43}
44
45function main() {
46 local module="${1-}"; shift || fatal "missing argument: module"
47 local output="${1-}"; shift || fatal "missing argument: output"
48 local retval="${1-}"; shift || fatal "missing argument: retval"
49 local action="${1-}"; shift || fatal "missing argument: action"
50 # The rest of the arguments are the command to run.
51
52 if [ "$action" = 'wrap' ]; then
53 # Run the command specified by the rest of arguments ("$@") and save output
54 # and return value.
55 echo 0 >"${retval}"
56 "$@" >"${output}" 2>&1 || echo "$?" >"${retval}"
57
58 # Wrapping itself is always successful.
59 return
60 elif [ "$action" = 'eval' ]; then
61 local result="$(cat "${retval}")"
62 if [ "$result" = 0 ]; then
63 # If successful only print the last few lines.
64 tail -n 5 "$output" | sed -e "s/^/${module}: /"
65 else
66 # Print the entire output on failure.
67 cat "$output" | sed -e "s/^/${module}: /"
68 fi
69 # Evaluating returns the stored return value.
70 return "$result"
71 else
72 fatal "invalid action: $action"
73 fi
74}
75
76main "$@"