diff mbox series

[v3] bitbake-layers: Support add-layer to prepend

Message ID 20240509110400.1093934-1-hieu2.nguyen@lge.com
State New
Headers show
Series [v3] bitbake-layers: Support add-layer to prepend | expand

Commit Message

Hieu Van Nguyen May 9, 2024, 11:04 a.m. UTC
From: Hieu Van Nguyen <hieu2.nguyen@lge.com>

As you know, layer order in BBLAYERS can affect in parsing recipes process,
in some cases, users want to add a layer on the top of BBLAYERS variable

So, add "--prepend" option for bitbake-layers to support add-layer to prepend

Signed-off-by: Hieu Van Nguyen <hieu2.nguyen@lge.com>
---
v3: fix From:
 lib/bb/utils.py        | 8 ++++++--
 lib/bblayers/action.py | 3 ++-
 2 files changed, 8 insertions(+), 3 deletions(-)

Comments

Alexandre Belloni June 1, 2024, 5:45 a.m. UTC | #1
This fails on the autbuilders:

2024-06-01 04:08:35,036 - oe-selftest - INFO - ======================================================================
2024-06-01 04:08:35,195 - oe-selftest - INFO - FAIL: sstatetests.SStateBundles.test_minimal_bundle (subunit.RemotedTestCase)
2024-06-01 04:08:35,195 - oe-selftest - INFO - ----------------------------------------------------------------------
2024-06-01 04:08:35,195 - oe-selftest - INFO - testtools.testresult.real._StringException: Traceback (most recent call last):
  File "/home/pokybuild/yocto-worker/oe-selftest-centos/build/meta/lib/oeqa/selftest/cases/sstatetests.py", line 1016, in test_minimal_bundle
    runCmd("oe-replicate-build --targets {}".format(targets))
  File "/home/pokybuild/yocto-worker/oe-selftest-centos/build/meta/lib/oeqa/utils/commands.py", line 212, in runCmd
    raise AssertionError("Command '%s' returned non-zero exit status %d:\n%s" % (command, result.status, exc_output))
AssertionError: Command 'oe-replicate-build --targets core-image-minimal' returned non-zero exit status 1:
Traceback (most recent call last):
  File "/home/pokybuild/yocto-worker/oe-selftest-centos/build/bitbake/bin/bitbake-layers", line 101, in <module>
    ret = main()
  File "/home/pokybuild/yocto-worker/oe-selftest-centos/build/bitbake/bin/bitbake-layers", line 94, in main
    return args.func(args)
  File "/home/pokybuild/yocto-worker/oe-selftest-centos/build/meta/lib/bblayers/create.py", line 76, in do_create_layer
    ActionPlugin.do_add_layer(self, args)
  File "/home/pokybuild/yocto-worker/oe-selftest-centos/build/bitbake/lib/bblayers/action.py", line 52, in do_add_layer
    notadded, _ = bb.utils.edit_bblayers_conf(bblayers_conf, layerdirs, None, None, args.prepend)
AttributeError: 'Namespace' object has no attribute 'prepend'
Making a self-extracting bundle archive in build-bundle.sh ...
Traceback (most recent call last):
  File "/home/pokybuild/yocto-worker/oe-selftest-centos/build/scripts/oe-replicate-build", line 74, in <module>
    _do_bundle(args)
  File "/home/pokybuild/yocto-worker/oe-selftest-centos/build/scripts/oe-replicate-build", line 29, in _do_bundle
    subprocess.check_output("bitbake-layers create-layer --add-layer {}".format(layerdir), shell=True, cwd=bundledir)
  File "/usr/lib64/python3.9/subprocess.py", line 424, in check_output
    return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
  File "/usr/lib64/python3.9/subprocess.py", line 528, in run
    raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command 'bitbake-layers create-layer --add-layer meta-build-config' returned non-zero exit status 1.


