[PATCH] kbuild: Avoid including architecture-specific Makefile twice
Yao Zi
ziyao at disroot.org
Fri Jul 11 09:27:57 CEST 2025
On Fri, Jul 11, 2025 at 08:11:03AM +0300, Ilias Apalodimas wrote:
> Hi Yao,
>
>
> On Wed, 9 Jul 2025 at 19:15, Yao Zi <ziyao at disroot.org> wrote:
> >
> > Stranges errors are observed when building U-Boot master for almost any
> > RISC-V board, the messages are in two types, one is about duplicated
> > symbols,
> >
> > u-boot/arch/riscv/cpu//mtrap.S:32: multiple definition of `trap_entry';
> > arch/riscv/cpu/mtrap.o: u-boot/arch/riscv/cpu//mtrap.S:32: first defined here
> >
> > and the other is fixdep's complaint about missing dependency files,
> >
> > fixdep: error opening file: arch/riscv/cpu/.mtrap.o.d: No such file or directory
> > fixdep: error opening file: arch/riscv/cpu//.start.o.d: No such file or directory
> >
> > where the latter could only be reproduced when building parallelly.
> >
> > Both the two types of errors are about files in arch/riscv/cpu, and
> > there's a suspicious slash character in the reported path. Looking
> > through RISC-V-specific Makefiles, there's only one place that may
> > expand to such a path,
> >
> > libs-y += arch/riscv/cpu/$(CPU)/
> >
> > The right hand expands to "arch/riscv/cpu//" if $(CPU) isn't defined at
> > the time of including. With some debug statement added to
> > arch/riscv/Makefile, the output proves that arch/riscv/Makefile is
> > included twice, once with $(CPU) undefined and once defined correctly
> > according to CONFIG_SYS_CPU.
> >
> > Futher bisecting shows an extra include statement against
> > arch/$(SRCARCH)/Makefile is added in earlier bump of Kbuild system. But
> > the statement is evaluated before config.mk is included and definition
> > of $(CPU), causing objects in arch/riscv/cpu/ are built and linked twice
> > (once as "arch/riscv/cpu/*", and once as "arch/riscv/cpu//*"), resulting
> > in the error.
> >
> > Let's simply remove the extra include to fix these nasty errors. Note
> > though this therotically affects all architectures, ones except RISC-V
> > may not reproduce similar errors since there are no source files
> > directly under arch/*/cpu, thus the extra include doesn't hurt.
>
> There's another unconditional include under ifeq ($(config-targets),1).
> Should we remove that as well?
I don't think it really matters. This include is only for config targets
that don't actually run the build, but only descent into scripts/kconfig
and generate a configuration. The include of arch/$(SRCARCH)/Makefile
seems only for getting an appropriate name of defconfig
(KBUILD_DEFCONFIG), as explained by the comment. It seems even okay to
remove the include, as U-Boot has no architecture defining its own
KBUILD_DEFCONFIG.
> The patch it self seems correct, but can you try removing the
> pre-existing include instead and add the config.mk inclusion?
> Something like
> diff --git a/Makefile b/Makefile
> index db8d89587290..e6ad9be262ef 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -636,6 +636,7 @@ ifeq ($(config-targets),1)
> # KBUILD_DEFCONFIG may point out an alternative default configuration
> # used for 'make defconfig'
> # Modified for U-Boot
> +include config.mk
> -include arch/$(SRCARCH)/Makefile
> export KBUILD_DEFCONFIG KBUILD_KCONFIG CC_VERSION_TEXT
>
> @@ -725,6 +726,7 @@ ARCH_CPPFLAGS :=
> ARCH_AFLAGS :=
> ARCH_CFLAGS :=
> # Modified for U-Boot
> +include config.mk
I don't think config.mk could be included without making sure
include/autoconf.mk is update to date, just as pointed out by the
comment at line 768
> We want to include arch/$(ARCH)/config.mk only when
> include/config/auto.conf is up-to-date. When we switch to a
> different board configuration, old CONFIG macros are still
> remaining in include/config/auto.conf. Without the following
> gimmick, wrong config.mk would be included leading nasty
> warnings/errors.
And this change does cause errors if I use a defconfig, build U-Boot,
then switch to another defconfig and build again, for example,
$ make ARCH=arm CROSS_COMPILE=arm-none-eabi- mx6sabresd_defconfig
$ make ARCH=arm CROSS_COMPILE=arm-none-eabi-
$ make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-musl- \
sifive_unleashed_defconfig
$ make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-musl-
results in errors like
drivers/gpio/sifive-gpio.c:9:10: fatal error: asm/arch/gpio.h: No such file or directory
9 | #include <asm/arch/gpio.h>
| ^~~~~~~~~~~~~~~~~
compilation terminated.
and ls -l arch/riscv/include/asm/arch shows the symlink points to a
non-existing directory,
$ ls -l arch/riscv/include/asm/arch
lrwxrwxrwx 1 ziyao ziyao 8 Jul 11 07:11 arch/riscv/include/asm/arch -> arch-mx6
it's really likely that the old auto.conf is evaluated, since arch-mx6
isn't a RISC-V thing.
> -include arch/$(SRCARCH)/Makefile
>
> ifeq ($(dot-config),1)
> @@ -773,10 +775,6 @@ ifneq ($(wildcard $(KCONFIG_CONFIG)),)
> ifneq ($(wildcard include/config/auto.conf),)
> autoconf_is_old := $(shell find . -path ./$(KCONFIG_CONFIG) -newer \
> include/config/auto.conf)
> -ifeq ($(autoconf_is_old),)
> -include config.mk
> -include arch/$(ARCH)/Makefile
> -endif
> endif
> endif
>
> I prefer keeping the makefile closer to the kernel so we can sync it
> up easier in the future
>
> Thanks for looking at this
> /Ilias
> >
Regards,
Yao Zi
More information about the U-Boot
mailing list