blob: 27c1d6168d4577fd6bbefe4528bfd0441383b1a2 [file] [log] [blame]
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001BB_DEFAULT_TASK ?= "build"
2CLASSOVERRIDE ?= "class-target"
3
4inherit patch
5inherit staging
6
7inherit mirrors
8inherit utils
9inherit utility-tasks
10inherit metadata_scm
11inherit logging
12
Brad Bishop15ae2502019-06-18 21:44:24 -040013OE_EXTRA_IMPORTS ?= ""
14
Andrew Jefferyecdf5f12022-03-01 01:09:46 +103015OE_IMPORTS += "os sys time oe.path oe.utils oe.types oe.package oe.packagegroup oe.sstatesig oe.lsb oe.cachedpath oe.license oe.qa oe.reproducible oe.rust ${OE_EXTRA_IMPORTS}"
Patrick Williamsc124f4f2015-09-15 14:41:29 -050016OE_IMPORTS[type] = "list"
17
Brad Bishopf3fd2882019-06-21 08:06:37 -040018PACKAGECONFIG_CONFARGS ??= ""
19
Patrick Williamsc124f4f2015-09-15 14:41:29 -050020def oe_import(d):
21 import sys
22
Brad Bishop6e60e8b2018-02-01 10:27:11 -050023 bbpath = d.getVar("BBPATH").split(":")
Patrick Williamsc124f4f2015-09-15 14:41:29 -050024 sys.path[0:0] = [os.path.join(dir, "lib") for dir in bbpath]
25
26 def inject(name, value):
27 """Make a python object accessible from the metadata"""
28 if hasattr(bb.utils, "_context"):
29 bb.utils._context[name] = value
30 else:
31 __builtins__[name] = value
32
33 import oe.data
34 for toimport in oe.data.typed_value("OE_IMPORTS", d):
Brad Bishop00e122a2019-10-05 11:10:57 -040035 try:
36 imported = __import__(toimport)
37 inject(toimport.split(".", 1)[0], imported)
38 except AttributeError as e:
39 bb.error("Error importing OE modules: %s" % str(e))
Patrick Williamsc124f4f2015-09-15 14:41:29 -050040 return ""
41
42# We need the oe module name space early (before INHERITs get added)
43OE_IMPORTED := "${@oe_import(d)}"
44
45def lsb_distro_identifier(d):
Brad Bishop6e60e8b2018-02-01 10:27:11 -050046 adjust = d.getVar('LSB_DISTRO_ADJUST')
Patrick Williamsc124f4f2015-09-15 14:41:29 -050047 adjust_func = None
48 if adjust:
49 try:
50 adjust_func = globals()[adjust]
51 except KeyError:
52 pass
53 return oe.lsb.distro_identifier(adjust_func)
54
55die() {
56 bbfatal_log "$*"
57}
58
59oe_runmake_call() {
60 bbnote ${MAKE} ${EXTRA_OEMAKE} "$@"
61 ${MAKE} ${EXTRA_OEMAKE} "$@"
62}
63
64oe_runmake() {
65 oe_runmake_call "$@" || die "oe_runmake failed"
66}
67
68
Patrick Williams213cb262021-08-07 19:21:33 -050069def get_base_dep(d):
Brad Bishopd7bf8c12018-02-25 22:55:05 -050070 if d.getVar('INHIBIT_DEFAULT_DEPS', False):
71 return ""
72 return "${BASE_DEFAULT_DEPS}"
Patrick Williamsc124f4f2015-09-15 14:41:29 -050073
Andrew Geissler7e0e3c02022-02-25 20:34:39 +000074BASE_DEFAULT_DEPS = "virtual/${HOST_PREFIX}gcc virtual/${HOST_PREFIX}compilerlibs virtual/libc"
Patrick Williamsc124f4f2015-09-15 14:41:29 -050075
Brad Bishopd7bf8c12018-02-25 22:55:05 -050076BASEDEPENDS = ""
Patrick Williams213cb262021-08-07 19:21:33 -050077BASEDEPENDS:class-target = "${@get_base_dep(d)}"
78BASEDEPENDS:class-nativesdk = "${@get_base_dep(d)}"
Patrick Williamsc124f4f2015-09-15 14:41:29 -050079
Patrick Williams213cb262021-08-07 19:21:33 -050080DEPENDS:prepend="${BASEDEPENDS} "
Patrick Williamsc124f4f2015-09-15 14:41:29 -050081
82FILESPATH = "${@base_set_filespath(["${FILE_DIRNAME}/${BP}", "${FILE_DIRNAME}/${BPN}", "${FILE_DIRNAME}/files"], d)}"
83# THISDIR only works properly with imediate expansion as it has to run
84# in the context of the location its used (:=)
Brad Bishop6e60e8b2018-02-01 10:27:11 -050085THISDIR = "${@os.path.dirname(d.getVar('FILE'))}"
Patrick Williamsc124f4f2015-09-15 14:41:29 -050086
87def extra_path_elements(d):
88 path = ""
Brad Bishop6e60e8b2018-02-01 10:27:11 -050089 elements = (d.getVar('EXTRANATIVEPATH') or "").split()
Patrick Williamsc124f4f2015-09-15 14:41:29 -050090 for e in elements:
91 path = path + "${STAGING_BINDIR_NATIVE}/" + e + ":"
92 return path
93
Patrick Williams213cb262021-08-07 19:21:33 -050094PATH:prepend = "${@extra_path_elements(d)}"
Patrick Williamsc124f4f2015-09-15 14:41:29 -050095
96def get_lic_checksum_file_list(d):
97 filelist = []
Brad Bishop6e60e8b2018-02-01 10:27:11 -050098 lic_files = d.getVar("LIC_FILES_CHKSUM") or ''
99 tmpdir = d.getVar("TMPDIR")
100 s = d.getVar("S")
101 b = d.getVar("B")
102 workdir = d.getVar("WORKDIR")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500103
104 urls = lic_files.split()
105 for url in urls:
106 # We only care about items that are absolute paths since
107 # any others should be covered by SRC_URI.
108 try:
Brad Bishop220d5532018-08-14 00:59:39 +0100109 (method, host, path, user, pswd, parm) = bb.fetch.decodeurl(url)
110 if method != "file" or not path:
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600111 raise bb.fetch.MalformedUrl(url)
112
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500113 if path[0] == '/':
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500114 if path.startswith((tmpdir, s, b, workdir)):
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500115 continue
116 filelist.append(path + ":" + str(os.path.exists(path)))
117 except bb.fetch.MalformedUrl:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500118 bb.fatal(d.getVar('PN') + ": LIC_FILES_CHKSUM contains an invalid URL: " + url)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500119 return " ".join(filelist)
120
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500121def setup_hosttools_dir(dest, toolsvar, d, fatal=True):
122 tools = d.getVar(toolsvar).split()
123 origbbenv = d.getVar("BB_ORIGENV", False)
124 path = origbbenv.getVar("PATH")
125 bb.utils.mkdirhier(dest)
126 notfound = []
127 for tool in tools:
128 desttool = os.path.join(dest, tool)
129 if not os.path.exists(desttool):
Andrew Geissler82c905d2020-04-13 13:39:40 -0500130 # clean up dead symlink
131 if os.path.islink(desttool):
132 os.unlink(desttool)
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500133 srctool = bb.utils.which(path, tool, executable=True)
Brad Bishop19323692019-04-05 15:28:33 -0400134 # gcc/g++ may link to ccache on some hosts, e.g.,
135 # /usr/local/bin/ccache/gcc -> /usr/bin/ccache, then which(gcc)
136 # would return /usr/local/bin/ccache/gcc, but what we need is
137 # /usr/bin/gcc, this code can check and fix that.
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500138 if "ccache" in srctool:
139 srctool = bb.utils.which(path, tool, executable=True, direction=1)
140 if srctool:
141 os.symlink(srctool, desttool)
142 else:
143 notfound.append(tool)
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800144
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500145 if notfound and fatal:
146 bb.fatal("The following required tools (as specified by HOSTTOOLS) appear to be unavailable in PATH, please install them in order to proceed:\n %s" % " ".join(notfound))
147
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500148addtask fetch
149do_fetch[dirs] = "${DL_DIR}"
150do_fetch[file-checksums] = "${@bb.fetch.get_checksum_file_list(d)}"
151do_fetch[file-checksums] += " ${@get_lic_checksum_file_list(d)}"
152do_fetch[vardeps] += "SRCREV"
Andrew Geissler595f6302022-01-24 19:11:47 +0000153do_fetch[network] = "1"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500154python base_do_fetch() {
155
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500156 src_uri = (d.getVar('SRC_URI') or "").split()
Andrew Geisslereff27472021-10-29 15:35:00 -0500157 if not src_uri:
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500158 return
159
160 try:
161 fetcher = bb.fetch2.Fetch(src_uri, d)
162 fetcher.download()
163 except bb.fetch2.BBFetchException as e:
Andrew Geisslereff27472021-10-29 15:35:00 -0500164 bb.fatal("Bitbake Fetcher Error: " + repr(e))
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500165}
166
167addtask unpack after do_fetch
168do_unpack[dirs] = "${WORKDIR}"
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600169
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800170do_unpack[cleandirs] = "${@d.getVar('S') if os.path.normpath(d.getVar('S')) != os.path.normpath(d.getVar('WORKDIR')) else os.path.join('${S}', 'patches')}"
Brad Bishop316dfdd2018-06-25 12:45:53 -0400171
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500172python base_do_unpack() {
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500173 src_uri = (d.getVar('SRC_URI') or "").split()
Andrew Geisslereff27472021-10-29 15:35:00 -0500174 if not src_uri:
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500175 return
176
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500177 try:
178 fetcher = bb.fetch2.Fetch(src_uri, d)
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500179 fetcher.unpack(d.getVar('WORKDIR'))
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500180 except bb.fetch2.BBFetchException as e:
Andrew Geisslereff27472021-10-29 15:35:00 -0500181 bb.fatal("Bitbake Fetcher Error: " + repr(e))
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500182}
183
Andrew Geisslereff27472021-10-29 15:35:00 -0500184SSTATETASKS += "do_deploy_source_date_epoch"
185
186do_deploy_source_date_epoch () {
187 mkdir -p ${SDE_DEPLOYDIR}
188 if [ -e ${SDE_FILE} ]; then
189 echo "Deploying SDE from ${SDE_FILE} -> ${SDE_DEPLOYDIR}."
190 cp -p ${SDE_FILE} ${SDE_DEPLOYDIR}/__source_date_epoch.txt
191 else
192 echo "${SDE_FILE} not found!"
193 fi
194}
195
196python do_deploy_source_date_epoch_setscene () {
197 sstate_setscene(d)
198 bb.utils.mkdirhier(d.getVar('SDE_DIR'))
199 sde_file = os.path.join(d.getVar('SDE_DEPLOYDIR'), '__source_date_epoch.txt')
200 if os.path.exists(sde_file):
201 target = d.getVar('SDE_FILE')
202 bb.debug(1, "Moving setscene SDE file %s -> %s" % (sde_file, target))
203 bb.utils.rename(sde_file, target)
204 else:
205 bb.debug(1, "%s not found!" % sde_file)
206}
207
208do_deploy_source_date_epoch[dirs] = "${SDE_DEPLOYDIR}"
209do_deploy_source_date_epoch[sstate-plaindirs] = "${SDE_DEPLOYDIR}"
210addtask do_deploy_source_date_epoch_setscene
211addtask do_deploy_source_date_epoch before do_configure after do_patch
212
213python create_source_date_epoch_stamp() {
214 source_date_epoch = oe.reproducible.get_source_date_epoch(d, d.getVar('S'))
215 oe.reproducible.epochfile_write(source_date_epoch, d.getVar('SDE_FILE'), d)
216}
217do_unpack[postfuncs] += "create_source_date_epoch_stamp"
218
219def get_source_date_epoch_value(d):
220 return oe.reproducible.epochfile_read(d.getVar('SDE_FILE'), d)
221
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500222def get_layers_branch_rev(d):
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500223 layers = (d.getVar("BBLAYERS") or "").split()
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500224 layers_branch_rev = ["%-20s = \"%s:%s\"" % (os.path.basename(i), \
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500225 base_get_metadata_git_branch(i, None).strip(), \
226 base_get_metadata_git_revision(i, None)) \
227 for i in layers]
228 i = len(layers_branch_rev)-1
229 p1 = layers_branch_rev[i].find("=")
230 s1 = layers_branch_rev[i][p1:]
231 while i > 0:
232 p2 = layers_branch_rev[i-1].find("=")
233 s2= layers_branch_rev[i-1][p2:]
234 if s1 == s2:
235 layers_branch_rev[i-1] = layers_branch_rev[i-1][0:p2]
236 i -= 1
237 else:
238 i -= 1
239 p1 = layers_branch_rev[i].find("=")
240 s1= layers_branch_rev[i][p1:]
241 return layers_branch_rev
242
243
244BUILDCFG_FUNCS ??= "buildcfg_vars get_layers_branch_rev buildcfg_neededvars"
245BUILDCFG_FUNCS[type] = "list"
246
247def buildcfg_vars(d):
248 statusvars = oe.data.typed_value('BUILDCFG_VARS', d)
249 for var in statusvars:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500250 value = d.getVar(var)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500251 if value is not None:
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500252 yield '%-20s = "%s"' % (var, value)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500253
254def buildcfg_neededvars(d):
255 needed_vars = oe.data.typed_value("BUILDCFG_NEEDEDVARS", d)
256 pesteruser = []
257 for v in needed_vars:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500258 val = d.getVar(v)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500259 if not val or val == 'INVALID':
260 pesteruser.append(v)
261
262 if pesteruser:
263 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))
264
265addhandler base_eventhandler
Brad Bishop19323692019-04-05 15:28:33 -0400266base_eventhandler[eventmask] = "bb.event.ConfigParsed bb.event.MultiConfigParsed bb.event.BuildStarted bb.event.RecipePreFinalise bb.event.RecipeParsed"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500267python base_eventhandler() {
268 import bb.runqueue
269
270 if isinstance(e, bb.event.ConfigParsed):
Brad Bishop316dfdd2018-06-25 12:45:53 -0400271 if not d.getVar("NATIVELSBSTRING", False):
272 d.setVar("NATIVELSBSTRING", lsb_distro_identifier(d))
Andrew Geissler6ce62a22020-11-30 19:58:47 -0600273 d.setVar("ORIGNATIVELSBSTRING", d.getVar("NATIVELSBSTRING", False))
Brad Bishop316dfdd2018-06-25 12:45:53 -0400274 d.setVar('BB_VERSION', bb.__version__)
Brad Bishop19323692019-04-05 15:28:33 -0400275
276 # There might be no bb.event.ConfigParsed event if bitbake server is
277 # running, so check bb.event.BuildStarted too to make sure ${HOSTTOOLS_DIR}
278 # exists.
279 if isinstance(e, bb.event.ConfigParsed) or \
280 (isinstance(e, bb.event.BuildStarted) and not os.path.exists(d.getVar('HOSTTOOLS_DIR'))):
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500281 # Works with the line in layer.conf which changes PATH to point here
282 setup_hosttools_dir(d.getVar('HOSTTOOLS_DIR'), 'HOSTTOOLS', d)
283 setup_hosttools_dir(d.getVar('HOSTTOOLS_DIR'), 'HOSTTOOLS_NONFATAL', d, fatal=False)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500284
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500285 if isinstance(e, bb.event.MultiConfigParsed):
286 # We need to expand SIGGEN_EXCLUDE_SAFE_RECIPE_DEPS in each of the multiconfig data stores
287 # own contexts so the variables get expanded correctly for that arch, then inject back into
288 # the main data store.
289 deps = []
290 for config in e.mcdata:
291 deps.append(e.mcdata[config].getVar("SIGGEN_EXCLUDE_SAFE_RECIPE_DEPS"))
292 deps = " ".join(deps)
293 e.mcdata[''].setVar("SIGGEN_EXCLUDE_SAFE_RECIPE_DEPS", deps)
294
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500295 if isinstance(e, bb.event.BuildStarted):
Brad Bishop316dfdd2018-06-25 12:45:53 -0400296 localdata = bb.data.createCopy(d)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500297 statuslines = []
298 for func in oe.data.typed_value('BUILDCFG_FUNCS', localdata):
299 g = globals()
300 if func not in g:
301 bb.warn("Build configuration function '%s' does not exist" % func)
302 else:
303 flines = g[func](localdata)
304 if flines:
305 statuslines.extend(flines)
306
Brad Bishop316dfdd2018-06-25 12:45:53 -0400307 statusheader = d.getVar('BUILDCFG_HEADER')
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500308 if statusheader:
309 bb.plain('\n%s\n%s\n' % (statusheader, '\n'.join(statuslines)))
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500310
311 # This code is to silence warnings where the SDK variables overwrite the
312 # target ones and we'd see dulpicate key names overwriting each other
313 # for various PREFERRED_PROVIDERS
314 if isinstance(e, bb.event.RecipePreFinalise):
Brad Bishop316dfdd2018-06-25 12:45:53 -0400315 if d.getVar("TARGET_PREFIX") == d.getVar("SDK_PREFIX"):
316 d.delVar("PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}binutils")
Brad Bishop316dfdd2018-06-25 12:45:53 -0400317 d.delVar("PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}gcc")
318 d.delVar("PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}g++")
319 d.delVar("PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}compilerlibs")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500320
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500321 if isinstance(e, bb.event.RecipeParsed):
322 #
323 # If we have multiple providers of virtual/X and a PREFERRED_PROVIDER_virtual/X is set
324 # skip parsing for all the other providers which will mean they get uninstalled from the
325 # sysroot since they're now "unreachable". This makes switching virtual/kernel work in
326 # particular.
327 #
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500328 pn = d.getVar('PN')
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500329 source_mirror_fetch = d.getVar('SOURCE_MIRROR_FETCH', False)
330 if not source_mirror_fetch:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500331 provs = (d.getVar("PROVIDES") or "").split()
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000332 multiwhitelist = (d.getVar("BB_MULTI_PROVIDER_ALLOWED") or "").split()
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500333 for p in provs:
334 if p.startswith("virtual/") and p not in multiwhitelist:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500335 profprov = d.getVar("PREFERRED_PROVIDER_" + p)
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500336 if profprov and pn != profprov:
Brad Bishop316dfdd2018-06-25 12:45:53 -0400337 raise bb.parse.SkipRecipe("PREFERRED_PROVIDER_%s set to %s, not %s" % (p, profprov, pn))
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500338}
339
340CONFIGURESTAMPFILE = "${WORKDIR}/configure.sstate"
341CLEANBROKEN = "0"
342
343addtask configure after do_patch
344do_configure[dirs] = "${B}"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500345base_do_configure() {
346 if [ -n "${CONFIGURESTAMPFILE}" -a -e "${CONFIGURESTAMPFILE}" ]; then
347 if [ "`cat ${CONFIGURESTAMPFILE}`" != "${BB_TASKHASH}" ]; then
348 cd ${B}
349 if [ "${CLEANBROKEN}" != "1" -a \( -e Makefile -o -e makefile -o -e GNUmakefile \) ]; then
350 oe_runmake clean
351 fi
Brad Bishopc4ea0752018-11-15 14:30:15 -0800352 # -ignore_readdir_race does not work correctly with -delete;
353 # use xargs to avoid spurious build failures
354 find ${B} -ignore_readdir_race -name \*.la -type f -print0 | xargs -0 rm -f
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500355 fi
356 fi
357 if [ -n "${CONFIGURESTAMPFILE}" ]; then
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500358 mkdir -p `dirname ${CONFIGURESTAMPFILE}`
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500359 echo ${BB_TASKHASH} > ${CONFIGURESTAMPFILE}
360 fi
361}
362
363addtask compile after do_configure
364do_compile[dirs] = "${B}"
365base_do_compile() {
366 if [ -e Makefile -o -e makefile -o -e GNUmakefile ]; then
367 oe_runmake || die "make failed"
368 else
369 bbnote "nothing to compile"
370 fi
371}
372
373addtask install after do_compile
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600374do_install[dirs] = "${B}"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500375# Remove and re-create ${D} so that is it guaranteed to be empty
376do_install[cleandirs] = "${D}"
377
378base_do_install() {
379 :
380}
381
382base_do_package() {
383 :
384}
385
386addtask build after do_populate_sysroot
387do_build[noexec] = "1"
388do_build[recrdeptask] += "do_deploy"
389do_build () {
390 :
391}
392
393def set_packagetriplet(d):
394 archs = []
395 tos = []
396 tvs = []
397
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500398 archs.append(d.getVar("PACKAGE_ARCHS").split())
399 tos.append(d.getVar("TARGET_OS"))
400 tvs.append(d.getVar("TARGET_VENDOR"))
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500401
402 def settriplet(d, varname, archs, tos, tvs):
403 triplets = []
404 for i in range(len(archs)):
405 for arch in archs[i]:
406 triplets.append(arch + tvs[i] + "-" + tos[i])
407 triplets.reverse()
408 d.setVar(varname, " ".join(triplets))
409
410 settriplet(d, "PKGTRIPLETS", archs, tos, tvs)
411
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500412 variants = d.getVar("MULTILIB_VARIANTS") or ""
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500413 for item in variants.split():
414 localdata = bb.data.createCopy(d)
415 overrides = localdata.getVar("OVERRIDES", False) + ":virtclass-multilib-" + item
416 localdata.setVar("OVERRIDES", overrides)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500417
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500418 archs.append(localdata.getVar("PACKAGE_ARCHS").split())
419 tos.append(localdata.getVar("TARGET_OS"))
420 tvs.append(localdata.getVar("TARGET_VENDOR"))
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500421
422 settriplet(d, "PKGMLTRIPLETS", archs, tos, tvs)
423
424python () {
425 import string, re
426
Brad Bishop316dfdd2018-06-25 12:45:53 -0400427 # Handle backfilling
428 oe.utils.features_backfill("DISTRO_FEATURES", d)
429 oe.utils.features_backfill("MACHINE_FEATURES", d)
430
Andrew Geisslerf0343792020-11-18 10:42:21 -0600431 if d.getVar("S")[-1] == '/':
432 bb.warn("Recipe %s sets S variable with trailing slash '%s', remove it" % (d.getVar("PN"), d.getVar("S")))
433 if d.getVar("B")[-1] == '/':
434 bb.warn("Recipe %s sets B variable with trailing slash '%s', remove it" % (d.getVar("PN"), d.getVar("B")))
435
436 if os.path.normpath(d.getVar("WORKDIR")) != os.path.normpath(d.getVar("S")):
437 d.appendVar("PSEUDO_IGNORE_PATHS", ",${S}")
438 if os.path.normpath(d.getVar("WORKDIR")) != os.path.normpath(d.getVar("B")):
439 d.appendVar("PSEUDO_IGNORE_PATHS", ",${B}")
440
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000441 # To add a recipe to the skip list , set:
442 # SKIP_RECIPE[pn] = "message"
443 pn = d.getVar('PN')
444 skip_msg = d.getVarFlag('SKIP_RECIPE', pn)
445 if skip_msg:
446 bb.debug(1, "Skipping %s %s" % (pn, skip_msg))
447 raise bb.parse.SkipRecipe("Recipe will be skipped because: %s" % (skip_msg))
448
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500449 # Handle PACKAGECONFIG
450 #
451 # These take the form:
452 #
453 # PACKAGECONFIG ??= "<default options>"
Andrew Geissler82c905d2020-04-13 13:39:40 -0500454 # PACKAGECONFIG[foo] = "--enable-foo,--disable-foo,foo_depends,foo_runtime_depends,foo_runtime_recommends,foo_conflict_packageconfig"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500455 pkgconfigflags = d.getVarFlags("PACKAGECONFIG") or {}
456 if pkgconfigflags:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500457 pkgconfig = (d.getVar('PACKAGECONFIG') or "").split()
458 pn = d.getVar("PN")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500459
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500460 mlprefix = d.getVar("MLPREFIX")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500461
462 def expandFilter(appends, extension, prefix):
463 appends = bb.utils.explode_deps(d.expand(" ".join(appends)))
464 newappends = []
465 for a in appends:
466 if a.endswith("-native") or ("-cross-" in a):
467 newappends.append(a)
468 elif a.startswith("virtual/"):
469 subs = a.split("/", 1)[1]
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500470 if subs.startswith(prefix):
471 newappends.append(a + extension)
472 else:
473 newappends.append("virtual/" + prefix + subs + extension)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500474 else:
475 if a.startswith(prefix):
476 newappends.append(a + extension)
477 else:
478 newappends.append(prefix + a + extension)
479 return newappends
480
481 def appendVar(varname, appends):
482 if not appends:
483 return
484 if varname.find("DEPENDS") != -1:
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500485 if bb.data.inherits_class('nativesdk', d) or bb.data.inherits_class('cross-canadian', d) :
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500486 appends = expandFilter(appends, "", "nativesdk-")
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500487 elif bb.data.inherits_class('native', d):
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500488 appends = expandFilter(appends, "-native", "")
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500489 elif mlprefix:
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500490 appends = expandFilter(appends, "", mlprefix)
491 varname = d.expand(varname)
492 d.appendVar(varname, " " + " ".join(appends))
493
494 extradeps = []
495 extrardeps = []
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500496 extrarrecs = []
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500497 extraconf = []
498 for flag, flagval in sorted(pkgconfigflags.items()):
499 items = flagval.split(",")
500 num = len(items)
Andrew Geissler82c905d2020-04-13 13:39:40 -0500501 if num > 6:
502 bb.error("%s: PACKAGECONFIG[%s] Only enable,disable,depend,rdepend,rrecommend,conflict_packageconfig can be specified!"
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500503 % (d.getVar('PN'), flag))
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500504
505 if flag in pkgconfig:
506 if num >= 3 and items[2]:
507 extradeps.append(items[2])
508 if num >= 4 and items[3]:
509 extrardeps.append(items[3])
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500510 if num >= 5 and items[4]:
511 extrarrecs.append(items[4])
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500512 if num >= 1 and items[0]:
513 extraconf.append(items[0])
514 elif num >= 2 and items[1]:
515 extraconf.append(items[1])
Andrew Geissler82c905d2020-04-13 13:39:40 -0500516
517 if num >= 6 and items[5]:
518 conflicts = set(items[5].split())
519 invalid = conflicts.difference(set(pkgconfigflags.keys()))
520 if invalid:
521 bb.error("%s: PACKAGECONFIG[%s] Invalid conflict package config%s '%s' specified."
522 % (d.getVar('PN'), flag, 's' if len(invalid) > 1 else '', ' '.join(invalid)))
523
524 if flag in pkgconfig:
525 intersec = conflicts.intersection(set(pkgconfig))
526 if intersec:
527 bb.fatal("%s: PACKAGECONFIG[%s] Conflict package config%s '%s' set in PACKAGECONFIG."
528 % (d.getVar('PN'), flag, 's' if len(intersec) > 1 else '', ' '.join(intersec)))
529
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500530 appendVar('DEPENDS', extradeps)
Patrick Williams213cb262021-08-07 19:21:33 -0500531 appendVar('RDEPENDS:${PN}', extrardeps)
532 appendVar('RRECOMMENDS:${PN}', extrarrecs)
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500533 appendVar('PACKAGECONFIG_CONFARGS', extraconf)
534
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500535 pn = d.getVar('PN')
536 license = d.getVar('LICENSE')
Brad Bishop316dfdd2018-06-25 12:45:53 -0400537 if license == "INVALID" and pn != "defaultpkgname":
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500538 bb.fatal('This recipe does not have the LICENSE field set (%s)' % pn)
539
540 if bb.data.inherits_class('license', d):
541 check_license_format(d)
Brad Bishop19323692019-04-05 15:28:33 -0400542 unmatched_license_flags = check_license_flags(d)
543 if unmatched_license_flags:
544 if len(unmatched_license_flags) == 1:
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000545 message = "because it has a restricted license '{0}'. Which is not listed in LICENSE_FLAGS_ACCEPTED".format(unmatched_license_flags[0])
Brad Bishop19323692019-04-05 15:28:33 -0400546 else:
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000547 message = "because it has restricted licenses {0}. Which are not listed in LICENSE_FLAGS_ACCEPTED".format(
Brad Bishop19323692019-04-05 15:28:33 -0400548 ", ".join("'{0}'".format(f) for f in unmatched_license_flags))
549 bb.debug(1, "Skipping %s %s" % (pn, message))
550 raise bb.parse.SkipRecipe(message)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500551
552 # If we're building a target package we need to use fakeroot (pseudo)
553 # in order to capture permissions, owners, groups and special files
554 if not bb.data.inherits_class('native', d) and not bb.data.inherits_class('cross', d):
Brad Bishop64c979e2019-11-04 13:55:29 -0500555 d.appendVarFlag('do_prepare_recipe_sysroot', 'depends', ' virtual/fakeroot-native:do_populate_sysroot')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500556 d.appendVarFlag('do_install', 'depends', ' virtual/fakeroot-native:do_populate_sysroot')
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500557 d.setVarFlag('do_install', 'fakeroot', '1')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500558 d.appendVarFlag('do_package', 'depends', ' virtual/fakeroot-native:do_populate_sysroot')
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500559 d.setVarFlag('do_package', 'fakeroot', '1')
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500560 d.setVarFlag('do_package_setscene', 'fakeroot', '1')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500561 d.appendVarFlag('do_package_setscene', 'depends', ' virtual/fakeroot-native:do_populate_sysroot')
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500562 d.setVarFlag('do_devshell', 'fakeroot', '1')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500563 d.appendVarFlag('do_devshell', 'depends', ' virtual/fakeroot-native:do_populate_sysroot')
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500564
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500565 need_machine = d.getVar('COMPATIBLE_MACHINE')
Andrew Geissler82c905d2020-04-13 13:39:40 -0500566 if need_machine and not d.getVar('PARSE_ALL_RECIPES', False):
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500567 import re
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500568 compat_machines = (d.getVar('MACHINEOVERRIDES') or "").split(":")
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500569 for m in compat_machines:
570 if re.match(need_machine, m):
571 break
572 else:
Brad Bishop316dfdd2018-06-25 12:45:53 -0400573 raise bb.parse.SkipRecipe("incompatible with machine %s (not in COMPATIBLE_MACHINE)" % d.getVar('MACHINE'))
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500574
Andrew Geissler82c905d2020-04-13 13:39:40 -0500575 source_mirror_fetch = d.getVar('SOURCE_MIRROR_FETCH', False) or d.getVar('PARSE_ALL_RECIPES', False)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500576 if not source_mirror_fetch:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500577 need_host = d.getVar('COMPATIBLE_HOST')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500578 if need_host:
579 import re
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500580 this_host = d.getVar('HOST_SYS')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500581 if not re.match(need_host, this_host):
Brad Bishop316dfdd2018-06-25 12:45:53 -0400582 raise bb.parse.SkipRecipe("incompatible with host %s (not in COMPATIBLE_HOST)" % this_host)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500583
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500584 bad_licenses = (d.getVar('INCOMPATIBLE_LICENSE') or "").split()
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500585
586 check_license = False if pn.startswith("nativesdk-") else True
587 for t in ["-native", "-cross-${TARGET_ARCH}", "-cross-initial-${TARGET_ARCH}",
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600588 "-crosssdk-${SDK_SYS}", "-crosssdk-initial-${SDK_SYS}",
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500589 "-cross-canadian-${TRANSLATED_TARGET_ARCH}"]:
590 if pn.endswith(d.expand(t)):
591 check_license = False
592 if pn.startswith("gcc-source-"):
593 check_license = False
594
595 if check_license and bad_licenses:
596 bad_licenses = expand_wildcard_licenses(d, bad_licenses)
597
598 whitelist = []
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500599 for lic in bad_licenses:
600 spdx_license = return_spdx(d, lic)
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800601 whitelist.extend((d.getVar("WHITELIST_" + lic) or "").split())
602 if spdx_license:
603 whitelist.extend((d.getVar("WHITELIST_" + spdx_license) or "").split())
Andrew Geissler82c905d2020-04-13 13:39:40 -0500604
605 if pn in whitelist:
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800606 '''
607 We need to track what we are whitelisting and why. If pn is
608 incompatible we need to be able to note that the image that
609 is created may infact contain incompatible licenses despite
610 INCOMPATIBLE_LICENSE being set.
611 '''
Andrew Geissler82c905d2020-04-13 13:39:40 -0500612 bb.note("Including %s as buildable despite it having an incompatible license because it has been whitelisted" % pn)
613 else:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500614 pkgs = d.getVar('PACKAGES').split()
Andrew Geissler82c905d2020-04-13 13:39:40 -0500615 skipped_pkgs = {}
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500616 unskipped_pkgs = []
617 for pkg in pkgs:
Andrew Geissler82c905d2020-04-13 13:39:40 -0500618 incompatible_lic = incompatible_license(d, bad_licenses, pkg)
619 if incompatible_lic:
620 skipped_pkgs[pkg] = incompatible_lic
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500621 else:
622 unskipped_pkgs.append(pkg)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500623 if unskipped_pkgs:
624 for pkg in skipped_pkgs:
Andrew Geissler82c905d2020-04-13 13:39:40 -0500625 bb.debug(1, "Skipping the package %s at do_rootfs because of incompatible license(s): %s" % (pkg, ' '.join(skipped_pkgs[pkg])))
Andrew Geissler7e0e3c02022-02-25 20:34:39 +0000626 d.setVar('_exclude_incompatible-' + pkg, ' '.join(skipped_pkgs[pkg]))
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500627 for pkg in unskipped_pkgs:
Andrew Geissler82c905d2020-04-13 13:39:40 -0500628 bb.debug(1, "Including the package %s" % pkg)
629 else:
630 incompatible_lic = incompatible_license(d, bad_licenses)
631 for pkg in skipped_pkgs:
632 incompatible_lic += skipped_pkgs[pkg]
633 incompatible_lic = sorted(list(set(incompatible_lic)))
634
635 if incompatible_lic:
636 bb.debug(1, "Skipping recipe %s because of incompatible license(s): %s" % (pn, ' '.join(incompatible_lic)))
637 raise bb.parse.SkipRecipe("it has incompatible license(s): %s" % ' '.join(incompatible_lic))
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500638
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500639 needsrcrev = False
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500640 srcuri = d.getVar('SRC_URI')
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600641 for uri_string in srcuri.split():
642 uri = bb.fetch.URI(uri_string)
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500643 # Also check downloadfilename as the URL path might not be useful for sniffing
644 path = uri.params.get("downloadfilename", uri.path)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500645
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500646 # HTTP/FTP use the wget fetcher
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600647 if uri.scheme in ("http", "https", "ftp"):
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500648 d.appendVarFlag('do_fetch', 'depends', ' wget-native:do_populate_sysroot')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500649
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500650 # Svn packages should DEPEND on subversion-native
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600651 if uri.scheme == "svn":
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500652 needsrcrev = True
653 d.appendVarFlag('do_fetch', 'depends', ' subversion-native:do_populate_sysroot')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500654
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500655 # Git packages should DEPEND on git-native
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600656 elif uri.scheme in ("git", "gitsm"):
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500657 needsrcrev = True
658 d.appendVarFlag('do_fetch', 'depends', ' git-native:do_populate_sysroot')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500659
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500660 # Mercurial packages should DEPEND on mercurial-native
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600661 elif uri.scheme == "hg":
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500662 needsrcrev = True
Andrew Geissler82c905d2020-04-13 13:39:40 -0500663 d.appendVar("EXTRANATIVEPATH", ' python3-native ')
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500664 d.appendVarFlag('do_fetch', 'depends', ' mercurial-native:do_populate_sysroot')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500665
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600666 # Perforce packages support SRCREV = "${AUTOREV}"
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600667 elif uri.scheme == "p4":
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600668 needsrcrev = True
669
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500670 # OSC packages should DEPEND on osc-native
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600671 elif uri.scheme == "osc":
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500672 d.appendVarFlag('do_fetch', 'depends', ' osc-native:do_populate_sysroot')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500673
Andrew Geisslerd1e89492021-02-12 15:35:20 -0600674 elif uri.scheme == "npm":
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500675 d.appendVarFlag('do_fetch', 'depends', ' nodejs-native:do_populate_sysroot')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500676
Andrew Geissler595f6302022-01-24 19:11:47 +0000677 elif uri.scheme == "repo":
678 needsrcrev = True
679 d.appendVarFlag('do_fetch', 'depends', ' repo-native:do_populate_sysroot')
680
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500681 # *.lz4 should DEPEND on lz4-native for unpacking
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500682 if path.endswith('.lz4'):
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500683 d.appendVarFlag('do_unpack', 'depends', ' lz4-native:do_populate_sysroot')
684
Andrew Geisslerd159c7f2021-09-02 21:05:58 -0500685 # *.zst should DEPEND on zstd-native for unpacking
686 elif path.endswith('.zst'):
687 d.appendVarFlag('do_unpack', 'depends', ' zstd-native:do_populate_sysroot')
688
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500689 # *.lz should DEPEND on lzip-native for unpacking
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500690 elif path.endswith('.lz'):
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500691 d.appendVarFlag('do_unpack', 'depends', ' lzip-native:do_populate_sysroot')
692
693 # *.xz should DEPEND on xz-native for unpacking
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500694 elif path.endswith('.xz') or path.endswith('.txz'):
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500695 d.appendVarFlag('do_unpack', 'depends', ' xz-native:do_populate_sysroot')
696
697 # .zip should DEPEND on unzip-native for unpacking
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500698 elif path.endswith('.zip') or path.endswith('.jar'):
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500699 d.appendVarFlag('do_unpack', 'depends', ' unzip-native:do_populate_sysroot')
700
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800701 # Some rpm files may be compressed internally using xz (for example, rpms from Fedora)
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500702 elif path.endswith('.rpm'):
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500703 d.appendVarFlag('do_unpack', 'depends', ' xz-native:do_populate_sysroot')
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500704
Brad Bishop316dfdd2018-06-25 12:45:53 -0400705 # *.deb should DEPEND on xz-native for unpacking
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500706 elif path.endswith('.deb'):
Brad Bishop316dfdd2018-06-25 12:45:53 -0400707 d.appendVarFlag('do_unpack', 'depends', ' xz-native:do_populate_sysroot')
708
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500709 if needsrcrev:
710 d.setVar("SRCPV", "${@bb.fetch2.get_srcrev(d)}")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500711
Brad Bishop15ae2502019-06-18 21:44:24 -0400712 # Gather all named SRCREVs to add to the sstate hash calculation
713 # This anonymous python snippet is called multiple times so we
714 # need to be careful to not double up the appends here and cause
715 # the base hash to mismatch the task hash
716 for uri in srcuri.split():
717 parm = bb.fetch.decodeurl(uri)[5]
718 uri_names = parm.get("name", "").split(",")
719 for uri_name in filter(None, uri_names):
720 srcrev_name = "SRCREV_{}".format(uri_name)
721 if srcrev_name not in (d.getVarFlag("do_fetch", "vardeps") or "").split():
722 d.appendVarFlag("do_fetch", "vardeps", " {}".format(srcrev_name))
723
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500724 set_packagetriplet(d)
725
726 # 'multimachine' handling
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500727 mach_arch = d.getVar('MACHINE_ARCH')
728 pkg_arch = d.getVar('PACKAGE_ARCH')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500729
730 if (pkg_arch == mach_arch):
731 # Already machine specific - nothing further to do
732 return
733
734 #
735 # We always try to scan SRC_URI for urls with machine overrides
736 # unless the package sets SRC_URI_OVERRIDES_PACKAGE_ARCH=0
737 #
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500738 override = d.getVar('SRC_URI_OVERRIDES_PACKAGE_ARCH')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500739 if override != '0':
740 paths = []
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500741 fpaths = (d.getVar('FILESPATH') or '').split(':')
742 machine = d.getVar('MACHINE')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500743 for p in fpaths:
744 if os.path.basename(p) == machine and os.path.isdir(p):
745 paths.append(p)
746
Andrew Geisslereff27472021-10-29 15:35:00 -0500747 if paths:
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500748 for s in srcuri.split():
749 if not s.startswith("file://"):
750 continue
751 fetcher = bb.fetch2.Fetch([s], d)
752 local = fetcher.localpath(s)
753 for mp in paths:
754 if local.startswith(mp):
755 #bb.note("overriding PACKAGE_ARCH from %s to %s for %s" % (pkg_arch, mach_arch, pn))
756 d.setVar('PACKAGE_ARCH', "${MACHINE_ARCH}")
757 return
758
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500759 packages = d.getVar('PACKAGES').split()
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500760 for pkg in packages:
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500761 pkgarch = d.getVar("PACKAGE_ARCH_%s" % pkg)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500762
763 # We could look for != PACKAGE_ARCH here but how to choose
764 # if multiple differences are present?
765 # Look through PACKAGE_ARCHS for the priority order?
766 if pkgarch and pkgarch == mach_arch:
767 d.setVar('PACKAGE_ARCH', "${MACHINE_ARCH}")
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500768 bb.warn("Recipe %s is marked as only being architecture specific but seems to have machine specific packages?! The recipe may as well mark itself as machine specific directly." % d.getVar("PN"))
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500769}
770
771addtask cleansstate after do_clean
772python do_cleansstate() {
773 sstate_clean_cachefiles(d)
774}
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500775addtask cleanall after do_cleansstate
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500776do_cleansstate[nostamp] = "1"
777
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500778python do_cleanall() {
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500779 src_uri = (d.getVar('SRC_URI') or "").split()
Andrew Geisslereff27472021-10-29 15:35:00 -0500780 if not src_uri:
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500781 return
782
783 try:
784 fetcher = bb.fetch2.Fetch(src_uri, d)
785 fetcher.clean()
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600786 except bb.fetch2.BBFetchException as e:
787 bb.fatal(str(e))
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500788}
789do_cleanall[nostamp] = "1"
790
791
792EXPORT_FUNCTIONS do_fetch do_unpack do_configure do_compile do_install do_package