• Masahiro Yamada's avatar
    kbuild: fix endless syncconfig in case arch Makefile sets CROSS_COMPILE · 315bab4e
    Masahiro Yamada authored
    Commit 21c54b77 ("kconfig: show compiler version text in the top
    comment") was intended to detect the compiler upgrade, but Geert
    reported a breakage on the m68k build.
    
    The compiler upgrade is detected by the change of the environment
    variable, CC_VERSION_TEXT, which contains the first line of the output
    from $(CC) --version.  Currently, this works well when CROSS_COMPILE
    is given via the environment variable or the Make command line.
    
    However, some architectures such as m68k can specify CROSS_COMPILE
    from arch/$(SRCARCH)/Makefile as well.  In this case, "make ARCH=m68k"
    ends up with endless syncconfig loop.
    
      $ make ARCH=m68k defconfig
      *** Default configuration is based on 'multi_defconfig'
      #
      # configuration written to .config
      #
      $ make ARCH=m68k
      scripts/kconfig/conf  --syncconfig Kconfig
      scripts/kconfig/conf  --syncconfig Kconfig
      scripts/kconfig/conf  --syncconfig Kconfig
      scripts/kconfig/conf  --syncconfig Kconfig
    
    Things are happening like this:
    
    Because arch/$(SRCARCH)/Makefile is included after CC_VERSION_TEXT
    is set, it contains the host compiler version in the defconfig phase.
    
    To create or update auto.conf, the following line is triggered:
    
    include/config/%.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd
            $(Q)$(MAKE) -f $(srctree)/Makefile syncconfig
    
    This recurses the top Makefile after arch/$(SRCARCH)/Makefile is
    included.  CROSS_COMPILE is set to a m68k toolchain prefix and
    exported to the recursed Make.  Then, syncconfig is invoked with
    the target compiler version in CC_VERSION_TEXT.
    
    The Make will restart because auto.conf and auto.conf.cmd have been
    updated.  At this point, CROSS_COMPILE is reset, so CC_VERSION_TEXT
    is set to the host compiler version again.  Then, syncconfig is
    triggered due to the change of CC_VERSION_TEXT.  This loop continues
    eternally.
    
    To fix this problem, $(CC_VERSION_TEXT) must be evaluated only after
    arch/$(SRCARCH)/Makefile.  Setting it earlier is OK as long as it is
    defined by using the '=' operator instead of ':='.
    
    For the defconfig phase, $(CC_VERSION_TEXT) is evaluated when Kbuild
    descends into scripts/kconfig/, so it contains the target compiler
    version correctly.
    
    include/config/auto.conf.cmd references $(CC_VERSION_TEXT) as well,
    so it must be included after arch/$(SRCARCH)/Makefile.
    
    Fixes: 21c54b77 ("kconfig: show compiler version text in the top comment")
    Reported-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
    Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
    Tested-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
    315bab4e
Makefile 61.5 KB