[U-Boot] [PATCH v4 01/10] moveconfig: Always run savedefconfig on the moved config

Masahiro Yamada yamada.masahiro at socionext.com
Tue May 19 03:58:02 CEST 2015


Hi Joe,

2015-05-16 6:40 GMT+09:00 Joe Hershberger <joe.hershberger at ni.com>:
> This will ensure that the order of the defconfig entries will always
> match that of the Kconfig files. After one slightly painful (but
> still early in the process) pass over all boards, this should keep
> the defconfigs clean from here on.
>
> Users must edit the Kconfig first to add the menu entries and then run
> moveconfig.py to update the defconfig files and the include configs.
>
> As such, moveconfig.py cannot compare against the '.config' contents.
>
> Signed-off-by: Joe Hershberger <joe.hershberger at ni.com>


This feature expects the defconfigs are all clean.
Otherwise, savedefconfig would make "git diff" noisier.

It is safer to use "make menuconfig && make savedefconfig"
for adding new options, but some people still try to
edit the defconfig directly...

Perhaps, should do the global cleanup periodically?


> ---
> This is based on https://patchwork.ozlabs.org/patch/472591/
>
> Changes in v4:
> -Rebased series on Masahiro's v2
>
> Changes in v3: None
> Changes in v2: None
>
>  tools/moveconfig.py | 35 ++++++++++++++++++++++++++---------
>  1 file changed, 26 insertions(+), 9 deletions(-)
>
> diff --git a/tools/moveconfig.py b/tools/moveconfig.py
> index c39ea95..544f6af 100755
> --- a/tools/moveconfig.py
> +++ b/tools/moveconfig.py
> @@ -46,6 +46,9 @@ should look like this:
>    CONFIG_CMD_USB bool n
>    CONFIG_SYS_TEXT_BASE hex 0x00000000
>
> +Next you must edit the Kconfig to add the menu entries for the configs
> +you are moving.
> +
>  And then run this tool giving the file name of the recipe

Uh, I was doing in a different work-flow.
(I edit the Kconfig after I move CONFIGs to defconfigs).

But, the Kconfig must be edited beforehand
to do savedefconfig.

So, I am OK with this change.



>    $ tools/moveconfig.py recipe
> @@ -192,6 +195,7 @@ CROSS_COMPILE = {
>  STATE_IDLE = 0
>  STATE_DEFCONFIG = 1
>  STATE_AUTOCONF = 2
> +STATE_SAVEDEFCONFIG = 3
>
>  ACTION_MOVE = 0
>  ACTION_DEFAULT_VALUE = 1
> @@ -390,8 +394,7 @@ class KconfigParser:
>
>          return CROSS_COMPILE.get(arch, '')
>
> -    def parse_one_config(self, config_attr, defconfig_lines,
> -                         dotconfig_lines, autoconf_lines):
> +    def parse_one_config(self, config_attr, defconfig_lines, autoconf_lines):
>          """Parse .config, defconfig, include/autoconf.mk for one config.
>
>          This function looks for the config options in the lines from
> @@ -402,7 +405,6 @@ class KconfigParser:
>            config_attr: A dictionary including the name, the type,
>                         and the default value of the target config.
>            defconfig_lines: lines from the original defconfig file.
> -          dotconfig_lines: lines from the .config file.
>            autoconf_lines: lines from the include/autoconf.mk file.
>
>          Returns:
> @@ -418,7 +420,7 @@ class KconfigParser:
>          else:
>              default = config + '=' + config_attr['default']
>
> -        for line in defconfig_lines + dotconfig_lines:
> +        for line in defconfig_lines:
>              line = line.rstrip()
>              if line.startswith(config + '=') or line == not_set:
>                  return (ACTION_ALREADY_EXIST, line)
> @@ -463,15 +465,12 @@ class KconfigParser:
>          with open(defconfig_path) as f:
>              defconfig_lines = f.readlines()
>
> -        with open(dotconfig_path) as f:
> -            dotconfig_lines = f.readlines()
> -
>          with open(autoconf_path) as f:
>              autoconf_lines = f.readlines()
>
>          for config_attr in self.config_attrs:
>              result = self.parse_one_config(config_attr, defconfig_lines,
> -                                           dotconfig_lines, autoconf_lines)
> +                                           autoconf_lines)
>              results.append(result)
>
>          log = ''


With the change of the work-flow above,
we need not parse the .config, so this seems OK.



> @@ -499,7 +498,7 @@ class KconfigParser:
>          print log,
>
>          if not self.options.dry_run:
> -            with open(defconfig_path, 'a') as f:
> +            with open(dotconfig_path, 'a') as f:
>                  for (action, value) in results:
>                      if action == ACTION_MOVE:
>                          f.write(value + '\n')
> @@ -608,6 +607,24 @@ class Slot:
>
>          if self.state == STATE_AUTOCONF:
>              self.parser.update_defconfig(self.defconfig)
> +
> +            """Save off the defconfig in a consistent way"""
> +            cmd = list(self.make_cmd)
> +            cmd.append('savedefconfig')
> +            self.ps = subprocess.Popen(cmd, stdout=self.devnull,
> +                                       stderr=self.devnull)
> +            self.state = STATE_SAVEDEFCONFIG
> +            return False
> +
> +        if self.state == STATE_SAVEDEFCONFIG:
> +            defconfig_path = os.path.join(self.build_dir, 'defconfig')
> +            if not os.path.exists(defconfig_path):
> +                print >> sys.stderr, log_msg(self.options.color,
> +                                             COLOR_LIGHT_RED,
> +                                             self.defconfig,
> +                                             'The defconfig was not updated')

Is this warning message reachable?

The missing defconfig means "make savedefconfig" failed.

That case has been already caught by 'Failed to process.' above, I think.


> +            shutil.move(defconfig_path,
> +                        os.path.join('configs', self.defconfig))
>              self.state = STATE_IDLE
>              return True





-- 
Best Regards
Masahiro Yamada


More information about the U-Boot mailing list