| 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()) |