mbox series

[0/8] Devicetree build consolidation

Message ID 20180821215524.23040-1-robh@kernel.org
Headers show
Series Devicetree build consolidation | expand

Message

Rob Herring Aug. 21, 2018, 9:55 p.m. UTC
This series addresses a couple of issues I have with building dts files.

First, the ability to build all the dts files in the tree. This has been
supported on most arches for some time with powerpc being the main
exception. The reason powerpc wasn't supported was it needed a change
in the location built dtb files are put.

Secondly, it's a pain to acquire all the cross-compilers needed to build
dtbs for each arch. There's no reason to build with the cross compiler and
the host compiler is perfectly fine as we only need the pre-processor.

I started addressing just those 2 problems, but kept finding small
differences such as target dependencies and dtbs_install support across
architectures. Instead of trying to align all these, I've consolidated the
build targets moving them out of the arch makefiles.

I'd like to take the series via the DT tree.

Rob

Rob Herring (8):
  powerpc: build .dtb files in dts directory
  nios2: build .dtb files in dts directory
  nios2: use common rules to build built-in dtb
  nios2: fix building all dtbs
  c6x: use common built-in dtb support
  kbuild: consolidate Devicetree dtb build rules
  powerpc: enable building all dtbs
  c6x: enable building all dtbs

 Makefile                           | 30 ++++++++++++++++++
 arch/arc/Makefile                  |  6 ----
 arch/arm/Makefile                  | 20 +-----------
 arch/arm64/Makefile                | 17 +----------
 arch/c6x/Makefile                  |  2 --
 arch/c6x/boot/dts/Makefile         | 17 +++++------
 arch/c6x/boot/dts/linked_dtb.S     |  2 --
 arch/c6x/include/asm/sections.h    |  1 -
 arch/c6x/kernel/setup.c            |  4 +--
 arch/c6x/kernel/vmlinux.lds.S      | 10 ------
 arch/h8300/Makefile                | 11 +------
 arch/microblaze/Makefile           |  4 +--
 arch/mips/Makefile                 | 15 +--------
 arch/nds32/Makefile                |  2 +-
 arch/nios2/Makefile                | 11 +------
 arch/nios2/boot/Makefile           | 22 --------------
 arch/nios2/boot/dts/Makefile       |  6 ++++
 arch/nios2/boot/linked_dtb.S       | 19 ------------
 arch/powerpc/Makefile              |  3 --
 arch/powerpc/boot/Makefile         | 49 ++++++++++++++----------------
 arch/powerpc/boot/dts/Makefile     |  6 ++++
 arch/powerpc/boot/dts/fsl/Makefile |  4 +++
 arch/xtensa/Makefile               | 12 +-------
 scripts/Makefile                   |  1 -
 scripts/Makefile.lib               |  2 +-
 25 files changed, 87 insertions(+), 189 deletions(-)
 delete mode 100644 arch/c6x/boot/dts/linked_dtb.S
 create mode 100644 arch/nios2/boot/dts/Makefile
 delete mode 100644 arch/nios2/boot/linked_dtb.S
 create mode 100644 arch/powerpc/boot/dts/Makefile
 create mode 100644 arch/powerpc/boot/dts/fsl/Makefile

--
2.17.1

Comments

Masahiro Yamada Aug. 26, 2018, 2:05 a.m. UTC | #1
Hi Rob,


2018-08-22 6:55 GMT+09:00 Rob Herring <robh@kernel.org>:
> There is nothing arch specific about building dtb files other than their

