From patchwork Sun Aug 2 14:35:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [bitbake-devel, v2, 4/4] build: add back the Bash EXIT trap to handle cases that ERR doesn't From: "Chris Laplante via lists.openembedded.org" X-Patchwork-Id: 174993 Message-Id: <20200802143505.88409-5-chris.laplante@agilent.com> To: Cc: Chris Laplante Date: Sun, 2 Aug 2020 10:35:05 -0400 ERR unfortunately doesn't trigger for e.g. 'exit 1'. Unfortunately the backtrace we generate in the EXIT trap won't be able to get the correct line number for the first frame. See http://gnu-bash.2382.n7.nabble.com/trap-echo-quot-trap-exit-on-LINENO-quot-EXIT-gt-wrong-linenumber-td3666.html Therefore the metadata-relative backtrace will just not have the first frame. Example: | WARNING: /home/laplante/repos/oe-core/build/tmp-glibc/work/core2-64-oe-linux/libsolv/0.7.14-r0/temp/run.do_compile.85057:1 exit 1 from 'exit 1' | WARNING: Backtrace (BB generated script): | #1: myclass_do_something, /home/laplante/repos/oe-core/build/tmp-glibc/work/core2-64-oe-linux/libsolv/0.7.14-r0/temp/run.do_compile.85057, line ? | #2: do_something, /home/laplante/repos/oe-core/build/tmp-glibc/work/core2-64-oe-linux/libsolv/0.7.14-r0/temp/run.do_compile.85057, line 156 | #3: actually_fail, /home/laplante/repos/oe-core/build/tmp-glibc/work/core2-64-oe-linux/libsolv/0.7.14-r0/temp/run.do_compile.85057, line 144 | #4: my_compile_extra, /home/laplante/repos/oe-core/build/tmp-glibc/work/core2-64-oe-linux/libsolv/0.7.14-r0/temp/run.do_compile.85057, line 146 | #5: do_compile, /home/laplante/repos/oe-core/build/tmp-glibc/work/core2-64-oe-linux/libsolv/0.7.14-r0/temp/run.do_compile.85057, line 137 | #6: main, /home/laplante/repos/oe-core/build/tmp-glibc/work/core2-64-oe-linux/libsolv/0.7.14-r0/temp/run.do_compile.85057, line 180 | | Backtrace (metadata-relative locations): | #2: do_something, autogenerated, line 2 | #3: actually_fail, /home/laplante/repos/oe-core/meta/recipes-extended/libsolv/libsolv_0.7.14.bb, line 36 | #4: my_compile_extra, /home/laplante/repos/oe-core/meta/recipes-extended/libsolv/libsolv_0.7.14.bb, line 38 | #5: do_compile, autogenerated, line 3 Signed-off-by: Chris Laplante --- lib/bb/build.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/lib/bb/build.py b/lib/bb/build.py index 834078fd..a6b7c5de 100644 --- a/lib/bb/build.py +++ b/lib/bb/build.py @@ -314,6 +314,26 @@ bb_sh_exit_handler() { exit $ret } +bb_bash_exit_handler() { + ret=$? + if [ "$ret" != 0 ]; then + echo "WARNING: ${BASH_SOURCE[0]}:${BASH_LINENO[0]} exit $ret from '$BASH_COMMAND'" + + echo "WARNING: Backtrace (BB generated script): " + for ((i=1; i<${#FUNCNAME[@]}; i++)); do + if [ $i -eq 1 ]; then + # TODO: maybe manually track LINENO with a DEBUG trap? + # LINENO / BASH_LINENO for the first frame in an EXIT trap is wrong :/ + # http://gnu-bash.2382.n7.nabble.com/trap-echo-quot-trap-exit-on-LINENO-quot-EXIT-gt-wrong-linenumber-td3666.html + echo "\t#$((i)): ${FUNCNAME[$i]}, ${BASH_SOURCE[$((i-1))]}, line ?" + else + echo "\t#$((i)): ${FUNCNAME[$i]}, ${BASH_SOURCE[$((i-1))]}, line ${BASH_LINENO[$((i-1))]}" + fi + done + fi + exit $ret +} + bb_bash_err_handler() { ret=$? echo "WARNING: ${BASH_SOURCE[0]}:${BASH_LINENO[0]} exit $ret from '$BASH_COMMAND'" @@ -323,6 +343,7 @@ bb_bash_err_handler() { echo "\t#$((i-1)): ${FUNCNAME[$i]}, ${BASH_SOURCE[$((i-1))]}, line ${BASH_LINENO[$((i-1))]}" done + trap "" EXIT exit $ret } @@ -331,6 +352,7 @@ case $BASH_VERSION in set -e ;; *) trap 'bb_bash_err_handler' ERR + trap 'bb_bash_exit_handler' 0 set -eE esac '''