diff mbox

Makefile: Don't find and delete when $(DSOSUF) is empty in "make clean"

Message ID 1394786300-18017-1-git-send-email-famz@redhat.com
State New
Headers show

Commit Message

Fam Zheng March 14, 2014, 8:38 a.m. UTC
DANGEROUS: don't try it before you read to the end.

A first "make distclean" will unset $(DSOSUF), a following "make
distclean" or "make clean" will find all the files and delete it.

Including all the files in the .git directory!

Fix it by only do it when $(DSOSUF) is not empty.

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 Makefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Stefan Hajnoczi March 14, 2014, 12:13 p.m. UTC | #1
On Fri, Mar 14, 2014 at 04:38:20PM +0800, Fam Zheng wrote:
> DANGEROUS: don't try it before you read to the end.
> 
> A first "make distclean" will unset $(DSOSUF), a following "make
> distclean" or "make clean" will find all the files and delete it.
> 
> Including all the files in the .git directory!
> 
> Fix it by only do it when $(DSOSUF) is not empty.
> 
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
>  Makefile | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)

Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Stefan Weil March 14, 2014, 5:49 p.m. UTC | #2
Am 14.03.2014 09:38, schrieb Fam Zheng:
> DANGEROUS: don't try it before you read to the end.
>
> A first "make distclean" will unset $(DSOSUF), a following "make
> distclean" or "make clean" will find all the files and delete it.
>
> Including all the files in the .git directory!

If you only use out-of-tree build, you are safe here. Maybe we should no
longer support in-tree builds. Personally, I nearly never use them.

> Fix it by only do it when $(DSOSUF) is not empty.

s/do/doing/

> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
>  Makefile | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/Makefile b/Makefile
> index bd9cd4f..0666d6e 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -267,7 +267,7 @@ clean:
>  	rm -f qemu-options.def
>  	find . -name '*.[oda]' -type f -exec rm -f {} +
>  	find . -name '*.l[oa]' -type f -exec rm -f {} +
> -	find . -name '*$(DSOSUF)' -type f -exec rm -f {} +
> +	if test -n "$(DSOSUF)"; then find . -name '*$(DSOSUF)' -type f -exec rm -f {} +; fi
>  	find . -name '*.mo' -type f -exec rm -f {} +
>  	rm -f $(filter-out %.tlb,$(TOOLS)) $(HELPERS-y) qemu-ga TAGS cscope.* *.pod *~ */*~
>  	rm -f fsdev/*.pod

No, I think it is still too dangerous to use a macro here. There are
only two valid possibilities, so it's easy to name them explicitly:

        find -name "*.dll" -o -name "*.so"

Is there a good reason why rm is called with option -f? Normally, -f
should not be needed when cleaning generated files because those files
are not write protected. The only other reason for -f would be
suppressing an error message if rm tries to remove a non existing files,
but that does not apply here.

I'd also combine all find statements in a single statement. It is not
necessary to parse the directory tree several times. That can be done in
a separate patch.

Regards,
Stefan
Fam Zheng March 17, 2014, 1:34 a.m. UTC | #3
On Fri, 03/14 18:49, Stefan Weil wrote:
> Am 14.03.2014 09:38, schrieb Fam Zheng:
> > DANGEROUS: don't try it before you read to the end.
> >
> > A first "make distclean" will unset $(DSOSUF), a following "make
> > distclean" or "make clean" will find all the files and delete it.
> >
> > Including all the files in the .git directory!
> 
> If you only use out-of-tree build, you are safe here. Maybe we should no
> longer support in-tree builds. Personally, I nearly never use them.
> 
> > Fix it by only do it when $(DSOSUF) is not empty.
> 
> s/do/doing/
> 
> > Signed-off-by: Fam Zheng <famz@redhat.com>
> > ---
> >  Makefile | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/Makefile b/Makefile
> > index bd9cd4f..0666d6e 100644
> > --- a/Makefile
> > +++ b/Makefile
> > @@ -267,7 +267,7 @@ clean:
> >  	rm -f qemu-options.def
> >  	find . -name '*.[oda]' -type f -exec rm -f {} +
> >  	find . -name '*.l[oa]' -type f -exec rm -f {} +
> > -	find . -name '*$(DSOSUF)' -type f -exec rm -f {} +
> > +	if test -n "$(DSOSUF)"; then find . -name '*$(DSOSUF)' -type f -exec rm -f {} +; fi
> >  	find . -name '*.mo' -type f -exec rm -f {} +
> >  	rm -f $(filter-out %.tlb,$(TOOLS)) $(HELPERS-y) qemu-ga TAGS cscope.* *.pod *~ */*~
> >  	rm -f fsdev/*.pod
> 
> No, I think it is still too dangerous to use a macro here. There are
> only two valid possibilities, so it's easy to name them explicitly:
> 
>         find -name "*.dll" -o -name "*.so"
> 
> Is there a good reason why rm is called with option -f? Normally, -f
> should not be needed when cleaning generated files because those files
> are not write protected. The only other reason for -f would be
> suppressing an error message if rm tries to remove a non existing files,
> but that does not apply here.
> 
> I'd also combine all find statements in a single statement. It is not
> necessary to parse the directory tree several times. That can be done in
> a separate patch.
> 

Sounds good to me. I'll respin.

Thanks,
Fam
Markus Armbruster March 17, 2014, 8:30 a.m. UTC | #4
Stefan Weil <sw@weilnetz.de> writes:

> Am 14.03.2014 09:38, schrieb Fam Zheng:
>> DANGEROUS: don't try it before you read to the end.
>>
>> A first "make distclean" will unset $(DSOSUF), a following "make
>> distclean" or "make clean" will find all the files and delete it.
>>
>> Including all the files in the .git directory!
>
> If you only use out-of-tree build, you are safe here. Maybe we should no
> longer support in-tree builds. Personally, I nearly never use them.

Same here.  Building in-tree is calling for trouble.  I'd support a
patch that prevents it.

[...]
Andreas Färber March 17, 2014, 6:51 p.m. UTC | #5
Am 17.03.2014 09:30, schrieb Markus Armbruster:
> Stefan Weil <sw@weilnetz.de> writes:
> 
>> Am 14.03.2014 09:38, schrieb Fam Zheng:
>>> DANGEROUS: don't try it before you read to the end.
>>>
>>> A first "make distclean" will unset $(DSOSUF), a following "make
>>> distclean" or "make clean" will find all the files and delete it.
>>>
>>> Including all the files in the .git directory!
>>
>> If you only use out-of-tree build, you are safe here. Maybe we should no
>> longer support in-tree builds. Personally, I nearly never use them.
> 
> Same here.  Building in-tree is calling for trouble.  I'd support a
> patch that prevents it.

What about disabling it only when .git/ is available? There seems
nothing wrong with doing one-time builds inside an extracted tarball on
central build servers; most of the problems arise when building inside
the developer's git checkout.

If we do drop support for building in-tree (always or with Git), we
could also drop most of the .gitignore clutter. :)

Cheers,
Andreas
Peter Maydell March 17, 2014, 7:15 p.m. UTC | #6
On 17 March 2014 18:51, Andreas Färber <afaerber@suse.de> wrote:
> Am 17.03.2014 09:30, schrieb Markus Armbruster:
>> Stefan Weil <sw@weilnetz.de> writes:
>>
>>> Am 14.03.2014 09:38, schrieb Fam Zheng:
>>>> DANGEROUS: don't try it before you read to the end.
>>>>
>>>> A first "make distclean" will unset $(DSOSUF), a following "make
>>>> distclean" or "make clean" will find all the files and delete it.
>>>>
>>>> Including all the files in the .git directory!
>>>
>>> If you only use out-of-tree build, you are safe here. Maybe we should no
>>> longer support in-tree builds. Personally, I nearly never use them.
>>
>> Same here.  Building in-tree is calling for trouble.  I'd support a
>> patch that prevents it.
>
> What about disabling it only when .git/ is available?

The other idea that's been suggested in the past is to
have the makefile/configure simply map attempts to build
in-tree into 'create builddir and build in it'. This
is probably easier to suggest than to get right in all
situations :-)

thanks
-- PMM
Markus Armbruster March 18, 2014, 8:24 a.m. UTC | #7
Andreas Färber <afaerber@suse.de> writes:

> Am 17.03.2014 09:30, schrieb Markus Armbruster:
>> Stefan Weil <sw@weilnetz.de> writes:
>> 
>>> Am 14.03.2014 09:38, schrieb Fam Zheng:
>>>> DANGEROUS: don't try it before you read to the end.
>>>>
>>>> A first "make distclean" will unset $(DSOSUF), a following "make
>>>> distclean" or "make clean" will find all the files and delete it.
>>>>
>>>> Including all the files in the .git directory!
>>>
>>> If you only use out-of-tree build, you are safe here. Maybe we should no
>>> longer support in-tree builds. Personally, I nearly never use them.
>> 
>> Same here.  Building in-tree is calling for trouble.  I'd support a
>> patch that prevents it.
>
> What about disabling it only when .git/ is available? There seems
> nothing wrong with doing one-time builds inside an extracted tarball on
> central build servers;

Except for this one: in-tree build will rot even faster.

>                        most of the problems arise when building inside
> the developer's git checkout.
>
> If we do drop support for building in-tree (always or with Git), we
> could also drop most of the .gitignore clutter. :)

Bonus!
Markus Armbruster March 18, 2014, 9:19 a.m. UTC | #8
Peter Maydell <peter.maydell@linaro.org> writes:

> On 17 March 2014 18:51, Andreas Färber <afaerber@suse.de> wrote:
>> Am 17.03.2014 09:30, schrieb Markus Armbruster:
>>> Stefan Weil <sw@weilnetz.de> writes:
>>>
>>>> Am 14.03.2014 09:38, schrieb Fam Zheng:
>>>>> DANGEROUS: don't try it before you read to the end.
>>>>>
>>>>> A first "make distclean" will unset $(DSOSUF), a following "make
>>>>> distclean" or "make clean" will find all the files and delete it.
>>>>>
>>>>> Including all the files in the .git directory!
>>>>
>>>> If you only use out-of-tree build, you are safe here. Maybe we should no
>>>> longer support in-tree builds. Personally, I nearly never use them.
>>>
>>> Same here.  Building in-tree is calling for trouble.  I'd support a
>>> patch that prevents it.
>>
>> What about disabling it only when .git/ is available?
>
> The other idea that's been suggested in the past is to
> have the makefile/configure simply map attempts to build
> in-tree into 'create builddir and build in it'. This
> is probably easier to suggest than to get right in all
> situations :-)

Perfect is the enemy of good enough.

all:

%: force
	@$(MAKE) -C bld $@
force: ;
diff mbox

Patch

diff --git a/Makefile b/Makefile
index bd9cd4f..0666d6e 100644
--- a/Makefile
+++ b/Makefile
@@ -267,7 +267,7 @@  clean:
 	rm -f qemu-options.def
 	find . -name '*.[oda]' -type f -exec rm -f {} +
 	find . -name '*.l[oa]' -type f -exec rm -f {} +
-	find . -name '*$(DSOSUF)' -type f -exec rm -f {} +
+	if test -n "$(DSOSUF)"; then find . -name '*$(DSOSUF)' -type f -exec rm -f {} +; fi
 	find . -name '*.mo' -type f -exec rm -f {} +
 	rm -f $(filter-out %.tlb,$(TOOLS)) $(HELPERS-y) qemu-ga TAGS cscope.* *.pod *~ */*~
 	rm -f fsdev/*.pod