diff options
Diffstat (limited to 'meta/lib/oe/recipeutils.py')
-rw-r--r-- | meta/lib/oe/recipeutils.py | 77 |
1 files changed, 70 insertions, 7 deletions
diff --git a/meta/lib/oe/recipeutils.py b/meta/lib/oe/recipeutils.py index de1fbdd3a8..044f1bfa61 100644 --- a/meta/lib/oe/recipeutils.py +++ b/meta/lib/oe/recipeutils.py | |||
@@ -818,7 +818,7 @@ def bbappend_recipe(rd, destlayerdir, srcfiles, install=None, wildcardver=False, | |||
818 | instdirline = 'install -d ${D}%s' % os.path.dirname(instdestpath) | 818 | instdirline = 'install -d ${D}%s' % os.path.dirname(instdestpath) |
819 | if not instdirline in instfunclines: | 819 | if not instdirline in instfunclines: |
820 | instfunclines.append(instdirline) | 820 | instfunclines.append(instdirline) |
821 | instfunclines.append('install -m %s ${WORKDIR}/%s ${D}%s' % (perms, os.path.basename(srcfile), instdestpath)) | 821 | instfunclines.append('install -m %s ${UNPACKDIR}/%s ${D}%s' % (perms, os.path.basename(srcfile), instdestpath)) |
822 | if instfunclines: | 822 | if instfunclines: |
823 | bbappendlines.append(('do_install:append%s()' % appendoverride, '', instfunclines)) | 823 | bbappendlines.append(('do_install:append%s()' % appendoverride, '', instfunclines)) |
824 | 824 | ||
@@ -1070,10 +1070,15 @@ def get_recipe_upstream_version(rd): | |||
1070 | ud = bb.fetch2.FetchData(src_uri, rd) | 1070 | ud = bb.fetch2.FetchData(src_uri, rd) |
1071 | if rd.getVar("UPSTREAM_CHECK_COMMITS") == "1": | 1071 | if rd.getVar("UPSTREAM_CHECK_COMMITS") == "1": |
1072 | bb.fetch2.get_srcrev(rd) | 1072 | bb.fetch2.get_srcrev(rd) |
1073 | revision = ud.method.latest_revision(ud, rd, 'default') | 1073 | upversion = None |
1074 | upversion = pv | 1074 | revision = None |
1075 | if revision != rd.getVar("SRCREV"): | 1075 | try: |
1076 | upversion = upversion + "-new-commits-available" | 1076 | revision = ud.method.latest_revision(ud, rd, 'default') |
1077 | upversion = pv | ||
1078 | if revision != rd.getVar("SRCREV"): | ||
1079 | upversion = upversion + "-new-commits-available" | ||
1080 | except bb.fetch2.FetchError as e: | ||
1081 | bb.warn("Unable to obtain latest revision: {}".format(e)) | ||
1077 | else: | 1082 | else: |
1078 | pupver = ud.method.latest_versionstring(ud, rd) | 1083 | pupver = ud.method.latest_versionstring(ud, rd) |
1079 | (upversion, revision) = pupver | 1084 | (upversion, revision) = pupver |
@@ -1112,7 +1117,7 @@ def _get_recipe_upgrade_status(data): | |||
1112 | maintainer = data.getVar('RECIPE_MAINTAINER') | 1117 | maintainer = data.getVar('RECIPE_MAINTAINER') |
1113 | no_upgrade_reason = data.getVar('RECIPE_NO_UPDATE_REASON') | 1118 | no_upgrade_reason = data.getVar('RECIPE_NO_UPDATE_REASON') |
1114 | 1119 | ||
1115 | return (pn, status, cur_ver, next_ver, maintainer, revision, no_upgrade_reason) | 1120 | return {'pn':pn, 'status':status, 'cur_ver':cur_ver, 'next_ver':next_ver, 'maintainer':maintainer, 'revision':revision, 'no_upgrade_reason':no_upgrade_reason} |
1116 | 1121 | ||
1117 | def get_recipe_upgrade_status(recipes=None): | 1122 | def get_recipe_upgrade_status(recipes=None): |
1118 | pkgs_list = [] | 1123 | pkgs_list = [] |
@@ -1154,6 +1159,7 @@ def get_recipe_upgrade_status(recipes=None): | |||
1154 | if not recipes: | 1159 | if not recipes: |
1155 | recipes = tinfoil.all_recipe_files(variants=False) | 1160 | recipes = tinfoil.all_recipe_files(variants=False) |
1156 | 1161 | ||
1162 | recipeincludes = {} | ||
1157 | for fn in recipes: | 1163 | for fn in recipes: |
1158 | try: | 1164 | try: |
1159 | if fn.startswith("/"): | 1165 | if fn.startswith("/"): |
@@ -1178,8 +1184,65 @@ def get_recipe_upgrade_status(recipes=None): | |||
1178 | 1184 | ||
1179 | data_copy_list.append(data_copy) | 1185 | data_copy_list.append(data_copy) |
1180 | 1186 | ||
1187 | recipeincludes[data.getVar('FILE')] = {'bbincluded':data.getVar('BBINCLUDED').split(),'pn':data.getVar('PN')} | ||
1188 | |||
1181 | from concurrent.futures import ProcessPoolExecutor | 1189 | from concurrent.futures import ProcessPoolExecutor |
1182 | with ProcessPoolExecutor(max_workers=utils.cpu_count()) as executor: | 1190 | with ProcessPoolExecutor(max_workers=utils.cpu_count()) as executor: |
1183 | pkgs_list = executor.map(_get_recipe_upgrade_status, data_copy_list) | 1191 | pkgs_list = executor.map(_get_recipe_upgrade_status, data_copy_list) |
1184 | 1192 | ||
1185 | return pkgs_list | 1193 | return _group_recipes(pkgs_list, _get_common_include_recipes(recipeincludes)) |
1194 | |||
1195 | def get_common_include_recipes(): | ||
1196 | with bb.tinfoil.Tinfoil() as tinfoil: | ||
1197 | tinfoil.prepare(config_only=False) | ||
1198 | |||
1199 | recipes = tinfoil.all_recipe_files(variants=False) | ||
1200 | |||
1201 | recipeincludes = {} | ||
1202 | for fn in recipes: | ||
1203 | data = tinfoil.parse_recipe_file(fn) | ||
1204 | recipeincludes[fn] = {'bbincluded':data.getVar('BBINCLUDED').split(),'pn':data.getVar('PN')} | ||
1205 | return _get_common_include_recipes(recipeincludes) | ||
1206 | |||
1207 | def _get_common_include_recipes(recipeincludes_all): | ||
1208 | recipeincludes = {} | ||
1209 | for fn,data in recipeincludes_all.items(): | ||
1210 | bbincluded_filtered = [i for i in data['bbincluded'] if os.path.dirname(i) == os.path.dirname(fn) and i != fn] | ||
1211 | if bbincluded_filtered: | ||
1212 | recipeincludes[data['pn']] = bbincluded_filtered | ||
1213 | |||
1214 | recipeincludes_inverted = {} | ||
1215 | for k,v in recipeincludes.items(): | ||
1216 | for i in v: | ||
1217 | recipeincludes_inverted.setdefault(i,set()).add(k) | ||
1218 | |||
1219 | recipeincludes_inverted_filtered = {k:v for k,v in recipeincludes_inverted.items() if len(v) > 1} | ||
1220 | |||
1221 | recipes_with_shared_includes = list() | ||
1222 | for v in recipeincludes_inverted_filtered.values(): | ||
1223 | recipeset = v | ||
1224 | for v1 in recipeincludes_inverted_filtered.values(): | ||
1225 | if recipeset.intersection(v1): | ||
1226 | recipeset.update(v1) | ||
1227 | if recipeset not in recipes_with_shared_includes: | ||
1228 | recipes_with_shared_includes.append(recipeset) | ||
1229 | |||
1230 | return recipes_with_shared_includes | ||
1231 | |||
1232 | def _group_recipes(recipes, groups): | ||
1233 | recipedict = {} | ||
1234 | for r in recipes: | ||
1235 | recipedict[r['pn']] = r | ||
1236 | |||
1237 | recipegroups = [] | ||
1238 | for g in groups: | ||
1239 | recipeset = [] | ||
1240 | for r in g: | ||
1241 | if r in recipedict.keys(): | ||
1242 | recipeset.append(recipedict[r]) | ||
1243 | del recipedict[r] | ||
1244 | recipegroups.append(recipeset) | ||
1245 | |||
1246 | for r in recipedict.values(): | ||
1247 | recipegroups.append([r]) | ||
1248 | return recipegroups | ||