diff mbox series

[bitbake-devel] toaster: remove dependency on poky distro

Message ID IA1PR11MB76778274C592752D2D2E9993EACCA@IA1PR11MB7677.namprd11.prod.outlook.com
State New
Headers show
Series [bitbake-devel] toaster: remove dependency on poky distro | expand

Commit Message

Reyna, David Nov. 12, 2025, 8:27 a.m. UTC
From 12b96eba959f298bb8edcbcbd9b35a53d104ecea Mon Sep 17 00:00:00 2001
From: David Reyna <David.Reyna@windriver.com>
Date: Wed, 12 Nov 2025 00:04:24 -0800
Subject: [PATCH] toaster: remove dependency on poky distro

The poky distro is now stripped of its repositories. Toaster had used that
repo as both a quick way to get the three core layers (openembedded-code,
meta-poky, and meta-yocto-bsp) but also a way to get the related bitbake,
which was important because bitbake is not in the Layer Index. Now, Toaster
must explicitly clone each of the core layers plus the proper bitbake layer.

Notes on "orm/fixtures":
  * The "orm/fixtures" files used to hard code the three core layers to
    point to the poky distro, ignoring the Layer Index values
  * The script "lsupdates.py" is now allowed to use the Layer Index to
    properly initialize these layers.
  * The fixture files are still used because (a) they define the supported
    releases for Toaster, plus (b) they now define the proper bitbake repo
    path and branches to associate with the YP releases.
Notes on "localhostbecontroller.py":
  * Always insert the proper bitbake into the layer clone list
  * Insure that both 'BBBASEDIR' and 'BITBAKEDIR' are defined in the
    sub-shells so that oe-init finds the right bitbake (e.g.
    'oe-buildenv-internal')

