[PATCH] make: clean after distclean deletes source files

Steve Sistare posted 1 patch 1 year ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/1681909700-94095-1-git-send-email-steven.sistare@oracle.com
Maintainers: Paolo Bonzini <pbonzini@redhat.com>, "Alex Bennée" <alex.bennee@linaro.org>, Thomas Huth <thuth@redhat.com>
Makefile | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
[PATCH] make: clean after distclean deletes source files
Posted by Steve Sistare 1 year ago
Run 'make distclean' in a tree, and GNUmakefile is removed.
But, GNUmakefile is where we change directory to build.
Run 'make distclean' or 'make clean' again, and Makefile applies
the clean actions, such as this one, at the top level of the tree.
For example, it removes the .d source files in 'meson/test cases/d/*/*.d'.

    find . \( -name '*.so' -o -name '*.dll' -o \
          -name '*.[oda]' -o -name '*.gcno' \) -type f \
        ! -path ./roms/edk2/ArmPkg/Library/GccLto/liblto-aarch64.a \
        ! -path ./roms/edk2/ArmPkg/Library/GccLto/liblto-arm.a \
        -exec rm {} +

To fix, remove clean and distclean from UNCHECKED_GOALS, so those targets
are "checked", meaning that configure must be run before make.  However,
the check action does not trigger, because clean does not depend on
config-host.mak, so change the action to simply throw an error.

Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
---
 Makefile | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/Makefile b/Makefile
index e421f8a..30d61f8 100644
--- a/Makefile
+++ b/Makefile
@@ -26,7 +26,7 @@ quiet-command-run = $(if $(V),,$(if $2,printf "  %-7s %s\n" $2 $3 && ))$1
 quiet-@ = $(if $(V),,@)
 quiet-command = $(quiet-@)$(call quiet-command-run,$1,$2,$3)
 
-UNCHECKED_GOALS := %clean TAGS cscope ctags dist \
+UNCHECKED_GOALS := TAGS cscope ctags dist \
     help check-help print-% \
     docker docker-% vm-help vm-test vm-build-%
 
@@ -176,10 +176,8 @@ plugins:
 endif # $(CONFIG_PLUGIN)
 
 else # config-host.mak does not exist
-config-host.mak:
 ifneq ($(filter-out $(UNCHECKED_GOALS),$(MAKECMDGOALS)),$(if $(MAKECMDGOALS),,fail))
-	@echo "Please call configure before running make!"
-	@exit 1
+$(error Please call configure before running make)
 endif
 endif # config-host.mak does not exist
 
-- 
1.8.3.1
Re: [PATCH] make: clean after distclean deletes source files
Posted by Paolo Bonzini 1 year ago
Queued, thanks.

Paolo
Re: [PATCH] make: clean after distclean deletes source files
Posted by Steven Sistare 1 year ago
Any takers?  I believe this patch is correct and clean.
Examples, run in the top level of a git tree:

$ configure ...
$ make clean
... cleans ...

$ make clean
... cleans ...

$ make distclean
... cleans ...

$ make distclean
Makefile:180: *** Please call configure before running make.  Stop.

$ make clean
Makefile:180: *** Please call configure before running make.  Stop.

# unchecked goals still work
$ make cscope
cscope  Remove old cscope files
cscope  Create file list
cscope  Re-index .

$ configure ...
$ make clean
... cleans ...

- Steve

On 4/19/2023 9:08 AM, Steve Sistare wrote:
> Run 'make distclean' in a tree, and GNUmakefile is removed.
> But, GNUmakefile is where we change directory to build.
> Run 'make distclean' or 'make clean' again, and Makefile applies
> the clean actions, such as this one, at the top level of the tree.
> For example, it removes the .d source files in 'meson/test cases/d/*/*.d'.
> 
>     find . \( -name '*.so' -o -name '*.dll' -o \
>           -name '*.[oda]' -o -name '*.gcno' \) -type f \
>         ! -path ./roms/edk2/ArmPkg/Library/GccLto/liblto-aarch64.a \
>         ! -path ./roms/edk2/ArmPkg/Library/GccLto/liblto-arm.a \
>         -exec rm {} +
> 
> To fix, remove clean and distclean from UNCHECKED_GOALS, so those targets
> are "checked", meaning that configure must be run before make.  However,
> the check action does not trigger, because clean does not depend on
> config-host.mak, so change the action to simply throw an error.
> 
> Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
> ---
>  Makefile | 6 ++----
>  1 file changed, 2 insertions(+), 4 deletions(-)
> 
> diff --git a/Makefile b/Makefile
> index e421f8a..30d61f8 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -26,7 +26,7 @@ quiet-command-run = $(if $(V),,$(if $2,printf "  %-7s %s\n" $2 $3 && ))$1
>  quiet-@ = $(if $(V),,@)
>  quiet-command = $(quiet-@)$(call quiet-command-run,$1,$2,$3)
>  
> -UNCHECKED_GOALS := %clean TAGS cscope ctags dist \
> +UNCHECKED_GOALS := TAGS cscope ctags dist \
>      help check-help print-% \
>      docker docker-% vm-help vm-test vm-build-%
>  
> @@ -176,10 +176,8 @@ plugins:
>  endif # $(CONFIG_PLUGIN)
>  
>  else # config-host.mak does not exist
> -config-host.mak:
>  ifneq ($(filter-out $(UNCHECKED_GOALS),$(MAKECMDGOALS)),$(if $(MAKECMDGOALS),,fail))
> -	@echo "Please call configure before running make!"
> -	@exit 1
> +$(error Please call configure before running make)
>  endif
>  endif # config-host.mak does not exist
>