> location under /arch/*/boot/dts/. Keeping each arch aligned is a pain.

> The dependencies and supported targets are all slightly different.

> Also, a cross-compiler for each arch is needed, but really the host

> compiler preprocessor is perfectly fine for building dtbs. Move the

> build rules to a common location and remove the arch specific ones. This

> is done in a single step to avoid warnings about overriding rules.

>

> The build dependencies had been a mixture of 'scripts' and/or 'prepare'.

> These pull in several dependencies some of which need a target compiler

> (specifically devicetable-offsets.h) and aren't needed to build dtbs.

> All that is really needed is dtc, so adjust the dependencies to only be

> dtc.

>

> This change enables support 'dtbs_install' on some arches which were

> missing the target.

>

> Cc: Masahiro Yamada <yamada.masahiro@socionext.com>

> Cc: Michal Marek <michal.lkml@markovi.net>

> Cc: Vineet Gupta <vgupta@synopsys.com>

> Cc: Russell King <linux@armlinux.org.uk>

> Cc: Catalin Marinas <catalin.marinas@arm.com>

> Cc: Will Deacon <will.deacon@arm.com>

> Cc: Yoshinori Sato <ysato@users.sourceforge.jp>

> Cc: Michal Simek <monstr@monstr.eu>

> Cc: Ralf Baechle <ralf@linux-mips.org>

> Cc: Paul Burton <paul.burton@mips.com>

> Cc: James Hogan <jhogan@kernel.org>

> Cc: Ley Foon Tan <lftan@altera.com>

> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>

> Cc: Paul Mackerras <paulus@samba.org>

> Cc: Michael Ellerman <mpe@ellerman.id.au>

> Cc: Chris Zankel <chris@zankel.net>

> Cc: Max Filippov <jcmvbkbc@gmail.com>

> Cc: linux-kbuild@vger.kernel.org

> Cc: linux-snps-arc@lists.infradead.org

> Cc: linux-arm-kernel@lists.infradead.org

> Cc: uclinux-h8-devel@lists.sourceforge.jp

> Cc: linux-mips@linux-mips.org

> Cc: nios2-dev@lists.rocketboards.org

> Cc: linuxppc-dev@lists.ozlabs.org

> Cc: linux-xtensa@linux-xtensa.org

> Signed-off-by: Rob Herring <robh@kernel.org>

> ---

>  Makefile                 | 30 ++++++++++++++++++++++++++++++

>  arch/arc/Makefile        |  6 ------

>  arch/arm/Makefile        | 20 +-------------------

>  arch/arm64/Makefile      | 17 +----------------

>  arch/c6x/Makefile        |  2 --

>  arch/h8300/Makefile      | 11 +----------

>  arch/microblaze/Makefile |  4 +---

>  arch/mips/Makefile       | 15 +--------------

>  arch/nds32/Makefile      |  2 +-

>  arch/nios2/Makefile      |  7 -------

>  arch/nios2/boot/Makefile |  4 ----

>  arch/powerpc/Makefile    |  3 ---

>  arch/xtensa/Makefile     | 12 +-----------

>  scripts/Makefile         |  1 -

>  scripts/Makefile.lib     |  2 +-

>  15 files changed, 38 insertions(+), 98 deletions(-)

>

> diff --git a/Makefile b/Makefile

> index c13f8b85ba60..6d89e673f192 100644

> --- a/Makefile

> +++ b/Makefile

> @@ -1212,6 +1212,30 @@ kselftest-merge:

>                 $(srctree)/tools/testing/selftests/*/config

>         +$(Q)$(MAKE) -f $(srctree)/Makefile olddefconfig

>

> +# ---------------------------------------------------------------------------

> +# Devicetree files

> +

> +dtstree := $(wildcard arch/$(SRCARCH)/boot/dts)

> +

> +ifdef CONFIG_OF_EARLY_FLATTREE

> +

> +%.dtb %.dtb.S %.dtb.o: | dtc


I think the pipe operator is unnecessary
because Kbuild will descend to $(dtstree) anyway.


> +       $(Q)$(MAKE) $(build)=$(dtstree) $(dtstree)/$@

> +

> +PHONY += dtbs

> +dtbs: | dtc


Ditto.


> +       $(Q)$(MAKE) $(build)=$(dtstree)

> +

> +dtbs_install: dtbs

> +       $(Q)$(MAKE) $(dtbinst)=$(dtstree)

> +

> +all: dtbs

> +

> +dtc:

> +       $(Q)$(MAKE) $(build)=scripts/dtc

> +

> +endif

> +



