I don't always write make files but when I do I like to try and write them well. Trying to make the interface consistent with what other developers might expect is always a struggle. What I am looking for is a summary of all the common make something cleaner (GNU) make targets.
What are the commonly found cleaning make targets?
When is each target normally used?
How does each target compare to others?
I have worked with a system using make clean
, make clobber
and make mrproper
before. Those got steadily more extream with; make clean
only tidying up temporaries, make clobber
getting rid of most configuration and make mrproper
almost going back to a just checked out state. Is that the normal order of things? Should make mrproper
always remove the generated binaries and shared libraries for deployment?
Reading around suggests that make distclean
tidies things up to the point of being ready to make a distribution package. I would imagine that leaves behind some automatically generated version tagging files, file manifests and shared libraries but possibly strips out temporary files that you would not want archived?
make realclean
was completely new to me when I spied it on the GNU Make Goals manual page. As it is listed with distclean
and clobber
I would guess it had similar effects. Have I never come across it as it is a historical artifact or just quite specific to a set of projects I have to worked on?
Sorry, that is is a bit rambling. I have found various questions and answers that compare one target to the other but none that seemed to give a good overview.
'distclean' Delete all files in the current directory (or created by this makefile) that are created by configuring or building the program. If you have unpacked the source and built the program without creating any other files, 'make distclean' should leave only the files that were in the distribution.
It is written in the linux kernel Makefile that clean - Remove most generated files but keep the config and enough build support to build external modules mrproper - Remove all generated files + config + various backup files.
The Makefile author creates targets and gives them human-readable names; conventionally, clean means to remove things from a previous build, while clobber means to forcibly overwrite some previous results. The latter is less commonly seen or necessary.
The make clean is a command that removes all executable files from a program binary and coding directory. That means it removes all the object files that were created in the meantime. To get a super clean build, it's necessary to run the make clean command before recompiling.
Trying to form my own answer based on some research. I think the approximate order of severity is; mostlyclean
, clean
, maintainer-clean
, mrproper
, distclean
and finally clobber
(which is combined distclean
and uninstall
).
make clean
make clean
is the most basic level. It cleans up most generated files but not anything that records configuration. GNU Make Manual's Goals page states:
Delete all files that are normally created by running make.
Further, the GNU Make Manual's Standard Targets page stages:
Delete all files in the current directory that are normally created by building the program. Also delete files in other directories if they are created by this makefile. However, don’t delete the files that record the configuration. Also preserve files that could be made by building, but normally aren’t because the distribution comes with them. There is no need to delete parent directories that were created with ‘mkdir -p’, since they could have existed anyway.
Delete .dvi files here if they are not part of the distribution.
make mostlyclean
make mostlyclean
is the only gentler form of clean I have found, it behaves like clean but leaves behind files that would take a long time to compile and do not often need to be regenerated.
The GNU Make Manual's Standard Targets page stages:
Like ‘clean’, but may refrain from deleting a few files that people normally don’t want to recompile. For example, the ‘mostlyclean’ target for GCC does not delete libgcc.a, because recompiling it is rarely necessary and takes a lot of time.
make distclean
make distclean
is the first step up from the basic make clean
on many GNU Make systems. It seems to be pseudonymous or at least very similar to with make realclean
and make clobber
in many, but not all cases. It will delete everything that make clean
does and remove the configuration.
In the Linux system this is one step beyond make mrpropper
, see the section below for details.
I am not sure if the name implies that things are being made clean enough for distribution (the forming of a tar archive) or that the process is returning them to the state equal to what was distributed (just as things were immediately after unpacking a tar archive).
GNU Make Manual's Goals page states:
Any of these targets might be defined to delete more files than ‘clean’ does. For example, this would delete configuration files or links that you would normally create as preparation for compilation, even if the makefile itself cannot create these files.
Further, the GNU Make Manual's Standard Targets page stages:
Delete all files in the current directory (or created by this makefile) that are created by configuring or building the program. If you have unpacked the source and built the program without creating any other files, ‘make distclean’ should leave only the files that were in the distribution. However, there is no need to delete parent directories that were created with ‘mkdir -p’, since they could have existed anyway.
make uninstall
make uninstall
will uninstall software installed via make install
or one of the install-*
variants. This is similar to part of the behaviour to make clobber
on some systems but make uninstall
should not touch the build area as make clobber
will.
The GNU Make Manual's Standard Targets page stages:
Delete all the installed files—the copies that the ‘install’ and ‘install-*’ targets create.
This rule should not modify the directories where compilation is done, only the directories where files are installed.
make maintainer-clean
make maintainer-clean
seems to be one step back from the more common make distclean
. It deletes almost everything apart from the configuration. This makes it very similar to make clean
.
The GNU Make Manual's Standard Targets page stages:
Delete almost everything that can be reconstructed with this Makefile. This typically includes everything deleted by distclean, plus more: C source files produced by Bison, tags tables, Info files, and so on.
It is also highlighted that this is not a commonly used target as it is for a specific set of users:
The ‘maintainer-clean’ target is intended to be used by a maintainer of the package, not by ordinary users.
make mrproper
make mrproper
seems to be a Linux Kernel version of make distclean
or make clobber
.
that stops short of removing backup and patch files. It does everything that the make clean
target does and strips out configuration.
I believe the name comes from a cleaning product known in the USA as Mr. Clean and the UK as Flash (which is why I had not heard of the product as named). Linus Torvalds being Finnish-American was presumably familiar with the Mr. Propper brand name.
The Linux Kernel Makefile states:
# Cleaning is done on three levels.
# make clean Delete most generated files
# Leave enough to build external modules
# make mrproper Delete the current configuration, and all generated files
# make distclean Remove editor backup files, patch leftover files and the like
make clobber
make clobber
gets a mention on the Wikipedia article for Clobbering too. That also states that it is more severe than make clean
, possibly one that even uninstalls the software. It is possible a combination of make uninstall
and make distclean
.
There is no single source for make clean levels. As things have evolved over time terminology and behaviour is inconsistent. The above is the best I have managed to piece together so far.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With