• Masahiro Yamada's avatar
    kbuild: change if_changed_rule for multi-line recipe · 3a2429e1
    Masahiro Yamada authored
    
    
    The 'define' ... 'endef' directive is useful to confine a series of
    shell commands into a single macro:
    
      define foo
              [action1]
              [action2]
              [action3]
      endif
    
    Each action is executed in a separate subshell.
    
    However, rule_cc_o_c and rule_as_o_S in scripts/Makefile.build are
    written as follows (with a trailing semicolon in each cmd_*):
    
      define rule_cc_o_c
              [action1] ; \
              [action2] ; \
              [action3] ;
      endef
    
    All shell commands are concatenated with '; \' so that it looks like
    a single command from the Makefile point of view. This does not
    exploit the benefits of 'define' ... 'endef' form because a single
    shell command can be more simply written, like this:
    
      rule_cc_o_c = \
              [action1] ; \
              [action2] ; \
              [action3] ;
    
    I guess the intention for the command concatenation was to let the
    '@set -e' in if_changed_rule cover all the commands.
    
    We can improve the readability by moving '@set -e' to the 'cmd' macro.
    The combo of $(call echo-cmd,*) $(cmd_*) in rule_cc_o_c and rule_as_o_S
    have been replaced with $(call cmd,*). The trailing back-slashes have
    been removed.
    
    Here is a note about the performance: the commands in rule_cc_o_c and
    rule_as_o_S were previously executed all together in a single subshell,
    but now each line in a separate subshell. This means Make will spawn
    extra subshells [1]. I measured the build performance for
      x86_64_defconfig + CONFIG_MODVERSIONS + CONFIG_TRIM_UNUSED_KSYMS
    and I saw slight performance regression, but I believe code readability
    and maintainability wins.
    
    [1] Precisely, GNU Make may optimize this by executing the command
        directly instead of forking a subshell, if no shell special
        characters are found in the command line and omitting the subshell
        will not change the behavior.
    
    Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
    3a2429e1