From fd1517e2b51a170f2427122c6b95396db251d827 Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Wed, 10 Aug 2022 14:35:29 +0100 Subject: classes: Update classes to match new bitbake class scope functionality Move classes to classes-global or classes-recipe as appropriate to take advantage of new bitbake functionality to check class scope/usage. (From OE-Core rev: f5c128008365e141082c129417eb72d2751e8045) Signed-off-by: Richard Purdie --- meta/classes-recipe/waf.bbclass | 81 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 meta/classes-recipe/waf.bbclass (limited to 'meta/classes-recipe/waf.bbclass') 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 @@ +# +# Copyright OpenEmbedded Contributors +# +# SPDX-License-Identifier: MIT +# + +# avoids build breaks when using no-static-libs.inc +DISABLE_STATIC = "" + +# What Python interpretter to use. Defaults to Python 3 but can be +# overridden if required. +WAF_PYTHON ?= "python3" + +B = "${WORKDIR}/build" +do_configure[cleandirs] += "${B}" + +EXTRA_OECONF:append = " ${PACKAGECONFIG_CONFARGS}" + +EXTRA_OEWAF_BUILD ??= "" +# In most cases, you want to pass the same arguments to `waf build` and `waf +# install`, but you can override it if necessary +EXTRA_OEWAF_INSTALL ??= "${EXTRA_OEWAF_BUILD}" + +def waflock_hash(d): + # Calculates the hash used for the waf lock file. This should include + # all of the user controllable inputs passed to waf configure. Note + # that the full paths for ${B} and ${S} are used; this is OK and desired + # because a change to either of these should create a unique lock file + # to prevent collisions. + import hashlib + h = hashlib.sha512() + def update(name): + val = d.getVar(name) + if val is not None: + h.update(val.encode('utf-8')) + update('S') + update('B') + update('prefix') + update('EXTRA_OECONF') + return h.hexdigest() + +# Use WAFLOCK to specify a separate lock file. The build is already +# sufficiently isolated by setting the output directory, this ensures that +# bitbake won't step on toes of any other configured context in the source +# directory (e.g. if the source is coming from externalsrc and was previously +# configured elsewhere). +export WAFLOCK = ".lock-waf_oe_${@waflock_hash(d)}_build" +BB_BASEHASH_IGNORE_VARS += "WAFLOCK" + +python waf_preconfigure() { + import subprocess + subsrcdir = d.getVar('S') + python = d.getVar('WAF_PYTHON') + wafbin = os.path.join(subsrcdir, 'waf') + try: + result = subprocess.check_output([python, wafbin, '--version'], cwd=subsrcdir, stderr=subprocess.STDOUT) + version = result.decode('utf-8').split()[1] + if bb.utils.vercmp_string_op(version, "1.8.7", ">="): + d.setVar("WAF_EXTRA_CONF", "--bindir=${bindir} --libdir=${libdir}") + except subprocess.CalledProcessError as e: + bb.warn("Unable to execute waf --version, exit code %d. Assuming waf version without bindir/libdir support." % e.returncode) + except FileNotFoundError: + bb.fatal("waf does not exist in %s" % subsrcdir) +} + +do_configure[prefuncs] += "waf_preconfigure" + +waf_do_configure() { + (cd ${S} && ${WAF_PYTHON} ./waf configure -o ${B} --prefix=${prefix} ${WAF_EXTRA_CONF} ${EXTRA_OECONF}) +} + +do_compile[progress] = "outof:^\[\s*(\d+)/\s*(\d+)\]\s+" +waf_do_compile() { + (cd ${S} && ${WAF_PYTHON} ./waf build ${@oe.utils.parallel_make_argument(d, '-j%d', limit=64)} ${EXTRA_OEWAF_BUILD}) +} + +waf_do_install() { + (cd ${S} && ${WAF_PYTHON} ./waf install --destdir=${D} ${EXTRA_OEWAF_INSTALL}) +} + +EXPORT_FUNCTIONS do_configure do_compile do_install -- cgit v1.2.3-54-g00ecf