Subject: How make(1) reacts on failing commands
To: Eric Haszlakiewicz <erh@netbsd.org>
From: Roland Illig <rillig@NetBSD.org>
List: tech-pkg
Date: 11/17/2005 18:57:31
Eric Haszlakiewicz wrote:
> On Thu, Nov 17, 2005 at 10:07:41AM +0100, Roland Illig wrote:
> 
>>Eric Haszlakiewicz wrote:
>>
>>>	Well, that certainly makes the output look correct, but I don't
>>>understand why you don't see any output without the patch.  The line
>>>that calls check-vulnerable has a semicolon on the end:
>>>       vul=`${MAKE} ${MAKEFLAGS} check-vulnerable`;        \
>>>so the shell should keep processing the rest of the "command" that's been
>>>fed to it, no?
>>
>>No.
>>
>>When invoked from make(1), the shell is always in "set -e" mode, that is 
>>the first command giving an exitcode != 0 stops the whole program.
> 
> 
> 	eh? I tried this on two of my machines, and on mail.netbsd.org:
> 
>>cat Makefile
> 
> foo:
>         echo foo; false; echo bar; set -o
> 
>>make foo
> 
> echo foo; false; echo bar; set -o
> foo
> bar
> Current option settings
> errexit         off
> ...rest of them are off also...

make programs terminating after "echo foo":
   - Solaris 9, /usr/xpg4/bin/make
   - bmake-3.1.12 20050603
   - netbsd-20040210
   - IRIX 6.5:1289570120

make programs continuing:
   - GNU make
   - netbsd-20050327
   - netbsd-20041129

However, what they all do the same is to terminate when a complete 
command fails. That is, if the Makefile were:

foo:
         echo foo
         false
         echo bar
         set -o

"echo bar" and "set -o" would not be executed (with the default options; 
there's still -k).

> Is this something that has changed recently?  If it really is supposed to
> work how you say it is, how can one ever use make to run a program that
> doesn't return 0?  (e.g. even just a simple rv=`cmp -s a b` would cause
> the script line to stop)

Surround it with "if". See mk/bulk/print{index,depends} for examples. I 
have rewritten them lately to use the "set -e" mode. (printindex, line 
157--158, is a good starting point.)

Roland