bsd.clean.mk revision 1.10 1 # $NetBSD: bsd.clean.mk,v 1.10 2023/06/03 21:21:32 lukem Exp $
2
3 # <bsd.clean.mk>
4 #
5 # Public targets:
6 #
7 # clean: Delete files listed in ${CLEANFILES}.
8 # cleandir: Delete files listed in ${CLEANFILES} and ${CLEANDIRFILES}.
9 #
10 # Public variables:
11 #
12 # CLEANFILES Files to remove for both the clean and cleandir targets.
13 #
14 # CLEANDIRFILES Files to remove for the cleandir target, but not for
15 # the clean target.
16 #
17 # MKCLEANSRC Whether or not to clean the source directory
18 # in addition to the object directory. Defaults to "yes".
19 #
20 # MKCLEANVERIFY Whether or not to verify that the file deletion worked.
21 # Defaults to "yes".
22 #
23 # The files listed in CLEANFILES and CLEANDIRFILES must not be
24 # directories, because the potential risk from running "rm -rf" commands
25 # in bsd.clean.mk is considered too great. If you want to recursively
26 # delete a directory as part of "make clean" or "make cleandir" then you
27 # need to provide your own target.
28
29 .if !defined(_BSD_CLEAN_MK_)
30 _BSD_CLEAN_MK_=1
31
32 .include <bsd.init.mk>
33
34 clean: .PHONY __doclean
35 __doclean: .PHONY .MADE __cleanuse CLEANFILES
36 cleandir: .PHONY clean __docleandir
37 __docleandir: .PHONY .MADE __cleanuse CLEANDIRFILES
38
39 # __cleanuse is invoked with ${.ALLSRC} as the name of a variable
40 # (such as CLEANFILES or CLEANDIRFILES), or possibly a list of
41 # variable names. ${.ALLSRC:@v@${${v}}@} will be the list of
42 # files to delete. (We pass the variable name, e.g. CLEANFILES,
43 # instead of the file names, e.g. ${CLEANFILES}, because we don't
44 # want make to replace any of the file names with the result of
45 # searching .PATH.)
46 #
47 # If the list of files is empty, then the commands
48 # reduce to "true", with an "@" prefix to prevent echoing.
49 #
50 # The use of :M* is needed to handle the case that CLEANFILES
51 # or CLEANDIRFILES is not completely empty but contains spaces.
52 # This can easily happen when CLEANFILES or CLEANDIRFILES is set
53 # from other variables that happen to be empty.
54 #
55 # The use of :Q is needed to handle the case that CLEANFILES
56 # or CLEANDIRFILES contains quoted strings, such as
57 # CLEANFILES = "filename with spaces".
58 #
59 __cleanuse: .USE
60 .if 0 # print "# clean CLEANFILES" for debugging
61 ${"${.ALLSRC:@v@${${v}:M*}@:Q}" == "":?@true:${_MKMSG} \
62 "clean" ${.ALLSRC} }
63 .endif
64 .for _d in ${"${.OBJDIR}" == "${.CURDIR}" || "${MKCLEANSRC}" == "no" \
65 :? ${.OBJDIR} \
66 : ${.OBJDIR} ${.CURDIR} }
67 ${"${.ALLSRC:@v@${${v}:M*}@:Q}" == "":?@true: \
68 (cd ${_d} && rm -f ${.ALLSRC:@v@${${v}}@} || true) }
69 .if "${MKCLEANVERIFY}" == "yes"
70 @${"${.ALLSRC:@v@${${v}:M*}@:Q}" == "":?true: \
71 bad="\$(cd ${_d} && ls -1d ${.ALLSRC:@v@${${v}}@} 2>/dev/null)"; \
72 if test -n "\$bad"; then \
73 echo "Failed to remove the following files from ${_d}:" ; \
74 echo "\$bad" | while read file ; do \
75 echo " \$file" ; \
76 done ; \
77 false ; \
78 fi }
79 .endif
80 .endfor
81
82 # Don't automatically load ".depend" files during "make clean"
83 # or "make cleandir".
84 .if make(clean) || make(cleandir)
85 .MAKE.DEPENDFILE := .depend.no-such-file
86 .endif
87
88 .endif # !defined(_BSD_CLEAN_MK)
89