On 09/05/2024 20:04:00+0900, Hieu Van Nguyen wrote:
> From: Hieu Van Nguyen <hieu2.nguyen@lge.com>
> 
> As you know, layer order in BBLAYERS can affect in parsing recipes process,
> in some cases, users want to add a layer on the top of BBLAYERS variable
> 
> So, add "--prepend" option for bitbake-layers to support add-layer to prepend
> 
> Signed-off-by: Hieu Van Nguyen <hieu2.nguyen@lge.com>
> ---
> v3: fix From:
>  lib/bb/utils.py        | 8 ++++++--
>  lib/bblayers/action.py | 3 ++-
>  2 files changed, 8 insertions(+), 3 deletions(-)
> 
> diff --git a/lib/bb/utils.py b/lib/bb/utils.py
> index ebee65d3d..f1634da0a 100644
> --- a/lib/bb/utils.py
> +++ b/lib/bb/utils.py
> @@ -1414,7 +1414,7 @@ def edit_metadata_file(meta_file, variables, varfunc):
>      return updated
>  
>  
> -def edit_bblayers_conf(bblayers_conf, add, remove, edit_cb=None):
> +def edit_bblayers_conf(bblayers_conf, add, remove, edit_cb=None, prepend=None):
>      """Edit bblayers.conf, adding and/or removing layers
>      Parameters:
>          bblayers_conf: path to bblayers.conf file to edit
> @@ -1424,6 +1424,7 @@ def edit_bblayers_conf(bblayers_conf, add, remove, edit_cb=None):
>              empty list to remove nothing
>          edit_cb: optional callback function that will be called after
>              processing adds/removes once per existing entry.
> +        prepend: optional support add-layer to prepend
>      Returns a tuple:
>          notadded: list of layers specified to be added but weren't
>              (because they were already in the list)
> @@ -1484,7 +1485,10 @@ def edit_bblayers_conf(bblayers_conf, add, remove, edit_cb=None):
>              for addlayer in addlayers:
>                  if addlayer not in bblayers:
>                      updated = True
> -                    bblayers.append(addlayer)
> +                    if prepend:
> +                        bblayers.insert(0,addlayer)
> +                    else:
> +                        bblayers.append(addlayer)
>              del addlayers[:]
>  
>          if edit_cb:
> diff --git a/lib/bblayers/action.py b/lib/bblayers/action.py
> index a14f19948..8ef89fc09 100644
> --- a/lib/bblayers/action.py
> +++ b/lib/bblayers/action.py
> @@ -49,7 +49,7 @@ class ActionPlugin(LayerPlugin):
>          shutil.copy2(bblayers_conf, backup)
>  
>          try:
> -            notadded, _ = bb.utils.edit_bblayers_conf(bblayers_conf, layerdirs, None)
> +            notadded, _ = bb.utils.edit_bblayers_conf(bblayers_conf, layerdirs, None, None, args.prepend)
>              if not (args.force or notadded):
>                  self.tinfoil.modified_files()
>                  try:
> @@ -269,6 +269,7 @@ build results (as the layer priority order has effectively changed).
>      def register_commands(self, sp):
>          parser_add_layer = self.add_command(sp, 'add-layer', self.do_add_layer, parserecipes=False)
>          parser_add_layer.add_argument('layerdir', nargs='+', help='Layer directory/directories to add')
> +        parser_add_layer.add_argument('--prepend', action='store_true', help='Prepend layer directory/directories')
>  
>          parser_remove_layer = self.add_command(sp, 'remove-layer', self.do_remove_layer, parserecipes=False)
>          parser_remove_layer.add_argument('layerdir', nargs='+', help='Layer directory/directories to remove (wildcards allowed, enclose in quotes to avoid shell expansion)')
> -- 
> 2.34.1
> 

> 
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#16196): https://lists.openembedded.org/g/bitbake-devel/message/16196
> Mute This Topic: https://lists.openembedded.org/mt/105998764/3617179
> Group Owner: bitbake-devel+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/bitbake-devel/unsub [alexandre.belloni@bootlin.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
nvhieudt11@gmail.com June 1, 2024, 10:01 a.m. UTC | #2
Hi Alexandre,

Sorry I didn't test with create new layer. I've uploaded new patch (v4).

Please help to check and let me know if I need more tests.

https://lists.openembedded.org/g/bitbake-devel/message/16302
diff mbox series

Patch

diff --git a/lib/bb/utils.py b/lib/bb/utils.py
index ebee65d3d..f1634da0a 100644
--- a/lib/bb/utils.py
+++ b/lib/bb/utils.py
@@ -1414,7 +1414,7 @@  def edit_metadata_file(meta_file, variables, varfunc):
     return updated
 
 
-def edit_bblayers_conf(bblayers_conf, add, remove, edit_cb=None):
+def edit_bblayers_conf(bblayers_conf, add, remove, edit_cb=None, prepend=None):
     """Edit bblayers.conf, adding and/or removing layers
     Parameters:
         bblayers_conf: path to bblayers.conf file to edit
@@ -1424,6 +1424,7 @@  def edit_bblayers_conf(bblayers_conf, add, remove, edit_cb=None):
             empty list to remove nothing
         edit_cb: optional callback function that will be called after
             processing adds/removes once per existing entry.
+        prepend: optional support add-layer to prepend
     Returns a tuple:
         notadded: list of layers specified to be added but weren't
             (because they were already in the list)
@@ -1484,7 +1485,10 @@  def edit_bblayers_conf(bblayers_conf, add, remove, edit_cb=None):
             for addlayer in addlayers:
                 if addlayer not in bblayers:
                     updated = True
-                    bblayers.append(addlayer)
+                    if prepend:
+                        bblayers.insert(0,addlayer)
+                    else:
+                        bblayers.append(addlayer)
             del addlayers[:]
 
         if edit_cb:
diff --git a/lib/bblayers/action.py b/lib/bblayers/action.py
index a14f19948..8ef89fc09 100644
--- a/lib/bblayers/action.py
+++ b/lib/bblayers/action.py
@@ -49,7 +49,7 @@  class ActionPlugin(LayerPlugin):
         shutil.copy2(bblayers_conf, backup)
 
         try:
-            notadded, _ = bb.utils.edit_bblayers_conf(bblayers_conf, layerdirs, None)
+            notadded, _ = bb.utils.edit_bblayers_conf(bblayers_conf, layerdirs, None, None, args.prepend)
             if not (args.force or notadded):
                 self.tinfoil.modified_files()
                 try:
@@ -269,6 +269,7 @@  build results (as the layer priority order has effectively changed).
     def register_commands(self, sp):
         parser_add_layer = self.add_command(sp, 'add-layer', self.do_add_layer, parserecipes=False)
         parser_add_layer.add_argument('layerdir', nargs='+', help='Layer directory/directories to add')
+        parser_add_layer.add_argument('--prepend', action='store_true', help='Prepend layer directory/directories')
 
         parser_remove_layer = self.add_command(sp, 'remove-layer', self.do_remove_layer, parserecipes=False)
         parser_remove_layer.add_argument('layerdir', nargs='+', help='Layer directory/directories to remove (wildcards allowed, enclose in quotes to avoid shell expansion)')