[YOCTO #16012]

Signed-off-by: David Reyna <David.Reyna@windriver.com>
---
 .../bldcontrol/localhostbecontroller.py       | 67 ++++++++-----------
 lib/toaster/orm/fixtures/gen_fixtures.py      | 10 +--
 lib/toaster/orm/fixtures/poky.xml             | 38 +++++------
 .../orm/management/commands/lsupdates.py      |  6 +-
 4 files changed, 55 insertions(+), 66 deletions(-)
diff mbox series

Patch

diff --git a/lib/toaster/bldcontrol/localhostbecontroller.py b/lib/toaster/bldcontrol/localhostbecontroller.py
index 37b0a7519..dafda7e16 100644
--- a/lib/toaster/bldcontrol/localhostbecontroller.py
+++ b/lib/toaster/bldcontrol/localhostbecontroller.py
@@ -40,7 +40,8 @@  class LocalhostBEController(BuildEnvironmentController):
 
     def __init__(self, be):
         super(LocalhostBEController, self).__init__(be)
-        self.pokydirname = None
+        self.bitbake_dirname = None
+        self.oecore_dirname = None
         self.islayerset = False
 
     def _shellcmd(self, command, cwd=None, nowait=False,env=None):
@@ -100,7 +101,7 @@  class LocalhostBEController(BuildEnvironmentController):
         # 1. get a list of repos with branches, and map dirpaths for each layer
         gitrepos = {}
 
-        # if we're using a remotely fetched version of bitbake add its git
+        # We are using a remotely fetched version of bitbake - add its git
         # details to the list of repos to clone
         if bitbake.giturl and bitbake.commit:
             gitrepos[(bitbake.giturl, bitbake.commit)] = []
@@ -154,12 +155,20 @@  class LocalhostBEController(BuildEnvironmentController):
         clone_total=len(gitrepos.keys())
         self.setCloneStatus(bitbake,'Started',clone_total,clone_count,'')
         for giturl, commit in gitrepos.keys():
-            self.setCloneStatus(bitbake,'progress',clone_total,clone_count,gitrepos[(giturl, commit)][0][0])
+            layer_name = gitrepos[(giturl, commit)][0][0]
+            self.setCloneStatus(bitbake,'progress',clone_total,clone_count,layer_name)
             clone_count += 1
 
             localdirname = os.path.join(self.be.sourcedir, self.getGitCloneDirectory(giturl, commit))
             logger.debug("localhostbecontroller: giturl %s:%s checking out in current directory %s" % (giturl, commit, localdirname))
 
+            # Capture local paths to release's bitbake and openembedded-core layers
+            if 'bitbake' == layer_name:
+                self.bitbake_dirname = localdirname
+            # Capture local path to release's openembedded-core layer (for 'oe-init-build-env')
+            if 'openembedded-core' == layer_name:
+                self.oecore_dirname = localdirname
+
             # see if our directory is a git repository
             if os.path.exists(localdirname):
                 try:
@@ -192,16 +201,6 @@  class LocalhostBEController(BuildEnvironmentController):
                 # prevent inserted debugging commands from being lost
                 self._shellcmd('git fetch && git reset --hard "%s"' % ref, localdirname,env=git_env)
 
-            # take the localdirname as poky dir if we can find the oe-init-build-env
-            if self.pokydirname is None and os.path.exists(os.path.join(localdirname, "oe-init-build-env")):
-                logger.debug("localhostbecontroller: selected poky dir name %s" % localdirname)
-                self.pokydirname = localdirname
-
-                # make sure we have a working bitbake
-                if not os.path.exists(os.path.join(self.pokydirname, 'bitbake')):
-                    logger.debug("localhostbecontroller: checking bitbake into the poky dirname %s " % self.pokydirname)
-                    self._shellcmd("git clone -b \"%s\" \"%s\" \"%s\" " % (bitbake.commit, bitbake.giturl, os.path.join(self.pokydirname, 'bitbake')),env=git_env)
-
             # verify our repositories
             for name, dirpath, index in gitrepos[(giturl, commit)]:
                 localdirpath = os.path.join(localdirname, dirpath)
@@ -215,21 +214,11 @@  class LocalhostBEController(BuildEnvironmentController):
         self.setCloneStatus(bitbake,'complete',clone_total,clone_count,'')
         logger.debug("localhostbecontroller: current layer list %s " % pformat(layerlist))
 
-        # Resolve self.pokydirname if not resolved yet, consider the scenario
-        # where all layers are local, that's the else clause
-        if self.pokydirname is None:
-            if os.path.exists(os.path.join(self.be.sourcedir, "oe-init-build-env")):
-                logger.debug("localhostbecontroller: selected poky dir name %s" % self.be.sourcedir)
-                self.pokydirname = self.be.sourcedir
-            else:
-                # Alternatively, scan local layers for relative "oe-init-build-env" location
-                for layer in layers:
-                    if os.path.exists(os.path.join(layer.layer_version.layer.local_source_dir,"..","oe-init-build-env")):
-                        logger.debug("localhostbecontroller, setting pokydirname to %s" % (layer.layer_version.layer.local_source_dir))
-                        self.pokydirname = os.path.join(layer.layer_version.layer.local_source_dir,"..")
-                        break
-                else:
-                    logger.error("pokydirname is not set, you will run into trouble!")
+        # If self.bitbake_dirname still missing (e.g. 'local' build), use local bitbake
+        if not self.bitbake_dirname:
+            self.bitbake_dirname = os.environ.get('BBBASEDIR','')
+        if not self.bitbake_dirname:
+            logger.error("bitbake_dirname is not set, you will run into trouble!")
 
         # 5. create custom layer and add custom recipes to it
         for target in targets:
@@ -352,8 +341,11 @@  class LocalhostBEController(BuildEnvironmentController):
         try:
             # insure that the project init/build uses the selected bitbake, and not Toaster's
             del git_env['TEMPLATECONF']
-            del git_env['BBBASEDIR']
             del git_env['BUILDDIR']
+            # Insure that oe-init finds the right bitbake (e.g. 'oe-buildenv-internal')
+            git_env['BBBASEDIR'] = self.bitbake_dirname
+            git_env['BITBAKEDIR'] = self.bitbake_dirname
+
         except KeyError:
             pass
 
@@ -362,7 +354,7 @@  class LocalhostBEController(BuildEnvironmentController):
             builddir = bitbake.req.project.builddir
         else:
             builddir = '%s-toaster-%d' % (self.be.builddir, bitbake.req.project.id)
-        oe_init = os.path.join(self.pokydirname, 'oe-init-build-env')
+        oe_init = os.path.join(self.oecore_dirname, 'oe-init-build-env')
         setup_init = os.path.join(builddir, 'init-build-env')
         # init build environment and build directory structure
         try:
@@ -376,7 +368,7 @@  class LocalhostBEController(BuildEnvironmentController):
                 os.makedirs(builddir, exist_ok = True)
                 build_init_script = os.path.join(builddir,'init-build-env')
                 os.system(f"cp {os.path.join(toaster_run_dir,'init-build-env')} {build_init_script}")
-                os.system(f"sed -i -e 's|^cd .*$|cd {self.pokydirname}|g' {build_init_script}")
+                os.system(f"sed -i -e 's|^cd .*$|cd {self.oecore_dirname}|g' {build_init_script}")
                 os.system(f"sed -i -e 's|^set .*$|set {builddir}|g' {build_init_script}")
                 # Execute the init
                 self._shellcmd(f"bash -c 'source {build_init_script}'", env=git_env)
@@ -476,10 +468,10 @@  class LocalhostBEController(BuildEnvironmentController):
 
         # run bitbake server from the clone if available
         # otherwise pick it from the PATH
-        bitbake = os.path.join(self.pokydirname, 'bitbake', 'bin', 'bitbake')
+        bitbake = os.path.join(self.bitbake_dirname, 'bin', 'bitbake')
         if not os.path.exists(bitbake):
             logger.info("Bitbake not available under %s, will try to use it from PATH" %
-                        self.pokydirname)
+                        self.bitbake_dirname)
             for path in os.environ["PATH"].split(os.pathsep):
                 if os.path.exists(os.path.join(path, 'bitbake')):
                     bitbake = os.path.join(path, 'bitbake')