arch/*/boot/dts/ are not only directories that
require dtc.


$ find  drivers/  -name '*.dts'
drivers/staging/mt7621-dts/gbpc1.dts
drivers/staging/pi433/Documentation/devicetree/pi433-overlay.dts
drivers/of/unittest-data/overlay_12.dts
drivers/of/unittest-data/overlay.dts
drivers/of/unittest-data/overlay_5.dts
drivers/of/unittest-data/overlay_bad_symbol.dts
drivers/of/unittest-data/overlay_1.dts
drivers/of/unittest-data/overlay_bad_phandle.dts
drivers/of/unittest-data/overlay_2.dts
drivers/of/unittest-data/overlay_15.dts
drivers/of/unittest-data/overlay_10.dts
drivers/of/unittest-data/testcases.dts
drivers/of/unittest-data/overlay_6.dts
drivers/of/unittest-data/overlay_13.dts
drivers/of/unittest-data/overlay_4.dts
drivers/of/unittest-data/overlay_9.dts
drivers/of/unittest-data/overlay_3.dts
drivers/of/unittest-data/overlay_8.dts
drivers/of/unittest-data/overlay_7.dts
drivers/of/unittest-data/overlay_11.dts
drivers/of/unittest-data/overlay_0.dts
drivers/of/unittest-data/overlay_base.dts
drivers/gpu/drm/rcar-du/rcar_du_of_lvds_r8a7796.dts
drivers/gpu/drm/rcar-du/rcar_du_of_lvds_r8a7795.dts
drivers/gpu/drm/rcar-du/rcar_du_of_lvds_r8a7793.dts
drivers/gpu/drm/rcar-du/rcar_du_of_lvds_r8a7790.dts
drivers/gpu/drm/rcar-du/rcar_du_of_lvds_r8a7791.dts





dtc must be built before descending into any directory.





$ git clean -f -x
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-  defconfig
drivers/gpu/drm/rcar-du/
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  YACC    scripts/kconfig/zconf.tab.c
  LEX     scripts/kconfig/zconf.lex.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
*** Default configuration is based on 'multi_v7_defconfig'
#
# configuration written to .config
#
scripts/kconfig/conf  --syncconfig Kconfig
  CC      kernel/bounds.s
  CC      arch/arm/kernel/asm-offsets.s
  CALL    scripts/checksyscalls.sh
<stdin>:1332:2: warning: #warning syscall io_pgetevents not implemented [-Wcpp]
  CC      scripts/mod/empty.o
  HOSTCC  scripts/mod/mk_elfconfig
  MKELF   scripts/mod/elfconfig.h
  HOSTCC  scripts/mod/modpost.o
  CC      scripts/mod/devicetable-offsets.s
  UPD     scripts/mod/devicetable-offsets.h
  HOSTCC  scripts/mod/file2alias.o
  HOSTCC  scripts/mod/sumversion.o
  HOSTLD  scripts/mod/modpost
  HOSTCC  scripts/kallsyms
  HOSTCC  scripts/conmakehash
  HOSTCC  scripts/sortextable
  HOSTCC  scripts/asn1_compiler
  HOSTCC  scripts/extract-cert
  CC      drivers/gpu/drm/rcar-du/rcar_lvds.o
  AR      drivers/gpu/drm/rcar-du/built-in.a
  CC [M]  drivers/gpu/drm/rcar-du/rcar_du_crtc.o
  CC [M]  drivers/gpu/drm/rcar-du/rcar_du_drv.o
  CC [M]  drivers/gpu/drm/rcar-du/rcar_du_encoder.o
  CC [M]  drivers/gpu/drm/rcar-du/rcar_du_group.o
  CC [M]  drivers/gpu/drm/rcar-du/rcar_du_kms.o
  CC [M]  drivers/gpu/drm/rcar-du/rcar_du_plane.o
  CC [M]  drivers/gpu/drm/rcar-du/rcar_du_of.o
make[2]: *** No rule to make target
'drivers/gpu/drm/rcar-du/rcar_du_of_lvds_r8a7790.dtb', needed by
'drivers/gpu/drm/rcar-du/rcar_du_of_lvds_r8a7790.dtb.S'.  Stop.
Makefile:1721: recipe for target 'drivers/gpu/drm/rcar-du/' failed
make[1]: *** [drivers/gpu/drm/rcar-du/] Error 2
Makefile:286: recipe for target '__build_one_by_one' failed
make: *** [__build_one_by_one] Error 2








> diff --git a/scripts/Makefile b/scripts/Makefile

> index 61affa300d25..a716a6b10954 100644

> --- a/scripts/Makefile

> +++ b/scripts/Makefile

> @@ -39,7 +39,6 @@ build_unifdef: $(obj)/unifdef

>  subdir-$(CONFIG_MODVERSIONS) += genksyms

>  subdir-y                     += mod

>  subdir-$(CONFIG_SECURITY_SELINUX) += selinux

> -subdir-$(CONFIG_DTC)         += dtc

>  subdir-$(CONFIG_GDB_SCRIPTS) += gdb

>

>  # Let clean descend into subdirs



You need to 'dtc' here to clean-up scripts/dtc by "make mrproper".

subdir- += basic kconfig package gcc-plugins dtc







-- 
Best Regards
Masahiro Yamada
Rob Herring Aug. 26, 2018, 11:56 p.m. UTC | #2
On Sat, Aug 25, 2018 at 9:06 PM Masahiro Yamada
<yamada.masahiro@socionext.com> wrote:
>

> Hi Rob,

>

>

> 2018-08-22 6:55 GMT+09:00 Rob Herring <robh@kernel.org>:

> > There is nothing arch specific about building dtb files other than their

> > location under /arch/*/boot/dts/. Keeping each arch aligned is a pain.

