summaryrefslogtreecommitdiff
path: root/import-layers/yocto-poky/meta/classes/package_deb.bbclass
diff options
context:
space:
mode:
Diffstat (limited to 'import-layers/yocto-poky/meta/classes/package_deb.bbclass')
-rw-r--r--import-layers/yocto-poky/meta/classes/package_deb.bbclass119
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}"