diff options
Diffstat (limited to 'meta/classes/base.bbclass')
| -rw-r--r-- | meta/classes/base.bbclass | 276 |
1 files changed, 180 insertions, 96 deletions
diff --git a/meta/classes/base.bbclass b/meta/classes/base.bbclass index 789af3b10b..f2e3d4092e 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.package oe.packagegroup oe.sstatesig oe.lsb oe.cachedpath" +OE_IMPORTS += "os sys time oe.path oe.utils oe.types oe.package oe.packagegroup oe.sstatesig oe.lsb oe.cachedpath" OE_IMPORTS[type] = "list" def oe_import(d): @@ -47,7 +47,7 @@ def lsb_distro_identifier(d): return oe.lsb.distro_identifier(adjust_func) die() { - bbfatal "$*" + bbfatal_log "$*" } oe_runmake_call() { @@ -71,7 +71,7 @@ def base_dep_prepend(d): # INHIBIT_DEFAULT_DEPS doesn't apply to the patch command. Whether or not # we need that built is the responsibility of the patch function / class, not # the application. - if not d.getVar('INHIBIT_DEFAULT_DEPS'): + if not d.getVar('INHIBIT_DEFAULT_DEPS', False): if (d.getVar('HOST_SYS', True) != d.getVar('BUILD_SYS', True)): deps += " virtual/${TARGET_PREFIX}gcc virtual/${TARGET_PREFIX}compilerlibs virtual/libc " return deps @@ -94,9 +94,32 @@ def extra_path_elements(d): PATH_prepend = "${@extra_path_elements(d)}" +def get_lic_checksum_file_list(d): + filelist = [] + lic_files = d.getVar("LIC_FILES_CHKSUM", True) or '' + tmpdir = d.getVar("TMPDIR", True) + + urls = lic_files.split() + for url in urls: + # We only care about items that are absolute paths since + # any others should be covered by SRC_URI. + try: + path = bb.fetch.decodeurl(url)[2] + if not path: + raise bb.fetch.MalformedUrl(url) + + if path[0] == '/': + if path.startswith(tmpdir): + continue + filelist.append(path + ":" + str(os.path.exists(path))) + except bb.fetch.MalformedUrl: + raise bb.build.FuncFailed(d.getVar('PN', True) + ": LIC_FILES_CHKSUM contains an invalid URL: " + url) + return " ".join(filelist) + addtask fetch do_fetch[dirs] = "${DL_DIR}" do_fetch[file-checksums] = "${@bb.fetch.get_checksum_file_list(d)}" +do_fetch[file-checksums] += " ${@get_lic_checksum_file_list(d)}" do_fetch[vardeps] += "SRCREV" python base_do_fetch() { @@ -113,28 +136,23 @@ python base_do_fetch() { addtask unpack after do_fetch do_unpack[dirs] = "${WORKDIR}" + +python () { + if d.getVar('S', True) != d.getVar('WORKDIR', True): + d.setVarFlag('do_unpack', 'cleandirs', '${S}') + else: + d.setVarFlag('do_unpack', 'cleandirs', os.path.join('${S}', 'patches')) +} python base_do_unpack() { src_uri = (d.getVar('SRC_URI', True) or "").split() if len(src_uri) == 0: return - rootdir = d.getVar('WORKDIR', True) - - # Ensure that we cleanup ${S}/patches - # TODO: Investigate if we can remove - # the entire ${S} in this case. - s_dir = d.getVar('S', True) - p_dir = os.path.join(s_dir, 'patches') - bb.utils.remove(p_dir, True) - try: fetcher = bb.fetch2.Fetch(src_uri, d) - fetcher.unpack(rootdir) + fetcher.unpack(d.getVar('WORKDIR', True)) except bb.fetch2.BBFetchException as e: raise bb.build.FuncFailed(e) - - if not os.path.exists(s_dir): - bb.warn("%s ('S') don't exist, you must set 'S' to a proper value" % s_dir) } def pkgarch_mapping(d): @@ -187,10 +205,13 @@ def buildcfg_neededvars(d): bb.fatal('The following variable(s) were not set: %s\nPlease set them directly, or choose a MACHINE or DISTRO that sets them.' % ', '.join(pesteruser)) addhandler base_eventhandler -base_eventhandler[eventmask] = "bb.event.ConfigParsed bb.event.BuildStarted bb.event.RecipePreFinalise" +base_eventhandler[eventmask] = "bb.event.ConfigParsed bb.event.BuildStarted bb.event.RecipePreFinalise bb.runqueue.sceneQueueComplete bb.event.RecipeParsed" python base_eventhandler() { + import bb.runqueue + if isinstance(e, bb.event.ConfigParsed): - e.data.setVar("NATIVELSBSTRING", lsb_distro_identifier(e.data)) + if not e.data.getVar("NATIVELSBSTRING", False): + e.data.setVar("NATIVELSBSTRING", lsb_distro_identifier(e.data)) e.data.setVar('BB_VERSION', bb.__version__) pkgarch_mapping(e.data) oe.utils.features_backfill("DISTRO_FEATURES", e.data) @@ -210,7 +231,8 @@ python base_eventhandler() { statuslines.extend(flines) statusheader = e.data.getVar('BUILDCFG_HEADER', True) - bb.plain('\n%s\n%s\n' % (statusheader, '\n'.join(statuslines))) + if statusheader: + bb.plain('\n%s\n%s\n' % (statusheader, '\n'.join(statuslines))) # This code is to silence warnings where the SDK variables overwrite the # target ones and we'd see dulpicate key names overwriting each other @@ -223,6 +245,35 @@ python base_eventhandler() { e.data.delVar("PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}g++") e.data.delVar("PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}compilerlibs") + if isinstance(e, bb.runqueue.sceneQueueComplete): + completions = e.data.expand("${STAGING_DIR}/sstatecompletions") + if os.path.exists(completions): + cmds = set() + with open(completions, "r") as f: + cmds = set(f) + e.data.setVar("completion_function", "\n".join(cmds)) + e.data.setVarFlag("completion_function", "func", "1") + bb.debug(1, "Executing SceneQueue Completion commands: %s" % "\n".join(cmds)) + bb.build.exec_func("completion_function", e.data) + os.remove(completions) + + if isinstance(e, bb.event.RecipeParsed): + # + # If we have multiple providers of virtual/X and a PREFERRED_PROVIDER_virtual/X is set + # skip parsing for all the other providers which will mean they get uninstalled from the + # sysroot since they're now "unreachable". This makes switching virtual/kernel work in + # particular. + # + pn = d.getVar('PN', True) + source_mirror_fetch = d.getVar('SOURCE_MIRROR_FETCH', False) + if not source_mirror_fetch: + provs = (d.getVar("PROVIDES", True) or "").split() + multiwhitelist = (d.getVar("MULTI_PROVIDER_WHITELIST", True) or "").split() + for p in provs: + if p.startswith("virtual/") and p not in multiwhitelist: + profprov = d.getVar("PREFERRED_PROVIDER_" + p, True) + if profprov and pn != profprov: + raise bb.parse.SkipPackage("PREFERRED_PROVIDER_%s set to %s, not %s" % (p, profprov, pn)) } CONFIGURESTAMPFILE = "${WORKDIR}/configure.sstate" @@ -238,10 +289,11 @@ base_do_configure() { if [ "${CLEANBROKEN}" != "1" -a \( -e Makefile -o -e makefile -o -e GNUmakefile \) ]; then oe_runmake clean fi - find ${B} -name \*.la -delete + find ${B} -ignore_readdir_race -name \*.la -delete fi fi if [ -n "${CONFIGURESTAMPFILE}" ]; then + mkdir -p `dirname ${CONFIGURESTAMPFILE}` echo ${BB_TASKHASH} > ${CONFIGURESTAMPFILE} fi } @@ -321,6 +373,7 @@ python () { if pkgconfigflags: pkgconfig = (d.getVar('PACKAGECONFIG', True) or "").split() pn = d.getVar("PN", True) + mlprefix = d.getVar("MLPREFIX", True) def expandFilter(appends, extension, prefix): @@ -331,7 +384,10 @@ python () { newappends.append(a) elif a.startswith("virtual/"): subs = a.split("/", 1)[1] - newappends.append("virtual/" + prefix + subs + extension) + if subs.startswith(prefix): + newappends.append(a + extension) + else: + newappends.append("virtual/" + prefix + subs + extension) else: if a.startswith(prefix): newappends.append(a + extension) @@ -343,11 +399,11 @@ python () { if not appends: return if varname.find("DEPENDS") != -1: - if pn.startswith("nativesdk-"): + if bb.data.inherits_class('nativesdk', d) or bb.data.inherits_class('cross-canadian', d) : appends = expandFilter(appends, "", "nativesdk-") - if pn.endswith("-native"): + elif bb.data.inherits_class('native', d): appends = expandFilter(appends, "-native", "") - if mlprefix: + elif mlprefix: appends = expandFilter(appends, "", mlprefix) varname = d.expand(varname) d.appendVar(varname, " " + " ".join(appends)) @@ -359,7 +415,8 @@ python () { items = flagval.split(",") num = len(items) if num > 4: - bb.error("Only enable,disable,depend,rdepend can be specified!") + bb.error("%s: PACKAGECONFIG[%s] Only enable,disable,depend,rdepend can be specified!" + % (d.getVar('PN', True), flag)) if flag in pkgconfig: if num >= 3 and items[2]: @@ -372,26 +429,13 @@ python () { extraconf.append(items[1]) appendVar('DEPENDS', extradeps) appendVar('RDEPENDS_${PN}', extrardeps) - if bb.data.inherits_class('cmake', d): - appendVar('EXTRA_OECMAKE', extraconf) - else: - appendVar('EXTRA_OECONF', extraconf) + appendVar('PACKAGECONFIG_CONFARGS', extraconf) - # If PRINC is set, try and increase the PR value by the amount specified - # The PR server is now the preferred way to handle PR changes based on - # the checksum of the recipe (including bbappend). The PRINC is now - # obsolete. Return a warning to the user. - princ = d.getVar('PRINC', True) - if princ and princ != "0": - bb.error("Use of PRINC %s was detected in the recipe %s (or one of its .bbappends)\nUse of PRINC is deprecated. The PR server should be used to automatically increment the PR. See: https://wiki.yoctoproject.org/wiki/PR_Service." % (princ, d.getVar("FILE", True))) - pr = d.getVar('PR', True) - pr_prefix = re.search("\D+",pr) - prval = re.search("\d+",pr) - if pr_prefix is None or prval is None: - bb.error("Unable to analyse format of PR variable: %s" % pr) - nval = int(prval.group(0)) + int(princ) - pr = pr_prefix.group(0) + str(nval) + pr[prval.end():] - d.setVar('PR', pr) + # TODO: once all recipes/classes abusing EXTRA_OECONF + # to get PACKAGECONFIG options are fixed to use PACKAGECONFIG_CONFARGS + # move this appendVar to autotools.bbclass. + if not bb.data.inherits_class('cmake', d): + appendVar('EXTRA_OECONF', extraconf) pn = d.getVar('PN', True) license = d.getVar('LICENSE', True) @@ -414,15 +458,26 @@ python () { d.setVarFlag('do_configure', 'umask', '022') d.setVarFlag('do_compile', 'umask', '022') d.appendVarFlag('do_install', 'depends', ' virtual/fakeroot-native:do_populate_sysroot') - d.setVarFlag('do_install', 'fakeroot', 1) + d.setVarFlag('do_install', 'fakeroot', '1') d.setVarFlag('do_install', 'umask', '022') d.appendVarFlag('do_package', 'depends', ' virtual/fakeroot-native:do_populate_sysroot') - d.setVarFlag('do_package', 'fakeroot', 1) + d.setVarFlag('do_package', 'fakeroot', '1') d.setVarFlag('do_package', 'umask', '022') - d.setVarFlag('do_package_setscene', 'fakeroot', 1) + d.setVarFlag('do_package_setscene', 'fakeroot', '1') d.appendVarFlag('do_package_setscene', 'depends', ' virtual/fakeroot-native:do_populate_sysroot') - d.setVarFlag('do_devshell', 'fakeroot', 1) + d.setVarFlag('do_devshell', 'fakeroot', '1') d.appendVarFlag('do_devshell', 'depends', ' virtual/fakeroot-native:do_populate_sysroot') + + need_machine = d.getVar('COMPATIBLE_MACHINE', True) + if need_machine: + import re + compat_machines = (d.getVar('MACHINEOVERRIDES', True) or "").split(":") + for m in compat_machines: + if re.match(need_machine, m): + break + else: + raise bb.parse.SkipPackage("incompatible with machine %s (not in COMPATIBLE_MACHINE)" % d.getVar('MACHINE', True)) + source_mirror_fetch = d.getVar('SOURCE_MIRROR_FETCH', 0) if not source_mirror_fetch: need_host = d.getVar('COMPATIBLE_HOST', True) @@ -432,17 +487,6 @@ python () { if not re.match(need_host, this_host): raise bb.parse.SkipPackage("incompatible with host %s (not in COMPATIBLE_HOST)" % this_host) - need_machine = d.getVar('COMPATIBLE_MACHINE', True) - if need_machine: - import re - compat_machines = (d.getVar('MACHINEOVERRIDES', True) or "").split(":") - for m in compat_machines: - if re.match(need_machine, m): - break - else: - raise bb.parse.SkipPackage("incompatible with machine %s (not in COMPATIBLE_MACHINE)" % d.getVar('MACHINE', True)) - - bad_licenses = (d.getVar('INCOMPATIBLE_LICENSE', True) or "").split() check_license = False if pn.startswith("nativesdk-") else True @@ -451,19 +495,31 @@ python () { "-cross-canadian-${TRANSLATED_TARGET_ARCH}"]: if pn.endswith(d.expand(t)): check_license = False + if pn.startswith("gcc-source-"): + check_license = False if check_license and bad_licenses: bad_licenses = expand_wildcard_licenses(d, bad_licenses) whitelist = [] + incompatwl = [] for lic in bad_licenses: - for w in ["HOSTTOOLS_WHITELIST_", "LGPLv2_WHITELIST_", "WHITELIST_"]: - whitelist.extend((d.getVar(w + lic, True) or "").split()) spdx_license = return_spdx(d, lic) - if spdx_license: - whitelist.extend((d.getVar('HOSTTOOLS_WHITELIST_%s' % spdx_license, True) or "").split()) + for w in ["LGPLv2_WHITELIST_", "WHITELIST_"]: + whitelist.extend((d.getVar(w + lic, True) or "").split()) + if spdx_license: + whitelist.extend((d.getVar(w + spdx_license, True) or "").split()) + ''' + We need to track what we are whitelisting and why. If pn is + incompatible we need to be able to note that the image that + is created may infact contain incompatible licenses despite + INCOMPATIBLE_LICENSE being set. + ''' + incompatwl.extend((d.getVar(w + lic, True) or "").split()) + if spdx_license: + incompatwl.extend((d.getVar(w + spdx_license, True) or "").split()) + if not pn in whitelist: - recipe_license = d.getVar('LICENSE', True) pkgs = d.getVar('PACKAGES', True).split() skipped_pkgs = [] unskipped_pkgs = [] @@ -475,48 +531,75 @@ python () { all_skipped = skipped_pkgs and not unskipped_pkgs if unskipped_pkgs: for pkg in skipped_pkgs: - bb.debug(1, "SKIPPING the package " + pkg + " at do_rootfs because it's " + recipe_license) - d.setVar('LICENSE_EXCLUSION-' + pkg, 1) + bb.debug(1, "SKIPPING the package " + pkg + " at do_rootfs because it's " + license) + mlprefix = d.getVar('MLPREFIX', True) + d.setVar('LICENSE_EXCLUSION-' + mlprefix + pkg, 1) for pkg in unskipped_pkgs: bb.debug(1, "INCLUDING the package " + pkg) elif all_skipped or incompatible_license(d, bad_licenses): - bb.debug(1, "SKIPPING recipe %s because it's %s" % (pn, recipe_license)) - raise bb.parse.SkipPackage("incompatible with license %s" % recipe_license) + bb.debug(1, "SKIPPING recipe %s because it's %s" % (pn, license)) + raise bb.parse.SkipPackage("incompatible with license %s" % license) + elif pn in whitelist: + if pn in incompatwl: + bb.note("INCLUDING " + pn + " as buildable despite INCOMPATIBLE_LICENSE because it has been whitelisted") + needsrcrev = False srcuri = d.getVar('SRC_URI', True) - # Svn packages should DEPEND on subversion-native - if "svn://" in srcuri: - d.appendVarFlag('do_fetch', 'depends', ' subversion-native:do_populate_sysroot') + for uri in srcuri.split(): + (scheme, _ , path) = bb.fetch.decodeurl(uri)[:3] - # Git packages should DEPEND on git-native - if "git://" in srcuri: - d.appendVarFlag('do_fetch', 'depends', ' git-native:do_populate_sysroot') + # HTTP/FTP use the wget fetcher + if scheme in ("http", "https", "ftp"): + d.appendVarFlag('do_fetch', 'depends', ' wget-native:do_populate_sysroot') - # Mercurial packages should DEPEND on mercurial-native - elif "hg://" in srcuri: - d.appendVarFlag('do_fetch', 'depends', ' mercurial-native:do_populate_sysroot') + # Svn packages should DEPEND on subversion-native + if scheme == "svn": + needsrcrev = True + d.appendVarFlag('do_fetch', 'depends', ' subversion-native:do_populate_sysroot') - # OSC packages should DEPEND on osc-native - elif "osc://" in srcuri: - d.appendVarFlag('do_fetch', 'depends', ' osc-native:do_populate_sysroot') + # Git packages should DEPEND on git-native + elif scheme in ("git", "gitsm"): + needsrcrev = True + d.appendVarFlag('do_fetch', 'depends', ' git-native:do_populate_sysroot') - # *.lz4 should depends on lz4-native for unpacking - # Not endswith because of "*.patch.lz4;patch=1". Need bb.fetch.decodeurl in future - if '.lz4' in srcuri: - d.appendVarFlag('do_unpack', 'depends', ' lz4-native:do_populate_sysroot') + # Mercurial packages should DEPEND on mercurial-native + elif scheme == "hg": + needsrcrev = True + d.appendVarFlag('do_fetch', 'depends', ' mercurial-native:do_populate_sysroot') - # *.xz should depends on xz-native for unpacking - # Not endswith because of "*.patch.xz;patch=1". Need bb.fetch.decodeurl in future - if '.xz' in srcuri: - d.appendVarFlag('do_unpack', 'depends', ' xz-native:do_populate_sysroot') + # Perforce packages support SRCREV = "${AUTOREV}" + elif scheme == "p4": + needsrcrev = True - # unzip-native should already be staged before unpacking ZIP recipes - if ".zip" in srcuri: - d.appendVarFlag('do_unpack', 'depends', ' unzip-native:do_populate_sysroot') + # OSC packages should DEPEND on osc-native + elif scheme == "osc": + d.appendVarFlag('do_fetch', 'depends', ' osc-native:do_populate_sysroot') - # file is needed by rpm2cpio.sh - if ".src.rpm" in srcuri: - d.appendVarFlag('do_unpack', 'depends', ' file-native:do_populate_sysroot') + elif scheme == "npm": + d.appendVarFlag('do_fetch', 'depends', ' nodejs-native:do_populate_sysroot') + + # *.lz4 should DEPEND on lz4-native for unpacking + if path.endswith('.lz4'): + d.appendVarFlag('do_unpack', 'depends', ' lz4-native:do_populate_sysroot') + + # *.lz should DEPEND on lzip-native for unpacking + elif path.endswith('.lz'): + d.appendVarFlag('do_unpack', 'depends', ' lzip-native:do_populate_sysroot') + + # *.xz should DEPEND on xz-native for unpacking + elif path.endswith('.xz'): + d.appendVarFlag('do_unpack', 'depends', ' xz-native:do_populate_sysroot') + + # .zip should DEPEND on unzip-native for unpacking + elif path.endswith('.zip'): + d.appendVarFlag('do_unpack', 'depends', ' unzip-native:do_populate_sysroot') + + # file is needed by rpm2cpio.sh + elif path.endswith('.src.rpm'): + d.appendVarFlag('do_unpack', 'depends', ' file-native:do_populate_sysroot') + + if needsrcrev: + d.setVar("SRCPV", "${@bb.fetch2.get_srcrev(d)}") set_packagetriplet(d) @@ -569,8 +652,9 @@ addtask cleansstate after do_clean python do_cleansstate() { sstate_clean_cachefiles(d) } - addtask cleanall after do_cleansstate +do_cleansstate[nostamp] = "1" + python do_cleanall() { src_uri = (d.getVar('SRC_URI', True) or "").split() if len(src_uri) == 0: @@ -579,7 +663,7 @@ python do_cleanall() { try: fetcher = bb.fetch2.Fetch(src_uri, d) fetcher.clean() - except bb.fetch2.BBFetchException, e: + except bb.fetch2.BBFetchException as e: raise bb.build.FuncFailed(e) } do_cleanall[nostamp] = "1" |
