Automatically setting jobs (-j) flag for a multicore machine?
Solution 1:
I'm assuming you're using Linux. This is from my ~/.bashrc
# parallel make
export NUMCPUS=`grep -c '^processor' /proc/cpuinfo`
alias pmake='time nice make -j$NUMCPUS --load-average=$NUMCPUS'
sample usage
samm@host src> echo $NUMCPUS
8
samm@host src> pmake
becomes time nice make -j8 --load-average=8
.
To answer your specific question about putting this into a Makefile
, I don't find it practical to sprinkle this logic all over my Makefiles. Putting this into a top level Makefile also isn't a great solution since I often build from sub-directories and wish to build them in parallel as well. However, if you have a fairly flat source hierarchy, it may work for you.
Solution 2:
It appears that the MAKEFLAGS
environment variable can pass flags that are part of every make
run (at least for GNU make). I haven't had much luck with this myself, but it might be possible to use -l
rather than -j
to automatically run as many jobs as are appropriate for the number of cores you have available.
Solution 3:
As Jeremiah Willcock said, use MAKEFLAGS
, but here is how to do it:
export MAKEFLAGS="-j $(grep -c ^processor /proc/cpuinfo)"
or you could just set a fixed value like this:
export MAKEFLAGS="-j 8"
If you really want to boost performance you should use ccache
by adding something like the following to your Makefile
:
CCACHE_EXISTS := $(shell ccache -V)
ifdef CCACHE_EXISTS
CC := ccache $(CC)
CXX := ccache $(CXX)
endif
Solution 4:
I usually do this as follows in my bash scripts:
make -j$(nproc)
Solution 5:
You can add a line to your Makefile similar to the following:
NUMJOBS=${NUMJOBS:-" -j4 "}
Then add a ${NUMJOBS}
line in your rules, or add it into another Makefile
var (like MAKEFLAGS
). This will use the NUMJOBS envvar, if it exists; if it doesn't, automatically use -j4
. You can tune or rename it to your taste.
(N.B.: Personally, I'd prefer the default to be -j1
or ""
, especially if it's going to be distributed to others, because although I have multiple cores also, I compile on many different platforms, and often forget to dis-able the -jX
setting.)