joe@fluke.UUCP (Joe Kelsey) (09/25/84)
Subject: shell error handling -e flag breaks conditionals in make. Index: bin/sh/xec.c 4.2BSD Description: sh conditionals do not work inside make files. Repeat-By: Place an if statement with both branches in a make file such that the condition is false to try to force execution of the else clause. For example: all: if false ; then echo "true" ; else "false" ; fi Make will report an error and exit immediately after printing the command line. Fix: The -e flag is supposed to cause the shell to exit as soon as it encounters a command which returns non-zero exit status. Make obviously uses this flag so that it can pass complex shell commands without parsing them into individual lines. Unfortunately, the shell will exit if the command on a conditional test internal statement returns non-zero status. Shell should treat commands run for the if, while, and until commands differently than others when the -e flag is set. The solution is to turn off the -e flag while running the commands associated with these flow control statements, then turn it back on immediately after. Here are diff -e for the module xec.c (sorry -this is proprietary, so I can't post contextual diffs - I am also indenting them so that the naked '.'s don't offend anyones software): > 379,380c > THEN flags |= saveflg; > execute(t->thtre,execflg); > ELSE flags |= saveflg; > execute(t->eltre,execflg); > . > 377a > saveflg = flags&errflg; > flags &= ~errflg; > . > 371a > flags |= saveflg; > . > 369c > DO flags |= saveflg; > i=execute(t->dotre,0); > flags &= ~errflg; > . > 366a > saveflg = flags&errflg; > flags &= ~errflg; > . > 32a > INT saveflg; > . /Joe