Uma razão é que uma falha em um dos comandos de receita não seria detectada pelo GNU make
. Apenas o status final de saída do shell seria dado a make
. Teria que definir adicionalmente .SHELLFLAGS
para -e
para fazer com que o shell terminasse logo no início dos erros (isso é necessário para chamadas de shell multi-comando mesmo sem .ONESHELL
se eles precisarem falharem em o primeiro erro).
Tudo isso é bom para quando SHELL
é um shell POSIX. Um Makefile também pode definir SHELL
como, por exemplo /usr/bin/perl
ou algum outro interpretador de comandos. Pode então ser apropriado, ou não, usar .ONESHELL
.
Tornar .ONESHELL
o comportamento padrão em make
poderia potencialmente quebrar Makefiles antigos.
Mesmo que esta não seja uma questão relacionada ao padrão POSIX ou a conformidade com esse padrão pelo GNU make
, a Justificativa de a especificação POSIX para make
tem a dizer sobre o problema em questão:
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.
O GNU make
é compatível com POSIX a esse respeito, pois implementa o comportamento do System V e fornece um .ONESHELL
de destino para ativar o comportamento alternativo, se desejado. ... o que é outro motivo para o GNU make
manter o comportamento atual.