Make “make” default to “make -j 8”

2019-02-04 18:19发布

问题:

Is there a way that I can make

$ make

default to:

$ make -j 8

?

回答1:

alias make="make -j 8", assuming bash shell



回答2:

Set the environment variable MAKEFLAGS to -j 8. If you are using csh or tcsh, you can do this with setenv MAKEFLAGS '-j 8'. If you are using bash, you can do this with export MAKEFLAGS='-j 8'. You might wish to put this command in your shell's start-up file, such as .cshrc or .bashrc (in your home directory).

Caution: Setting a default like this will apply to all invocations of make, including when you "make" a project other than your own or run a script that invokes make. If the project was not well designed, it might have problems when it is built with multiple jobs executing in parallel.



回答3:

The answers suggesting alias make='make -j 8' are fine responses to your question.

However, I would recommend against doing that!

By all means, use an alias to save typing - but call it something other than make.

It might be OK for whatever project you're currently working on; but it's quite possible to write makefiles with missing dependencies which do not quite work properly with -j, and if you encounter such a thing, you'll be left wondering why the build fails in a mysterious way for you but works fine for other people.

(That said, if you do alias make, you can get bash to ignore the alias by typing \make.)



回答4:

If you are using the command line you can do:

alias make='make -j 8'

This will be temporary, to make it permanent you need to add it to .bashrc

Read here: http://www.linfo.org/make_alias_permanent.html



回答5:

Add

MAKEOPTS='-j8'
MAKEFLAGS='-j8'

to /etc/make.conf (create it if it doesn't already exist).

If that doesn't work, add

export MAKEOPTS='-j8'
export MAKEFLAGS='-j8'

to your system-wide profile (e.g., /etc/profile).

For me, MAKEOPTS alone didn't work. Possibly MAKEFLAGS is all that's needed.



回答6:

Why not create an outer makefile, that calls another makefile like this, this is replicated from the manual here.

     SUBDIRS = foo bar baz
     .PHONY: subdirs $(SUBDIRS)
     subdirs: $(SUBDIRS)
     $(SUBDIRS):
             $(MAKE) -j 8 -C $@

     foo: baz


回答7:

If you're using GNU make:

$ make --version
GNU Make 4.2.1
Built for x86_64-alpine-linux-musl

...then I found that GNUMAKEFLAGS seems to work:

export GNUMAKEFLAGS=-j8
make

Disclaimer, I'm a n00b with the C toolchain so sorry if this isn't portable. It's working on Alpine Linux 3.8 (in Docker) though.



回答8:

You could move /usr/bin/make to /usr/bin/make_orig and make /usr/bin/make this script:

#!/bin/sh

/usr/bin/make_orig -j 8 $@

Be sure to run chmod +x /usr/bin/make.

Try this method if the simpler method in my other answer doesn't work. This method isn't as safe and is a bit of a kludge.