@@ -494,18 +486,18 @@  class LocalhostBEController(BuildEnvironmentController):
             # Use 'init-build-env' model
             if not is_merged_attr:
                 self._shellcmd(f'{env_clean} bash -c \"source {setup_init}; BITBAKE_UI="knotty" {bitbake} --read {confpath} --read {bblayers} --read {toasterlayers} '
-                               '--server-only -B 0.0.0.0:0\"', self.be.sourcedir)
+                               '--server-only -B 0.0.0.0:0\"', self.be.sourcedir,env=git_env)
             else:
                 self._shellcmd(f'{env_clean} bash -c \"source {setup_init}; BITBAKE_UI="knotty" {bitbake} '
-                           '--server-only -B 0.0.0.0:0\"', self.be.sourcedir)
+                           '--server-only -B 0.0.0.0:0\"', self.be.sourcedir,env=git_env)
         else:
             # Use 'oe-init-build-env' model
             if not is_merged_attr:
                 self._shellcmd(f'{env_clean} bash -c \"source {oe_init} {builddir}; BITBAKE_UI="knotty" {bitbake} --read {confpath} --read {bblayers} --read {toasterlayers} '
-                               '--server-only -B 0.0.0.0:0\"', self.be.sourcedir)
+                               '--server-only -B 0.0.0.0:0\"', self.be.sourcedir,env=git_env)
             else:
                 self._shellcmd(f'{env_clean} bash -c \"source {oe_init} {builddir}; BITBAKE_UI="knotty" {bitbake} '
-                           '--server-only -B 0.0.0.0:0\"', self.be.sourcedir)
+                           '--server-only -B 0.0.0.0:0\"', self.be.sourcedir,env=git_env)
 
         # read port number from bitbake.lock
         self.be.bbport = -1
@@ -551,7 +543,6 @@  class LocalhostBEController(BuildEnvironmentController):
         log = os.path.join(builddir, 'toaster_ui.log')
         local_bitbake = os.path.join(os.path.dirname(os.getenv('BBBASEDIR')),
                                      'bitbake')
