diff mbox series

[whinlatter,18/19] devtool: deploy: Run pseudo with correct PATH

Message ID 2e0afe1da33fbe353182ba63760d7d3e5420dbff.1770968514.git.yoann.congal@smile.fr
State RFC
Delegated to: Yoann Congal
Headers show
Series [whinlatter,01/19] linux-yocto/6.12: update to v6.12.69 | expand

Commit Message

Yoann Congal Feb. 13, 2026, 8:08 a.m. UTC
From: Paul Barker <paul@pbarker.dev>

When running FAKEROOTCMD (i.e. pseudo), we need to use the same PATH as
we would use if we were running inside bitbake instead of the host
environment's PATH. This ensures that we don't pick up any host
executables that may have problems with pseudo (such as the uutils
implementations of common system utilities used in Ubuntu 25.10).

Signed-off-by: Paul Barker <paul@pbarker.dev>
Signed-off-by: Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
(cherry picked from commit 1551136333876ab8a63e96430a498dcfa580265c)
Signed-off-by: Yoann Congal <yoann.congal@smile.fr>
---
 scripts/lib/devtool/__init__.py | 3 ++-
 scripts/lib/devtool/deploy.py   | 6 +++---
 2 files changed, 5 insertions(+), 4 deletions(-)

Comments

Yoann Congal Feb. 13, 2026, 9:37 a.m. UTC | #1
On Fri Feb 13, 2026 at 9:08 AM CET, Yoann Congal wrote:
> From: Paul Barker <paul@pbarker.dev>
>
> When running FAKEROOTCMD (i.e. pseudo), we need to use the same PATH as
> we would use if we were running inside bitbake instead of the host
> environment's PATH. This ensures that we don't pick up any host
> executables that may have problems with pseudo (such as the uutils
> implementations of common system utilities used in Ubuntu 25.10).
>
> Signed-off-by: Paul Barker <paul@pbarker.dev>
> Signed-off-by: Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com>
> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
> (cherry picked from commit 1551136333876ab8a63e96430a498dcfa580265c)
> Signed-off-by: Yoann Congal <yoann.congal@smile.fr>
> ---
>  scripts/lib/devtool/__init__.py | 3 ++-
>  scripts/lib/devtool/deploy.py   | 6 +++---
>  2 files changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/scripts/lib/devtool/__init__.py b/scripts/lib/devtool/__init__.py
> index 969d6dc13ab..7c8de5540c1 100644
> --- a/scripts/lib/devtool/__init__.py
> +++ b/scripts/lib/devtool/__init__.py
> @@ -74,12 +74,13 @@ def exec_watch(cmd, **options):
>  
>      return buf, None
>  
> -def exec_fakeroot_no_d(fakerootcmd, fakerootenv, cmd, **kwargs):
> +def exec_fakeroot_no_d(fakerootcmd, fakerootenv, path, cmd, **kwargs):

As a heads-up, this changes the exec_fakeroot_no_d() API. But, I
discussed this with Paul:
* We think this is an internal API (behind the more public
  deploy_no_d())
* And, if this breaks existing code, the change to adapt is trivial.

Regards,

