All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrejs Cainikovs <andrejs.cainikovs@toradex.com>
To: Simon Glass <sjg@chromium.org>
Cc: U-Boot Mailing List <u-boot@lists.denx.de>,
	Tom Rini <trini@konsulko.com>,
	Alexey Brodkin <Alexey.Brodkin@synopsys.com>,
	Heinrich Schuchardt <xypron.glpk@gmx.de>,
	Quentin Schulz <quentin.schulz@cherry.de>
Subject: Re: [PATCH v3 4/6] buildman: Always use the full path in CROSS_COMPILE
Date: Tue, 25 Jun 2024 02:06:33 +0200	[thread overview]
Message-ID: <ZnoKCXS5+Z0tM7Wb@toradex.com> (raw)
In-Reply-To: <20240623175622.1468600-5-sjg@chromium.org>

On Sun, Jun 23, 2024 at 11:56:20AM -0600, Simon Glass wrote:
> The feature to set the toolchain path does not seem to be needed. It
> causes problems with venv (see [1]). Let's remove it.
> 
> Add some tests while we are here.
> 
> It does not look like any docs changes are needed for this.
> 
> [1] https://patchwork.ozlabs.org/project/uboot/patch/20240621131423.2363294-6-sjg@chromium.org/
> 
> Signed-off-by: Simon Glass <sjg@chromium.org>
> Suggested-by: Tom Rini <trini@konsulko.com>
> ---
> 
> Changes in v3:
> - Drop the PATH modification altogether
> 
>  tools/buildman/bsettings.py     |  3 ++
>  tools/buildman/builder.py       |  5 +--
>  tools/buildman/builderthread.py |  4 +-
>  tools/buildman/cmdline.py       |  2 -
>  tools/buildman/control.py       |  6 +--
>  tools/buildman/test.py          | 75 +++++++++++++++++++++++++++++++++
>  tools/buildman/toolchain.py     | 20 ++++-----
>  7 files changed, 92 insertions(+), 23 deletions(-)
> 
> diff --git a/tools/buildman/bsettings.py b/tools/buildman/bsettings.py
> index e225ac2ca0f..1be1d45e0fa 100644
> --- a/tools/buildman/bsettings.py
> +++ b/tools/buildman/bsettings.py
> @@ -31,6 +31,9 @@ def setup(fname=''):
>  def add_file(data):
>      settings.readfp(io.StringIO(data))
>  
> +def add_section(name):
> +    settings.add_section(name)
> +
>  def get_items(section):
>      """Get the items from a section of the config.
>  
> diff --git a/tools/buildman/builder.py b/tools/buildman/builder.py
> index f35175b4598..7c563cddada 100644
> --- a/tools/buildman/builder.py
> +++ b/tools/buildman/builder.py
> @@ -255,7 +255,7 @@ class Builder:
>  
>      def __init__(self, toolchains, base_dir, git_dir, num_threads, num_jobs,
>                   gnu_make='make', checkout=True, show_unknown=True, step=1,
> -                 no_subdirs=False, full_path=False, verbose_build=False,
> +                 no_subdirs=False, verbose_build=False,
>                   mrproper=False, per_board_out_dir=False,
>                   config_only=False, squash_config_y=False,
>                   warnings_as_errors=False, work_in_output=False,
> @@ -279,8 +279,6 @@ class Builder:
>              step: 1 to process every commit, n to process every nth commit
>              no_subdirs: Don't create subdirectories when building current
>                  source for a single board
> -            full_path: Return the full path in CROSS_COMPILE and don't set
> -                PATH
>              verbose_build: Run build with V=1 and don't use 'make -s'
>              mrproper: Always run 'make mrproper' when configuring
>              per_board_out_dir: Build in a separate persistent directory per
> @@ -336,7 +334,6 @@ class Builder:
>          self._step = step
>          self._error_lines = 0
>          self.no_subdirs = no_subdirs
> -        self.full_path = full_path
>          self.verbose_build = verbose_build
>          self.config_only = config_only
>          self.squash_config_y = squash_config_y
> diff --git a/tools/buildman/builderthread.py b/tools/buildman/builderthread.py
> index a8599c0bb2a..c23c3254d2d 100644
> --- a/tools/buildman/builderthread.py
> +++ b/tools/buildman/builderthread.py
> @@ -404,7 +404,7 @@ class BuilderThread(threading.Thread):
>                      the next incremental build
>          """
>          # Set up the environment and command line
> -        env = self.toolchain.MakeEnvironment(self.builder.full_path)
> +        env = self.toolchain.MakeEnvironment()
>          mkdir(out_dir)
>  
>          args, cwd, src_dir = self._build_args(brd, out_dir, out_rel_dir,
> @@ -569,7 +569,7 @@ class BuilderThread(threading.Thread):
>                  outf.write(f'{result.return_code}')
>  
>              # Write out the image and function size information and an objdump
> -            env = result.toolchain.MakeEnvironment(self.builder.full_path)
> +            env = result.toolchain.MakeEnvironment()
>              with open(os.path.join(build_dir, 'out-env'), 'wb') as outf:
>                  for var in sorted(env.keys()):
>                      outf.write(b'%s="%s"' % (var, env[var]))
> diff --git a/tools/buildman/cmdline.py b/tools/buildman/cmdline.py
> index 03211bd5aa5..5fda90508f2 100644
> --- a/tools/buildman/cmdline.py
> +++ b/tools/buildman/cmdline.py
> @@ -121,8 +121,6 @@ def add_after_m(parser):
>            help="Override host toochain to use for sandbox (e.g. 'clang-7')")
>      parser.add_argument('-Q', '--quick', action='store_true',
>            default=False, help='Do a rough build, with limited warning resolution')
> -    parser.add_argument('-p', '--full-path', action='store_true',
> -          default=False, help="Use full toolchain path in CROSS_COMPILE")
>      parser.add_argument('-P', '--per-board-out-dir', action='store_true',
>            default=False, help="Use an O= (output) directory per board rather than per thread")
>      parser.add_argument('--print-arch', action='store_true',
> diff --git a/tools/buildman/control.py b/tools/buildman/control.py
> index 8f6850c5211..3ca9e2e8761 100644
> --- a/tools/buildman/control.py
> +++ b/tools/buildman/control.py
> @@ -653,10 +653,8 @@ def do_buildman(args, toolchains=None, make_func=None, brds=None,
>      builder = Builder(toolchains, output_dir, git_dir,
>              args.threads, args.jobs, checkout=True,
>              show_unknown=args.show_unknown, step=args.step,
> -            no_subdirs=args.no_subdirs, full_path=args.full_path,
> -            verbose_build=args.verbose_build,
> -            mrproper=args.mrproper,
> -            per_board_out_dir=args.per_board_out_dir,
> +            no_subdirs=args.no_subdirs, verbose_build=args.verbose_build,
> +            mrproper=args.mrproper, per_board_out_dir=args.per_board_out_dir,
>              config_only=args.config_only,
>              squash_config_y=not args.preserve_config_y,
>              warnings_as_errors=args.warnings_as_errors,
> diff --git a/tools/buildman/test.py b/tools/buildman/test.py
> index f92add7a7c5..ae9963eed4f 100644
> --- a/tools/buildman/test.py
> +++ b/tools/buildman/test.py
> @@ -146,6 +146,7 @@ class TestBuild(unittest.TestCase):
>          self.toolchains.Add('arm-linux-gcc', test=False)
>          self.toolchains.Add('sparc-linux-gcc', test=False)
>          self.toolchains.Add('powerpc-linux-gcc', test=False)
> +        self.toolchains.Add('/path/to/aarch64-linux-gcc', test=False)

Sorry Simon, but me and others love to be consistent.

Best regards,
Andrejs.

>          self.toolchains.Add('gcc', test=False)
>  
>          # Avoid sending any output
> @@ -747,6 +748,80 @@ class TestBuild(unittest.TestCase):
>          self.assertEqual([
>              ['MARY="mary"', 'Missing expected line: CONFIG_MARY="mary"']], result)
>  
> +    def call_make_environment(self, tchn, in_env=None):
> +        """Call Toolchain.MakeEnvironment() and process the result
> +
> +        Args:
> +            tchn (Toolchain): Toolchain to use
> +            in_env (dict): Input environment to use, None to use current env
> +
> +        Returns:
> +            tuple:
> +                dict: Changes that MakeEnvironment has made to the environment
> +                    key: Environment variable that was changed
> +                    value: New value (for PATH this only includes components
> +                        which were added)
> +                str: Full value of the new PATH variable
> +        """
> +        env = tchn.MakeEnvironment(env=in_env)
> +
> +        # Get the original environment
> +        orig_env = dict(os.environb if in_env is None else in_env)
> +        orig_path = orig_env[b'PATH'].split(b':')
> +
> +        # Find new variables
> +        diff = dict((k, env[k]) for k in env if orig_env.get(k) != env[k])
> +
> +        # Find new / different path components
> +        diff_path = None
> +        new_path = None
> +        if b'PATH' in diff:
> +            new_path = diff[b'PATH'].split(b':')
> +            diff_paths = [p for p in new_path if p not in orig_path]
> +            diff_path = b':'.join(p for p in new_path if p not in orig_path)
> +            if diff_path:
> +                diff[b'PATH'] = diff_path
> +            else:
> +                del diff[b'PATH']
> +        return diff, new_path
> +
> +    def test_toolchain_env(self):
> +        """Test PATH and other environment settings for toolchains"""
> +        # Use a toolchain which has a path
> +        tchn = self.toolchains.Select('aarch64')
> +
> +        # Normal case
> +        diff = self.call_make_environment(tchn)[0]
> +        self.assertEqual(
> +            {b'CROSS_COMPILE': b'/path/to/aarch64-linux-', b'LC_ALL': b'C'},
> +            diff)
> +
> +        # When overriding the toolchain, only LC_ALL should be set
> +        tchn.override_toolchain = True
> +        diff = self.call_make_environment(tchn)[0]
> +        self.assertEqual({b'LC_ALL': b'C'}, diff)
> +
> +        # Test that virtualenv is handled correctly
> +        tchn.override_toolchain = False
> +        sys.prefix = '/some/venv'
> +        env = dict(os.environb)
> +        env[b'PATH'] = b'/some/venv/bin:other/things'
> +        tchn.path = '/my/path'
> +        diff, diff_path = self.call_make_environment(tchn, env)
> +
> +        self.assertNotIn(b'PATH', diff)
> +        self.assertEqual(None, diff_path)
> +        self.assertEqual(
> +            {b'CROSS_COMPILE': b'/my/path/aarch64-linux-', b'LC_ALL': b'C'},
> +            diff)
> +
> +        # Handle a toolchain wrapper
> +        tchn.path = ''
> +        bsettings.add_section('toolchain-wrapper')
> +        bsettings.set_item('toolchain-wrapper', 'my-wrapper', 'fred')
> +        diff = self.call_make_environment(tchn)[0]
> +        self.assertEqual(
> +            {b'CROSS_COMPILE': b'fred aarch64-linux-', b'LC_ALL': b'C'}, diff)
>  
>  if __name__ == "__main__":
>      unittest.main()
> diff --git a/tools/buildman/toolchain.py b/tools/buildman/toolchain.py
> index 324ad0e0821..739acf3ec53 100644
> --- a/tools/buildman/toolchain.py
> +++ b/tools/buildman/toolchain.py
> @@ -90,7 +90,7 @@ class Toolchain:
>          if self.arch == 'sandbox' and override_toolchain:
>              self.gcc = override_toolchain
>  
> -        env = self.MakeEnvironment(False)
> +        env = self.MakeEnvironment()
>  
>          # As a basic sanity check, run the C compiler with --version
>          cmd = [fname, '--version']
> @@ -172,7 +172,7 @@ class Toolchain:
>          else:
>              raise ValueError('Unknown arg to GetEnvArgs (%d)' % which)
>  
> -    def MakeEnvironment(self, full_path):
> +    def MakeEnvironment(self, env=None):
>          """Returns an environment for using the toolchain.
>  
>          This takes the current environment and adds CROSS_COMPILE so that
> @@ -188,25 +188,23 @@ class Toolchain:
>               569-570: surrogates not allowed
>  
>          Args:
> -            full_path: Return the full path in CROSS_COMPILE and don't set
> -                PATH
> +            env (dict of bytes): Original environment, used for testing
> +
>          Returns:
>              Dict containing the (bytes) environment to use. This is based on the
> -            current environment, with changes as needed to CROSS_COMPILE, PATH
> -            and LC_ALL.
> +            current environment, with changes as needed to CROSS_COMPILE and
> +            LC_ALL.
>          """
> -        env = dict(os.environb)
> +        env = dict(env or os.environb)
> +
>          wrapper = self.GetWrapper()
>  
>          if self.override_toolchain:
>              # We'll use MakeArgs() to provide this
>              pass
> -        elif full_path:
> +        else:
>              env[b'CROSS_COMPILE'] = tools.to_bytes(
>                  wrapper + os.path.join(self.path, self.cross))
> -        else:
> -            env[b'CROSS_COMPILE'] = tools.to_bytes(wrapper + self.cross)
> -            env[b'PATH'] = tools.to_bytes(self.path) + b':' + env[b'PATH']
>  
>          env[b'LC_ALL'] = b'C'
>  
> -- 
> 2.34.1
> 


  parent reply	other threads:[~2024-06-25  1:15 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-06-23 17:56 [PATCH v3 0/6] Add Binman code-coverage test to CI Simon Glass
2024-06-23 17:56 ` [PATCH v3 1/6] buildman: Add python3-coverage Simon Glass
2024-07-15 13:31   ` Simon Glass
2024-06-23 17:56 ` [PATCH v3 2/6] buildman: Add python3-pycryptodome Simon Glass
2024-07-15 13:31   ` Simon Glass
2024-06-23 17:56 ` [PATCH v3 3/6] buildman: Fix a few typos in toolchain code Simon Glass
2024-07-15 13:31   ` Simon Glass
2024-06-23 17:56 ` [PATCH v3 4/6] buildman: Always use the full path in CROSS_COMPILE Simon Glass
2024-06-24 15:49   ` Tom Rini
2024-06-25  0:06   ` Andrejs Cainikovs [this message]
2024-06-25 12:38     ` Simon Glass
2024-06-25 15:16       ` Andrejs Cainikovs
2024-06-26  8:00         ` Simon Glass
2024-06-26  8:43           ` Andrejs Cainikovs
2024-07-15 13:31             ` Simon Glass
2024-06-23 17:56 ` [PATCH v3 5/6] u_boot_pylib: Use correct coverage tool within venv Simon Glass
2024-07-15 13:31   ` Simon Glass
2024-06-23 17:56 ` [PATCH v3 6/6] CI: Run code-coverage test for Binman Simon Glass
2024-06-24 15:49   ` Tom Rini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ZnoKCXS5+Z0tM7Wb@toradex.com \
    --to=andrejs.cainikovs@toradex.com \
    --cc=Alexey.Brodkin@synopsys.com \
    --cc=quentin.schulz@cherry.de \
    --cc=sjg@chromium.org \
    --cc=trini@konsulko.com \
    --cc=u-boot@lists.denx.de \
    --cc=xypron.glpk@gmx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.