[net.bugs.v7] sh conditionals do not work inside make files

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