1# 2# SPDX-License-Identifier: GPL-2.0-only 3# 4 5import codecs 6import os 7 8def packaged(pkg, d): 9 return os.access(get_subpkgedata_fn(pkg, d) + '.packaged', os.R_OK) 10 11def read_pkgdatafile(fn): 12 pkgdata = {} 13 14 def decode(str): 15 c = codecs.getdecoder("unicode_escape") 16 return c(str)[0] 17 18 if os.access(fn, os.R_OK): 19 import re 20 with open(fn, 'r') as f: 21 lines = f.readlines() 22 r = re.compile("(^.+?):\s+(.*)") 23 for l in lines: 24 m = r.match(l) 25 if m: 26 pkgdata[m.group(1)] = decode(m.group(2)) 27 28 return pkgdata 29 30def get_subpkgedata_fn(pkg, d): 31 return d.expand('${PKGDATA_DIR}/runtime/%s' % pkg) 32 33def has_subpkgdata(pkg, d): 34 return os.access(get_subpkgedata_fn(pkg, d), os.R_OK) 35 36def read_subpkgdata(pkg, d): 37 return read_pkgdatafile(get_subpkgedata_fn(pkg, d)) 38 39def has_pkgdata(pn, d): 40 fn = d.expand('${PKGDATA_DIR}/%s' % pn) 41 return os.access(fn, os.R_OK) 42 43def read_pkgdata(pn, d): 44 fn = d.expand('${PKGDATA_DIR}/%s' % pn) 45 return read_pkgdatafile(fn) 46 47# 48# Collapse FOO:pkg variables into FOO 49# 50def read_subpkgdata_dict(pkg, d): 51 ret = {} 52 subd = read_pkgdatafile(get_subpkgedata_fn(pkg, d)) 53 for var in subd: 54 newvar = var.replace(":" + pkg, "") 55 if newvar == var and var + ":" + pkg in subd: 56 continue 57 ret[newvar] = subd[var] 58 return ret 59 60def read_subpkgdata_extended(pkg, d): 61 import json 62 import bb.compress.zstd 63 64 fn = d.expand("${PKGDATA_DIR}/extended/%s.json.zstd" % pkg) 65 try: 66 num_threads = int(d.getVar("BB_NUMBER_THREADS")) 67 with bb.compress.zstd.open(fn, "rt", encoding="utf-8", num_threads=num_threads) as f: 68 return json.load(f) 69 except FileNotFoundError: 70 return None 71 72def _pkgmap(d): 73 """Return a dictionary mapping package to recipe name.""" 74 75 pkgdatadir = d.getVar("PKGDATA_DIR") 76 77 pkgmap = {} 78 try: 79 files = os.listdir(pkgdatadir) 80 except OSError: 81 bb.warn("No files in %s?" % pkgdatadir) 82 files = [] 83 84 for pn in [f for f in files if not os.path.isdir(os.path.join(pkgdatadir, f))]: 85 try: 86 pkgdata = read_pkgdatafile(os.path.join(pkgdatadir, pn)) 87 except OSError: 88 continue 89 90 packages = pkgdata.get("PACKAGES") or "" 91 for pkg in packages.split(): 92 pkgmap[pkg] = pn 93 94 return pkgmap 95 96def pkgmap(d): 97 """Return a dictionary mapping package to recipe name. 98 Cache the mapping in the metadata""" 99 100 pkgmap_data = d.getVar("__pkgmap_data", False) 101 if pkgmap_data is None: 102 pkgmap_data = _pkgmap(d) 103 d.setVar("__pkgmap_data", pkgmap_data) 104 105 return pkgmap_data 106 107def recipename(pkg, d): 108 """Return the recipe name for the given binary package name.""" 109 110 return pkgmap(d).get(pkg) 111