Skip to content

Commit c90863a

Browse files
savannahostrowskizoobachris-eibl
authored
GH-141362: Make get_externals handle fetching platform-specific release artifacts (#142405)
Co-authored-by: Steve Dower <[email protected]> Co-authored-by: Chris Eibl <[email protected]>
1 parent 0a97941 commit c90863a

File tree

3 files changed

+47
-12
lines changed

3 files changed

+47
-12
lines changed

PCbuild/get_external.py

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import argparse
44
import os
55
import pathlib
6+
import platform
67
import sys
78
import tarfile
89
import time
@@ -44,20 +45,38 @@ def fetch_zip(commit_hash, zip_dir, *, org='python', binary=False, verbose):
4445

4546

4647
def fetch_release(tag, tarball_dir, *, org='python', verbose=False):
47-
url = f'https://github.com/{org}/cpython-bin-deps/releases/download/{tag}/{tag}.tar.xz'
48+
arch = os.environ.get('PreferredToolArchitecture')
49+
if not arch:
50+
machine = platform.machine()
51+
arch = 'ARM64' if machine == 'ARM64' else 'AMD64'
52+
elif arch.lower() in ('x86', 'x64'):
53+
arch = 'AMD64'
4854
reporthook = None
4955
if verbose:
5056
reporthook = print
5157
tarball_dir.mkdir(parents=True, exist_ok=True)
52-
output_path = tarball_dir / f'{tag}.tar.xz'
53-
retrieve_with_retries(url, output_path, reporthook)
58+
59+
arch_filename = f'{tag}-{arch}.tar.xz'
60+
arch_url = f'https://github.com/{org}/cpython-bin-deps/releases/download/{tag}/{arch_filename}'
61+
try:
62+
output_path = tarball_dir / arch_filename
63+
retrieve_with_retries(arch_url, output_path, reporthook)
64+
return output_path
65+
except OSError:
66+
if verbose:
67+
print(f'{arch_filename} not found, trying generic binary...')
68+
69+
generic_filename = f'{tag}.tar.xz'
70+
generic_url = f'https://github.com/{org}/cpython-bin-deps/releases/download/{tag}/{generic_filename}'
71+
output_path = tarball_dir / generic_filename
72+
retrieve_with_retries(generic_url, output_path, reporthook)
5473
return output_path
5574

5675

5776
def extract_tarball(externals_dir, tarball_path, tag):
5877
output_path = externals_dir / tag
5978
with tarfile.open(tarball_path) as tf:
60-
tf.extractall(os.fspath(externals_dir))
79+
tf.extractall(os.fspath(externals_dir), filter='data')
6180
return output_path
6281

6382

Tools/jit/README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,15 @@ Homebrew won't add any of the tools to your `$PATH`. That's okay; the build scri
4343

4444
LLVM is downloaded automatically (along with other external binary dependencies) by `PCbuild\build.bat`.
4545

46+
By default, the architecture of the LLVM tools is auto-detected based on the host machine. To override this, set the `PreferredToolArchitecture` environment variable before building:
47+
48+
```sh
49+
set PreferredToolArchitecture=AMD64
50+
PCbuild\build.bat --experimental-jit
51+
```
52+
53+
Valid values are`x64`, `x86` and `ARM64`.
54+
4655
Otherwise, you can install LLVM 21 [by searching for it on LLVM's GitHub releases page](https://github.com/llvm/llvm-project/releases?q=21), clicking on "Assets", downloading the appropriate Windows installer for your platform (likely the file ending with `-win64.exe`), and running it. **When installing, be sure to select the option labeled "Add LLVM to the system PATH".**
4756

4857
Alternatively, you can use [chocolatey](https://chocolatey.org):

Tools/jit/jit_infra.md

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,28 @@ When we update LLVM, we need to also update the LLVM release artifact for Window
88

99
To update the LLVM release artifact for Windows builds, follow these steps:
1010
1. Go to the [LLVM releases page](https://github.com/llvm/llvm-project/releases).
11-
1. Download x86_64 Windows artifact for the desired LLVM version (e.g. `clang+llvm-21.1.4-x86_64-pc-windows-msvc.tar.xz`).
12-
1. Extract and repackage the tarball with the correct directory structure. For example:
11+
1. Download Windows artifacts for the desired LLVM version (e.g. `clang+llvm-21.1.4-x86_64-pc-windows-msvc.tar.xz` and `clang+llvm-21.1.4-aarch64-pc-windows-msvc.tar.xz`).
12+
1. Extract and repackage each tarball with the correct directory structure. For example:
1313
```bash
14+
# For x86_64 (AMD64)
1415
tar -xf clang+llvm-21.1.4-x86_64-pc-windows-msvc.tar.xz
1516
mv clang+llvm-21.1.4-x86_64-pc-windows-msvc llvm-21.1.4.0
16-
tar -cf - llvm-21.1.4.0 | pv | xz > llvm-21.1.4.0.tar.xz
17+
tar -cf - llvm-21.1.4.0 | pv | xz > llvm-21.1.4.0-x64.tar.xz
18+
rm -rf llvm-21.1.4.0
19+
20+
# For ARM64
21+
tar -xf clang+llvm-21.1.4-aarch64-pc-windows-msvc.tar.xz
22+
mv clang+llvm-21.1.4-aarch64-pc-windows-msvc llvm-21.1.4.0
23+
tar -cf - llvm-21.1.4.0 | pv | xz > llvm-21.1.4.0-ARM64.tar.xz
1724
```
18-
The tarball must contain a top-level directory named `llvm-{version}.0/`.
25+
Each tarball must contain a top-level directory named `llvm-{version}.0/`.
1926
1. Go to [cpython-bin-deps](https://github.com/python/cpython-bin-deps).
20-
1. Create a new release with the updated LLVM artifact.
27+
1. Create a new release with the LLVM artifacts.
2128
- Create a new tag to match the LLVM version (e.g. `llvm-21.1.4.0`).
22-
- Specify the release title (e.g. `LLVM 21.1.4 for x86_64 Windows`).
23-
- Upload the asset (you can leave all other fields the same).
29+
- Specify the release title (e.g. `LLVM 21.1.4`).
30+
- Upload both platform-specific assets to the same release.
2431

2532
### Other notes
2633
- You must make sure that the name of the artifact matches exactly what is expected in `Tools/jit/_llvm.py` and `PCbuild/get_externals.py`.
27-
- We don't need multiple release artifacts for each architecture because LLVM can cross-compile for different architectures on Windows; x86_64 is sufficient.
34+
- The artifact filename must include the architecture suffix (e.g. `llvm-21.1.4.0-x64.tar.xz`, `llvm-21.1.4.0-ARM64.tar.xz`).
2835
- You must have permissions to create releases in the `cpython-bin-deps` repository. If you don't have permissions, you should contact one of the organization admins.

0 commit comments

Comments
 (0)