>      if not os.path.exists(fakerootcmd):
>          logger.error('pseudo executable %s could not be found - have you run a build yet? pseudo-native should install this and if you have run any build then that should have been built')
>          return 2
>      # Set up the appropriate environment
>      newenv = dict(os.environ)
> +    newenv['PATH'] = path
>      for varvalue in fakerootenv.split():
>          if '=' in varvalue:
>              splitval = varvalue.split('=', 1)
> diff --git a/scripts/lib/devtool/deploy.py b/scripts/lib/devtool/deploy.py
> index a98b33c5718..2bf693d165a 100644
> --- a/scripts/lib/devtool/deploy.py
> +++ b/scripts/lib/devtool/deploy.py
> @@ -186,8 +186,8 @@ def deploy_no_d(srcdir, workdir, path, strip_cmd, libdir, base_libdir, max_proce
>          srcdir = recipe_outdir
>          recipe_outdir = os.path.join(workdir, 'devtool-deploy-target-stripped')
>          if os.path.isdir(recipe_outdir):
> -            exec_fakeroot_no_d(fakerootcmd, fakerootenv, "rm -rf %s" % recipe_outdir, shell=True)
> -        exec_fakeroot_no_d(fakerootcmd, fakerootenv, "cp -af %s %s" % (os.path.join(srcdir, '.'), recipe_outdir), shell=True)
> +            exec_fakeroot_no_d(fakerootcmd, fakerootenv, path, "rm -rf %s" % recipe_outdir, shell=True)
> +        exec_fakeroot_no_d(fakerootcmd, fakerootenv, path, "cp -af %s %s" % (os.path.join(srcdir, '.'), recipe_outdir), shell=True)
>          os.environ['PATH'] = ':'.join([os.environ['PATH'], path or ''])
>          oe.package.strip_execs(args.recipename, recipe_outdir, strip_cmd, libdir, base_libdir, max_process)
>  
> @@ -266,7 +266,7 @@ def deploy_no_d(srcdir, workdir, path, strip_cmd, libdir, base_libdir, max_proce
>          shutil.rmtree(tmpdir)
>  
>      # Now run the script
> -    ret = exec_fakeroot_no_d(fakerootcmd, fakerootenv, 'tar cf - . | %s  %s %s %s \'sh %s %s %s %s\'' % (ssh_sshexec, ssh_port, extraoptions, args.target, tmpscript, args.recipename, destdir, tmpfilelist), cwd=recipe_outdir, shell=True)
> +    ret = exec_fakeroot_no_d(fakerootcmd, fakerootenv, path, 'tar cf - . | %s  %s %s %s \'sh %s %s %s %s\'' % (ssh_sshexec, ssh_port, extraoptions, args.target, tmpscript, args.recipename, destdir, tmpfilelist), cwd=recipe_outdir, shell=True)
>      if ret != 0:
>          raise DevtoolError('Deploy failed - rerun with -s to get a complete '
>                          'error message')
diff mbox series

Patch

diff --git a/scripts/lib/devtool/__init__.py b/scripts/lib/devtool/__init__.py
index 969d6dc13ab..7c8de5540c1 100644
--- a/scripts/lib/devtool/__init__.py
+++ b/scripts/lib/devtool/__init__.py
@@ -74,12 +74,13 @@  def exec_watch(cmd, **options):
 
     return buf, None
 
-def exec_fakeroot_no_d(fakerootcmd, fakerootenv, cmd, **kwargs):
+def exec_fakeroot_no_d(fakerootcmd, fakerootenv, path, cmd, **kwargs):
     if not os.path.exists(fakerootcmd):
         logger.error('pseudo executable %s could not be found - have you run a build yet? pseudo-native should install this and if you have run any build then that should have been built')
         return 2
     # Set up the appropriate environment
     newenv = dict(os.environ)
+    newenv['PATH'] = path
     for varvalue in fakerootenv.split():
         if '=' in varvalue:
             splitval = varvalue.split('=', 1)
diff --git a/scripts/lib/devtool/deploy.py b/scripts/lib/devtool/deploy.py
index a98b33c5718..2bf693d165a 100644
--- a/scripts/lib/devtool/deploy.py
+++ b/scripts/lib/devtool/deploy.py
@@ -186,8 +186,8 @@  def deploy_no_d(srcdir, workdir, path, strip_cmd, libdir, base_libdir, max_proce
         srcdir = recipe_outdir
         recipe_outdir = os.path.join(workdir, 'devtool-deploy-target-stripped')
         if os.path.isdir(recipe_outdir):
-            exec_fakeroot_no_d(fakerootcmd, fakerootenv, "rm -rf %s" % recipe_outdir, shell=True)
-        exec_fakeroot_no_d(fakerootcmd, fakerootenv, "cp -af %s %s" % (os.path.join(srcdir, '.'), recipe_outdir), shell=True)
+            exec_fakeroot_no_d(fakerootcmd, fakerootenv, path, "rm -rf %s" % recipe_outdir, shell=True)
+        exec_fakeroot_no_d(fakerootcmd, fakerootenv, path, "cp -af %s %s" % (os.path.join(srcdir, '.'), recipe_outdir), shell=True)
         os.environ['PATH'] = ':'.join([os.environ['PATH'], path or ''])
         oe.package.strip_execs(args.recipename, recipe_outdir, strip_cmd, libdir, base_libdir, max_process)
 
@@ -266,7 +266,7 @@  def deploy_no_d(srcdir, workdir, path, strip_cmd, libdir, base_libdir, max_proce
         shutil.rmtree(tmpdir)
 
     # Now run the script
-    ret = exec_fakeroot_no_d(fakerootcmd, fakerootenv, 'tar cf - . | %s  %s %s %s \'sh %s %s %s %s\'' % (ssh_sshexec, ssh_port, extraoptions, args.target, tmpscript, args.recipename, destdir, tmpfilelist), cwd=recipe_outdir, shell=True)
+    ret = exec_fakeroot_no_d(fakerootcmd, fakerootenv, path, 'tar cf - . | %s  %s %s %s \'sh %s %s %s %s\'' % (ssh_sshexec, ssh_port, extraoptions, args.target, tmpscript, args.recipename, destdir, tmpfilelist), cwd=recipe_outdir, shell=True)
     if ret != 0:
         raise DevtoolError('Deploy failed - rerun with -s to get a complete '
                         'error message')