Skip to content
  • Masahiro Yamada's avatar
    scripts/setlocalversion: clear local variable to make it work for sh · 7a82e3fa
    Masahiro Yamada authored
    Geert Uytterhoeven reports a strange side-effect of commit 858805b3
    ("kbuild: add $(BASH) to run scripts with bash-extension"), which
    inserts the contents of a localversion file in the build directory twice.
    
    [Steps to Reproduce]
      $ echo bar > localversion
      $ mkdir build
      $ cd build/
      $ echo foo > localversion
      $ make -s -f ../Makefile defconfig include/config/kernel.release
      $ cat include/config/kernel.release
      5.4.0-rc1foofoobar
    
    This comes down to the behavior change of local variables.
    
    The 'man sh' on my Ubuntu machine, where sh is an alias to dash,
    explains as follows:
      When a variable is made local, it inherits the initial value and
      exported and readonly flags from the variable with the same name
      in the surrounding scope, if there is one. Otherwise, the variable
      is initially unset.
    
    [Test Code]
    
      foo ()
      {
              local res
              echo "res: $res"
      }
    
      res=1
      foo
    
    [Result]
    
      $ sh test.sh
      res: 1
      $ bash test.sh
      res:
    
    So, scripts/setlocalversion correctly works only for bash in spite of
    its hashbang being #!/bin/sh. Nobody had noticed it before because
    CONFIG_SHELL was previously set to bash almost all the time.
    
    Now that CONFIG_SHELL is set to sh, we must write portable and correct
    code. I gave the Fixes tag to the commit that uncovered the issue.
    
    Clear the variable 'res' in collect_files() to make it work for sh
    (and it also works on distributions where sh is an alias to bash).
    
    Fixes: 858805b3
    
     ("kbuild: add $(BASH) to run scripts with bash-extension")
    Reported-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
    Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
    Tested-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
    7a82e3fa