PMake was specifically designed
to re-create several targets at once, when possible. You do not
have to do anything special to cause this to happen (unless
PMake was configured to not act in
parallel, in which case you will have to make use of the
-L
and -J
flags (see below)),
but you do have to be careful at times.
There are several problems you are likely to encounter. One
is that some makefiles (and programs) are written in such a way
that it is impossible for two targets to be made at once. The
program xstr, for example, always
modifies the files strings
and
x.c
. There is no way to change it. Thus
you cannot run two of them at once without something being
trashed. Similarly, if you have commands in the makefile that
always send output to the same file, you will not be able to
make more than one target at once unless you change the file you
use. You can, for instance, add a $$$$
to
the end of the file name to tack on the process ID of the shell
executing the command (each $$
expands to a
single $
, thus giving you the shell variable
$$
). Since only one shell is used for all
the commands, you will get the same file name for each command
in the script.
The other problem comes from improperly-specified dependencies that worked in Make because of its sequential, depth-first way of examining them. While I do not want to go into depth on how PMake works (look in Chapter 4, PMake for Gods if you are interested), I will warn you that files in two different levels of the dependency tree may be examined in a different order in PMake than they were in Make. For example, given the makefile:
a : b c b : d
PMake will examine the targets in
the order c
,
d
, b
,
a
. If the makefile's author expected
PMake to abort before making
c
if an error occurred while making
b
, or if b
needed to exist before c
was made,
(s)he will be sorely disappointed. The dependencies are
incomplete, since in both these cases,
c
would depend on
b
. So watch out.
Another problem you may face is that, while
PMake is set up to handle the output
from multiple jobs in a graceful fashion, the same is not so for
input. It has no way to regulate input to different jobs, so if
you use the redirection from /dev/tty
I
mentioned earlier, you must be careful not to run two of the
jobs at once.
All FreeBSD documents are available for download at https://download.freebsd.org/ftp/doc/
Questions that are not answered by the
documentation may be
sent to <freebsd-questions@FreeBSD.org>.
Send questions about this document to <freebsd-doc@FreeBSD.org>.