xref: /OK3568_Linux_fs/yocto/poky/meta/classes/multilib_global.bbclass (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyundef preferred_ml_updates(d):
2*4882a593Smuzhiyun    # If any of PREFERRED_PROVIDER, PREFERRED_RPROVIDER, REQUIRED_VERSION
3*4882a593Smuzhiyun    # or PREFERRED_VERSION are set, we need to mirror these variables in
4*4882a593Smuzhiyun    # the multilib case;
5*4882a593Smuzhiyun    multilibs = d.getVar('MULTILIBS') or ""
6*4882a593Smuzhiyun    if not multilibs:
7*4882a593Smuzhiyun        return
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun    prefixes = []
10*4882a593Smuzhiyun    for ext in multilibs.split():
11*4882a593Smuzhiyun        eext = ext.split(':')
12*4882a593Smuzhiyun        if len(eext) > 1 and eext[0] == 'multilib':
13*4882a593Smuzhiyun            prefixes.append(eext[1])
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun    required_versions = []
16*4882a593Smuzhiyun    preferred_versions = []
17*4882a593Smuzhiyun    providers = []
18*4882a593Smuzhiyun    rproviders = []
19*4882a593Smuzhiyun    for v in d.keys():
20*4882a593Smuzhiyun        if v.startswith("REQUIRED_VERSION_"):
21*4882a593Smuzhiyun            required_versions.append(v)
22*4882a593Smuzhiyun        if v.startswith("PREFERRED_VERSION_"):
23*4882a593Smuzhiyun            preferred_versions.append(v)
24*4882a593Smuzhiyun        if v.startswith("PREFERRED_PROVIDER_"):
25*4882a593Smuzhiyun            providers.append(v)
26*4882a593Smuzhiyun        if v.startswith("PREFERRED_RPROVIDER_"):
27*4882a593Smuzhiyun            rproviders.append(v)
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun    def sort_versions(versions, keyword):
30*4882a593Smuzhiyun        version_str = "_".join([keyword, "VERSION", ""])
31*4882a593Smuzhiyun        for v in versions:
32*4882a593Smuzhiyun            val = d.getVar(v, False)
33*4882a593Smuzhiyun            pkg = v.replace(version_str, "")
34*4882a593Smuzhiyun            if pkg.endswith("-native") or "-crosssdk-" in pkg or pkg.startswith(("nativesdk-", "virtual/nativesdk-")):
35*4882a593Smuzhiyun                continue
36*4882a593Smuzhiyun            if '-cross-' in pkg and '${' in pkg:
37*4882a593Smuzhiyun                for p in prefixes:
38*4882a593Smuzhiyun                    localdata = bb.data.createCopy(d)
39*4882a593Smuzhiyun                    override = ":virtclass-multilib-" + p
40*4882a593Smuzhiyun                    localdata.setVar("OVERRIDES", localdata.getVar("OVERRIDES", False) + override)
41*4882a593Smuzhiyun                    if "-canadian-" in pkg:
42*4882a593Smuzhiyun                        newtune = localdata.getVar("DEFAULTTUNE:" + "virtclass-multilib-" + p, False)
43*4882a593Smuzhiyun                        if newtune:
44*4882a593Smuzhiyun                            localdata.setVar("DEFAULTTUNE", newtune)
45*4882a593Smuzhiyun                        newname = localdata.expand(v)
46*4882a593Smuzhiyun                    else:
47*4882a593Smuzhiyun                        newname = localdata.expand(v).replace(version_str, version_str + p + '-')
48*4882a593Smuzhiyun                    if newname != v:
49*4882a593Smuzhiyun                        newval = localdata.expand(val)
50*4882a593Smuzhiyun                        d.setVar(newname, newval)
51*4882a593Smuzhiyun                # Avoid future variable key expansion
52*4882a593Smuzhiyun                vexp = d.expand(v)
53*4882a593Smuzhiyun                if v != vexp and d.getVar(v, False):
54*4882a593Smuzhiyun                    d.renameVar(v, vexp)
55*4882a593Smuzhiyun                continue
56*4882a593Smuzhiyun            for p in prefixes:
57*4882a593Smuzhiyun                newname = version_str + p + "-" + pkg
58*4882a593Smuzhiyun                if not d.getVar(newname, False):
59*4882a593Smuzhiyun                    d.setVar(newname, val)
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun    sort_versions(required_versions, "REQUIRED")
62*4882a593Smuzhiyun    sort_versions(preferred_versions, "PREFERRED")
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun    for prov in providers:
65*4882a593Smuzhiyun        val = d.getVar(prov, False)
66*4882a593Smuzhiyun        pkg = prov.replace("PREFERRED_PROVIDER_", "")
67*4882a593Smuzhiyun        if pkg.endswith("-native") or "-crosssdk-" in pkg or pkg.startswith(("nativesdk-", "virtual/nativesdk-")):
68*4882a593Smuzhiyun            continue
69*4882a593Smuzhiyun        if 'cross-canadian' in pkg:
70*4882a593Smuzhiyun            for p in prefixes:
71*4882a593Smuzhiyun                localdata = bb.data.createCopy(d)
72*4882a593Smuzhiyun                override = ":virtclass-multilib-" + p
73*4882a593Smuzhiyun                localdata.setVar("OVERRIDES", localdata.getVar("OVERRIDES", False) + override)
74*4882a593Smuzhiyun                newname = localdata.expand(prov)
75*4882a593Smuzhiyun                if newname != prov:
76*4882a593Smuzhiyun                    newval = localdata.expand(val)
77*4882a593Smuzhiyun                    d.setVar(newname, newval)
78*4882a593Smuzhiyun            # Avoid future variable key expansion
79*4882a593Smuzhiyun            provexp = d.expand(prov)
80*4882a593Smuzhiyun            if prov != provexp and d.getVar(prov, False):
81*4882a593Smuzhiyun                d.renameVar(prov, provexp)
82*4882a593Smuzhiyun            continue
83*4882a593Smuzhiyun        virt = ""
84*4882a593Smuzhiyun        if pkg.startswith("virtual/"):
85*4882a593Smuzhiyun            pkg = pkg.replace("virtual/", "")
86*4882a593Smuzhiyun            virt = "virtual/"
87*4882a593Smuzhiyun        for p in prefixes:
88*4882a593Smuzhiyun            newval = None
89*4882a593Smuzhiyun            if pkg != "kernel":
90*4882a593Smuzhiyun                newval = p + "-" + val
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun            # implement variable keys
93*4882a593Smuzhiyun            localdata = bb.data.createCopy(d)
94*4882a593Smuzhiyun            override = ":virtclass-multilib-" + p
95*4882a593Smuzhiyun            localdata.setVar("OVERRIDES", localdata.getVar("OVERRIDES", False) + override)
96*4882a593Smuzhiyun            newname = localdata.expand(prov)
97*4882a593Smuzhiyun            if newname != prov and not d.getVar(newname, False):
98*4882a593Smuzhiyun                d.setVar(newname, localdata.expand(newval))
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun            # implement alternative multilib name
101*4882a593Smuzhiyun            newname = localdata.expand("PREFERRED_PROVIDER_" + virt + p + "-" + pkg)
102*4882a593Smuzhiyun            if not d.getVar(newname, False) and newval != None:
103*4882a593Smuzhiyun                d.setVar(newname, localdata.expand(newval))
104*4882a593Smuzhiyun        # Avoid future variable key expansion
105*4882a593Smuzhiyun        provexp = d.expand(prov)
106*4882a593Smuzhiyun        if prov != provexp and d.getVar(prov, False):
107*4882a593Smuzhiyun            d.renameVar(prov, provexp)
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun    for prov in rproviders:
110*4882a593Smuzhiyun        val = d.getVar(prov, False)
111*4882a593Smuzhiyun        pkg = prov.replace("PREFERRED_RPROVIDER_", "")
112*4882a593Smuzhiyun        for p in prefixes:
113*4882a593Smuzhiyun            newval = p + "-" + val
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun            # implement variable keys
116*4882a593Smuzhiyun            localdata = bb.data.createCopy(d)
117*4882a593Smuzhiyun            override = ":virtclass-multilib-" + p
118*4882a593Smuzhiyun            localdata.setVar("OVERRIDES", localdata.getVar("OVERRIDES", False) + override)
119*4882a593Smuzhiyun            newname = localdata.expand(prov)
120*4882a593Smuzhiyun            if newname != prov and not d.getVar(newname, False):
121*4882a593Smuzhiyun                d.setVar(newname, localdata.expand(newval))
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun            # implement alternative multilib name
124*4882a593Smuzhiyun            newname = localdata.expand("PREFERRED_RPROVIDER_" + p + "-" + pkg)
125*4882a593Smuzhiyun            if not d.getVar(newname, False) and newval != None:
126*4882a593Smuzhiyun                d.setVar(newname, localdata.expand(newval))
127*4882a593Smuzhiyun        # Avoid future variable key expansion
128*4882a593Smuzhiyun        provexp = d.expand(prov)
129*4882a593Smuzhiyun        if prov != provexp and d.getVar(prov, False):
130*4882a593Smuzhiyun            d.renameVar(prov, provexp)
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun    def translate_provide(prefix, prov):
133*4882a593Smuzhiyun        # Really need to know if kernel modules class is inherited somehow
134*4882a593Smuzhiyun        if prov == "lttng-modules":
135*4882a593Smuzhiyun            return prov
136*4882a593Smuzhiyun        if not prov.startswith("virtual/"):
137*4882a593Smuzhiyun            return prefix + "-" + prov
138*4882a593Smuzhiyun        if prov == "virtual/kernel":
139*4882a593Smuzhiyun            return prov
140*4882a593Smuzhiyun        prov = prov.replace("virtual/", "")
141*4882a593Smuzhiyun        return "virtual/" + prefix + "-" + prov
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun    mp = (d.getVar("BB_MULTI_PROVIDER_ALLOWED") or "").split()
144*4882a593Smuzhiyun    extramp = []
145*4882a593Smuzhiyun    for p in mp:
146*4882a593Smuzhiyun        if p.endswith("-native") or "-crosssdk-" in p or p.startswith(("nativesdk-", "virtual/nativesdk-")) or 'cross-canadian' in p:
147*4882a593Smuzhiyun            continue
148*4882a593Smuzhiyun        for pref in prefixes:
149*4882a593Smuzhiyun            extramp.append(translate_provide(pref, p))
150*4882a593Smuzhiyun    d.setVar("BB_MULTI_PROVIDER_ALLOWED", " ".join(mp + extramp))
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun    abisafe = (d.getVar("SIGGEN_EXCLUDERECIPES_ABISAFE") or "").split()
153*4882a593Smuzhiyun    extras = []
154*4882a593Smuzhiyun    for p in prefixes:
155*4882a593Smuzhiyun        for a in abisafe:
156*4882a593Smuzhiyun            extras.append(p + "-" + a)
157*4882a593Smuzhiyun    d.appendVar("SIGGEN_EXCLUDERECIPES_ABISAFE", " " + " ".join(extras))
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun    siggen_exclude = (d.getVar("SIGGEN_EXCLUDE_SAFE_RECIPE_DEPS") or "").split()
160*4882a593Smuzhiyun    extras = []
161*4882a593Smuzhiyun    for p in prefixes:
162*4882a593Smuzhiyun        for a in siggen_exclude:
163*4882a593Smuzhiyun            a1, a2 = a.split("->")
164*4882a593Smuzhiyun            extras.append(translate_provide(p, a1) + "->" + translate_provide(p, a2))
165*4882a593Smuzhiyun    d.appendVar("SIGGEN_EXCLUDE_SAFE_RECIPE_DEPS", " " + " ".join(extras))
166*4882a593Smuzhiyun
167*4882a593Smuzhiyunpython multilib_virtclass_handler_vendor () {
168*4882a593Smuzhiyun    if isinstance(e, bb.event.ConfigParsed):
169*4882a593Smuzhiyun        for v in e.data.getVar("MULTILIB_VARIANTS").split():
170*4882a593Smuzhiyun            if e.data.getVar("TARGET_VENDOR:virtclass-multilib-" + v, False) is None:
171*4882a593Smuzhiyun                e.data.setVar("TARGET_VENDOR:virtclass-multilib-" + v, e.data.getVar("TARGET_VENDOR", False) + "ml" + v)
172*4882a593Smuzhiyun        preferred_ml_updates(e.data)
173*4882a593Smuzhiyun}
174*4882a593Smuzhiyunaddhandler multilib_virtclass_handler_vendor
175*4882a593Smuzhiyunmultilib_virtclass_handler_vendor[eventmask] = "bb.event.ConfigParsed"
176*4882a593Smuzhiyun
177*4882a593Smuzhiyunpython multilib_virtclass_handler_global () {
178*4882a593Smuzhiyun    variant = e.data.getVar("BBEXTENDVARIANT")
179*4882a593Smuzhiyun    if variant:
180*4882a593Smuzhiyun        return
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun    non_ml_recipes = d.getVar('NON_MULTILIB_RECIPES').split()
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun    if bb.data.inherits_class('kernel', e.data) or \
185*4882a593Smuzhiyun            bb.data.inherits_class('module-base', e.data) or \
186*4882a593Smuzhiyun            d.getVar('BPN') in non_ml_recipes:
187*4882a593Smuzhiyun
188*4882a593Smuzhiyun            # We need to avoid expanding KERNEL_VERSION which we can do by deleting it
189*4882a593Smuzhiyun            # from a copy of the datastore
190*4882a593Smuzhiyun            localdata = bb.data.createCopy(d)
191*4882a593Smuzhiyun            localdata.delVar("KERNEL_VERSION")
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun            variants = (e.data.getVar("MULTILIB_VARIANTS") or "").split()
194*4882a593Smuzhiyun
195*4882a593Smuzhiyun            import oe.classextend
196*4882a593Smuzhiyun            clsextends = []
197*4882a593Smuzhiyun            for variant in variants:
198*4882a593Smuzhiyun                clsextends.append(oe.classextend.ClassExtender(variant, localdata))
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun            # Process PROVIDES
201*4882a593Smuzhiyun            origprovs = provs = localdata.getVar("PROVIDES") or ""
202*4882a593Smuzhiyun            for clsextend in clsextends:
203*4882a593Smuzhiyun                provs = provs + " " + clsextend.map_variable("PROVIDES", setvar=False)
204*4882a593Smuzhiyun            e.data.setVar("PROVIDES", provs)
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun            # Process RPROVIDES
207*4882a593Smuzhiyun            origrprovs = rprovs = localdata.getVar("RPROVIDES") or ""
208*4882a593Smuzhiyun            for clsextend in clsextends:
209*4882a593Smuzhiyun                rprovs = rprovs + " " + clsextend.map_variable("RPROVIDES", setvar=False)
210*4882a593Smuzhiyun            if rprovs.strip():
211*4882a593Smuzhiyun                e.data.setVar("RPROVIDES", rprovs)
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun            # Process RPROVIDES:${PN}...
214*4882a593Smuzhiyun            for pkg in (e.data.getVar("PACKAGES") or "").split():
215*4882a593Smuzhiyun                origrprovs = rprovs = localdata.getVar("RPROVIDES:%s" % pkg) or ""
216*4882a593Smuzhiyun                for clsextend in clsextends:
217*4882a593Smuzhiyun                    rprovs = rprovs + " " + clsextend.map_variable("RPROVIDES:%s" % pkg, setvar=False)
218*4882a593Smuzhiyun                    rprovs = rprovs + " " + clsextend.extname + "-" + pkg
219*4882a593Smuzhiyun                e.data.setVar("RPROVIDES:%s" % pkg, rprovs)
220*4882a593Smuzhiyun}
221*4882a593Smuzhiyun
222*4882a593Smuzhiyunaddhandler multilib_virtclass_handler_global
223*4882a593Smuzhiyunmultilib_virtclass_handler_global[eventmask] = "bb.event.RecipeTaskPreProcess"
224