[PATCH] kbuild: fix compilation of dtb specified on command-line without make rule

Thomas De Schampheleire posted 1 patch 1 week, 4 days ago
There is a newer version of this series
scripts/Makefile.build | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
[PATCH] kbuild: fix compilation of dtb specified on command-line without make rule
Posted by Thomas De Schampheleire 1 week, 4 days ago
Since commit e7e2941300d2 ("kbuild: split device tree build rules into
scripts/Makefile.dtbs"), it is no longer possible to compile a device tree
blob that is not specified in a make rule
like:
    dtb-$(CONFIG_FOO) += foo.dtb

Before the mentioned commit, one could copy a dts file to e.g.
arch/arm64/boot/dts/ (or a new subdirectory) and then convert it to a dtb
file using:
    make ARCH=arm64 foo.dtb

In this scenario, both 'dtb-y' and 'dtb-' are empty, and the inclusion of
scripts/Makefile.dtbs relies on 'targets' to contain the MAKECMDGOALS. The
value of 'targets', however, is only final later in the code.

Move the conditional include of scripts/Makefile.dtbs down to where the
value of 'targets' is final.

Fixes: e7e2941300d2 ("kbuild: split device tree build rules into scripts/Makefile.dtbs")
Signed-off-by: Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
---
 scripts/Makefile.build | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/scripts/Makefile.build b/scripts/Makefile.build
index d0ee33a487be..6e0f9e922c68 100644
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -527,10 +527,6 @@ ifneq ($(userprogs),)
 include $(srctree)/scripts/Makefile.userprogs
 endif
 
-ifneq ($(need-dtbslist)$(dtb-y)$(dtb-)$(filter %.dtb %.dtb.o %.dtbo.o,$(targets)),)
-include $(srctree)/scripts/Makefile.dtbs
-endif
-
 # Build
 # ---------------------------------------------------------------------------
 
@@ -568,6 +564,11 @@ FORCE:
 targets += $(filter-out $(single-subdir-goals), $(MAKECMDGOALS))
 targets := $(filter-out $(PHONY), $(targets))
 
+# Now that targets is fully known, include dtb rules if needed
+ifneq ($(need-dtbslist)$(dtb-y)$(dtb-)$(filter %.dtb %.dtb.o %.dtbo.o,$(targets)),)
+include $(srctree)/scripts/Makefile.dtbs
+endif
+
 # Read all saved command lines and dependencies for the $(targets) we
 # may be building above, using $(if_changed{,_dep}). As an
 # optimization, we don't need to read them if the target does not

base-commit: deab487e0f9b39ae4603e22d7d00908ebfc9753c
-- 
2.51.0
Re: [PATCH] kbuild: fix compilation of dtb specified on command-line without make rule
Posted by Rob Herring 1 week ago
On Thu, Nov 20, 2025 at 03:06:43PM +0100, Thomas De Schampheleire wrote:
> Since commit e7e2941300d2 ("kbuild: split device tree build rules into
> scripts/Makefile.dtbs"), it is no longer possible to compile a device tree
> blob that is not specified in a make rule
> like:
>     dtb-$(CONFIG_FOO) += foo.dtb
> 
> Before the mentioned commit, one could copy a dts file to e.g.
> arch/arm64/boot/dts/ (or a new subdirectory) and then convert it to a dtb
> file using:
>     make ARCH=arm64 foo.dtb

News to me this was ever possible.

> 
> In this scenario, both 'dtb-y' and 'dtb-' are empty, and the inclusion of
> scripts/Makefile.dtbs relies on 'targets' to contain the MAKECMDGOALS. The
> value of 'targets', however, is only final later in the code.
> 
> Move the conditional include of scripts/Makefile.dtbs down to where the
> value of 'targets' is final.

This breaks 'make dtbs' (and just 'make' for arm64).


> 
> Fixes: e7e2941300d2 ("kbuild: split device tree build rules into scripts/Makefile.dtbs")
> Signed-off-by: Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
> ---
>  scripts/Makefile.build | 9 +++++----
>  1 file changed, 5 insertions(+), 4 deletions(-)
> 
> diff --git a/scripts/Makefile.build b/scripts/Makefile.build
> index d0ee33a487be..6e0f9e922c68 100644
> --- a/scripts/Makefile.build
> +++ b/scripts/Makefile.build
> @@ -527,10 +527,6 @@ ifneq ($(userprogs),)
>  include $(srctree)/scripts/Makefile.userprogs
>  endif
>  
> -ifneq ($(need-dtbslist)$(dtb-y)$(dtb-)$(filter %.dtb %.dtb.o %.dtbo.o,$(targets)),)
> -include $(srctree)/scripts/Makefile.dtbs
> -endif
> -
>  # Build
>  # ---------------------------------------------------------------------------
>  
> @@ -568,6 +564,11 @@ FORCE:
>  targets += $(filter-out $(single-subdir-goals), $(MAKECMDGOALS))
>  targets := $(filter-out $(PHONY), $(targets))
>  
> +# Now that targets is fully known, include dtb rules if needed
> +ifneq ($(need-dtbslist)$(dtb-y)$(dtb-)$(filter %.dtb %.dtb.o %.dtbo.o,$(targets)),)
> +include $(srctree)/scripts/Makefile.dtbs
> +endif
> +
>  # Read all saved command lines and dependencies for the $(targets) we
>  # may be building above, using $(if_changed{,_dep}). As an
>  # optimization, we don't need to read them if the target does not
> 
> base-commit: deab487e0f9b39ae4603e22d7d00908ebfc9753c
> -- 
> 2.51.0
>
Re: [PATCH] kbuild: fix compilation of dtb specified on command-line without make rule
Posted by Thomas De Schampheleire 6 days, 14 hours ago
On Mon, Nov 24, 2025 at 07:07:47AM -0600, Rob Herring wrote:
> On Thu, Nov 20, 2025 at 03:06:43PM +0100, Thomas De Schampheleire wrote:
[...]
> > In this scenario, both 'dtb-y' and 'dtb-' are empty, and the inclusion of
> > scripts/Makefile.dtbs relies on 'targets' to contain the MAKECMDGOALS. The
> > value of 'targets', however, is only final later in the code.
> >
> > Move the conditional include of scripts/Makefile.dtbs down to where the
> > value of 'targets' is final.
> 
> This breaks 'make dtbs' (and just 'make' for arm64).

I see the 'make dtbs' failure, I will investigate.

I don't yet see a problem with 'make ARCH=arm64 CROSS_COMPILE=[...]' after a
standard 'defconfig'. Can you please clarify how it fails for you?

Thanks,
Thomas
Re: [PATCH] kbuild: fix compilation of dtb specified on command-line without make rule
Posted by Rob Herring 6 days, 12 hours ago
On Tue, Nov 25, 2025 at 4:52 AM Thomas De Schampheleire
<thomas.de_schampheleire@nokia.com> wrote:
>
> On Mon, Nov 24, 2025 at 07:07:47AM -0600, Rob Herring wrote:
> > On Thu, Nov 20, 2025 at 03:06:43PM +0100, Thomas De Schampheleire wrote:
> [...]
> > > In this scenario, both 'dtb-y' and 'dtb-' are empty, and the inclusion of
> > > scripts/Makefile.dtbs relies on 'targets' to contain the MAKECMDGOALS. The
> > > value of 'targets', however, is only final later in the code.
> > >
> > > Move the conditional include of scripts/Makefile.dtbs down to where the
> > > value of 'targets' is final.
> >
> > This breaks 'make dtbs' (and just 'make' for arm64).
>
> I see the 'make dtbs' failure, I will investigate.
>
> I don't yet see a problem with 'make ARCH=arm64 CROSS_COMPILE=[...]' after a
> standard 'defconfig'. Can you please clarify how it fails for you?

Did it build the dtbs? "dtbs" is an implicit target for "all", so I'm
assuming that wouldn't work either.

Rob
Re: [PATCH] kbuild: fix compilation of dtb specified on command-line without make rule
Posted by Nathan Chancellor 1 week, 3 days ago
+ Rob, as he reviewed e7e2941300d2

On Thu, Nov 20, 2025 at 03:06:43PM +0100, Thomas De Schampheleire wrote:
> Since commit e7e2941300d2 ("kbuild: split device tree build rules into
> scripts/Makefile.dtbs"), it is no longer possible to compile a device tree
> blob that is not specified in a make rule
> like:
>     dtb-$(CONFIG_FOO) += foo.dtb
> 
> Before the mentioned commit, one could copy a dts file to e.g.
> arch/arm64/boot/dts/ (or a new subdirectory) and then convert it to a dtb
> file using:
>     make ARCH=arm64 foo.dtb
> 
> In this scenario, both 'dtb-y' and 'dtb-' are empty, and the inclusion of
> scripts/Makefile.dtbs relies on 'targets' to contain the MAKECMDGOALS. The
> value of 'targets', however, is only final later in the code.
> 
> Move the conditional include of scripts/Makefile.dtbs down to where the
> value of 'targets' is final.
> 
> Fixes: e7e2941300d2 ("kbuild: split device tree build rules into scripts/Makefile.dtbs")
> Signed-off-by: Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>

Huh, TIL that .c and .S files can be built in the same way...

  $ touch init/foo.c init/bar.S
  $ make init/foo.o init/bar.o
  $ ls init/.foo.o.cmd init/.bar.o.cmd
  init/.bar.o.cmd
  init/.foo.o.cmd

I do not necessarily love splitting up the conditional includes from
each other but I am not sure it can be avoided... Nicolas, are you okay
with me taking this as a fix or do you want to take it via kbuild-next?
If the latter:

Reviewed-by: Nathan Chancellor <nathan@kernel.org>

> ---
>  scripts/Makefile.build | 9 +++++----
>  1 file changed, 5 insertions(+), 4 deletions(-)
> 
> diff --git a/scripts/Makefile.build b/scripts/Makefile.build
> index d0ee33a487be..6e0f9e922c68 100644
> --- a/scripts/Makefile.build
> +++ b/scripts/Makefile.build
> @@ -527,10 +527,6 @@ ifneq ($(userprogs),)
>  include $(srctree)/scripts/Makefile.userprogs
>  endif
>  
> -ifneq ($(need-dtbslist)$(dtb-y)$(dtb-)$(filter %.dtb %.dtb.o %.dtbo.o,$(targets)),)
> -include $(srctree)/scripts/Makefile.dtbs
> -endif
> -
>  # Build
>  # ---------------------------------------------------------------------------
>  
> @@ -568,6 +564,11 @@ FORCE:
>  targets += $(filter-out $(single-subdir-goals), $(MAKECMDGOALS))
>  targets := $(filter-out $(PHONY), $(targets))
>  
> +# Now that targets is fully known, include dtb rules if needed
> +ifneq ($(need-dtbslist)$(dtb-y)$(dtb-)$(filter %.dtb %.dtb.o %.dtbo.o,$(targets)),)
> +include $(srctree)/scripts/Makefile.dtbs
> +endif
> +
>  # Read all saved command lines and dependencies for the $(targets) we
>  # may be building above, using $(if_changed{,_dep}). As an
>  # optimization, we don't need to read them if the target does not
> 
> base-commit: deab487e0f9b39ae4603e22d7d00908ebfc9753c
> -- 
> 2.51.0
>
Re: [PATCH] kbuild: fix compilation of dtb specified on command-line without make rule
Posted by Nicolas Schier 1 week, 3 days ago
On Thu, Nov 20, 2025 at 11:42:56PM -0700, Nathan Chancellor wrote:
> + Rob, as he reviewed e7e2941300d2
> 
> On Thu, Nov 20, 2025 at 03:06:43PM +0100, Thomas De Schampheleire wrote:
> > Since commit e7e2941300d2 ("kbuild: split device tree build rules into
> > scripts/Makefile.dtbs"), it is no longer possible to compile a device tree
> > blob that is not specified in a make rule
> > like:
> >     dtb-$(CONFIG_FOO) += foo.dtb
> > 
> > Before the mentioned commit, one could copy a dts file to e.g.
> > arch/arm64/boot/dts/ (or a new subdirectory) and then convert it to a dtb
> > file using:
> >     make ARCH=arm64 foo.dtb
> > 
> > In this scenario, both 'dtb-y' and 'dtb-' are empty, and the inclusion of
> > scripts/Makefile.dtbs relies on 'targets' to contain the MAKECMDGOALS. The
> > value of 'targets', however, is only final later in the code.
> > 
> > Move the conditional include of scripts/Makefile.dtbs down to where the
> > value of 'targets' is final.
> > 
> > Fixes: e7e2941300d2 ("kbuild: split device tree build rules into scripts/Makefile.dtbs")
> > Signed-off-by: Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
> 
> Huh, TIL that .c and .S files can be built in the same way...
> 
>   $ touch init/foo.c init/bar.S
>   $ make init/foo.o init/bar.o
>   $ ls init/.foo.o.cmd init/.bar.o.cmd
>   init/.bar.o.cmd
>   init/.foo.o.cmd
> 
> I do not necessarily love splitting up the conditional includes from
> each other but I am not sure it can be avoided... Nicolas, are you okay
> with me taking this as a fix or do you want to take it via kbuild-next?
> If the latter:
> 
> Reviewed-by: Nathan Chancellor <nathan@kernel.org>

I am ok with you taking it via kbuild-fixed, thanks.

Kind regards,
Nicolas

PS: If I combine this here with [1], [1] does not work any more.
[1]: https://lore.kernel.org/linux-kbuild/20251120204812.1983452-4-robh@kernel.org