diff options
Diffstat (limited to 'import-layers/yocto-poky/meta/classes/package_deb.bbclass')
-rw-r--r-- | import-layers/yocto-poky/meta/classes/package_deb.bbclass | 119 |
1 files changed, 74 insertions, 45 deletions
diff --git a/import-layers/yocto-poky/meta/classes/package_deb.bbclass b/import-layers/yocto-poky/meta/classes/package_deb.bbclass index eacabcdb61..5d297939b6 100644 --- a/import-layers/yocto-poky/meta/classes/package_deb.bbclass +++ b/import-layers/yocto-poky/meta/classes/package_deb.bbclass @@ -39,35 +39,33 @@ def debian_arch_map(arch, tune): if arch == "arm": return arch + ["el", "hf"]["callconvention-hard" in tune_features] return arch -# -# install a bunch of packages using apt -# the following shell variables needs to be set before calling this func: -# INSTALL_ROOTFS_DEB - install root dir -# INSTALL_BASEARCH_DEB - install base architecutre -# INSTALL_ARCHS_DEB - list of available archs -# INSTALL_PACKAGES_NORMAL_DEB - packages to be installed -# INSTALL_PACKAGES_ATTEMPTONLY_DEB - packages attempted to be installed only -# INSTALL_PACKAGES_LINGUAS_DEB - additional packages for uclibc -# INSTALL_TASK_DEB - task name python do_package_deb () { - import re, copy - import textwrap - import subprocess - import collections - import codecs - - oldcwd = os.getcwd() - workdir = d.getVar('WORKDIR') - if not workdir: - bb.error("WORKDIR not defined, unable to package") - return + import multiprocessing + import traceback + + class DebianWritePkgProcess(multiprocessing.Process): + def __init__(self, *args, **kwargs): + multiprocessing.Process.__init__(self, *args, **kwargs) + self._pconn, self._cconn = multiprocessing.Pipe() + self._exception = None + + def run(self): + try: + multiprocessing.Process.run(self) + self._cconn.send(None) + except Exception as e: + tb = traceback.format_exc() + self._cconn.send((e, tb)) + + @property + def exception(self): + if self._pconn.poll(): + self._exception = self._pconn.recv() + return self._exception - outdir = d.getVar('PKGWRITEDIRDEB') - if not outdir: - bb.error("PKGWRITEDIRDEB not defined, unable to package") - return + oldcwd = os.getcwd() packages = d.getVar('PACKAGES') if not packages: @@ -75,14 +73,45 @@ python do_package_deb () { return tmpdir = d.getVar('TMPDIR') - if os.access(os.path.join(tmpdir, "stamps", "DEB_PACKAGE_INDEX_CLEAN"),os.R_OK): os.unlink(os.path.join(tmpdir, "stamps", "DEB_PACKAGE_INDEX_CLEAN")) - if packages == []: - bb.debug(1, "No packages; nothing to do") - return + max_process = int(d.getVar("BB_NUMBER_THREADS") or os.cpu_count() or 1) + launched = [] + error = None + pkgs = packages.split() + while not error and pkgs: + if len(launched) < max_process: + p = DebianWritePkgProcess(target=deb_write_pkg, args=(pkgs.pop(), d)) + p.start() + launched.append(p) + for q in launched: + # The finished processes are joined when calling is_alive() + if not q.is_alive(): + launched.remove(q) + if q.exception: + error, traceback = q.exception + break + + for p in launched: + p.join() + + os.chdir(oldcwd) + if error: + raise error +} +do_package_deb[vardeps] += "deb_write_pkg" +do_package_deb[vardepsexclude] = "BB_NUMBER_THREADS" + +def deb_write_pkg(pkg, d): + import re, copy + import textwrap + import subprocess + import collections + import codecs + + outdir = d.getVar('PKGWRITEDIRDEB') pkgdest = d.getVar('PKGDEST') def cleanupcontrol(root): @@ -91,11 +120,11 @@ python do_package_deb () { if os.path.exists(p): bb.utils.prunedir(p) - for pkg in packages.split(): - localdata = bb.data.createCopy(d) - root = "%s/%s" % (pkgdest, pkg) + localdata = bb.data.createCopy(d) + root = "%s/%s" % (pkgdest, pkg) - lf = bb.utils.lockfile(root + ".lock") + lf = bb.utils.lockfile(root + ".lock") + try: localdata.setVar('ROOT', '') localdata.setVar('ROOT_%s' % pkg, root) @@ -117,8 +146,7 @@ python do_package_deb () { g = glob('*') if not g and localdata.getVar('ALLOW_EMPTY', False) != "1": bb.note("Not creating empty archive for %s-%s-%s" % (pkg, localdata.getVar('PKGV'), localdata.getVar('PKGR'))) - bb.utils.unlockfile(lf) - continue + return controldir = os.path.join(root, 'DEBIAN') bb.utils.mkdirhier(controldir) @@ -194,8 +222,8 @@ python do_package_deb () { mapping_rename_hook(localdata) def debian_cmp_remap(var): - # dpkg does not allow for '(' or ')' in a dependency name - # replace these instances with '__' and '__' + # dpkg does not allow for '(', ')' or ':' in a dependency name + # Replace any instances of them with '__' # # In debian '>' and '<' do not mean what it appears they mean # '<' = less or equal @@ -204,8 +232,7 @@ python do_package_deb () { # for dep in var: if '(' in dep: - newdep = dep.replace('(', '__') - newdep = newdep.replace(')', '__') + newdep = re.sub(r'[(:)]', '__', dep) if newdep != dep: var[newdep] = var[dep] del var[dep] @@ -289,17 +316,19 @@ python do_package_deb () { conffiles.close() os.chdir(basedir) - subprocess.check_output("PATH=\"%s\" dpkg-deb -b %s %s" % (localdata.getVar("PATH"), root, pkgoutdir), shell=True) + subprocess.check_output("PATH=\"%s\" dpkg-deb -b %s %s" % (localdata.getVar("PATH"), root, pkgoutdir), + stderr=subprocess.STDOUT, + shell=True) + finally: cleanupcontrol(root) bb.utils.unlockfile(lf) - os.chdir(oldcwd) -} -# Indirect references to these vars -do_package_write_deb[vardeps] += "PKGV PKGR PKGV DESCRIPTION SECTION PRIORITY MAINTAINER DPKG_ARCH PN HOMEPAGE" + # Otherwise allarch packages may change depending on override configuration -do_package_deb[vardepsexclude] = "OVERRIDES" +deb_write_pkg[vardepsexclude] = "OVERRIDES" +# Indirect references to these vars +do_package_write_deb[vardeps] += "PKGV PKGR PKGV DESCRIPTION SECTION PRIORITY MAINTAINER DPKG_ARCH PN HOMEPAGE" SSTATETASKS += "do_package_write_deb" do_package_write_deb[sstate-inputdirs] = "${PKGWRITEDIRDEB}" |