import io import json from . import constants _LEVELS = { 0xA0: "alpha", 0xB0: "beta", 0xC0: "candidate", 0xF0: "final", } _TEMPLATE = { "schema_version": "1.0", "base_prefix": ".", "base_interpreter": "python.exe", "platform": None, # Set later "language": { "version": f"{constants.VER_MAJOR}.{constants.VER_MINOR}", "version_info": { "major": constants.VER_MAJOR, "minor": constants.VER_MINOR, "micro": constants.VER_MICRO, "releaselevel": _LEVELS.get(constants.VER_FIELD4 & 0xF0, "final"), "serial": constants.VER_FIELD4 & 0x0F, }, }, "implementation": { "name": "cpython", "cache_tag": f"cpython-{constants.VER_MAJOR}{constants.VER_MINOR}", "version": { "major": constants.VER_MAJOR, "minor": constants.VER_MINOR, "micro": constants.VER_MICRO, "releaselevel": _LEVELS.get(constants.VER_FIELD4 & 0xF0, "final"), "serial": constants.VER_FIELD4 & 0x0F, }, "hexversion": constants.VER_HEXVERSION, }, "abi": { "flags": [], "extension_suffix": ".pyd", "stable_abi_suffix": ".pyd", }, "suffixes": { "source": [".py", ".pyw"], "bytecode": [".pyc"], "extensions": [".pyd"], }, "libpython": { "dynamic": constants.PYTHON_DLL_NAME, "dynamic_stableabi": constants.PYTHON_STABLE_DLL_NAME, "link_extensions": True, }, "c_api": { }, } def _with_d(path): pre, sep, post = path.partition(".") return pre + "_d" + sep + post def _add_d(data, *args): for a in args[:-1]: data = data[a] a = args[-1] v = data[a] if isinstance(v, list): data[a] = [_with_d(i) for i in data[a]] else: data[a] = _with_d(data[a]) def get_builddetails(ns): if not ns.include_builddetails_json: return details = dict(_TEMPLATE) plat = { "win32": "win32", "amd64": "win-amd64", "arm64": "win-arm64", }.get(ns.arch, ns.arch) pyd_abi_flags = "" if ns.include_freethreaded: details["abi"]["flags"].append("t") pyd_abi_flags += "t" if ns.debug: details["abi"]["flags"].append("d") norm_plat = plat.replace("-", "_") ext_suffix = f".cp{constants.VER_MAJOR}{constants.VER_MINOR}{pyd_abi_flags}-{norm_plat}.pyd" details["abi"]["extension_suffix"] = ext_suffix details["suffixes"]["extensions"].insert(0, ext_suffix) details["platform"] = plat if ns.include_dev: details["c_api"]["headers"] = "Include" if ns.include_freethreaded: details["libpython"]["dynamic"] = constants.FREETHREADED_PYTHON_DLL_NAME details["libpython"]["dynamic_stableabi"] = constants.FREETHREADED_PYTHON_STABLE_DLL_NAME if ns.debug: _add_d(details, "base_interpreter") _add_d(details, "abi", "stable_abi_suffix") _add_d(details, "abi", "extension_suffix") _add_d(details, "suffixes", "extensions") _add_d(details, "libpython", "dynamic") _add_d(details, "libpython", "dynamic_stableabi") buffer = io.StringIO() json.dump(details, buffer, indent=2) yield "build-details.json", ("build-details.json", buffer.getvalue().encode())