Previously, the script only generated the parent CPU and any versions that had a defined alias. Now generate all CPU versions. Any version that had a defined alias will continue to use that alias, but those without aliases will use the generated name $BASECPUNAME-vN. This generated name will be used as an alternate name for those CPU versions with defined aliases. --- src/cpu_map/sync_qemu_models_i386.py | 44 +++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/src/cpu_map/sync_qemu_models_i386.py b/src/cpu_map/sync_qemu_models_i386.py index 1c6a2d4d27..956e4700de 100755 --- a/src/cpu_map/sync_qemu_models_i386.py +++ b/src/cpu_map/sync_qemu_models_i386.py @@ -322,31 +322,55 @@ def expand_model(model): different fields and may have differing versions into several libvirt- friendly cpu models.""" - result = { - "name": model.pop(".name"), + basename = model.pop(".name") + parent = { + "name": basename, + "alias": None, "vendor": translate_vendor(model.pop(".vendor")), "features": set(), "extra": dict()} if ".family" in model and ".model" in model: - result["family"] = model.pop(".family") - result["model"] = model.pop(".model") + parent["family"] = model.pop(".family") + parent["model"] = model.pop(".model") for k in [k for k in model if k.startswith(".features")]: v = model.pop(k) for feature in v.split(): translated = translate_feature(feature) if translated: - result["features"].add(translated) + parent["features"].add(translated) versions = model.pop(".versions", []) for k, v in model.items(): - result["extra"]["model" + k] = v - yield result + parent["extra"]["model" + k] = v + + result = parent for version in versions: + # each version builds on the previous one result = copy.deepcopy(result) - result["name"] = version.pop(".alias", result["name"]) + vnum = int(version.pop(".version")) + vname = "{}-v{}".format(basename, vnum) + if vnum == 1: + # the first version should always be an alias for the parent and + # should therefore have no extra properties + if version.items(): + raise RuntimeError("Unexpected properties in version 1") + # just treat this version as an alias of the parent model and don't + # generate a new CPU model + parent["alias"] = vname + continue + + # prefer the 'alias' over the generated the name if it exists since we + # have already been using these aliases + alias = version.pop(".alias", None) + if alias: + result["name"] = alias + result["alias"] = vname + else: + result["name"] = vname + result["alias"] = None props = version.pop(".props", dict()) for k, v in props: @@ -367,6 +391,8 @@ def expand_model(model): yield result + yield parent + def output_model(f, model): if model["extra"]: @@ -377,6 +403,8 @@ def output_model(f, model): f.write("<cpus>\n") f.write(" <model name='{}'>\n".format(model["name"])) + if model["alias"]: + f.write(" <alias name='{}'/>\n".format(model["alias"])) f.write(" <decode host='on' guest='on'/>\n") f.write(" <signature family='{}' model='{}'/>\n".format( model["family"], model["model"])) -- 2.41.0 _______________________________________________ Devel mailing list -- devel@xxxxxxxxxxxxxxxxx To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxx