diff mbox series

[4/4] populate_sdk_ext: split copy_buildsystem() into logical steps defined as functions

Message ID 20231103102806.2332746-4-alex@linutronix.de
State Accepted, archived
Commit a163b8f339f32bc9e3865736af321190bc89c61b
Headers show
Series [1/4] populate_sdk_ext.bbclass: do not symlink unfsd from sdk image sysroot into eSDK tools path | expand

Commit Message

Alexander Kanavin Nov. 3, 2023, 10:28 a.m. UTC
copy_buildsystem() has become far too large and needs to be split
into shorter and more understandable pieces; some of those
pieces will be reused for the purpose of providing esdk mode
directly from a plain yocto build.

Signed-off-by: Alexander Kanavin <alex@linutronix.de>
---
 meta/classes-recipe/populate_sdk_ext.bbclass | 59 ++++++++++++++++----
 1 file changed, 47 insertions(+), 12 deletions(-)

Comments

Alexandre Belloni Nov. 3, 2023, 11:50 p.m. UTC | #1
https://autobuilder.yoctoproject.org/typhoon/#/builders/97/builds/7419/steps/16/logs/stdio

On 03/11/2023 11:28:06+0100, Alexander Kanavin wrote:
> copy_buildsystem() has become far too large and needs to be split
> into shorter and more understandable pieces; some of those
> pieces will be reused for the purpose of providing esdk mode
> directly from a plain yocto build.
> 
> Signed-off-by: Alexander Kanavin <alex@linutronix.de>
> ---
>  meta/classes-recipe/populate_sdk_ext.bbclass | 59 ++++++++++++++++----
>  1 file changed, 47 insertions(+), 12 deletions(-)
> 
> diff --git a/meta/classes-recipe/populate_sdk_ext.bbclass b/meta/classes-recipe/populate_sdk_ext.bbclass
> index 53adc868d47..a20f38fb210 100644
> --- a/meta/classes-recipe/populate_sdk_ext.bbclass
> +++ b/meta/classes-recipe/populate_sdk_ext.bbclass
> @@ -186,12 +186,7 @@ def create_filtered_tasklist(d, sdkbasepath, tasklistfile, conf_initpath):
>          if os.path.exists(localconf + '.bak'):
>              os.replace(localconf + '.bak', localconf)
>  
> -python copy_buildsystem () {
> -    import re
> -    import shutil
> -    import glob
> -    import oe.copy_buildsystem
> -
> +def copy_bitbake_and_layers(d, baseoutpath, derivative):
>      oe_init_env_script = d.getVar('OE_INIT_ENV_SCRIPT')
>  
>      conf_bbpath = ''
> @@ -200,13 +195,7 @@ python copy_buildsystem () {
>  
>      # Copy in all metadata layers + bitbake (as repositories)
>      buildsystem = oe.copy_buildsystem.BuildSystem('extensible SDK', d)
> -    baseoutpath = d.getVar('SDK_OUTPUT') + '/' + d.getVar('SDKPATH')
>  
> -    #check if custome templateconf path is set
> -    use_custom_templateconf = d.getVar('SDK_CUSTOM_TEMPLATECONF')
> -
> -    # Determine if we're building a derivative extensible SDK (from devtool build-sdk)
> -    derivative = (d.getVar('SDK_DERIVATIVE') or '') == '1'
>      if derivative:
>          workspace_name = 'orig-workspace'
>      else:
> @@ -231,6 +220,9 @@ python copy_buildsystem () {
>      d.setVar('oe_init_build_env_path', conf_initpath)
>      d.setVar('esdk_tools_path', esdk_tools_path)
>  
> +    return (conf_initpath, conf_bbpath, core_meta_subdir, sdkbblayers)
> +
> +def write_devtool_config(d, baseoutpath, conf_bbpath, conf_initpath, core_meta_subdir):
>      # Write out config file for devtool
>      import configparser
>      config = configparser.ConfigParser()
> @@ -247,10 +239,12 @@ python copy_buildsystem () {
>      with open(os.path.join(baseoutpath, 'conf', 'devtool.conf'), 'w') as f:
>          config.write(f)
>  
> +def write_unlocked_sigs(d, baseoutpath):
>      unlockedsigs =  os.path.join(baseoutpath, 'conf', 'unlocked-sigs.inc')
>      with open(unlockedsigs, 'w') as f:
>          pass
>  
> +def write_bblayers_conf(d, baseoutpath, sdkbblayers):
>      # Create a layer for new recipes / appends
>      bbpath = d.getVar('BBPATH')
>      env = os.environ.copy()
> @@ -279,6 +273,9 @@ python copy_buildsystem () {
>          f.write('    $' + '{SDKBASEMETAPATH}/workspace \\\n')
>          f.write('    "\n')
>  
> +def copy_uninative(d, baseoutpath):
> +    import shutil
> +
>      # Copy uninative tarball
>      # For now this is where uninative.bbclass expects the tarball
>      if bb.data.inherits_class('uninative', d):
> @@ -288,6 +285,12 @@ python copy_buildsystem () {
>          bb.utils.mkdirhier(uninative_outdir)
>          shutil.copy(uninative_file, uninative_outdir)
>  
> +    return uninative_checksum
> +
> +def write_local_conf(d, baseoutpath, derivative, core_meta_subdir, uninative_checksum):
> +    #check if custome templateconf path is set
> +    use_custom_templateconf = d.getVar('SDK_CUSTOM_TEMPLATECONF')
> +
>      env_passthrough = (d.getVar('BB_ENV_PASSTHROUGH_ADDITIONS') or '').split()
>      env_passthrough_values = {}
>  
> @@ -457,6 +460,9 @@ python copy_buildsystem () {
>                  f.write(line)
>              f.write('\n')
>  
> +def prepare_locked_cache(d, baseoutpath, conf_initpath):
> +    import shutil
> +
>      # Filter the locked signatures file to just the sstate tasks we are interested in
>      excluded_targets = get_sdk_install_targets(d, images_only=True)
>      sigfile = d.getVar('WORKDIR') + '/locked-sigs.inc'
> @@ -560,6 +566,9 @@ python copy_buildsystem () {
>                  f = os.path.join(root, name)
>                  os.remove(f)
>  
> +def write_manifest(d, baseoutpath):
> +    import glob
> +
>      # Write manifest file
>      # Note: at the moment we cannot include the env setup script here to keep
>      # it updated, since it gets modified during SDK installation (see
> @@ -583,6 +592,32 @@ python copy_buildsystem () {
>                      continue
>                  chksum = bb.utils.sha256_file(fn)
>                  f.write('%s\t%s\n' % (chksum, os.path.relpath(fn, baseoutpath)))
> +
> +
> +python copy_buildsystem () {
> +    import oe.copy_buildsystem
> +
> +    baseoutpath = d.getVar('SDK_OUTPUT') + '/' + d.getVar('SDKPATH')
> +
> +    # Determine if we're building a derivative extensible SDK (from devtool build-sdk)
> +    derivative = (d.getVar('SDK_DERIVATIVE') or '') == '1'
> +
> +    conf_initpath, conf_bbpath, core_meta_subdir, sdkbblayers = copy_bitbake_and_layers(d, baseoutpath, derivative)
> +
> +    write_devtool_config(d, baseoutpath, conf_bbpath, conf_initpath, core_meta_subdir)
> +
> +    write_unlocked_sigs(d, baseoutpath)
> +
> +    write_bblayers_conf(d, baseoutpath, sdkbblayers)
> +
> +    uninative_checksum = copy_uninative(d, baseoutpath)
> +
> +    write_local_conf(d, baseoutpath, derivative, core_meta_subdir, uninative_checksum)
> +
> +    prepare_locked_cache(d, baseoutpath, conf_initpath)
> +
> +    write_manifest(d, baseoutpath)
> +
>  }
>  
>  def get_current_buildtools(d):
> -- 
> 2.39.2
> 

> 
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#190151): https://lists.openembedded.org/g/openembedded-core/message/190151
> Mute This Topic: https://lists.openembedded.org/mt/102361115/3617179
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [alexandre.belloni@bootlin.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
Alexander Kanavin Nov. 6, 2023, 12:54 p.m. UTC | #2
Thanks, I just sent a corrected patch.

Alex

On Sat, 4 Nov 2023 at 00:50, Alexandre Belloni
<alexandre.belloni@bootlin.com> wrote:
>
> https://autobuilder.yoctoproject.org/typhoon/#/builders/97/builds/7419/steps/16/logs/stdio
>
> On 03/11/2023 11:28:06+0100, Alexander Kanavin wrote:
> > copy_buildsystem() has become far too large and needs to be split
> > into shorter and more understandable pieces; some of those
> > pieces will be reused for the purpose of providing esdk mode
> > directly from a plain yocto build.
> >
> > Signed-off-by: Alexander Kanavin <alex@linutronix.de>
> > ---
> >  meta/classes-recipe/populate_sdk_ext.bbclass | 59 ++++++++++++++++----
> >  1 file changed, 47 insertions(+), 12 deletions(-)
> >
> > diff --git a/meta/classes-recipe/populate_sdk_ext.bbclass b/meta/classes-recipe/populate_sdk_ext.bbclass
> > index 53adc868d47..a20f38fb210 100644
> > --- a/meta/classes-recipe/populate_sdk_ext.bbclass
> > +++ b/meta/classes-recipe/populate_sdk_ext.bbclass
> > @@ -186,12 +186,7 @@ def create_filtered_tasklist(d, sdkbasepath, tasklistfile, conf_initpath):
> >          if os.path.exists(localconf + '.bak'):
> >              os.replace(localconf + '.bak', localconf)
> >
> > -python copy_buildsystem () {
> > -    import re
> > -    import shutil
> > -    import glob
> > -    import oe.copy_buildsystem
> > -
> > +def copy_bitbake_and_layers(d, baseoutpath, derivative):
> >      oe_init_env_script = d.getVar('OE_INIT_ENV_SCRIPT')
> >
> >      conf_bbpath = ''
> > @@ -200,13 +195,7 @@ python copy_buildsystem () {
> >
> >      # Copy in all metadata layers + bitbake (as repositories)
> >      buildsystem = oe.copy_buildsystem.BuildSystem('extensible SDK', d)
> > -    baseoutpath = d.getVar('SDK_OUTPUT') + '/' + d.getVar('SDKPATH')
> >
> > -    #check if custome templateconf path is set
> > -    use_custom_templateconf = d.getVar('SDK_CUSTOM_TEMPLATECONF')
> > -
> > -    # Determine if we're building a derivative extensible SDK (from devtool build-sdk)
> > -    derivative = (d.getVar('SDK_DERIVATIVE') or '') == '1'
> >      if derivative:
> >          workspace_name = 'orig-workspace'
> >      else:
> > @@ -231,6 +220,9 @@ python copy_buildsystem () {
> >      d.setVar('oe_init_build_env_path', conf_initpath)
> >      d.setVar('esdk_tools_path', esdk_tools_path)
> >
> > +    return (conf_initpath, conf_bbpath, core_meta_subdir, sdkbblayers)
> > +
> > +def write_devtool_config(d, baseoutpath, conf_bbpath, conf_initpath, core_meta_subdir):
> >      # Write out config file for devtool
> >      import configparser
> >      config = configparser.ConfigParser()
> > @@ -247,10 +239,12 @@ python copy_buildsystem () {
> >      with open(os.path.join(baseoutpath, 'conf', 'devtool.conf'), 'w') as f:
> >          config.write(f)
> >
> > +def write_unlocked_sigs(d, baseoutpath):
> >      unlockedsigs =  os.path.join(baseoutpath, 'conf', 'unlocked-sigs.inc')
> >      with open(unlockedsigs, 'w') as f:
> >          pass
> >
> > +def write_bblayers_conf(d, baseoutpath, sdkbblayers):
> >      # Create a layer for new recipes / appends
> >      bbpath = d.getVar('BBPATH')
> >      env = os.environ.copy()
> > @@ -279,6 +273,9 @@ python copy_buildsystem () {
> >          f.write('    $' + '{SDKBASEMETAPATH}/workspace \\\n')
> >          f.write('    "\n')
> >
> > +def copy_uninative(d, baseoutpath):
> > +    import shutil
> > +
> >      # Copy uninative tarball
> >      # For now this is where uninative.bbclass expects the tarball
> >      if bb.data.inherits_class('uninative', d):
> > @@ -288,6 +285,12 @@ python copy_buildsystem () {
> >          bb.utils.mkdirhier(uninative_outdir)
> >          shutil.copy(uninative_file, uninative_outdir)
> >
> > +    return uninative_checksum
> > +
> > +def write_local_conf(d, baseoutpath, derivative, core_meta_subdir, uninative_checksum):
> > +    #check if custome templateconf path is set
> > +    use_custom_templateconf = d.getVar('SDK_CUSTOM_TEMPLATECONF')
> > +
> >      env_passthrough = (d.getVar('BB_ENV_PASSTHROUGH_ADDITIONS') or '').split()
> >      env_passthrough_values = {}
> >
> > @@ -457,6 +460,9 @@ python copy_buildsystem () {
> >                  f.write(line)
> >              f.write('\n')
> >
> > +def prepare_locked_cache(d, baseoutpath, conf_initpath):
> > +    import shutil
> > +
> >      # Filter the locked signatures file to just the sstate tasks we are interested in
> >      excluded_targets = get_sdk_install_targets(d, images_only=True)
> >      sigfile = d.getVar('WORKDIR') + '/locked-sigs.inc'
> > @@ -560,6 +566,9 @@ python copy_buildsystem () {
> >                  f = os.path.join(root, name)
> >                  os.remove(f)
> >
> > +def write_manifest(d, baseoutpath):
> > +    import glob
> > +
> >      # Write manifest file
> >      # Note: at the moment we cannot include the env setup script here to keep
> >      # it updated, since it gets modified during SDK installation (see
> > @@ -583,6 +592,32 @@ python copy_buildsystem () {
> >                      continue
> >                  chksum = bb.utils.sha256_file(fn)
> >                  f.write('%s\t%s\n' % (chksum, os.path.relpath(fn, baseoutpath)))
> > +
> > +
> > +python copy_buildsystem () {
> > +    import oe.copy_buildsystem
> > +
> > +    baseoutpath = d.getVar('SDK_OUTPUT') + '/' + d.getVar('SDKPATH')
> > +
> > +    # Determine if we're building a derivative extensible SDK (from devtool build-sdk)
> > +    derivative = (d.getVar('SDK_DERIVATIVE') or '') == '1'
> > +
> > +    conf_initpath, conf_bbpath, core_meta_subdir, sdkbblayers = copy_bitbake_and_layers(d, baseoutpath, derivative)
> > +
> > +    write_devtool_config(d, baseoutpath, conf_bbpath, conf_initpath, core_meta_subdir)
> > +
> > +    write_unlocked_sigs(d, baseoutpath)
> > +
> > +    write_bblayers_conf(d, baseoutpath, sdkbblayers)
> > +
> > +    uninative_checksum = copy_uninative(d, baseoutpath)
> > +
> > +    write_local_conf(d, baseoutpath, derivative, core_meta_subdir, uninative_checksum)
> > +
> > +    prepare_locked_cache(d, baseoutpath, conf_initpath)
> > +
> > +    write_manifest(d, baseoutpath)
> > +
> >  }
> >
> >  def get_current_buildtools(d):
> > --
> > 2.39.2
> >
>
> >
> > -=-=-=-=-=-=-=-=-=-=-=-
> > Links: You receive all messages sent to this group.
> > View/Reply Online (#190151): https://lists.openembedded.org/g/openembedded-core/message/190151
> > Mute This Topic: https://lists.openembedded.org/mt/102361115/3617179
> > Group Owner: openembedded-core+owner@lists.openembedded.org
> > Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [alexandre.belloni@bootlin.com]
> > -=-=-=-=-=-=-=-=-=-=-=-
> >
>
>
> --
> Alexandre Belloni, co-owner and COO, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com
Alexandre Belloni Nov. 6, 2023, 3:01 p.m. UTC | #3
On 06/11/2023 13:54:16+0100, Alexander Kanavin wrote:
> Thanks, I just sent a corrected patch.
> 

Thanks!

> Alex
> 
> On Sat, 4 Nov 2023 at 00:50, Alexandre Belloni
> <alexandre.belloni@bootlin.com> wrote:
> >
> > https://autobuilder.yoctoproject.org/typhoon/#/builders/97/builds/7419/steps/16/logs/stdio
> >
> > On 03/11/2023 11:28:06+0100, Alexander Kanavin wrote:
> > > copy_buildsystem() has become far too large and needs to be split
> > > into shorter and more understandable pieces; some of those
> > > pieces will be reused for the purpose of providing esdk mode
> > > directly from a plain yocto build.
> > >
> > > Signed-off-by: Alexander Kanavin <alex@linutronix.de>
> > > ---
> > >  meta/classes-recipe/populate_sdk_ext.bbclass | 59 ++++++++++++++++----
> > >  1 file changed, 47 insertions(+), 12 deletions(-)
> > >
> > > diff --git a/meta/classes-recipe/populate_sdk_ext.bbclass b/meta/classes-recipe/populate_sdk_ext.bbclass
> > > index 53adc868d47..a20f38fb210 100644
> > > --- a/meta/classes-recipe/populate_sdk_ext.bbclass
> > > +++ b/meta/classes-recipe/populate_sdk_ext.bbclass
> > > @@ -186,12 +186,7 @@ def create_filtered_tasklist(d, sdkbasepath, tasklistfile, conf_initpath):
> > >          if os.path.exists(localconf + '.bak'):
> > >              os.replace(localconf + '.bak', localconf)
> > >
> > > -python copy_buildsystem () {
> > > -    import re
> > > -    import shutil
> > > -    import glob
> > > -    import oe.copy_buildsystem
> > > -
> > > +def copy_bitbake_and_layers(d, baseoutpath, derivative):
> > >      oe_init_env_script = d.getVar('OE_INIT_ENV_SCRIPT')
> > >
> > >      conf_bbpath = ''
> > > @@ -200,13 +195,7 @@ python copy_buildsystem () {
> > >
> > >      # Copy in all metadata layers + bitbake (as repositories)
> > >      buildsystem = oe.copy_buildsystem.BuildSystem('extensible SDK', d)
> > > -    baseoutpath = d.getVar('SDK_OUTPUT') + '/' + d.getVar('SDKPATH')
> > >
> > > -    #check if custome templateconf path is set
> > > -    use_custom_templateconf = d.getVar('SDK_CUSTOM_TEMPLATECONF')
> > > -
> > > -    # Determine if we're building a derivative extensible SDK (from devtool build-sdk)
> > > -    derivative = (d.getVar('SDK_DERIVATIVE') or '') == '1'
> > >      if derivative:
> > >          workspace_name = 'orig-workspace'
> > >      else:
> > > @@ -231,6 +220,9 @@ python copy_buildsystem () {
> > >      d.setVar('oe_init_build_env_path', conf_initpath)
> > >      d.setVar('esdk_tools_path', esdk_tools_path)
> > >
> > > +    return (conf_initpath, conf_bbpath, core_meta_subdir, sdkbblayers)
> > > +
> > > +def write_devtool_config(d, baseoutpath, conf_bbpath, conf_initpath, core_meta_subdir):
> > >      # Write out config file for devtool
> > >      import configparser
> > >      config = configparser.ConfigParser()
> > > @@ -247,10 +239,12 @@ python copy_buildsystem () {
> > >      with open(os.path.join(baseoutpath, 'conf', 'devtool.conf'), 'w') as f:
> > >          config.write(f)
> > >
> > > +def write_unlocked_sigs(d, baseoutpath):
> > >      unlockedsigs =  os.path.join(baseoutpath, 'conf', 'unlocked-sigs.inc')
> > >      with open(unlockedsigs, 'w') as f:
> > >          pass
> > >
> > > +def write_bblayers_conf(d, baseoutpath, sdkbblayers):
> > >      # Create a layer for new recipes / appends
> > >      bbpath = d.getVar('BBPATH')
> > >      env = os.environ.copy()
> > > @@ -279,6 +273,9 @@ python copy_buildsystem () {
> > >          f.write('    $' + '{SDKBASEMETAPATH}/workspace \\\n')
> > >          f.write('    "\n')
> > >
> > > +def copy_uninative(d, baseoutpath):
> > > +    import shutil
> > > +
> > >      # Copy uninative tarball
> > >      # For now this is where uninative.bbclass expects the tarball
> > >      if bb.data.inherits_class('uninative', d):
> > > @@ -288,6 +285,12 @@ python copy_buildsystem () {
> > >          bb.utils.mkdirhier(uninative_outdir)
> > >          shutil.copy(uninative_file, uninative_outdir)
> > >
> > > +    return uninative_checksum
> > > +
> > > +def write_local_conf(d, baseoutpath, derivative, core_meta_subdir, uninative_checksum):
> > > +    #check if custome templateconf path is set
> > > +    use_custom_templateconf = d.getVar('SDK_CUSTOM_TEMPLATECONF')
> > > +
> > >      env_passthrough = (d.getVar('BB_ENV_PASSTHROUGH_ADDITIONS') or '').split()
> > >      env_passthrough_values = {}
> > >
> > > @@ -457,6 +460,9 @@ python copy_buildsystem () {
> > >                  f.write(line)
> > >              f.write('\n')
> > >
> > > +def prepare_locked_cache(d, baseoutpath, conf_initpath):
> > > +    import shutil
> > > +
> > >      # Filter the locked signatures file to just the sstate tasks we are interested in
> > >      excluded_targets = get_sdk_install_targets(d, images_only=True)
> > >      sigfile = d.getVar('WORKDIR') + '/locked-sigs.inc'
> > > @@ -560,6 +566,9 @@ python copy_buildsystem () {
> > >                  f = os.path.join(root, name)
> > >                  os.remove(f)
> > >
> > > +def write_manifest(d, baseoutpath):
> > > +    import glob
> > > +
> > >      # Write manifest file
> > >      # Note: at the moment we cannot include the env setup script here to keep
> > >      # it updated, since it gets modified during SDK installation (see
> > > @@ -583,6 +592,32 @@ python copy_buildsystem () {
> > >                      continue
> > >                  chksum = bb.utils.sha256_file(fn)
> > >                  f.write('%s\t%s\n' % (chksum, os.path.relpath(fn, baseoutpath)))
> > > +
> > > +
> > > +python copy_buildsystem () {
> > > +    import oe.copy_buildsystem
> > > +
> > > +    baseoutpath = d.getVar('SDK_OUTPUT') + '/' + d.getVar('SDKPATH')
> > > +
> > > +    # Determine if we're building a derivative extensible SDK (from devtool build-sdk)
> > > +    derivative = (d.getVar('SDK_DERIVATIVE') or '') == '1'
> > > +
> > > +    conf_initpath, conf_bbpath, core_meta_subdir, sdkbblayers = copy_bitbake_and_layers(d, baseoutpath, derivative)
> > > +
> > > +    write_devtool_config(d, baseoutpath, conf_bbpath, conf_initpath, core_meta_subdir)
> > > +
> > > +    write_unlocked_sigs(d, baseoutpath)
> > > +
> > > +    write_bblayers_conf(d, baseoutpath, sdkbblayers)
> > > +
> > > +    uninative_checksum = copy_uninative(d, baseoutpath)
> > > +
> > > +    write_local_conf(d, baseoutpath, derivative, core_meta_subdir, uninative_checksum)
> > > +
> > > +    prepare_locked_cache(d, baseoutpath, conf_initpath)
> > > +
> > > +    write_manifest(d, baseoutpath)
> > > +
> > >  }
> > >
> > >  def get_current_buildtools(d):
> > > --
> > > 2.39.2
> > >
> >
> > >
> > > -=-=-=-=-=-=-=-=-=-=-=-
> > > Links: You receive all messages sent to this group.
> > > View/Reply Online (#190151): https://lists.openembedded.org/g/openembedded-core/message/190151
> > > Mute This Topic: https://lists.openembedded.org/mt/102361115/3617179
> > > Group Owner: openembedded-core+owner@lists.openembedded.org
> > > Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [alexandre.belloni@bootlin.com]
> > > -=-=-=-=-=-=-=-=-=-=-=-
> > >
> >
> >
> > --
> > Alexandre Belloni, co-owner and COO, Bootlin
> > Embedded Linux and Kernel engineering
> > https://bootlin.com
diff mbox series

Patch

diff --git a/meta/classes-recipe/populate_sdk_ext.bbclass b/meta/classes-recipe/populate_sdk_ext.bbclass
index 53adc868d47..a20f38fb210 100644
--- a/meta/classes-recipe/populate_sdk_ext.bbclass
+++ b/meta/classes-recipe/populate_sdk_ext.bbclass
@@ -186,12 +186,7 @@  def create_filtered_tasklist(d, sdkbasepath, tasklistfile, conf_initpath):
         if os.path.exists(localconf + '.bak'):
             os.replace(localconf + '.bak', localconf)
 
-python copy_buildsystem () {
-    import re
-    import shutil
-    import glob
-    import oe.copy_buildsystem
-
+def copy_bitbake_and_layers(d, baseoutpath, derivative):
     oe_init_env_script = d.getVar('OE_INIT_ENV_SCRIPT')
 
     conf_bbpath = ''
@@ -200,13 +195,7 @@  python copy_buildsystem () {
 
     # Copy in all metadata layers + bitbake (as repositories)
     buildsystem = oe.copy_buildsystem.BuildSystem('extensible SDK', d)
-    baseoutpath = d.getVar('SDK_OUTPUT') + '/' + d.getVar('SDKPATH')
 
-    #check if custome templateconf path is set
-    use_custom_templateconf = d.getVar('SDK_CUSTOM_TEMPLATECONF')
-
-    # Determine if we're building a derivative extensible SDK (from devtool build-sdk)
-    derivative = (d.getVar('SDK_DERIVATIVE') or '') == '1'
     if derivative:
         workspace_name = 'orig-workspace'
     else:
@@ -231,6 +220,9 @@  python copy_buildsystem () {
     d.setVar('oe_init_build_env_path', conf_initpath)
     d.setVar('esdk_tools_path', esdk_tools_path)
 
+    return (conf_initpath, conf_bbpath, core_meta_subdir, sdkbblayers)
+
+def write_devtool_config(d, baseoutpath, conf_bbpath, conf_initpath, core_meta_subdir):
     # Write out config file for devtool
     import configparser
     config = configparser.ConfigParser()
@@ -247,10 +239,12 @@  python copy_buildsystem () {
     with open(os.path.join(baseoutpath, 'conf', 'devtool.conf'), 'w') as f:
         config.write(f)
 
+def write_unlocked_sigs(d, baseoutpath):
     unlockedsigs =  os.path.join(baseoutpath, 'conf', 'unlocked-sigs.inc')
     with open(unlockedsigs, 'w') as f:
         pass
 
+def write_bblayers_conf(d, baseoutpath, sdkbblayers):
     # Create a layer for new recipes / appends
     bbpath = d.getVar('BBPATH')
     env = os.environ.copy()
@@ -279,6 +273,9 @@  python copy_buildsystem () {
         f.write('    $' + '{SDKBASEMETAPATH}/workspace \\\n')
         f.write('    "\n')
 
+def copy_uninative(d, baseoutpath):
+    import shutil
+
     # Copy uninative tarball
     # For now this is where uninative.bbclass expects the tarball
     if bb.data.inherits_class('uninative', d):
@@ -288,6 +285,12 @@  python copy_buildsystem () {
         bb.utils.mkdirhier(uninative_outdir)
         shutil.copy(uninative_file, uninative_outdir)
 
+    return uninative_checksum
+
+def write_local_conf(d, baseoutpath, derivative, core_meta_subdir, uninative_checksum):
+    #check if custome templateconf path is set
+    use_custom_templateconf = d.getVar('SDK_CUSTOM_TEMPLATECONF')
+
     env_passthrough = (d.getVar('BB_ENV_PASSTHROUGH_ADDITIONS') or '').split()
     env_passthrough_values = {}
 
@@ -457,6 +460,9 @@  python copy_buildsystem () {
                 f.write(line)
             f.write('\n')
 
+def prepare_locked_cache(d, baseoutpath, conf_initpath):
+    import shutil
+
     # Filter the locked signatures file to just the sstate tasks we are interested in
     excluded_targets = get_sdk_install_targets(d, images_only=True)
     sigfile = d.getVar('WORKDIR') + '/locked-sigs.inc'
@@ -560,6 +566,9 @@  python copy_buildsystem () {
                 f = os.path.join(root, name)
                 os.remove(f)
 
+def write_manifest(d, baseoutpath):
+    import glob
+
     # Write manifest file
     # Note: at the moment we cannot include the env setup script here to keep
     # it updated, since it gets modified during SDK installation (see
@@ -583,6 +592,32 @@  python copy_buildsystem () {
                     continue
                 chksum = bb.utils.sha256_file(fn)
                 f.write('%s\t%s\n' % (chksum, os.path.relpath(fn, baseoutpath)))
+
+
+python copy_buildsystem () {
+    import oe.copy_buildsystem
+
+    baseoutpath = d.getVar('SDK_OUTPUT') + '/' + d.getVar('SDKPATH')
+
+    # Determine if we're building a derivative extensible SDK (from devtool build-sdk)
+    derivative = (d.getVar('SDK_DERIVATIVE') or '') == '1'
+
+    conf_initpath, conf_bbpath, core_meta_subdir, sdkbblayers = copy_bitbake_and_layers(d, baseoutpath, derivative)
+
+    write_devtool_config(d, baseoutpath, conf_bbpath, conf_initpath, core_meta_subdir)
+
+    write_unlocked_sigs(d, baseoutpath)
+
+    write_bblayers_conf(d, baseoutpath, sdkbblayers)
+
+    uninative_checksum = copy_uninative(d, baseoutpath)
+
+    write_local_conf(d, baseoutpath, derivative, core_meta_subdir, uninative_checksum)
+
+    prepare_locked_cache(d, baseoutpath, conf_initpath)
+
+    write_manifest(d, baseoutpath)
+
 }
 
 def get_current_buildtools(d):