ChatGPT解决这个技术问题 Extra ChatGPT

How does "make" app know default target to build if no target is specified?

Most Linux apps are compiled with:

make
make install clean

As I understand it, the make command takes names of build targets as arguments. So for example install is usually a target that copies some files to standard locations, and clean is a target that removes temporary files.

But what target will make build if no arguments are specified (e.g. the first command in my example)?


M
Marcel Gosselin

By default, it begins by processing the first target that does not begin with a . aka the default goal; to do that, it may have to process other targets - specifically, ones the first target depends on.

The GNU Make Manual covers all this stuff, and is a surprisingly easy and informative read.


Calling the first target all is just a convention.
It's useful to run them separately if you're installing for other users, as you then only need to run the make install in sudo, rather than the entire build.
FYI the default man entry for make makes no mention of what happens when you don't specify a target..
If the GNU make manual covers this stuff, why was this question asked? The manual is great at documenting how to write rules, but makes no mention on how to write a Makefile.
I'm looking at a make file that includes another makefile, whose first target is %.o : %.cpp. So the default target is... to build all .cpp files?
A
Alison R.

To save others a few seconds, and to save them from having to read the manual, here's the short answer. Add this to the top of your make file:

.DEFAULT_GOAL := mytarget

mytarget will now be the target that is run if "make" is executed and no target is specified.

If you have an older version of make (<= 3.80), this won't work. If this is the case, then you can do what anon mentions, simply add this to the top of your make file:

.PHONY: default
default: mytarget ;

References: https://www.gnu.org/software/make/manual/html_node/How-Make-Works.html


@nathan It makes mytarget the default target if someone runs "make" without any parameters.
Note that .DEFAULT_GOAL doesn't appear to be supported in GNU make v3.80, and I would assume prior versions as well (v3.81 does support it though). If you are running an older version of make you will have to make sure your default target is the first/topmost target in your make file.
is default: a special target name, or this works because it's the first target in the file?
"...to save them from having to read the manual" is one of the points of SO: quick answers to questions that would otherwise take awhile to dig for in ancient documentation.
This should be the correct answer. Explicit over implicit wins in this case.
j
jottr

GNU Make also allows you to specify the default make target using a special variable called .DEFAULT_GOAL. You can even unset this variable in the middle of the Makefile, causing the next target in the file to become the default target.

Ref: The Gnu Make manual - Special Variables


M
Mateusz Piotrowski

bmake's equivalent of GNU Make's .DEFAULT_GOAL is .MAIN:

$ cat Makefile
.MAIN: foo

all:
    @echo all

foo:
    @echo foo
$ bmake
foo

See the bmake(1) manual page.


关注公众号,不定期副业成功案例分享
Follow WeChat

Success story sharing

Want to stay one step ahead of the latest teleworks?

Subscribe Now