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