diff options
-rw-r--r-- | meta/classes-global/package.bbclass | 179 | ||||
-rw-r--r-- | meta/conf/bitbake.conf | 1 | ||||
-rw-r--r-- | meta/lib/oe/packagedata.py | 178 |
3 files changed, 181 insertions, 177 deletions
diff --git a/meta/classes-global/package.bbclass b/meta/classes-global/package.bbclass index 72e39f6914..389c857804 100644 --- a/meta/classes-global/package.bbclass +++ b/meta/classes-global/package.bbclass | |||
@@ -1232,185 +1232,10 @@ PKGDESTWORK = "${WORKDIR}/pkgdata" | |||
1232 | PKGDATA_VARS = "PN PE PV PR PKGE PKGV PKGR LICENSE DESCRIPTION SUMMARY RDEPENDS RPROVIDES RRECOMMENDS RSUGGESTS RREPLACES RCONFLICTS SECTION PKG ALLOW_EMPTY FILES CONFFILES FILES_INFO PACKAGE_ADD_METADATA pkg_postinst pkg_postrm pkg_preinst pkg_prerm" | 1232 | PKGDATA_VARS = "PN PE PV PR PKGE PKGV PKGR LICENSE DESCRIPTION SUMMARY RDEPENDS RPROVIDES RRECOMMENDS RSUGGESTS RREPLACES RCONFLICTS SECTION PKG ALLOW_EMPTY FILES CONFFILES FILES_INFO PACKAGE_ADD_METADATA pkg_postinst pkg_postrm pkg_preinst pkg_prerm" |
1233 | 1233 | ||
1234 | python emit_pkgdata() { | 1234 | python emit_pkgdata() { |
1235 | from glob import glob | 1235 | import oe.packagedata |
1236 | import json | 1236 | oe.packagedata.emit_pkgdata(pkgfiles, d) |
1237 | import bb.compress.zstd | ||
1238 | |||
1239 | def process_postinst_on_target(pkg, mlprefix): | ||
1240 | pkgval = d.getVar('PKG:%s' % pkg) | ||
1241 | if pkgval is None: | ||
1242 | pkgval = pkg | ||
1243 | |||
1244 | defer_fragment = """ | ||
1245 | if [ -n "$D" ]; then | ||
1246 | $INTERCEPT_DIR/postinst_intercept delay_to_first_boot %s mlprefix=%s | ||
1247 | exit 0 | ||
1248 | fi | ||
1249 | """ % (pkgval, mlprefix) | ||
1250 | |||
1251 | postinst = d.getVar('pkg_postinst:%s' % pkg) | ||
1252 | postinst_ontarget = d.getVar('pkg_postinst_ontarget:%s' % pkg) | ||
1253 | |||
1254 | if postinst_ontarget: | ||
1255 | bb.debug(1, 'adding deferred pkg_postinst_ontarget() to pkg_postinst() for %s' % pkg) | ||
1256 | if not postinst: | ||
1257 | postinst = '#!/bin/sh\n' | ||
1258 | postinst += defer_fragment | ||
1259 | postinst += postinst_ontarget | ||
1260 | d.setVar('pkg_postinst:%s' % pkg, postinst) | ||
1261 | |||
1262 | def add_set_e_to_scriptlets(pkg): | ||
1263 | for scriptlet_name in ('pkg_preinst', 'pkg_postinst', 'pkg_prerm', 'pkg_postrm'): | ||
1264 | scriptlet = d.getVar('%s:%s' % (scriptlet_name, pkg)) | ||
1265 | if scriptlet: | ||
1266 | scriptlet_split = scriptlet.split('\n') | ||
1267 | if scriptlet_split[0].startswith("#!"): | ||
1268 | scriptlet = scriptlet_split[0] + "\nset -e\n" + "\n".join(scriptlet_split[1:]) | ||
1269 | else: | ||
1270 | scriptlet = "set -e\n" + "\n".join(scriptlet_split[0:]) | ||
1271 | d.setVar('%s:%s' % (scriptlet_name, pkg), scriptlet) | ||
1272 | |||
1273 | def write_if_exists(f, pkg, var): | ||
1274 | def encode(str): | ||
1275 | import codecs | ||
1276 | c = codecs.getencoder("unicode_escape") | ||
1277 | return c(str)[0].decode("latin1") | ||
1278 | |||
1279 | val = d.getVar('%s:%s' % (var, pkg)) | ||
1280 | if val: | ||
1281 | f.write('%s:%s: %s\n' % (var, pkg, encode(val))) | ||
1282 | return val | ||
1283 | val = d.getVar('%s' % (var)) | ||
1284 | if val: | ||
1285 | f.write('%s: %s\n' % (var, encode(val))) | ||
1286 | return val | ||
1287 | |||
1288 | def write_extra_pkgs(variants, pn, packages, pkgdatadir): | ||
1289 | for variant in variants: | ||
1290 | with open("%s/%s-%s" % (pkgdatadir, variant, pn), 'w') as fd: | ||
1291 | fd.write("PACKAGES: %s\n" % ' '.join( | ||
1292 | map(lambda pkg: '%s-%s' % (variant, pkg), packages.split()))) | ||
1293 | |||
1294 | def write_extra_runtime_pkgs(variants, packages, pkgdatadir): | ||
1295 | for variant in variants: | ||
1296 | for pkg in packages.split(): | ||
1297 | ml_pkg = "%s-%s" % (variant, pkg) | ||
1298 | subdata_file = "%s/runtime/%s" % (pkgdatadir, ml_pkg) | ||
1299 | with open(subdata_file, 'w') as fd: | ||
1300 | fd.write("PKG:%s: %s" % (ml_pkg, pkg)) | ||
1301 | |||
1302 | packages = d.getVar('PACKAGES') | ||
1303 | pkgdest = d.getVar('PKGDEST') | ||
1304 | pkgdatadir = d.getVar('PKGDESTWORK') | ||
1305 | |||
1306 | data_file = pkgdatadir + d.expand("/${PN}") | ||
1307 | with open(data_file, 'w') as fd: | ||
1308 | fd.write("PACKAGES: %s\n" % packages) | ||
1309 | |||
1310 | pkgdebugsource = d.getVar("PKGDEBUGSOURCES") or [] | ||
1311 | |||
1312 | pn = d.getVar('PN') | ||
1313 | global_variants = (d.getVar('MULTILIB_GLOBAL_VARIANTS') or "").split() | ||
1314 | variants = (d.getVar('MULTILIB_VARIANTS') or "").split() | ||
1315 | |||
1316 | if bb.data.inherits_class('kernel', d) or bb.data.inherits_class('module-base', d): | ||
1317 | write_extra_pkgs(variants, pn, packages, pkgdatadir) | ||
1318 | |||
1319 | if bb.data.inherits_class('allarch', d) and not variants \ | ||
1320 | and not bb.data.inherits_class('packagegroup', d): | ||
1321 | write_extra_pkgs(global_variants, pn, packages, pkgdatadir) | ||
1322 | |||
1323 | workdir = d.getVar('WORKDIR') | ||
1324 | |||
1325 | for pkg in packages.split(): | ||
1326 | pkgval = d.getVar('PKG:%s' % pkg) | ||
1327 | if pkgval is None: | ||
1328 | pkgval = pkg | ||
1329 | d.setVar('PKG:%s' % pkg, pkg) | ||
1330 | |||
1331 | extended_data = { | ||
1332 | "files_info": {} | ||
1333 | } | ||
1334 | |||
1335 | pkgdestpkg = os.path.join(pkgdest, pkg) | ||
1336 | files = {} | ||
1337 | files_extra = {} | ||
1338 | total_size = 0 | ||
1339 | seen = set() | ||
1340 | for f in pkgfiles[pkg]: | ||
1341 | fpath = os.sep + os.path.relpath(f, pkgdestpkg) | ||
1342 | |||
1343 | fstat = os.lstat(f) | ||
1344 | files[fpath] = fstat.st_size | ||
1345 | |||
1346 | extended_data["files_info"].setdefault(fpath, {}) | ||
1347 | extended_data["files_info"][fpath]['size'] = fstat.st_size | ||
1348 | |||
1349 | if fstat.st_ino not in seen: | ||
1350 | seen.add(fstat.st_ino) | ||
1351 | total_size += fstat.st_size | ||
1352 | |||
1353 | if fpath in pkgdebugsource: | ||
1354 | extended_data["files_info"][fpath]['debugsrc'] = pkgdebugsource[fpath] | ||
1355 | del pkgdebugsource[fpath] | ||
1356 | |||
1357 | d.setVar('FILES_INFO:' + pkg , json.dumps(files, sort_keys=True)) | ||
1358 | |||
1359 | process_postinst_on_target(pkg, d.getVar("MLPREFIX")) | ||
1360 | add_set_e_to_scriptlets(pkg) | ||
1361 | |||
1362 | subdata_file = pkgdatadir + "/runtime/%s" % pkg | ||
1363 | with open(subdata_file, 'w') as sf: | ||
1364 | for var in (d.getVar('PKGDATA_VARS') or "").split(): | ||
1365 | val = write_if_exists(sf, pkg, var) | ||
1366 | |||
1367 | write_if_exists(sf, pkg, 'FILERPROVIDESFLIST') | ||
1368 | for dfile in sorted((d.getVar('FILERPROVIDESFLIST:' + pkg) or "").split()): | ||
1369 | write_if_exists(sf, pkg, 'FILERPROVIDES:' + dfile) | ||
1370 | |||
1371 | write_if_exists(sf, pkg, 'FILERDEPENDSFLIST') | ||
1372 | for dfile in sorted((d.getVar('FILERDEPENDSFLIST:' + pkg) or "").split()): | ||
1373 | write_if_exists(sf, pkg, 'FILERDEPENDS:' + dfile) | ||
1374 | |||
1375 | sf.write('%s:%s: %d\n' % ('PKGSIZE', pkg, total_size)) | ||
1376 | |||
1377 | subdata_extended_file = pkgdatadir + "/extended/%s.json.zstd" % pkg | ||
1378 | num_threads = int(d.getVar("BB_NUMBER_THREADS")) | ||
1379 | with bb.compress.zstd.open(subdata_extended_file, "wt", encoding="utf-8", num_threads=num_threads) as f: | ||
1380 | json.dump(extended_data, f, sort_keys=True, separators=(",", ":")) | ||
1381 | |||
1382 | # Symlinks needed for rprovides lookup | ||
1383 | rprov = d.getVar('RPROVIDES:%s' % pkg) or d.getVar('RPROVIDES') | ||
1384 | if rprov: | ||
1385 | for p in bb.utils.explode_deps(rprov): | ||
1386 | subdata_sym = pkgdatadir + "/runtime-rprovides/%s/%s" % (p, pkg) | ||
1387 | bb.utils.mkdirhier(os.path.dirname(subdata_sym)) | ||
1388 | oe.path.symlink("../../runtime/%s" % pkg, subdata_sym, True) | ||
1389 | |||
1390 | allow_empty = d.getVar('ALLOW_EMPTY:%s' % pkg) | ||
1391 | if not allow_empty: | ||
1392 | allow_empty = d.getVar('ALLOW_EMPTY') | ||
1393 | root = "%s/%s" % (pkgdest, pkg) | ||
1394 | os.chdir(root) | ||
1395 | g = glob('*') | ||
1396 | if g or allow_empty == "1": | ||
1397 | # Symlinks needed for reverse lookups (from the final package name) | ||
1398 | subdata_sym = pkgdatadir + "/runtime-reverse/%s" % pkgval | ||
1399 | oe.path.symlink("../runtime/%s" % pkg, subdata_sym, True) | ||
1400 | |||
1401 | packagedfile = pkgdatadir + '/runtime/%s.packaged' % pkg | ||
1402 | open(packagedfile, 'w').close() | ||
1403 | |||
1404 | if bb.data.inherits_class('kernel', d) or bb.data.inherits_class('module-base', d): | ||
1405 | write_extra_runtime_pkgs(variants, packages, pkgdatadir) | ||
1406 | |||
1407 | if bb.data.inherits_class('allarch', d) and not variants \ | ||
1408 | and not bb.data.inherits_class('packagegroup', d): | ||
1409 | write_extra_runtime_pkgs(global_variants, packages, pkgdatadir) | ||
1410 | |||
1411 | } | 1237 | } |
1412 | emit_pkgdata[dirs] = "${PKGDESTWORK}/runtime ${PKGDESTWORK}/runtime-reverse ${PKGDESTWORK}/runtime-rprovides ${PKGDESTWORK}/extended" | 1238 | emit_pkgdata[dirs] = "${PKGDESTWORK}/runtime ${PKGDESTWORK}/runtime-reverse ${PKGDESTWORK}/runtime-rprovides ${PKGDESTWORK}/extended" |
1413 | emit_pkgdata[vardepsexclude] = "BB_NUMBER_THREADS" | ||
1414 | 1239 | ||
1415 | ldconfig_postinst_fragment() { | 1240 | ldconfig_postinst_fragment() { |
1416 | if [ x"$D" = "x" ]; then | 1241 | if [ x"$D" = "x" ]; then |
diff --git a/meta/conf/bitbake.conf b/meta/conf/bitbake.conf index bfa28d3bc9..05d5a844de 100644 --- a/meta/conf/bitbake.conf +++ b/meta/conf/bitbake.conf | |||
@@ -973,3 +973,4 @@ oe.sstatesig.find_sstate_manifest[vardepsexclude] = "BBEXTENDCURR BBEXTENDVARIAN | |||
973 | oe.utils.get_multilib_datastore[vardepsexclude] = "DEFAULTTUNE_MULTILIB_ORIGINAL OVERRIDES" | 973 | oe.utils.get_multilib_datastore[vardepsexclude] = "DEFAULTTUNE_MULTILIB_ORIGINAL OVERRIDES" |
974 | oe.path.format_display[vardepsexclude] = "TOPDIR" | 974 | oe.path.format_display[vardepsexclude] = "TOPDIR" |
975 | oe.utils.multiprocess_launch[vardepsexclude] = "BB_NUMBER_THREADS" | 975 | oe.utils.multiprocess_launch[vardepsexclude] = "BB_NUMBER_THREADS" |
976 | oe.packagedata.emit_pkgdata[vardepsexclude] = "BB_NUMBER_THREADS" | ||
diff --git a/meta/lib/oe/packagedata.py b/meta/lib/oe/packagedata.py index ff260f405c..efa600ddcd 100644 --- a/meta/lib/oe/packagedata.py +++ b/meta/lib/oe/packagedata.py | |||
@@ -6,6 +6,11 @@ | |||
6 | 6 | ||
7 | import codecs | 7 | import codecs |
8 | import os | 8 | import os |
9 | import json | ||
10 | import bb.compress.zstd | ||
11 | import oe.path | ||
12 | |||
13 | from glob import glob | ||
9 | 14 | ||
10 | def packaged(pkg, d): | 15 | def packaged(pkg, d): |
11 | return os.access(get_subpkgedata_fn(pkg, d) + '.packaged', os.R_OK) | 16 | return os.access(get_subpkgedata_fn(pkg, d) + '.packaged', os.R_OK) |
@@ -162,4 +167,177 @@ def runtime_mapping_rename(varname, pkg, d): | |||
162 | 167 | ||
163 | #bb.note("%s after: %s" % (varname, d.getVar(varname))) | 168 | #bb.note("%s after: %s" % (varname, d.getVar(varname))) |
164 | 169 | ||
170 | def emit_pkgdata(pkgfiles, d): | ||
171 | def process_postinst_on_target(pkg, mlprefix): | ||
172 | pkgval = d.getVar('PKG:%s' % pkg) | ||
173 | if pkgval is None: | ||
174 | pkgval = pkg | ||
175 | |||
176 | defer_fragment = """ | ||
177 | if [ -n "$D" ]; then | ||
178 | $INTERCEPT_DIR/postinst_intercept delay_to_first_boot %s mlprefix=%s | ||
179 | exit 0 | ||
180 | fi | ||
181 | """ % (pkgval, mlprefix) | ||
182 | |||
183 | postinst = d.getVar('pkg_postinst:%s' % pkg) | ||
184 | postinst_ontarget = d.getVar('pkg_postinst_ontarget:%s' % pkg) | ||
185 | |||
186 | if postinst_ontarget: | ||
187 | bb.debug(1, 'adding deferred pkg_postinst_ontarget() to pkg_postinst() for %s' % pkg) | ||
188 | if not postinst: | ||
189 | postinst = '#!/bin/sh\n' | ||
190 | postinst += defer_fragment | ||
191 | postinst += postinst_ontarget | ||
192 | d.setVar('pkg_postinst:%s' % pkg, postinst) | ||
193 | |||
194 | def add_set_e_to_scriptlets(pkg): | ||
195 | for scriptlet_name in ('pkg_preinst', 'pkg_postinst', 'pkg_prerm', 'pkg_postrm'): | ||
196 | scriptlet = d.getVar('%s:%s' % (scriptlet_name, pkg)) | ||
197 | if scriptlet: | ||
198 | scriptlet_split = scriptlet.split('\n') | ||
199 | if scriptlet_split[0].startswith("#!"): | ||
200 | scriptlet = scriptlet_split[0] + "\nset -e\n" + "\n".join(scriptlet_split[1:]) | ||
201 | else: | ||
202 | scriptlet = "set -e\n" + "\n".join(scriptlet_split[0:]) | ||
203 | d.setVar('%s:%s' % (scriptlet_name, pkg), scriptlet) | ||
204 | |||
205 | def write_if_exists(f, pkg, var): | ||
206 | def encode(str): | ||
207 | import codecs | ||
208 | c = codecs.getencoder("unicode_escape") | ||
209 | return c(str)[0].decode("latin1") | ||
210 | |||
211 | val = d.getVar('%s:%s' % (var, pkg)) | ||
212 | if val: | ||
213 | f.write('%s:%s: %s\n' % (var, pkg, encode(val))) | ||
214 | return val | ||
215 | val = d.getVar('%s' % (var)) | ||
216 | if val: | ||
217 | f.write('%s: %s\n' % (var, encode(val))) | ||
218 | return val | ||
219 | |||
220 | def write_extra_pkgs(variants, pn, packages, pkgdatadir): | ||
221 | for variant in variants: | ||
222 | with open("%s/%s-%s" % (pkgdatadir, variant, pn), 'w') as fd: | ||
223 | fd.write("PACKAGES: %s\n" % ' '.join( | ||
224 | map(lambda pkg: '%s-%s' % (variant, pkg), packages.split()))) | ||
225 | |||
226 | def write_extra_runtime_pkgs(variants, packages, pkgdatadir): | ||
227 | for variant in variants: | ||
228 | for pkg in packages.split(): | ||
229 | ml_pkg = "%s-%s" % (variant, pkg) | ||
230 | subdata_file = "%s/runtime/%s" % (pkgdatadir, ml_pkg) | ||
231 | with open(subdata_file, 'w') as fd: | ||
232 | fd.write("PKG:%s: %s" % (ml_pkg, pkg)) | ||
233 | |||
234 | packages = d.getVar('PACKAGES') | ||
235 | pkgdest = d.getVar('PKGDEST') | ||
236 | pkgdatadir = d.getVar('PKGDESTWORK') | ||
237 | |||
238 | data_file = pkgdatadir + d.expand("/${PN}") | ||
239 | with open(data_file, 'w') as fd: | ||
240 | fd.write("PACKAGES: %s\n" % packages) | ||
241 | |||
242 | pkgdebugsource = d.getVar("PKGDEBUGSOURCES") or [] | ||
243 | |||
244 | pn = d.getVar('PN') | ||
245 | global_variants = (d.getVar('MULTILIB_GLOBAL_VARIANTS') or "").split() | ||
246 | variants = (d.getVar('MULTILIB_VARIANTS') or "").split() | ||
247 | |||
248 | if bb.data.inherits_class('kernel', d) or bb.data.inherits_class('module-base', d): | ||
249 | write_extra_pkgs(variants, pn, packages, pkgdatadir) | ||
250 | |||
251 | if bb.data.inherits_class('allarch', d) and not variants \ | ||
252 | and not bb.data.inherits_class('packagegroup', d): | ||
253 | write_extra_pkgs(global_variants, pn, packages, pkgdatadir) | ||
254 | |||
255 | workdir = d.getVar('WORKDIR') | ||
256 | |||
257 | for pkg in packages.split(): | ||
258 | pkgval = d.getVar('PKG:%s' % pkg) | ||
259 | if pkgval is None: | ||
260 | pkgval = pkg | ||
261 | d.setVar('PKG:%s' % pkg, pkg) | ||
262 | |||
263 | extended_data = { | ||
264 | "files_info": {} | ||
265 | } | ||
266 | |||
267 | pkgdestpkg = os.path.join(pkgdest, pkg) | ||
268 | files = {} | ||
269 | files_extra = {} | ||
270 | total_size = 0 | ||
271 | seen = set() | ||
272 | for f in pkgfiles[pkg]: | ||
273 | fpath = os.sep + os.path.relpath(f, pkgdestpkg) | ||
274 | |||
275 | fstat = os.lstat(f) | ||
276 | files[fpath] = fstat.st_size | ||
277 | |||
278 | extended_data["files_info"].setdefault(fpath, {}) | ||
279 | extended_data["files_info"][fpath]['size'] = fstat.st_size | ||
280 | |||
281 | if fstat.st_ino not in seen: | ||
282 | seen.add(fstat.st_ino) | ||
283 | total_size += fstat.st_size | ||
284 | |||
285 | if fpath in pkgdebugsource: | ||
286 | extended_data["files_info"][fpath]['debugsrc'] = pkgdebugsource[fpath] | ||
287 | del pkgdebugsource[fpath] | ||
288 | |||
289 | d.setVar('FILES_INFO:' + pkg , json.dumps(files, sort_keys=True)) | ||
290 | |||
291 | process_postinst_on_target(pkg, d.getVar("MLPREFIX")) | ||
292 | add_set_e_to_scriptlets(pkg) | ||
293 | |||
294 | subdata_file = pkgdatadir + "/runtime/%s" % pkg | ||
295 | with open(subdata_file, 'w') as sf: | ||
296 | for var in (d.getVar('PKGDATA_VARS') or "").split(): | ||
297 | val = write_if_exists(sf, pkg, var) | ||
298 | |||
299 | write_if_exists(sf, pkg, 'FILERPROVIDESFLIST') | ||
300 | for dfile in sorted((d.getVar('FILERPROVIDESFLIST:' + pkg) or "").split()): | ||
301 | write_if_exists(sf, pkg, 'FILERPROVIDES:' + dfile) | ||
302 | |||
303 | write_if_exists(sf, pkg, 'FILERDEPENDSFLIST') | ||
304 | for dfile in sorted((d.getVar('FILERDEPENDSFLIST:' + pkg) or "").split()): | ||
305 | write_if_exists(sf, pkg, 'FILERDEPENDS:' + dfile) | ||
306 | |||
307 | sf.write('%s:%s: %d\n' % ('PKGSIZE', pkg, total_size)) | ||
308 | |||
309 | subdata_extended_file = pkgdatadir + "/extended/%s.json.zstd" % pkg | ||
310 | num_threads = int(d.getVar("BB_NUMBER_THREADS")) | ||
311 | with bb.compress.zstd.open(subdata_extended_file, "wt", encoding="utf-8", num_threads=num_threads) as f: | ||
312 | json.dump(extended_data, f, sort_keys=True, separators=(",", ":")) | ||
313 | |||
314 | # Symlinks needed for rprovides lookup | ||
315 | rprov = d.getVar('RPROVIDES:%s' % pkg) or d.getVar('RPROVIDES') | ||
316 | if rprov: | ||
317 | for p in bb.utils.explode_deps(rprov): | ||
318 | subdata_sym = pkgdatadir + "/runtime-rprovides/%s/%s" % (p, pkg) | ||
319 | bb.utils.mkdirhier(os.path.dirname(subdata_sym)) | ||
320 | oe.path.symlink("../../runtime/%s" % pkg, subdata_sym, True) | ||
321 | |||
322 | allow_empty = d.getVar('ALLOW_EMPTY:%s' % pkg) | ||
323 | if not allow_empty: | ||
324 | allow_empty = d.getVar('ALLOW_EMPTY') | ||
325 | root = "%s/%s" % (pkgdest, pkg) | ||
326 | os.chdir(root) | ||
327 | g = glob('*') | ||
328 | if g or allow_empty == "1": | ||
329 | # Symlinks needed for reverse lookups (from the final package name) | ||
330 | subdata_sym = pkgdatadir + "/runtime-reverse/%s" % pkgval | ||
331 | oe.path.symlink("../runtime/%s" % pkg, subdata_sym, True) | ||
332 | |||
333 | packagedfile = pkgdatadir + '/runtime/%s.packaged' % pkg | ||
334 | open(packagedfile, 'w').close() | ||
335 | |||
336 | if bb.data.inherits_class('kernel', d) or bb.data.inherits_class('module-base', d): | ||
337 | write_extra_runtime_pkgs(variants, packages, pkgdatadir) | ||
338 | |||
339 | if bb.data.inherits_class('allarch', d) and not variants \ | ||
340 | and not bb.data.inherits_class('packagegroup', d): | ||
341 | write_extra_runtime_pkgs(global_variants, packages, pkgdatadir) | ||
342 | |||
165 | 343 | ||