diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2013-02-01 13:50:38 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2013-02-06 13:11:19 +0000 |
commit | b659eb0f2070149d9516c129b3853b41fbbd1033 (patch) | |
tree | a6369183efeb923135b0bce142286272226f40a5 | |
parent | 8ef0e59d5a7da3671d1ad9a54fe068ed78f928d5 (diff) | |
download | openembedded-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.bbclass | 2 | ||||
-rw-r--r-- | meta/classes/package.bbclass | 92 | ||||
-rw-r--r-- | meta/classes/update-alternatives.bbclass | 2 | ||||
-rw-r--r-- | meta/lib/oe/package.py | 51 |
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) |