diff mbox

Makefile: fix out-of-tree builds with multiple targets with 'all'

Message ID 1383676405-25536-1-git-send-email-yann.morin.1998@free.fr
State Superseded
Headers show

Commit Message

Yann E. MORIN Nov. 5, 2013, 6:33 p.m. UTC
From: "Yann E. MORIN" <yann.morin.1998@free.fr>

For out-of-tree builds, this use-case fails to build:
    $ make clean all

This is because 'all' is filtered-out in the Makefile wrapper, since
the wrapper itself has a 'all' target.

The 'all' target is just the usual naming for the default target in a
Makefile. In fact, the first target is the default one, so we can name
it whatever we want.

Rename the Makefile wrapper 'all' target to avoid name-clashing.

Fixes #6644.

Reported-by: Ryan Barnett <rjbarnet@rockwellcollins.com>
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Cc: Ryan Barnett <rjbarnet@rockwellcollins.com>
Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Tested-by: Ryan Barnett <rjbarnet@rockwellcollins.com>
---
Changes v2->v3:
  - add bug reference  (Ryan)

Changes v1->v2
  - fix one missed 'all' occurence

---
 support/scripts/mkmakefile | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

Comments

Thomas De Schampheleire Nov. 5, 2013, 6:39 p.m. UTC | #1
"Yann E. MORIN" <yann.morin.1998@free.fr> wrote:
>From: "Yann E. MORIN" <yann.morin.1998@free.fr>
>
>For out-of-tree builds, this use-case fails to build:
>    $ make clean all
>
>This is because 'all' is filtered-out in the Makefile wrapper, since
>the wrapper itself has a 'all' target.
>
>The 'all' target is just the usual naming for the default target in a
>Makefile. In fact, the first target is the default one, so we can name
>it whatever we want.
>
>Rename the Makefile wrapper 'all' target to avoid name-clashing.
>
>Fixes #6644.
>
>Reported-by: Ryan Barnett <rjbarnet@rockwellcollins.com>
>Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
>Cc: Ryan Barnett <rjbarnet@rockwellcollins.com>
>Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
>Tested-by: Ryan Barnett <rjbarnet@rockwellcollins.com>
>---
>Changes v2->v3:
>  - add bug reference  (Ryan)
>
>Changes v1->v2
>  - fix one missed 'all' occurence
>
>---
> support/scripts/mkmakefile | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
>diff --git a/support/scripts/mkmakefile b/support/scripts/mkmakefile
>index cef2ec7..27b1507 100755
>--- a/support/scripts/mkmakefile
>+++ b/support/scripts/mkmakefile
>@@ -32,16 +32,16 @@ MAKEFLAGS += --no-print-directory
> 
> .PHONY: all \$(MAKECMDGOALS)
> 
>-all	:= \$(filter-out all Makefile,\$(MAKECMDGOALS))
>+all	:= \$(filter-out Makefile,\$(MAKECMDGOALS))
> 
>-all:
>+_all:
> 	\$(MAKE) \$(MAKEARGS) \$(all)
> 
> Makefile:;
> 
>-\$(all): all
>+\$(all): _all
> 	@:
> 
>-%/: all
>+%/: _all
> 	@:
> EOF

Just curious: if you now type 'make all', which of the above rules gets executed? Can you explain what is going on here?

Thanks,
Thomas
Yann E. MORIN Nov. 5, 2013, 6:48 p.m. UTC | #2
Thomas DS, All,

On 2013-11-05 19:39 +0100, Thomas De Schampheleire spake thusly:
> "Yann E. MORIN" <yann.morin.1998@free.fr> wrote:
> >From: "Yann E. MORIN" <yann.morin.1998@free.fr>
> >
> >For out-of-tree builds, this use-case fails to build:
> >    $ make clean all
> >
> >This is because 'all' is filtered-out in the Makefile wrapper, since
> >the wrapper itself has a 'all' target.
> >
> >The 'all' target is just the usual naming for the default target in a
> >Makefile. In fact, the first target is the default one, so we can name
> >it whatever we want.
> >
> >Rename the Makefile wrapper 'all' target to avoid name-clashing.


[moved the question here, it's easier to answer below]
> Just curious: if you now type 'make all', which of the above rules 
> gets executed? Can you explain what is going on here?

Please, follow the numbers, below:

> >diff --git a/support/scripts/mkmakefile b/support/scripts/mkmakefile
> >index cef2ec7..27b1507 100755
> >--- a/support/scripts/mkmakefile
> >+++ b/support/scripts/mkmakefile
> >@@ -32,16 +32,16 @@ MAKEFLAGS += --no-print-directory
> > 
> > .PHONY: all \$(MAKECMDGOALS)
> > 
> >-all	:= \$(filter-out all Makefile,\$(MAKECMDGOALS))
> >+all	:= \$(filter-out Makefile,\$(MAKECMDGOALS))

(1)
With 'make all', the variable $(MAKECMDGOALS) is the string "all"
(without the quotes). So the variable $(all) is assigned the string
"all" (still without quotes).

> > 
> >-all:
> >+_all:
> > 	\$(MAKE) \$(MAKEARGS) \$(all)

(3)
And finally here, the rulle is:
    make -C /path/to/buildroot O=$(pwd) all
         `----------------------------' `-'
                $(MAKEARGS)             $(all)

> > 
> > Makefile:;
> > 

> >-\$(all): all
> >+\$(all): _all

(2)
And here the variable $(all) ix expanded, and as it depends on _all, the
rulle _all above is executed

> > 	@:
> > 
> >-%/: all
> >+%/: _all
> > 	@:
> > EOF
> 

Regards,
Yann E. MORIN.
diff mbox

Patch

diff --git a/support/scripts/mkmakefile b/support/scripts/mkmakefile
index cef2ec7..27b1507 100755
--- a/support/scripts/mkmakefile
+++ b/support/scripts/mkmakefile
@@ -32,16 +32,16 @@  MAKEFLAGS += --no-print-directory
 
 .PHONY: all \$(MAKECMDGOALS)
 
-all	:= \$(filter-out all Makefile,\$(MAKECMDGOALS))
+all	:= \$(filter-out Makefile,\$(MAKECMDGOALS))
 
-all:
+_all:
 	\$(MAKE) \$(MAKEARGS) \$(all)
 
 Makefile:;
 
-\$(all): all
+\$(all): _all
 	@:
 
-%/: all
+%/: _all
 	@:
 EOF