> > The dependencies and supported targets are all slightly different.

> > Also, a cross-compiler for each arch is needed, but really the host

> > compiler preprocessor is perfectly fine for building dtbs. Move the

> > build rules to a common location and remove the arch specific ones. This

> > is done in a single step to avoid warnings about overriding rules.

> >

> > The build dependencies had been a mixture of 'scripts' and/or 'prepare'.

> > These pull in several dependencies some of which need a target compiler

> > (specifically devicetable-offsets.h) and aren't needed to build dtbs.

> > All that is really needed is dtc, so adjust the dependencies to only be

> > dtc.

> >

> > This change enables support 'dtbs_install' on some arches which were

> > missing the target.

> >

> > Cc: Masahiro Yamada <yamada.masahiro@socionext.com>

> > Cc: Michal Marek <michal.lkml@markovi.net>

> > Cc: Vineet Gupta <vgupta@synopsys.com>

> > Cc: Russell King <linux@armlinux.org.uk>

> > Cc: Catalin Marinas <catalin.marinas@arm.com>

> > Cc: Will Deacon <will.deacon@arm.com>

> > Cc: Yoshinori Sato <ysato@users.sourceforge.jp>

> > Cc: Michal Simek <monstr@monstr.eu>

> > Cc: Ralf Baechle <ralf@linux-mips.org>

> > Cc: Paul Burton <paul.burton@mips.com>

> > Cc: James Hogan <jhogan@kernel.org>

> > Cc: Ley Foon Tan <lftan@altera.com>

> > Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>

> > Cc: Paul Mackerras <paulus@samba.org>

> > Cc: Michael Ellerman <mpe@ellerman.id.au>

> > Cc: Chris Zankel <chris@zankel.net>

> > Cc: Max Filippov <jcmvbkbc@gmail.com>

> > Cc: linux-kbuild@vger.kernel.org

> > Cc: linux-snps-arc@lists.infradead.org

> > Cc: linux-arm-kernel@lists.infradead.org

> > Cc: uclinux-h8-devel@lists.sourceforge.jp

> > Cc: linux-mips@linux-mips.org

> > Cc: nios2-dev@lists.rocketboards.org

> > Cc: linuxppc-dev@lists.ozlabs.org

> > Cc: linux-xtensa@linux-xtensa.org

> > Signed-off-by: Rob Herring <robh@kernel.org>

> > ---

> >  Makefile                 | 30 ++++++++++++++++++++++++++++++

> >  arch/arc/Makefile        |  6 ------

> >  arch/arm/Makefile        | 20 +-------------------

> >  arch/arm64/Makefile      | 17 +----------------

> >  arch/c6x/Makefile        |  2 --

> >  arch/h8300/Makefile      | 11 +----------

> >  arch/microblaze/Makefile |  4 +---

> >  arch/mips/Makefile       | 15 +--------------

> >  arch/nds32/Makefile      |  2 +-

> >  arch/nios2/Makefile      |  7 -------

> >  arch/nios2/boot/Makefile |  4 ----

> >  arch/powerpc/Makefile    |  3 ---

> >  arch/xtensa/Makefile     | 12 +-----------

> >  scripts/Makefile         |  1 -

> >  scripts/Makefile.lib     |  2 +-

> >  15 files changed, 38 insertions(+), 98 deletions(-)

> >

> > diff --git a/Makefile b/Makefile

> > index c13f8b85ba60..6d89e673f192 100644

> > --- a/Makefile

> > +++ b/Makefile

> > @@ -1212,6 +1212,30 @@ kselftest-merge:

