[U-Boot] [RFC PATCH] tools/buildman: Add env-flags section support
Simon Glass
sjg at chromium.org
Sat Aug 23 03:45:42 CEST 2014
Hi Tom,
On 22 August 2014 07:27, Tom Rini <trini at ti.com> wrote:
> In some cases (such as building little endian MIPS with the ELDK
> toolchain) you need to set a variable in the environment in order for
> the build to complete. Add env-flags, similar to make-flags, to allow
> for this.
>
> Signed-off-by: Tom Rini <trini at ti.com>
> ---
>
> I have this as RFC since GetEnvSettings is a copy/paste of
> GetMakeArguments and that tells me there must be a pythonic way of
> extending / renaming GetMakeArguments to take the dict to work from as
> an argument. And as per my other email, ${variable-board} doesn't work
> so the README is actually incorrect.
>
> tools/buildman/README | 24 +++++++++++++++++++++++
> tools/buildman/builderthread.py | 6 ++++++
> tools/buildman/toolchain.py | 40 +++++++++++++++++++++++++++++++++++++++
> 3 files changed, 70 insertions(+)
>
> diff --git a/tools/buildman/README b/tools/buildman/README
> index d4e8404..b513b81 100644
> --- a/tools/buildman/README
> +++ b/tools/buildman/README
> @@ -676,6 +676,30 @@ It is expected that any variables added are dealt with in U-Boot's
> config.mk file and documented in the README.
>
>
> +Providing key/value pairs to the environment
> +============================================
> +
> +U-Boot's build system supports a few environment variables (such as
> +CONFIG_USE_PRIVATE_LIBGCC) which affect the build product. These flags can be
> +specified in the buildman settings file. They can also be useful when building
> +U-Boot against other open source software.
> +
> +[env-flags]
> +mipsel-flags=CONFIG_USE_PRIVATE_LIBGCC=y
> +qemu_mipsel=${mipsel-flags}
> +maltael=${mipsel-flags}
> +pb1000=${mipsel-flags}
> +dbau1550_el=${mipsel-flags}
> +
> +This will set 'CONFIG_USE_PRIVATE_LIBGCC' to 'y' in the environment for
> +qemu_mipsel, maltael, pb100 and dbau1550_el. A special variable ${target} is
> +available to access the target name (qemu_mipsel, maltael, pb1000 and
> +dbau1550_el in this case). Variables are resolved recursively.
> +
> +It is expected that any variables added are dealt with in U-Boot's
> +config.mk file and documented in the README.
This should be equivalent to adding them on the 'make' command line.
Is there somethign else?
> +
> +
> Quick Sanity Check
> ==================
>
> diff --git a/tools/buildman/builderthread.py b/tools/buildman/builderthread.py
> index 8214662..920752c 100644
> --- a/tools/buildman/builderthread.py
> +++ b/tools/buildman/builderthread.py
> @@ -174,6 +174,12 @@ class BuilderThread(threading.Thread):
>
> # Set up the environment and command line
> env = self.toolchain.MakeEnvironment()
> +
> + # Add additional flags
> + for flag in self.builder.toolchains.GetEnvSettings(brd):
> + key_val = flag.split('=')
> + env[key_val[0]] = key_val[1]
> +
I would say move this code into the MakeEnvironment() function
mentioned above - that way the toolchain environment is all in one
place.
> Mkdir(out_dir)
> args = []
> cwd = work_dir
> diff --git a/tools/buildman/toolchain.py b/tools/buildman/toolchain.py
> index 1b9771f..1ab59b3 100644
> --- a/tools/buildman/toolchain.py
> +++ b/tools/buildman/toolchain.py
> @@ -111,6 +111,7 @@ class Toolchains:
> else:
> self.paths.append(value)
> self._make_flags = dict(bsettings.GetItems('make-flags'))
> + self._env_flags = dict(bsettings.GetItems('env-flags'))
>
> def Add(self, fname, test=True, verbose=False):
> """Add a toolchain to our list
> @@ -245,3 +246,42 @@ class Toolchains:
> else:
> i += 1
> return args
> +
> + def GetEnvSettings(self, board):
> + """Returns key=value pairs to set in the environment prior to 'make'
> +
> + The flags are in a section called 'env-flags'. Flags are named
> + after the target they represent, for example snapper9260=TESTING=1
> + will set TESTING to 1 in the environment prior to invoking make when
> + building the snapper9260 board.
> +
> + References to other boards can be added in the string also. For
> + example:
> +
> + [env-flags]
> + at91-boards=ENABLE_AT91_TEST=1
> + snapper9260=${at91-boards} BUILD_TAG=442
> + snapper9g45=${at91-boards} BUILD_TAG=443
> +
> + This will return 'ENABLE_AT91_TEST=1 BUILD_TAG=442' for snapper9260
> + and 'ENABLE_AT91_TEST=1 BUILD_TAG=443' for snapper9g45.
> +
> + A special 'target' variable is set to the board target.
> +
> + Args:
> + board: Board object for the board to check.
> + Returns:
> + key=value parts to set in the environment for that board, or ''
> + if none
> + """
> + self._env_flags['target'] = board.target
> + arg_str = self.ResolveReferences(self._env_flags,
> + self._env_flags.get(board.target, ''))
> + args = arg_str.split(' ')
> + i = 0
> + while i < len(args):
> + if not args[i]:
> + del args[i]
> + else:
> + i += 1
> + return args
Yes this could go in a common function. You can pass the dictionary to
it, and updates within the function will update the dictionary.
BTW I suppose we can replace the last 8 lines with something like:
return [arg for arg in arg_str.split(' ') if arg]
Regards,
Simon
More information about the U-Boot
mailing list