diff options
Diffstat (limited to 'meta/classes-recipe/waf.bbclass')
-rw-r--r-- | meta/classes-recipe/waf.bbclass | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/meta/classes-recipe/waf.bbclass b/meta/classes-recipe/waf.bbclass new file mode 100644 index 0000000000..5fa0cc4987 --- /dev/null +++ b/meta/classes-recipe/waf.bbclass | |||
@@ -0,0 +1,81 @@ | |||
1 | # | ||
2 | # Copyright OpenEmbedded Contributors | ||
3 | # | ||
4 | # SPDX-License-Identifier: MIT | ||
5 | # | ||
6 | |||
7 | # avoids build breaks when using no-static-libs.inc | ||
8 | DISABLE_STATIC = "" | ||
9 | |||
10 | # What Python interpretter to use. Defaults to Python 3 but can be | ||
11 | # overridden if required. | ||
12 | WAF_PYTHON ?= "python3" | ||
13 | |||
14 | B = "${WORKDIR}/build" | ||
15 | do_configure[cleandirs] += "${B}" | ||
16 | |||
17 | EXTRA_OECONF:append = " ${PACKAGECONFIG_CONFARGS}" | ||
18 | |||
19 | EXTRA_OEWAF_BUILD ??= "" | ||
20 | # In most cases, you want to pass the same arguments to `waf build` and `waf | ||
21 | # install`, but you can override it if necessary | ||
22 | EXTRA_OEWAF_INSTALL ??= "${EXTRA_OEWAF_BUILD}" | ||
23 | |||
24 | def waflock_hash(d): | ||
25 | # Calculates the hash used for the waf lock file. This should include | ||
26 | # all of the user controllable inputs passed to waf configure. Note | ||
27 | # that the full paths for ${B} and ${S} are used; this is OK and desired | ||
28 | # because a change to either of these should create a unique lock file | ||
29 | # to prevent collisions. | ||
30 | import hashlib | ||
31 | h = hashlib.sha512() | ||
32 | def update(name): | ||
33 | val = d.getVar(name) | ||
34 | if val is not None: | ||
35 | h.update(val.encode('utf-8')) | ||
36 | update('S') | ||
37 | update('B') | ||
38 | update('prefix') | ||
39 | update('EXTRA_OECONF') | ||
40 | return h.hexdigest() | ||
41 | |||
42 | # Use WAFLOCK to specify a separate lock file. The build is already | ||
43 | # sufficiently isolated by setting the output directory, this ensures that | ||
44 | # bitbake won't step on toes of any other configured context in the source | ||
45 | # directory (e.g. if the source is coming from externalsrc and was previously | ||
46 | # configured elsewhere). | ||
47 | export WAFLOCK = ".lock-waf_oe_${@waflock_hash(d)}_build" | ||
48 | BB_BASEHASH_IGNORE_VARS += "WAFLOCK" | ||
49 | |||
50 | python waf_preconfigure() { | ||
51 | import subprocess | ||
52 | subsrcdir = d.getVar('S') | ||
53 | python = d.getVar('WAF_PYTHON') | ||
54 | wafbin = os.path.join(subsrcdir, 'waf') | ||
55 | try: | ||
56 | result = subprocess.check_output([python, wafbin, '--version'], cwd=subsrcdir, stderr=subprocess.STDOUT) | ||
57 | version = result.decode('utf-8').split()[1] | ||
58 | if bb.utils.vercmp_string_op(version, "1.8.7", ">="): | ||
59 | d.setVar("WAF_EXTRA_CONF", "--bindir=${bindir} --libdir=${libdir}") | ||
60 | except subprocess.CalledProcessError as e: | ||
61 | bb.warn("Unable to execute waf --version, exit code %d. Assuming waf version without bindir/libdir support." % e.returncode) | ||
62 | except FileNotFoundError: | ||
63 | bb.fatal("waf does not exist in %s" % subsrcdir) | ||
64 | } | ||
65 | |||
66 | do_configure[prefuncs] += "waf_preconfigure" | ||
67 | |||
68 | waf_do_configure() { | ||
69 | (cd ${S} && ${WAF_PYTHON} ./waf configure -o ${B} --prefix=${prefix} ${WAF_EXTRA_CONF} ${EXTRA_OECONF}) | ||
70 | } | ||
71 | |||
72 | do_compile[progress] = "outof:^\[\s*(\d+)/\s*(\d+)\]\s+" | ||
73 | waf_do_compile() { | ||
74 | (cd ${S} && ${WAF_PYTHON} ./waf build ${@oe.utils.parallel_make_argument(d, '-j%d', limit=64)} ${EXTRA_OEWAF_BUILD}) | ||
75 | } | ||
76 | |||
77 | waf_do_install() { | ||
78 | (cd ${S} && ${WAF_PYTHON} ./waf install --destdir=${D} ${EXTRA_OEWAF_INSTALL}) | ||
79 | } | ||
80 | |||
81 | EXPORT_FUNCTIONS do_configure do_compile do_install | ||