| 109 | |
| 110 | |
| 111 | def resolve_versions(channel_manifest, packages, requested_msvc, requested_sdk): |
| 112 | msvc_versions = {} |
| 113 | sdk_versions = {} |
| 114 | for package_id in packages: |
| 115 | if package_id.startswith("microsoft.visualstudio.component.vc.") and package_id.endswith(".x86.x64"): |
| 116 | parts = package_id.split(".") |
| 117 | version_key = ".".join(parts[4:6]) |
| 118 | if version_key and version_key[0].isdigit(): |
| 119 | msvc_versions[version_key] = package_id |
| 120 | if package_id.startswith("microsoft.visualstudio.component.windows10sdk.") or package_id.startswith( |
| 121 | "microsoft.visualstudio.component.windows11sdk." |
| 122 | ): |
| 123 | version_key = package_id.split(".")[-1] |
| 124 | if version_key.isdigit(): |
| 125 | sdk_versions[version_key] = package_id |
| 126 | |
| 127 | if requested_msvc: |
| 128 | if requested_msvc not in msvc_versions: |
| 129 | raise RuntimeError(f"Unknown MSVC version: {requested_msvc}") |
| 130 | msvc_package_id = msvc_versions[requested_msvc] |
| 131 | else: |
| 132 | msvc_package_id = msvc_versions[max(msvc_versions)] |
| 133 | |
| 134 | if requested_sdk: |
| 135 | if requested_sdk not in sdk_versions: |
| 136 | raise RuntimeError(f"Unknown Windows SDK version: {requested_sdk}") |
| 137 | sdk_package_id = sdk_versions[requested_sdk] |
| 138 | else: |
| 139 | sdk_package_id = sdk_versions[max(sdk_versions)] |
| 140 | |
| 141 | msvc_version = ".".join(msvc_package_id.split(".")[4:-2]) |
| 142 | sdk_version = sdk_package_id.split(".")[-1] |
| 143 | build_tools = first( |
| 144 | channel_manifest["channelItems"], lambda item: item["id"] == "Microsoft.VisualStudio.Product.BuildTools" |
| 145 | ) |
| 146 | resource = first(build_tools["localizedResources"], lambda item: item["language"] == "en-us") |
| 147 | return msvc_version, sdk_version, msvc_package_id, sdk_package_id, resource["license"] |
| 148 | |
| 149 | |
| 150 | def extract_msvc(packages, cache_dir: Path, destination: Path, msvc_version: str): |