ports/64037 and the alleged && -> ; failure from March 2002
Matthias Andree
ma at dt.e-technik.uni-dortmund.de
Fri Mar 12 16:28:11 PST 2004
Hi,
I filed PR #64037 with a patch for a port that fuyuki maintains. My
patch included changing the ";" in "cd some dir ; some command " to "&&"
in shell command lines was refused by the maintainer, with a reference to
http://lists.liquidneon.com/pipermail/kde-freebsd/2002-March/000940.html
that claims that "make -jN" could break up a shell command such as "cd
dir && foo" and execute foo before cd dir.
I am refuting that claim in Akinori's post.
'cd dir && foo' IS a proper use of && in a Makefile.
The whole line is a shell command and make doesn't care about the && or
; - it's up to the shell to handle it. (I assume make uses a sane shell
such as /bin/sh or ksh.)
make(1) is specified to run shell commands, with the exception that
command lines have to start with a TAB and if the first non-blank
character is - or @ it is treated specially (exit code ignored or not
echoed).
The shell command lines associated with a target are "a series of shell
commands" (make(1)), hence the lines for any single target are executed
in order. Consider
target: depA depB
checksomething && dosomething
domore
Then make -j4 may build depB before depA - but it will run
dosomething and domore in exactly this order only if checksomething
passes (exits with code 0).
If you believe otherwise, please show evidence that a construct like this
target: depends
cd foo && bar
executes "bar" without having successfully completed "cd foo" first with
make -jN.
If that evidence cannot be shown or cannot be verified with the make
commands of currently supported FreeBSD versions, I ask that spreading
FUD about "&&" being invalid in make shell commands be stopped once and
for all and that "cd blah && foo" constructs be rehabilitated in
Makefiles.
Best regards,
--
Matthias Andree
Encrypt your mail: my GnuPG key ID is 0x052E7D95
More information about the freebsd-ports
mailing list