summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2013-02-01 13:50:38 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2013-02-06 13:11:19 +0000
commitb659eb0f2070149d9516c129b3853b41fbbd1033 (patch)
treea6369183efeb923135b0bce142286272226f40a5
parent8ef0e59d5a7da3671d1ad9a54fe068ed78f928d5 (diff)
downloadopenembedded-core-b659eb0f2070149d9516c129b3853b41fbbd1033.tar.gz
openembedded-core-b659eb0f2070149d9516c129b3853b41fbbd1033.tar.bz2
openembedded-core-b659eb0f2070149d9516c129b3853b41fbbd1033.zip
package.bbclass: Multithread per file dependency generation code
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/classes/base.bbclass2
-rw-r--r--meta/classes/package.bbclass92
-rw-r--r--meta/classes/update-alternatives.bbclass2
-rw-r--r--meta/lib/oe/package.py51
4 files changed, 85 insertions, 62 deletions
diff --git a/meta/classes/base.bbclass b/meta/classes/base.bbclass
index 4662d3bf64..5f43733905 100644
--- a/meta/classes/base.bbclass
+++ b/meta/classes/base.bbclass
@@ -10,7 +10,7 @@ inherit utility-tasks
inherit metadata_scm
inherit logging
-OE_IMPORTS += "os sys time oe.path oe.utils oe.data oe.packagegroup oe.sstatesig oe.lsb"
+OE_IMPORTS += "os sys time oe.path oe.utils oe.data oe.package oe.packagegroup oe.sstatesig oe.lsb"
OE_IMPORTS[type] = "list"
def oe_import(d):
diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass
index 2fbd2602ca..1858836697 100644
--- a/meta/classes/package.bbclass
+++ b/meta/classes/package.bbclass
@@ -1236,85 +1236,57 @@ RPMDEPS = "${STAGING_LIBDIR_NATIVE}/rpm/bin/rpmdeps-oecore --macros ${STAGING_LI
# FILERDEPENDS_filepath_pkg - per file dep
python package_do_filedeps() {
- import re
-
if d.getVar('SKIP_FILEDEPS', True) == '1':
return
pkgdest = d.getVar('PKGDEST', True)
packages = d.getVar('PACKAGES', True)
-
rpmdeps = d.expand("${RPMDEPS}")
- r = re.compile(r'[<>=]+ +[^ ]*')
-
- def file_translate(file):
- ft = file.replace("@", "@at@")
- ft = ft.replace(" ", "@space@")
- ft = ft.replace("\t", "@tab@")
- ft = ft.replace("[", "@openbrace@")
- ft = ft.replace("]", "@closebrace@")
- ft = ft.replace("_", "@underscore@")
- return ft
-
- # Quick routine to process the results of the rpmdeps call...
- def process_deps(pipe, pkg, provides_files, requires_files):
- provides = {}
- requires = {}
-
- for line in pipe:
- f = line.split(" ", 1)[0].strip()
- line = line.split(" ", 1)[1].strip()
-
- if line.startswith("Requires:"):
- i = requires
- elif line.startswith("Provides:"):
- i = provides
- else:
- continue
-
- file = f.replace(pkgdest + "/" + pkg, "")
- file = file_translate(file)
- value = line.split(":", 1)[1].strip()
- value = r.sub(r'(\g<0>)', value)
-
- if value.startswith("rpmlib("):
- continue
- if value == "python":
- continue
- if file not in i:
- i[file] = []
- i[file].append(value)
-
- for file in provides:
- provides_files.append(file)
- key = "FILERPROVIDES_" + file + "_" + pkg
- d.setVar(key, " ".join(provides[file]))
-
- for file in requires:
- requires_files.append(file)
- key = "FILERDEPENDS_" + file + "_" + pkg
- d.setVar(key, " ".join(requires[file]))
def chunks(files, n):
return [files[i:i+n] for i in range(0, len(files), n)]
- # Determine dependencies
+ pkglist = []
for pkg in packages.split():
if d.getVar('SKIP_FILEDEPS_' + pkg, True) == '1':
continue
if pkg.endswith('-dbg') or pkg.endswith('-doc') or pkg.find('-locale-') != -1 or pkg.find('-localedata-') != -1 or pkg.find('-gconv-') != -1 or pkg.find('-charmap-') != -1 or pkg.startswith('kernel-module-'):
continue
+ for files in chunks(pkgfiles[pkg], 100):
+ pkglist.append((pkg, files, rpmdeps, pkgdest))
- provides_files = []
- requires_files = []
+ import multiprocessing
+ nproc = multiprocessing.cpu_count()
+ pool = multiprocessing.Pool(nproc)
+ processed = pool.imap(oe.package.filedeprunner, pkglist)
+ pool.close()
+ pool.join()
- for files in chunks(pkgfiles[pkg], 100):
- dep_pipe = os.popen(rpmdeps + " " + " ".join(files))
+ provides_files = {}
+ requires_files = {}
+
+ for result in processed:
+ (pkg, provides, requires) = result
+
+ if pkg not in provides_files:
+ provides_files[pkg] = []
+ if pkg not in requires_files:
+ requires_files[pkg] = []
- process_deps(dep_pipe, pkg, provides_files, requires_files)
+ for file in provides:
+ provides_files[pkg].append(file)
+ key = "FILERPROVIDES_" + file + "_" + pkg
+ d.setVar(key, " ".join(provides[file]))
+
+ for file in requires:
+ requires_files[pkg].append(file)
+ key = "FILERDEPENDS_" + file + "_" + pkg
+ d.setVar(key, " ".join(requires[file]))
- d.setVar("FILERDEPENDSFLIST_" + pkg, " ".join(requires_files))
- d.setVar("FILERPROVIDESFLIST_" + pkg, " ".join(provides_files))
+ for pkg in requires_files:
+ d.setVar("FILERDEPENDSFLIST_" + pkg, " ".join(requires_files[pkg]))
+ for pkg in provides_files:
+ d.setVar("FILERPROVIDESFLIST_" + pkg, " ".join(provides_files[pkg]))
}
def getshlibsdirs(d):
diff --git a/meta/classes/update-alternatives.bbclass b/meta/classes/update-alternatives.bbclass
index a75e282a3c..90bc56b9fb 100644
--- a/meta/classes/update-alternatives.bbclass
+++ b/meta/classes/update-alternatives.bbclass
@@ -353,7 +353,7 @@ python package_do_filedeps_append () {
continue
# Add file provide
- trans_target = file_translate(alt_target)
+ trans_target = oe.package.file_translate(alt_target)
d.appendVar('FILERPROVIDES_%s_%s' % (trans_target, pkg), " " + alt_link)
if not trans_target in (d.getVar('FILERPROVIDESFLIST_%s' % pkg, True) or ""):
d.appendVar('FILERPROVIDESFLIST_%s' % pkg, " " + trans_target)
diff --git a/meta/lib/oe/package.py b/meta/lib/oe/package.py
new file mode 100644
index 0000000000..6b1c1f48ce
--- /dev/null
+++ b/meta/lib/oe/package.py
@@ -0,0 +1,51 @@
+
+def file_translate(file):
+ ft = file.replace("@", "@at@")
+ ft = ft.replace(" ", "@space@")
+ ft = ft.replace("\t", "@tab@")
+ ft = ft.replace("[", "@openbrace@")
+ ft = ft.replace("]", "@closebrace@")
+ ft = ft.replace("_", "@underscore@")
+ return ft
+
+def filedeprunner(arg):
+ import re
+
+ (pkg, pkgfiles, rpmdeps, pkgdest) = arg
+ provides = {}
+ requires = {}
+
+ r = re.compile(r'[<>=]+ +[^ ]*')
+
+ def process_deps(pipe, pkg, pkgdest, provides, requires):
+ for line in pipe:
+ f = line.split(" ", 1)[0].strip()
+ line = line.split(" ", 1)[1].strip()
+
+ if line.startswith("Requires:"):
+ i = requires
+ elif line.startswith("Provides:"):
+ i = provides
+ else:
+ continue
+
+ file = f.replace(pkgdest + "/" + pkg, "")
+ file = file_translate(file)
+ value = line.split(":", 1)[1].strip()
+ value = r.sub(r'(\g<0>)', value)
+
+ if value.startswith("rpmlib("):
+ continue
+ if value == "python":
+ continue
+ if file not in i:
+ i[file] = []
+ i[file].append(value)
+
+ return provides, requires
+
+ dep_pipe = os.popen(rpmdeps + " " + " ".join(pkgfiles))
+
+ provides, requires = process_deps(dep_pipe, pkg, pkgdest, provides, requires)
+
+ return (pkg, provides, requires)