summaryrefslogtreecommitdiffstats
path: root/import-layers/yocto-poky/meta/lib/oe/copy_buildsystem.py
diff options
context:
space:
mode:
Diffstat (limited to 'import-layers/yocto-poky/meta/lib/oe/copy_buildsystem.py')
-rw-r--r--import-layers/yocto-poky/meta/lib/oe/copy_buildsystem.py262
1 files changed, 0 insertions, 262 deletions
diff --git a/import-layers/yocto-poky/meta/lib/oe/copy_buildsystem.py b/import-layers/yocto-poky/meta/lib/oe/copy_buildsystem.py
deleted file mode 100644
index 4b94806c7..000000000
--- a/import-layers/yocto-poky/meta/lib/oe/copy_buildsystem.py
+++ /dev/null
@@ -1,262 +0,0 @@
-# This class should provide easy access to the different aspects of the
-# buildsystem such as layers, bitbake location, etc.
-import stat
-import shutil
-
-def _smart_copy(src, dest):
- import subprocess
- # smart_copy will choose the correct function depending on whether the
- # source is a file or a directory.
- mode = os.stat(src).st_mode
- if stat.S_ISDIR(mode):
- bb.utils.mkdirhier(dest)
- cmd = "tar --exclude='.git' --xattrs --xattrs-include='*' -chf - -C %s -p . \
- | tar --xattrs --xattrs-include='*' -xf - -C %s" % (src, dest)
- subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
- else:
- shutil.copyfile(src, dest)
- shutil.copymode(src, dest)
-
-class BuildSystem(object):
- def __init__(self, context, d):
- self.d = d
- self.context = context
- self.layerdirs = [os.path.abspath(pth) for pth in d.getVar('BBLAYERS').split()]
- self.layers_exclude = (d.getVar('SDK_LAYERS_EXCLUDE') or "").split()
-
- def copy_bitbake_and_layers(self, destdir, workspace_name=None):
- # Copy in all metadata layers + bitbake (as repositories)
- layers_copied = []
- bb.utils.mkdirhier(destdir)
- layers = list(self.layerdirs)
-
- corebase = os.path.abspath(self.d.getVar('COREBASE'))
- layers.append(corebase)
- # The bitbake build system uses the meta-skeleton layer as a layout
- # for common recipies, e.g: the recipetool script to create kernel recipies
- # Add the meta-skeleton layer to be included as part of the eSDK installation
- layers.append(os.path.join(corebase, 'meta-skeleton'))
-
- # Exclude layers
- for layer_exclude in self.layers_exclude:
- if layer_exclude in layers:
- layers.remove(layer_exclude)
-
- workspace_newname = workspace_name
- if workspace_newname:
- layernames = [os.path.basename(layer) for layer in layers]
- extranum = 0
- while workspace_newname in layernames:
- extranum += 1
- workspace_newname = '%s-%d' % (workspace_name, extranum)
-
- corebase_files = self.d.getVar('COREBASE_FILES').split()
- corebase_files = [corebase + '/' +x for x in corebase_files]
- # Make sure bitbake goes in
- bitbake_dir = bb.__file__.rsplit('/', 3)[0]
- corebase_files.append(bitbake_dir)
-
- for layer in layers:
- layerconf = os.path.join(layer, 'conf', 'layer.conf')
- layernewname = os.path.basename(layer)
- workspace = False
- if os.path.exists(layerconf):
- with open(layerconf, 'r') as f:
- if f.readline().startswith("# ### workspace layer auto-generated by devtool ###"):
- if workspace_newname:
- layernewname = workspace_newname
- workspace = True
- else:
- bb.plain("NOTE: Excluding local workspace layer %s from %s" % (layer, self.context))
- continue
-
- # If the layer was already under corebase, leave it there
- # since layers such as meta have issues when moved.
- layerdestpath = destdir
- if corebase == os.path.dirname(layer):
- layerdestpath += '/' + os.path.basename(corebase)
- else:
- layer_relative = os.path.basename(corebase) + '/' + os.path.relpath(layer, corebase)
- if os.path.dirname(layer_relative) != layernewname:
- layerdestpath += '/' + os.path.dirname(layer_relative)
-
- layerdestpath += '/' + layernewname
-
- layer_relative = os.path.relpath(layerdestpath,
- destdir)
- layers_copied.append(layer_relative)
-
- # Treat corebase as special since it typically will contain
- # build directories or other custom items.
- if corebase == layer:
- bb.utils.mkdirhier(layerdestpath)
- for f in corebase_files:
- f_basename = os.path.basename(f)
- destname = os.path.join(layerdestpath, f_basename)
- _smart_copy(f, destname)
- else:
- if os.path.exists(os.path.join(layerdestpath, 'conf/layer.conf')):
- bb.note("Skipping layer %s, already handled" % layer)
- else:
- _smart_copy(layer, layerdestpath)
-
- if workspace:
- # Make some adjustments original workspace layer
- # Drop sources (recipe tasks will be locked, so we don't need them)
- srcdir = os.path.join(layerdestpath, 'sources')
- if os.path.isdir(srcdir):
- shutil.rmtree(srcdir)
- # Drop all bbappends except the one for the image the SDK is being built for
- # (because of externalsrc, the workspace bbappends will interfere with the
- # locked signatures if present, and we don't need them anyway)
- image_bbappend = os.path.splitext(os.path.basename(self.d.getVar('FILE')))[0] + '.bbappend'
- appenddir = os.path.join(layerdestpath, 'appends')
- if os.path.isdir(appenddir):
- for fn in os.listdir(appenddir):
- if fn == image_bbappend:
- continue
- else:
- os.remove(os.path.join(appenddir, fn))
- # Drop README
- readme = os.path.join(layerdestpath, 'README')
- if os.path.exists(readme):
- os.remove(readme)
- # Filter out comments in layer.conf and change layer name
- layerconf = os.path.join(layerdestpath, 'conf', 'layer.conf')
- with open(layerconf, 'r') as f:
- origlines = f.readlines()
- with open(layerconf, 'w') as f:
- for line in origlines:
- if line.startswith('#'):
- continue
- line = line.replace('workspacelayer', workspace_newname)
- f.write(line)
-
- # meta-skeleton layer is added as part of the build system
- # but not as a layer included in the build, therefore it is
- # not reported to the function caller.
- for layer in layers_copied:
- if layer.endswith('/meta-skeleton'):
- layers_copied.remove(layer)
- break
-
- return layers_copied
-
-def generate_locked_sigs(sigfile, d):
- bb.utils.mkdirhier(os.path.dirname(sigfile))
- depd = d.getVar('BB_TASKDEPDATA', False)
- tasks = ['%s.%s' % (v[2], v[1]) for v in depd.values()]
- bb.parse.siggen.dump_lockedsigs(sigfile, tasks)
-
-def prune_lockedsigs(excluded_tasks, excluded_targets, lockedsigs, pruned_output):
- with open(lockedsigs, 'r') as infile:
- bb.utils.mkdirhier(os.path.dirname(pruned_output))
- with open(pruned_output, 'w') as f:
- invalue = False
- for line in infile:
- if invalue:
- if line.endswith('\\\n'):
- splitval = line.strip().split(':')
- if not splitval[1] in excluded_tasks and not splitval[0] in excluded_targets:
- f.write(line)
- else:
- f.write(line)
- invalue = False
- elif line.startswith('SIGGEN_LOCKEDSIGS'):
- invalue = True
- f.write(line)
-
-def merge_lockedsigs(copy_tasks, lockedsigs_main, lockedsigs_extra, merged_output, copy_output=None):
- merged = {}
- arch_order = []
- with open(lockedsigs_main, 'r') as f:
- invalue = None
- for line in f:
- if invalue:
- if line.endswith('\\\n'):
- merged[invalue].append(line)
- else:
- invalue = None
- elif line.startswith('SIGGEN_LOCKEDSIGS_t-'):
- invalue = line[18:].split('=', 1)[0].rstrip()
- merged[invalue] = []
- arch_order.append(invalue)
-
- with open(lockedsigs_extra, 'r') as f:
- invalue = None
- tocopy = {}
- for line in f:
- if invalue:
- if line.endswith('\\\n'):
- if not line in merged[invalue]:
- target, task = line.strip().split(':')[:2]
- if not copy_tasks or task in copy_tasks:
- tocopy[invalue].append(line)
- merged[invalue].append(line)
- else:
- invalue = None
- elif line.startswith('SIGGEN_LOCKEDSIGS_t-'):
- invalue = line[18:].split('=', 1)[0].rstrip()
- if not invalue in merged:
- merged[invalue] = []
- arch_order.append(invalue)
- tocopy[invalue] = []
-
- def write_sigs_file(fn, types, sigs):
- fulltypes = []
- bb.utils.mkdirhier(os.path.dirname(fn))
- with open(fn, 'w') as f:
- for typename in types:
- lines = sigs[typename]
- if lines:
- f.write('SIGGEN_LOCKEDSIGS_%s = "\\\n' % typename)
- for line in lines:
- f.write(line)
- f.write(' "\n')
- fulltypes.append(typename)
- f.write('SIGGEN_LOCKEDSIGS_TYPES = "%s"\n' % ' '.join(fulltypes))
-
- if copy_output:
- write_sigs_file(copy_output, list(tocopy.keys()), tocopy)
- if merged_output:
- write_sigs_file(merged_output, arch_order, merged)
-
-def create_locked_sstate_cache(lockedsigs, input_sstate_cache, output_sstate_cache, d, fixedlsbstring="", filterfile=None):
- import shutil
- bb.note('Generating sstate-cache...')
-
- nativelsbstring = d.getVar('NATIVELSBSTRING')
- bb.process.run("gen-lockedsig-cache %s %s %s %s %s" % (lockedsigs, input_sstate_cache, output_sstate_cache, nativelsbstring, filterfile or ''))
- if fixedlsbstring and nativelsbstring != fixedlsbstring:
- nativedir = output_sstate_cache + '/' + nativelsbstring
- if os.path.isdir(nativedir):
- destdir = os.path.join(output_sstate_cache, fixedlsbstring)
- for root, _, files in os.walk(nativedir):
- for fn in files:
- src = os.path.join(root, fn)
- dest = os.path.join(destdir, os.path.relpath(src, nativedir))
- if os.path.exists(dest):
- # Already exists, and it'll be the same file, so just delete it
- os.unlink(src)
- else:
- bb.utils.mkdirhier(os.path.dirname(dest))
- shutil.move(src, dest)
-
-def check_sstate_task_list(d, targets, filteroutfile, cmdprefix='', cwd=None, logfile=None):
- import subprocess
-
- bb.note('Generating sstate task list...')
-
- if not cwd:
- cwd = os.getcwd()
- if logfile:
- logparam = '-l %s' % logfile
- else:
- logparam = ''
- cmd = "%sBB_SETSCENE_ENFORCE=1 PSEUDO_DISABLED=1 oe-check-sstate %s -s -o %s %s" % (cmdprefix, targets, filteroutfile, logparam)
- env = dict(d.getVar('BB_ORIGENV', False))
- env.pop('BUILDDIR', '')
- env.pop('BBPATH', '')
- pathitems = env['PATH'].split(':')
- env['PATH'] = ':'.join([item for item in pathitems if not item.endswith('/bitbake/bin')])
- bb.process.run(cmd, stderr=subprocess.STDOUT, env=env, cwd=cwd, executable='/bin/bash')
OpenPOWER on IntegriCloud