> >                 $(srctree)/tools/testing/selftests/*/config

> >         +$(Q)$(MAKE) -f $(srctree)/Makefile olddefconfig

> >

> > +# ---------------------------------------------------------------------------

> > +# Devicetree files

> > +

> > +dtstree := $(wildcard arch/$(SRCARCH)/boot/dts)


BTW, there's an error here too. It doesn't work right with
KBUILD_OUTPUT set and should be:

ifneq ($(wildcard $(srctree)/arch/$(SRCARCH)/boot/dts/),)
dtstree := arch/$(SRCARCH)/boot/dts
endif

> > +

> > +ifdef CONFIG_OF_EARLY_FLATTREE

> > +

> > +%.dtb %.dtb.S %.dtb.o: | dtc

>

> I think the pipe operator is unnecessary

> because Kbuild will descend to $(dtstree) anyway.


The pipe means 'order-only', right? So it is just a weaker dependency
for things which are not input files as dtc is not. The 'dtc' here is
just the dtc rule below, not the actual executable. Or am I missing
something?

> > +       $(Q)$(MAKE) $(build)=$(dtstree) $(dtstree)/$@

> > +

> > +PHONY += dtbs

> > +dtbs: | dtc

>

> Ditto.

>

>

> > +       $(Q)$(MAKE) $(build)=$(dtstree)

> > +

> > +dtbs_install: dtbs

> > +       $(Q)$(MAKE) $(dtbinst)=$(dtstree)

> > +

> > +all: dtbs

> > +

> > +dtc:

> > +       $(Q)$(MAKE) $(build)=scripts/dtc

> > +

> > +endif

> > +

>

>

> arch/*/boot/dts/ are not only directories that

> require dtc.


Ah yes, of course...

> > diff --git a/scripts/Makefile b/scripts/Makefile

> > index 61affa300d25..a716a6b10954 100644

> > --- a/scripts/Makefile

> > +++ b/scripts/Makefile

> > @@ -39,7 +39,6 @@ build_unifdef: $(obj)/unifdef

> >  subdir-$(CONFIG_MODVERSIONS) += genksyms

> >  subdir-y                     += mod

> >  subdir-$(CONFIG_SECURITY_SELINUX) += selinux

> > -subdir-$(CONFIG_DTC)         += dtc

> >  subdir-$(CONFIG_GDB_SCRIPTS) += gdb

> >

> >  # Let clean descend into subdirs


Looks like I need to leave this line to fix the above and cleaning.

Thanks for the review.

Rob
Masahiro Yamada Sept. 7, 2018, 5:07 p.m. UTC | #3
2018-08-27 8:56 GMT+09:00 Rob Herring <robh@kernel.org>:
> On Sat, Aug 25, 2018 at 9:06 PM Masahiro Yamada

> <yamada.masahiro@socionext.com> wrote:

>>

>> Hi Rob,

>>

>>

>> 2018-08-22 6:55 GMT+09:00 Rob Herring <robh@kernel.org>:

>> > There is nothing arch specific about building dtb files other than their

