svn commit: r238563 - head/gnu/usr.bin/groff/tmac

Simon J. Gerraty sjg at juniper.net
Tue Aug 21 05:39:48 UTC 2012


Hi, sorry about the slow response.

On Thu, 26 Jul 2012 12:49:03 +0400, Ruslan Ermilov writes:
>On Wed, Jul 18, 2012 at 05:57:43AM +0000, David E. O'Brien wrote:
>> Author: obrien
>> Date: Wed Jul 18 05:57:42 2012
>> New Revision: 238563
>> URL: http://svn.freebsd.org/changeset/base/238563
>> 
>> Log:
>>   a ";" tells make we want the shell to be used
>>   
>>   Submitted by:	Simon Gerraty <sjg at juniper.net>
>> 
>> Modified:
>>   head/gnu/usr.bin/groff/tmac/Makefile
>
>I don't quite understand what this change does, could you elaborate?

Sure.  This is a consequence of bmake trying to be clever.

>Without -jN (in backwards compatibility mode), the "cd" is a no-op
>(whether it's terminated by `;' or not) because make will execute a
>single shell per command, with cwd set to ${.OBJDIR}.

Except on very weird systems, bmake is built in what NetBSD call
"native" mode, and even in compat mode will attempt to avoid the
overhead of all those shells.
Thus, unless it spots a shell meta char, it will try and skip the shell.

Shell builtins like 'cd' or 'chdir' cannot be directly invoked, but make
doesn't know that.  Simply adding the ';' convinces it to use a shell.
It is still a no-op.

>With -jN, "cd" becomes necessary because all commands are executed as
>a script by one shell (the reason it was added in the first place),
>but adding `;' is a no-op because commands are on separate lines.

A better way to construct targets like this is to put any excursion out
of .OBJDIR inside ():

	(cd ${.CURDIR} && \
	${INSTALL} -o ${TMACOWN} -g ${TMACGRP} -m ${TMACMODE} \
	koi8-r.tmac hyphen.ru ${DESTDIR}${TMACDIR})

then the cd ${.OBJDIR} isn't needed at all.
note use of && rather than ; which can be very dangerous

--sjg


More information about the svn-src-all mailing list