Drake Wilson wrote: > - Point out that full tail execution optimization is not as > localized as the "anything without shell meta-stuff" that some > people think it is, and that partial tail execution optimization > can lead to subtle problems if not done carefully. Cf. a vaguely > similar case where I was attempting to use an XSI shell builtin > (which I was willing to rely on on the target system) as a single > command in a series of commands in a makefile, and GNU Make > decided that it didn't look enough like a shell thing and could be > "optimized" into an exec, which naturally hosed the command. Of > course, the case of doing exec transformation _in_ the shell is > not as bad as that.
I think the gmake problem is caused by a non-compliance to POSIX in the operating system, possibly combined with an overzealous skipping of the shell by gmake. It is rather different from the fork/exec problem with sh -c. POSIX requires that all standard utilities except special builtins be available via the exec functions and the utilities that can invoke user-specified other utilities (env, find, nice, nohup, time, xargs). In SUSv4, the special builtins are . (dot), : (colon), break, continue, eval, exec, exit, export, readonly, return, set, shift, times, trap and unset; none of these are under the XSI option. An implementation is not required to provide them as external programs (and there seems no point in doing so). Gmake must know about these and not try to exec them itself. Other builtins that do not exist as external programs yet need to be provided. An easy way is to link a shell script like the below to /usr/bin/alias, /usr/bin/bg, /usr/bin/cd, /usr/bin/command, etc.: #!/bin/sh command -p ${0##*/} "$@" The 'command -p' serves to avoid looping when the PATH is set to a value like /usr/bin:%builtin which is an undocumented way to prefer /usr/bin/FOO to a builtin command FOO. The 'command' utility itself is not subject to this because dash implements the POSIX requirement that various (usually builtin) utilities such as 'command' cannot be overridden via PATH (but unlike the special builtins can be overridden with a function). Regarding sh -c optimization, I am in favour of this. Uselessly waiting 'sh -c' processes annoy me. I made the change for FreeBSD 8.0 sh, which is very similar to dash. The SVN changeset is r194128. The change appears to work for dash as well. -- Jilles Tjoelker -- To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org