C.2.10 Parallel Make

Support for parallel execution in make implementation varies.
Generally, using GNU make is your best bet.

When NetBSD or FreeBSD make are run in parallel mode, they will
reuse the same shell for multiple commands within one recipe. This can
have various unexpected consequences. For example, changes of directories
or variables persist between recipes, so that:

Moreover, when FreeBSD make (up at least to 8.2) is run in
parallel mode, it implements the @ and - “recipe
modifiers” by dynamically modifying the active shell flags. This
behavior has the effects of potentially clobbering the exit status
of recipes silenced with the @ modifier if they also unset
the errexit shell flag, and of mangling the output in
unexpected ways:

You can avoid all these issues by using the -B option to enable
compatibility semantics. However, that will effectively also disable
all parallelism as that will cause prerequisites to be updated in the
order they are listed in a rule.

Some make implementations (among them, FreeBSD make, NetBSD
make, and Solaris dmake), when invoked with a
-jN option, connect the standard output and standard
error of all their child processes to pipes or temporary regular
files. This can lead to subtly different semantics in the behavior
of the spawned processes. For example, even if the make
standard output is connected to a tty, the recipe command will not be: