diff mbox

Makefile: unconfigured "make toolchain" should run menuconfig

Message ID 20170615201917.16464-1-arnout@mind.be
State Changes Requested
Headers show

Commit Message

Arnout Vandecappelle June 15, 2017, 8:19 p.m. UTC
As reported by Alessandro Power on StackOverflow [1], the behaviour
of "make toolchain" in an unconfigured tree is misleading.

When .config doesn't exist, we don't read in the package .mk files, so
"make <package>" doesn't work:

    $ make busybox
    make: *** No rule to make target 'busybox'.  Stop.

However, for "linux" and "toolchain", the corresponding file (or
actually directory) already exists. So instead, we get:

    $ make linux
    make: Nothing to be done for 'linux'.

This is confusing, because it looks as if the build succeeded.

The obvious solution would be to make linux and toolchain PHONY targets
when .config doesn't exist. However, that actually does the reverse,
because then a rule _does_ exist for them and since they don't have
dependencies, make will consider them to be ready.

Instead, we define linux and toolchain as targets and make them depend
on menuconfig. The behaviour is still different from other packages,
but at least it is less confusing.

[1] https://stackoverflow.com/questions/44521150

Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
---
 Makefile | 5 +++++
 1 file changed, 5 insertions(+)

Comments

Luca Ceresoli June 16, 2017, 11:19 a.m. UTC | #1
Hi Arnout,

On 15/06/2017 22:19, Arnout Vandecappelle (Essensium/Mind) wrote:
> As reported by Alessandro Power on StackOverflow [1], the behaviour
> of "make toolchain" in an unconfigured tree is misleading.
> 
> When .config doesn't exist, we don't read in the package .mk files, so
> "make <package>" doesn't work:
> 
>     $ make busybox
>     make: *** No rule to make target 'busybox'.  Stop.
> 
> However, for "linux" and "toolchain", the corresponding file (or
> actually directory) already exists. So instead, we get:
> 
>     $ make linux
>     make: Nothing to be done for 'linux'.
> 
> This is confusing, because it looks as if the build succeeded.
> 
> The obvious solution would be to make linux and toolchain PHONY targets
> when .config doesn't exist. However, that actually does the reverse,
> because then a rule _does_ exist for them and since they don't have
> dependencies, make will consider them to be ready.
> 
> Instead, we define linux and toolchain as targets and make them depend
> on menuconfig. The behaviour is still different from other packages,
> but at least it is less confusing.
> 
> [1] https://stackoverflow.com/questions/44521150
> 
> Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
> ---
>  Makefile | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/Makefile b/Makefile
> index 88d98e0405..f1ae9b0c17 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -813,6 +813,11 @@ else # ifeq ($(BR2_HAVE_DOT_CONFIG),y)
>  
>  all: menuconfig
>  
> +# Some subdirectories are also package names. To avoid that "make linux"
> +# on an unconfigured tree produces "Nothing to be done", add an explicit
> +# rule for it.
> +linux toolchain: menuconfig
> +

This is very localized and documented w.r.t. the other solution, so I
prefer this one.

However I prefer how the other solution behaves, i.e. print an
explicit error message, not call menuconfig.

How about the following solution?

.PHONY: linux toolchain
linux toolchain:
  @echo 'Please configure Buildroot first (e.g. "make menuconfig")' 1>&2
  @exit 1

I'm not sure it's correct, but seems like it works:

$ make toolchain
Please configure Buildroot first (e.g. "make menuconfig")
Makefile:818: recipe for target 'toolchain' failed
make[1]: *** [toolchain] Error 1
Makefile:79: recipe for target '_all' failed
make: *** [_all] Error 2
$ make defconfig
[...]
$ make toolchain
[...the build starts...]

>  endif # ifeq ($(BR2_HAVE_DOT_CONFIG),y)
>  
>  # configuration
>
Thomas Petazzoni June 24, 2017, 9:17 p.m. UTC | #2
Hello,

On Fri, 16 Jun 2017 13:19:27 +0200, Luca Ceresoli wrote:

> > +# Some subdirectories are also package names. To avoid that "make linux"
> > +# on an unconfigured tree produces "Nothing to be done", add an explicit
> > +# rule for it.
> > +linux toolchain: menuconfig
> > +  
> 
> This is very localized and documented w.r.t. the other solution, so I
> prefer this one.

Agreed.

> 
> However I prefer how the other solution behaves, i.e. print an
> explicit error message, not call menuconfig.
> 
> How about the following solution?
> 
> .PHONY: linux toolchain
> linux toolchain:
>   @echo 'Please configure Buildroot first (e.g. "make menuconfig")' 1>&2
>   @exit 1
> 
> I'm not sure it's correct, but seems like it works:

+1 with Luca here. Running menuconfig is confusing, I very much prefer
an error message.

Arnout, what do you think? Can you respin with this idea?

Thanks!

Thomas
diff mbox

Patch

diff --git a/Makefile b/Makefile
index 88d98e0405..f1ae9b0c17 100644
--- a/Makefile
+++ b/Makefile
@@ -813,6 +813,11 @@  else # ifeq ($(BR2_HAVE_DOT_CONFIG),y)
 
 all: menuconfig
 
+# Some subdirectories are also package names. To avoid that "make linux"
+# on an unconfigured tree produces "Nothing to be done", add an explicit
+# rule for it.
+linux toolchain: menuconfig
+
 endif # ifeq ($(BR2_HAVE_DOT_CONFIG),y)
 
 # configuration