-
         if not is_merged_attr:
             self._shellcmd([f'{env_clean} bash -c \"(TOASTER_BRBE="{brbe}" BBSERVER="0.0.0.0:{self.be.bbport}" '
                         f'{bitbake} {bbtargets} -u toasterui  --read {confpath} --read {bblayers} --read {toasterlayers} --token="" >>{log} 2>&1;'
diff --git a/lib/toaster/orm/fixtures/gen_fixtures.py b/lib/toaster/orm/fixtures/gen_fixtures.py
index 6201f679b..c5b0ab7a7 100755
--- a/lib/toaster/orm/fixtures/gen_fixtures.py
+++ b/lib/toaster/orm/fixtures/gen_fixtures.py
@@ -32,7 +32,7 @@  verbose = False
 # It is also policy to include all active LTS releases.
 #
 
-# [Codename, Yocto Project Version, Release Date, Current Version, Support Level, Poky Version, BitBake branch]
+# [0=Codename, 1=Yocto Project Version, 2=Release Date, 3=Current Version, 4=Support Level, 5=Poky Version, 6=BitBake branch]
 current_releases = [
     # Release slot #1
     ['Scarthgap','5.0','April 2024','5.0.0 (April 2024)','Long Term Support (until April 2028)','','2.8'],
@@ -43,7 +43,7 @@  current_releases = [
     # Release slot #4
     ['Whinlatter','5.3','October 2025','5.3.0 (October 2024)','Support for 7 months (until May 2026)','','2.14'],
     ['Walnascar','5.2','April 2025','5.2.0 (April 2025)','Support for 7 months (until October 2025)','','2.12'],
-    #['Styhead','5.1','November 2024','5.1.0 (November 2024)','Support for 7 months (until May 2025)','','2.10'],
+    ['Styhead','5.1','November 2024','5.1.0 (November 2024)','Support for 7 months (until May 2025)','','2.10'],
     #['Nanbield','4.3','November 2023','4.3.0 (November 2023)','Support for 7 months (until May 2024)','','2.6'],
     #['Mickledore','4.2','April 2023','4.2.0 (April 2023)','Support for 7 months (until October 2023)','','2.4'],
     #['Langdale','4.1','October 2022','4.1.2 (January 2023)','Support for 7 months (until May 2023)','','2.2'],
@@ -81,9 +81,9 @@  prolog_template = '''\
 bitbakeversion_poky_template = '''\
   <object model="orm.bitbakeversion" pk="{{bitbake_id}}">
     <field type="CharField" name="name">{{name}}</field>
-    <field type="CharField" name="giturl">git://git.yoctoproject.org/poky</field>
+    <field type="CharField" name="giturl">git://git.openembedded.org/bitbake</field>
     <field type="CharField" name="branch">{{branch}}</field>
-    <field type="CharField" name="dirpath">bitbake</field>
+    <field type="CharField" name="dirpath"></field>
   </object>
 '''
 bitbakeversion_oecore_template = '''\
@@ -224,7 +224,7 @@  def generate_poky():
             params['release'] = params['release'][0].lower() + params['release'][1:]
         params['name'] = params['release']
         params['bitbake_id'] = str(i+1)
-        params['branch'] = params['release']
+        params['branch'] = release[6]   # Bitbake branch
         print_template(bitbakeversion_poky_template,params,fd)
     print_str('',fd)
 
diff --git a/lib/toaster/orm/fixtures/poky.xml b/lib/toaster/orm/fixtures/poky.xml
index 6cf4f0687..34b83e971 100644
--- a/lib/toaster/orm/fixtures/poky.xml
+++ b/lib/toaster/orm/fixtures/poky.xml
@@ -9,45 +9,45 @@ 
   <!-- Bitbake versions which correspond to the metadata release -->
   <object model="orm.bitbakeversion" pk="1">
     <field type="CharField" name="name">scarthgap</field>
-    <field type="CharField" name="giturl">git://git.yoctoproject.org/poky</field>
-    <field type="CharField" name="branch">scarthgap</field>
-    <field type="CharField" name="dirpath">bitbake</field>
+    <field type="CharField" name="giturl">git://git.openembedded.org/bitbake</field>
+    <field type="CharField" name="branch">2.8</field>
+    <field type="CharField" name="dirpath"></field>
   </object>
   <object model="orm.bitbakeversion" pk="2">
     <field type="CharField" name="name">HEAD</field>
-    <field type="CharField" name="giturl">git://git.yoctoproject.org/poky</field>
+    <field type="CharField" name="giturl">git://git.openembedded.org/bitbake</field>
     <field type="CharField" name="branch">HEAD</field>
-    <field type="CharField" name="dirpath">bitbake</field>
+    <field type="CharField" name="dirpath"></field>
   </object>
   <object model="orm.bitbakeversion" pk="3">
     <field type="CharField" name="name">master</field>
-    <field type="CharField" name="giturl">git://git.yoctoproject.org/poky</field>
+    <field type="CharField" name="giturl">git://git.openembedded.org/bitbake</field>
     <field type="CharField" name="branch">master</field>
-    <field type="CharField" name="dirpath">bitbake</field>
+    <field type="CharField" name="dirpath"></field>
   </object>
   <object model="orm.bitbakeversion" pk="4">
     <field type="CharField" name="name">whinlatter</field>
-    <field type="CharField" name="giturl">git://git.yoctoproject.org/poky</field>
-    <field type="CharField" name="branch">whinlatter</field>
-    <field type="CharField" name="dirpath">bitbake</field>
+    <field type="CharField" name="giturl">git://git.openembedded.org/bitbake</field>
+    <field type="CharField" name="branch">2.14</field>
+    <field type="CharField" name="dirpath"></field>
   </object>
   <object model="orm.bitbakeversion" pk="5">
     <field type="CharField" name="name">walnascar</field>
-    <field type="CharField" name="giturl">git://git.yoctoproject.org/poky</field>
-    <field type="CharField" name="branch">walnascar</field>
-    <field type="CharField" name="dirpath">bitbake</field>
+    <field type="CharField" name="giturl">git://git.openembedded.org/bitbake</field>
+    <field type="CharField" name="branch">2.12</field>
+    <field type="CharField" name="dirpath"></field>
   </object>
   <object model="orm.bitbakeversion" pk="6">
     <field type="CharField" name="name">styhead</field>
-    <field type="CharField" name="giturl">git://git.yoctoproject.org/poky</field>
-    <field type="CharField" name="branch">styhead</field>
-    <field type="CharField" name="dirpath">bitbake</field>
+    <field type="CharField" name="giturl">git://git.openembedded.org/bitbake</field>
+    <field type="CharField" name="branch">2.10</field>
+    <field type="CharField" name="dirpath"></field>
   </object>
   <object model="orm.bitbakeversion" pk="7">
     <field type="CharField" name="name">kirkstone</field>
-    <field type="CharField" name="giturl">git://git.yoctoproject.org/poky</field>
-    <field type="CharField" name="branch">kirkstone</field>
-    <field type="CharField" name="dirpath">bitbake</field>
+    <field type="CharField" name="giturl">git://git.openembedded.org/bitbake</field>
+    <field type="CharField" name="branch">2.0</field>
+    <field type="CharField" name="dirpath"></field>
   </object>
 
 
diff --git a/lib/toaster/orm/management/commands/lsupdates.py b/lib/toaster/orm/management/commands/lsupdates.py
index 6d64830eb..0ee00aa15 100644
--- a/lib/toaster/orm/management/commands/lsupdates.py
+++ b/lib/toaster/orm/management/commands/lsupdates.py
@@ -138,9 +138,7 @@  class Command(BaseCommand):
                 l.summary = index.layerItems[id].summary
                 l.description = index.layerItems[id].description
 
-                if created:
-                    # predefined layers in the fixtures (for example poky.xml)
-                    # always preempt the Layer Index for these values
+                if True: # (if created:) always override fixture defaults now that poky distro is stripped
                     l.vcs_url = index.layerItems[id].vcs_url
                     l.vcs_web_url = index.layerItems[id].vcs_web_url
                     l.vcs_web_tree_base_url = index.layerItems[id].vcs_web_tree_base_url
@@ -179,7 +177,7 @@  class Command(BaseCommand):
                     index.layerBranches[id].layer_id)
                 continue
 
-            if created:
+            if True: # (if created:) always override fixture defaults now that poky distro is stripped
                 lv.release = li_branch_id_to_toaster_release[index.layerBranches[id].branch_id]
                 lv.up_date = index.layerBranches[id].updated
                 lv.commit = index.layerBranches[id].actual_branch