>> > location under /arch/*/boot/dts/. Keeping each arch aligned is a pain.

>> > The dependencies and supported targets are all slightly different.

>> > Also, a cross-compiler for each arch is needed, but really the host

>> > compiler preprocessor is perfectly fine for building dtbs. Move the

>> > build rules to a common location and remove the arch specific ones. This

>> > is done in a single step to avoid warnings about overriding rules.

>> >

>> > The build dependencies had been a mixture of 'scripts' and/or 'prepare'.

>> > These pull in several dependencies some of which need a target compiler

>> > (specifically devicetable-offsets.h) and aren't needed to build dtbs.

>> > All that is really needed is dtc, so adjust the dependencies to only be

>> > dtc.

>> >

>> > This change enables support 'dtbs_install' on some arches which were

>> > missing the target.

>> >

>> > Cc: Masahiro Yamada <yamada.masahiro@socionext.com>

>> > Cc: Michal Marek <michal.lkml@markovi.net>

>> > Cc: Vineet Gupta <vgupta@synopsys.com>

>> > Cc: Russell King <linux@armlinux.org.uk>

>> > Cc: Catalin Marinas <catalin.marinas@arm.com>

>> > Cc: Will Deacon <will.deacon@arm.com>

>> > Cc: Yoshinori Sato <ysato@users.sourceforge.jp>

>> > Cc: Michal Simek <monstr@monstr.eu>

>> > Cc: Ralf Baechle <ralf@linux-mips.org>

>> > Cc: Paul Burton <paul.burton@mips.com>

>> > Cc: James Hogan <jhogan@kernel.org>

>> > Cc: Ley Foon Tan <lftan@altera.com>

>> > Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>

>> > Cc: Paul Mackerras <paulus@samba.org>

>> > Cc: Michael Ellerman <mpe@ellerman.id.au>

>> > Cc: Chris Zankel <chris@zankel.net>

>> > Cc: Max Filippov <jcmvbkbc@gmail.com>

>> > Cc: linux-kbuild@vger.kernel.org

>> > Cc: linux-snps-arc@lists.infradead.org

>> > Cc: linux-arm-kernel@lists.infradead.org

>> > Cc: uclinux-h8-devel@lists.sourceforge.jp

>> > Cc: linux-mips@linux-mips.org

>> > Cc: nios2-dev@lists.rocketboards.org

>> > Cc: linuxppc-dev@lists.ozlabs.org

>> > Cc: linux-xtensa@linux-xtensa.org

>> > Signed-off-by: Rob Herring <robh@kernel.org>

>> > ---

>> >  Makefile                 | 30 ++++++++++++++++++++++++++++++

>> >  arch/arc/Makefile        |  6 ------

>> >  arch/arm/Makefile        | 20 +-------------------

>> >  arch/arm64/Makefile      | 17 +----------------

>> >  arch/c6x/Makefile        |  2 --

>> >  arch/h8300/Makefile      | 11 +----------

>> >  arch/microblaze/Makefile |  4 +---

>> >  arch/mips/Makefile       | 15 +--------------

>> >  arch/nds32/Makefile      |  2 +-

>> >  arch/nios2/Makefile      |  7 -------

>> >  arch/nios2/boot/Makefile |  4 ----

>> >  arch/powerpc/Makefile    |  3 ---

>> >  arch/xtensa/Makefile     | 12 +-----------

>> >  scripts/Makefile         |  1 -

>> >  scripts/Makefile.lib     |  2 +-

>> >  15 files changed, 38 insertions(+), 98 deletions(-)

>> >

>> > diff --git a/Makefile b/Makefile

>> > index c13f8b85ba60..6d89e673f192 100644

>> > --- a/Makefile

>> > +++ b/Makefile

>> > @@ -1212,6 +1212,30 @@ kselftest-merge:

>> >                 $(srctree)/tools/testing/selftests/*/config

>> >         +$(Q)$(MAKE) -f $(srctree)/Makefile olddefconfig

>> >

>> > +# ---------------------------------------------------------------------------

>> > +# Devicetree files

>> > +

>> > +dtstree := $(wildcard arch/$(SRCARCH)/boot/dts)

>

> BTW, there's an error here too. It doesn't work right with

> KBUILD_OUTPUT set and should be:

>

> ifneq ($(wildcard $(srctree)/arch/$(SRCARCH)/boot/dts/),)

> dtstree := arch/$(SRCARCH)/boot/dts

> endif

>

>> > +

>> > +ifdef CONFIG_OF_EARLY_FLATTREE

>> > +

>> > +%.dtb %.dtb.S %.dtb.o: | dtc

>>

>> I think the pipe operator is unnecessary

>> because Kbuild will descend to $(dtstree) anyway.

>

> The pipe means 'order-only', right?


Yes.

> So it is just a weaker dependency

> for things which are not input files as dtc is not. The 'dtc' here is

> just the dtc rule below, not the actual executable. Or am I missing

> something?



The pipe is used when

  - we want to make sure the weaker prerequisite exists

  - but, we do not want to execute the recipe
    even if the weaker prerequisite is updated


In this case, we want to execute the recipe _all_the_time_.

We compare the timestamp between %.dtb and %.dts in the sub-directory.

We never know the real depenency until the following recipe is run
     $(Q)$(MAKE) $(build)=$(dtstree) $(dtstree)/$@



PHONY += dtbs
dtbs: | dtc
      $(Q)$(MAKE) $(build)=$(dtstree)

Here 'dtbs' is a PHONY target.
We always want to run the recipe.
The pipe operator is not sensible.


-- 
Best Regards
Masahiro Yamada