diff options
author | gad <gad@FreeBSD.org> | 2004-02-19 21:09:58 +0000 |
---|---|---|
committer | gad <gad@FreeBSD.org> | 2004-02-19 21:09:58 +0000 |
commit | bf55d649fcabfeb1de42e7461ed8afca8cde5ed5 (patch) | |
tree | df98d31b31e7c8d093102c2a60b60548e30ef6da /Makefile | |
parent | e5fb5670ab2c2252eaa505609e58eff1069bd277 (diff) | |
download | FreeBSD-src-bf55d649fcabfeb1de42e7461ed8afca8cde5ed5.zip FreeBSD-src-bf55d649fcabfeb1de42e7461ed8afca8cde5ed5.tar.gz |
Improvements on the 'make realclean' target. Some are style improvements,
but the biggest issue is that there are situatons when
${.OBJDIR} == ${.SRCDIR}, and in those situations the previous version
would happily remove all your /usr/src while it was cleaning out the objects.
Not that *you* would be happy about it... Thanks to bde for immediately
noticing this serious possibility.
More improvements will be made to this target, but I wanted to commit this
safer version right now, before anyone lost their /usr/src due to it.
Reviewed by: bde
MFC after: 10 days
Diffstat (limited to 'Makefile')
-rw-r--r-- | Makefile | 41 |
1 files changed, 28 insertions, 13 deletions
@@ -104,19 +104,34 @@ buildworld: upgrade_checks .endif # -# This 'realclean' target is not included in TGTS, because it is not -# a recursive target. All of the work for it is done right here. -# The first 'rm' will usually remove all files and directories. If -# it does not, then there are probably some files with chflags set. -# Unset all special chflags, and try the 'rm' a second time. -realclean : - -rm -Rf ${.OBJDIR}/* 2>/dev/null - @-if [ "`echo ${.OBJDIR}/*`" != "${.OBJDIR}/*" ] ; then \ - echo "chflags -R 0 ${.OBJDIR}/*" ; \ - chflags -R 0 ${.OBJDIR}/* ; \ - echo "rm -Rf ${.OBJDIR}/*" ; \ - rm -Rf ${.OBJDIR}/* ; \ - fi +# This 'realclean' target is not included in TGTS, because it is not a +# recursive target. All of the work for it is done right here. It is +# expected that BW_CANONICALOBJDIR == the CANONICALOBJDIR as would be +# created by bsd.obj.mk, except that we don't want to .include that file +# in this makefile. +# +# In the following, the first 'rm' in a series will usually remove all +# files and directories. If it does not, then there are probably some +# files with chflags set, so this unsets them and tries the 'rm' a +# second time. There are situations where this target will be cleaning +# some directories via more than one method, but that duplication is +# needed to correctly handle all the possible situations. +# +BW_CANONICALOBJDIR:=${MAKEOBJDIRPREFIX}${.CURDIR} +realclean: +.if ${.CURDIR} == ${.OBJDIR} || ${.CURDIR}/obj == ${.OBJDIR} +.if exists(${BW_CANONICALOBJDIR}/) + -rm -rf ${BW_CANONICALOBJDIR}/* + chflags -R 0 ${BW_CANONICALOBJDIR} + rm -rf ${BW_CANONICALOBJDIR}/* +.endif + # To be safe in this case, fall back to a 'make cleandir' + @cd ${.CURDIR}; ${_MAKE} cleandir +.else + -rm -rf ${.OBJDIR}/* + chflags -R 0 ${.OBJDIR} + rm -rf ${.OBJDIR}/* +.endif # # Handle the user-driven targets, using the source relative mk files. |