In case the build system builds a directory with empty Makefile,
one which does not contain any obj-y entries, the build fails to
link due to missing built-in.o .

This happens because of this part of scripts/Makefile.build
 81 ifneq ($(strip $(obj-y) $(obj-m) $(obj-) $(subdir-m) $(lib-target)),)
 82 builtin-target := $(obj)/built-in.o
 83 endif
which does not assign builtin-target in case obj-y is empty. The
built-in target is then not built at all, and built-in.o is not
generated by this part of scripts/Makefile.build
 325 ifdef builtin-target
 326 quiet_cmd_link_o_target = AR      $@
 327 # If the list of objects to link is empty, just create an empty built-in.o
 ...
 335 targets += $(builtin-target)
 336 endif # builtin-target
This is the correct behavior.

The final link however expects the built-in.o to exist in every directory
included in the build, even in those where the aforementioned code skipped
generation of built-in.o . Make sure the built-in.o does exist for every
directory used in final link simply by doing touch on every built-in.o used
for the link, which will create empty built-in.o in case any built-in.o is
missing.

A possible alternative fix is the always define the builtin-target
and always generate built-in.o .

Signed-off-by: Marek Vasut <marek.vasut+rene...@mailbox.org>
---
Cc: Bryan Brattlof <b...@ti.com>
Cc: Greg Malysa <greg.mal...@timesys.com>
Cc: Heinrich Schuchardt <xypron.g...@gmx.de>
Cc: Ian Roberts <ian.robe...@timesys.com>
Cc: Ilias Apalodimas <ilias.apalodi...@linaro.org>
Cc: Peter Robinson <pbrobin...@gmail.com>
Cc: Simon Glass <s...@chromium.org>
Cc: Sumit Garg <sumit.g...@linaro.org>
Cc: Tom Rini <tr...@konsulko.com>
Cc: u-boot@lists.denx.de
---
 Makefile               | 5 ++++-
 arch/sandbox/config.mk | 8 ++++++--
 scripts/Makefile.xpl   | 2 ++
 3 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/Makefile b/Makefile
index 0500eb6e0a7..03df04853c8 100644
--- a/Makefile
+++ b/Makefile
@@ -1779,6 +1779,7 @@ endif
 ifeq ($(LTO_ENABLE),y)
 quiet_cmd_u-boot__ ?= LTO     $@
       cmd_u-boot__ ?=                                                          
\
+               touch $(u-boot-main) ;                                          
\
                $(CC) -nostdlib -nostartfiles                                   
\
                $(LTO_FINAL_LDFLAGS) $(c_flags)                                 
\
                $(KBUILD_LDFLAGS:%=-Wl,%) $(LDFLAGS_u-boot:%=-Wl,%) -o $@       
\
@@ -1792,7 +1793,9 @@ quiet_cmd_u-boot__ ?= LTO     $@
                $(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)
 else
 quiet_cmd_u-boot__ ?= LD      $@
-      cmd_u-boot__ ?= $(LD) $(KBUILD_LDFLAGS) $(LDFLAGS_u-boot) -o $@          
\
+      cmd_u-boot__ ?=                                                          
\
+               touch $(u-boot-main) ;                                          
\
+               $(LD) $(KBUILD_LDFLAGS) $(LDFLAGS_u-boot) -o $@                 
\
                -T u-boot.lds $(u-boot-init)                                    
\
                --whole-archive                                                 
\
                        $(u-boot-main)                                          
\
diff --git a/arch/sandbox/config.mk b/arch/sandbox/config.mk
index 405843800e9..dd9b7473fa9 100644
--- a/arch/sandbox/config.mk
+++ b/arch/sandbox/config.mk
@@ -22,7 +22,9 @@ SANITIZERS    += -fsanitize=fuzzer
 endif
 KBUILD_CFLAGS  += $(SANITIZERS)
 
-cmd_u-boot__ = $(CC) -o $@ -Wl,-T u-boot.lds $(u-boot-init) \
+cmd_u-boot__ = \
+       touch $(u-boot-main) ; \
+       $(CC) -o $@ -Wl,-T u-boot.lds $(u-boot-init) \
        $(KBUILD_LDFLAGS:%=-Wl,%) \
        $(SANITIZERS) \
        $(LTO_FINAL_LDFLAGS) \
@@ -32,7 +34,9 @@ cmd_u-boot__ = $(CC) -o $@ -Wl,-T u-boot.lds $(u-boot-init) \
        -Wl,--no-whole-archive \
        $(PLATFORM_LIBS) -Wl,-Map -Wl,u-boot.map -Wl,--gc-sections
 
-cmd_u-boot-spl = (cd $(obj) && $(CC) -o $(SPL_BIN) -Wl,-T u-boot-spl.lds \
+cmd_u-boot-spl = (cd $(obj) && \
+       touch $(patsubst $(obj)/%,%,$(u-boot-spl-main)) && \
+       $(CC) -o $(SPL_BIN) -Wl,-T u-boot-spl.lds \
        $(KBUILD_LDFLAGS:%=-Wl,%) \
        $(SANITIZERS) \
        $(LTO_FINAL_LDFLAGS) \
diff --git a/scripts/Makefile.xpl b/scripts/Makefile.xpl
index dca5f4539d0..abc49fbe6c9 100644
--- a/scripts/Makefile.xpl
+++ b/scripts/Makefile.xpl
@@ -510,6 +510,7 @@ quiet_cmd_u-boot-spl ?= LTO     $@
       cmd_u-boot-spl ?= \
        (                                                                       
\
                cd $(obj) &&                                                    
\
+               touch $(patsubst $(obj)/%,%,$(u-boot-spl-main)) &&              
\
                $(CC) -nostdlib -nostartfiles $(LTO_FINAL_LDFLAGS) $(c_flags)   
\
                $(KBUILD_LDFLAGS:%=-Wl,%) $(LDFLAGS_$(@F):%=-Wl,%)              
\
                $(patsubst $(obj)/%,%,$(u-boot-spl-init))                       
\
@@ -526,6 +527,7 @@ quiet_cmd_u-boot-spl ?= LD      $@
       cmd_u-boot-spl ?= \
        (                                                               \
                cd $(obj) &&                                            \
+               touch $(patsubst $(obj)/%,%,$(u-boot-spl-main)) &&      \
                $(LD) $(KBUILD_LDFLAGS) $(LDFLAGS_$(@F))                \
                $(patsubst $(obj)/%,%,$(u-boot-spl-init))               \
                --whole-archive                                         \
-- 
2.45.2

Reply via email to