Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

kbuild: avoid build error when single DTB is turned into composite DTB

As commit afa974b77128 ("kbuild: add real-prereqs shorthand for
$(filter-out FORCE,$^)") explained, $(real-prereqs) is not just a list
of objects when linking a multi-object module. If a single-object module
is turned into a multi-object module, $^ (and therefore $(real-prereqs)
as well) contains header files recorded in the *.cmd file. Such headers
must be filtered out.

Now that a DTB can be built either from a single source or multiple
source files, the same issue can occur.

Consider the following scenario:

First, foo.dtb is implemented as a single-blob device tree.

The code looks something like this:

[Sample Code 1]

Makefile:

dtb-y += foo.dtb

foo.dts:

#include <dt-bindings/gpio/gpio.h>
/dts-v1/;
/ { };

When it is compiled, .foo.dtb.cmd records that foo.dtb depends on
scripts/dtc/include-prefixes/dt-bindings/gpio/gpio.h.

Later, foo.dtb is split into a base and an overlay. The code looks
something like this:

[Sample Code 2]

Makefile:

dtb-y += foo.dtb
foo-dtbs := foo-base.dtb foo-addon.dtbo

foo-base.dts:

#include <dt-bindings/gpio/gpio.h>
/dts-v1/;
/ { };

foo-addon.dtso:

/dts-v1/;
/plugin/;
/ { };

If you rebuild foo.dtb without 'make clean', you will get this error:

Overlay 'scripts/dtc/include-prefixes/dt-bindings/gpio/gpio.h' is incomplete

$(real-prereqs) contains not only foo-base.dtb and foo-addon.dtbo but
also scripts/dtc/include-prefixes/dt-bindings/gpio/gpio.h, which is
passed to scripts/dtc/fdtoverlay.

Fixes: 15d16d6dadf6 ("kbuild: Add generic rule to apply fdtoverlay")
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>

+5 -1
+5 -1
scripts/Makefile.lib
··· 407 407 -d $(depfile).dtc.tmp $(dtc-tmp) ; \ 408 408 cat $(depfile).pre.tmp $(depfile).dtc.tmp > $(depfile) 409 409 410 + # NOTE: 411 + # Do not replace $(filter %.dtb %.dtbo, $^) with $(real-prereqs). When a single 412 + # DTB is turned into a multi-blob DTB, $^ will contain header file dependencies 413 + # recorded in the .*.cmd file. 410 414 quiet_cmd_fdtoverlay = DTOVL $@ 411 - cmd_fdtoverlay = $(objtree)/scripts/dtc/fdtoverlay -o $@ -i $(real-prereqs) 415 + cmd_fdtoverlay = $(objtree)/scripts/dtc/fdtoverlay -o $@ -i $(filter %.dtb %.dtbo, $^) 412 416 413 417 $(multi-dtb-y): FORCE 414 418 $(call if_changed,fdtoverlay)