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 /meta/classes/package.bbclass | |
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>
Diffstat (limited to 'meta/classes/package.bbclass')
-rw-r--r-- | meta/classes/package.bbclass | 92 |
1 files changed, 32 insertions, 60 deletions
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): |