xref: /OK3568_Linux_fs/yocto/poky/meta/lib/oe/packagedata.py (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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