diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-03-30 22:02:45 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-06-22 09:16:00 +0100 |
commit | 1b489073dcf1e0836f7f2db8cb171debeb7a02e7 (patch) | |
tree | a0f4d93315d65bca27ed89271796d4581199aef6 | |
parent | d28f9b0c8636f27065c3261caa7a9c48a503460d (diff) | |
download | poky-1b489073dcf1e0836f7f2db8cb171debeb7a02e7.tar.gz |
package_ipk: Parallelise ipk creation
Allow the creation of ipks to happen in parallel, making best use of resources
on multiprocessor systems.
(From OE-Core rev: 07f6c0b464f0671bc39116317138e4ddf27bdae9)
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r-- | meta/classes/package_ipk.bbclass | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/meta/classes/package_ipk.bbclass b/meta/classes/package_ipk.bbclass index 8e69b5da36..d58b824d3a 100644 --- a/meta/classes/package_ipk.bbclass +++ b/meta/classes/package_ipk.bbclass | |||
@@ -17,6 +17,8 @@ OPKG_ARGS += "${@['', '--add-exclude ' + ' --add-exclude '.join((d.getVar('PACKA | |||
17 | OPKGLIBDIR = "${localstatedir}/lib" | 17 | OPKGLIBDIR = "${localstatedir}/lib" |
18 | 18 | ||
19 | python do_package_ipk () { | 19 | python do_package_ipk () { |
20 | from multiprocessing import Process | ||
21 | |||
20 | oldcwd = os.getcwd() | 22 | oldcwd = os.getcwd() |
21 | 23 | ||
22 | workdir = d.getVar('WORKDIR') | 24 | workdir = d.getVar('WORKDIR') |
@@ -37,11 +39,25 @@ python do_package_ipk () { | |||
37 | if os.access(os.path.join(tmpdir, "stamps", "IPK_PACKAGE_INDEX_CLEAN"), os.R_OK): | 39 | if os.access(os.path.join(tmpdir, "stamps", "IPK_PACKAGE_INDEX_CLEAN"), os.R_OK): |
38 | os.unlink(os.path.join(tmpdir, "stamps", "IPK_PACKAGE_INDEX_CLEAN")) | 40 | os.unlink(os.path.join(tmpdir, "stamps", "IPK_PACKAGE_INDEX_CLEAN")) |
39 | 41 | ||
40 | for pkg in packages.split(): | 42 | max_process = int(d.getVar("BB_NUMBER_THREADS") or os.cpu_count() or 1) |
41 | ipk_write_pkg(pkg, d) | 43 | launched = [] |
44 | pkgs = packages.split() | ||
45 | while pkgs: | ||
46 | if len(launched) < max_process: | ||
47 | p = Process(target=ipk_write_pkg, args=(pkgs.pop(), d)) | ||
48 | p.start() | ||
49 | launched.append(p) | ||
50 | for q in launched: | ||
51 | # The finished processes are joined when calling is_alive() | ||
52 | if not q.is_alive(): | ||
53 | launched.remove(q) | ||
54 | for p in launched: | ||
55 | p.join() | ||
42 | 56 | ||
43 | os.chdir(oldcwd) | 57 | os.chdir(oldcwd) |
44 | } | 58 | } |
59 | do_package_ipk[vardeps] += "ipk_write_pkg" | ||
60 | do_package_ipk[vardepsexclude] = "BB_NUMBER_THREADS" | ||
45 | 61 | ||
46 | def ipk_write_pkg(pkg, d): | 62 | def ipk_write_pkg(pkg, d): |
47 | import re, copy | 63 | import re, copy |