This is the mail archive of the
automake@gnu.org
mailing list for the automake project.
Re: Install failures are ignored
- From: Alexandre Duret-Lutz <duret_g at lrde dot epita dot fr>
- To: Pavel Roskin <proski at gnu dot org>
- Cc: Akim Demaille <akim at epita dot fr>, Tom Tromey <tromey at redhat dot com>,<automake at gnu dot org>
- Date: 30 Aug 2002 22:28:32 +0200
- Subject: Re: Install failures are ignored
- References: <Pine.LNX.4.44.0208291836030.17086-100000@marabou.research.att.com>
>>> "Pavel" == Pavel Roskin <proski@gnu.org> writes:
[...]
Pavel> I don't understand the reference to "set -e".
[...]
Pavel> Sorry, I don't know if I was supposed to try it on BSD.
FWIW, BSD make runs commands using `/bin/sh -ec' (unless the `-'
modifier is used, of course).
Anyway, that doesn't change anything for us. Portable Makefiles
should assume `-e' is not used.
BTW, another interesting point is that BSD make has two ways of
executing commands:
- By default it uses the "compatibility" mode:
each command line is run in a separate shell.
- In another mode (enabled when you use `-j max_jobs')
it will run all commands at once in a single shell,
using `/bin/sh -evc' so the shell echoes commands
as it processes them.
Here is what POSIX says about this second point:
The default in some advanced versions of make is to group all the
command lines for a target and execute them using a single shell
invocation; the System V method is to pass each line individually to a
separate shell. The single-shell method has the advantages in
performance and the lack of a requirement for many continued lines.
However, converting to this newer method has caused portability problems
with many historical makefiles, so the behavior with the POSIX makefile
is specified to be the same as that of System V. It is suggested that
the special target .ONESHELL be used as an implementation extension to
achieve the single-shell grouping for a target or group of targets.
[...]
Pavel> By the way, what if the user runs "make -k"? An "exit"
Pavel> would terminate the loop, even though the user wants
Pavel> make to do as much as possible. This would be
Pavel> especially bad if the loop is for subdirectories - a
Pavel> failure in the first of them would cause all other
Pavel> subdirectories to be skipped, and only local commands
Pavel> outside the loop would be executed.
(Automake already "disables" `-k' for recursive rules, see subdirs.am)
Pavel> You can consider this as a low-priority feature request for Automake.
Pavel> Perhaps it can be done by examining $(MAKE) for GNU make.
What about adding something like the following on top of each
"for/do/done" rule?
set fnord $$MAKEFLAGS; amf=$$2; \
case "$$amf" in *=*) set -e ;; *k*) ;; *) set -e ;; esac; \
The idea is to force `set -e' unless `make -k' is used.
This would free us from all these `|| exit 1'.
--
Alexandre Duret-Lutz