Skip to content

Commit

Permalink
fix: install PyPy on Linux ARM64 (#1011)
Browse files Browse the repository at this point in the history
* ci: check non-eol versions of PyPy are available on all runners

* fix: install PyPy on Linux ARM64

* ci: remove eol ubuntu-20.04
  • Loading branch information
mayeut authored Feb 5, 2025
1 parent 4237552 commit 8039c45
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 10 deletions.
53 changes: 53 additions & 0 deletions .github/workflows/test-pypy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,59 @@ jobs:
${EXECUTABLE} --version
shell: bash

check-non-eol:
name: Check non-eol ${{ matrix.pypy }} on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os:
- macos-13
- macos-14
- macos-15
- windows-2019
- windows-2022
- windows-2025
- ubuntu-22.04
- ubuntu-24.04
- ubuntu-22.04-arm
- ubuntu-24.04-arm
pypy: ['pypy-2.7', 'pypy-3.10']

steps:
- name: Checkout
uses: actions/checkout@v4

- name: setup-python ${{ matrix.pypy }}
id: setup-python
uses: ./
with:
python-version: ${{ matrix.pypy }}

- name: Check python-path
run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}'
shell: bash

- name: PyPy and Python version
run: python --version

- name: Run simple code
run: python -c 'import math; print(math.factorial(5))'

- name: Assert PyPy is running
run: |
import platform
assert platform.python_implementation().lower() == "pypy"
shell: python

- name: Assert expected binaries (or symlinks) are present
run: |
EXECUTABLE=${{ matrix.pypy }}
EXECUTABLE=${EXECUTABLE/pypy-/pypy} # remove the first '-' in "pypy-X.Y" -> "pypyX.Y" to match executable name
EXECUTABLE=${EXECUTABLE%%-*} # remove any -* suffixe
${EXECUTABLE} --version
shell: bash

setup-pypy-noenv:
name: Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv)
runs-on: ${{ matrix.os }}
Expand Down
15 changes: 10 additions & 5 deletions dist/setup/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -100062,28 +100062,33 @@ function pypyVersionToSemantic(versionSpec) {
}
exports.pypyVersionToSemantic = pypyVersionToSemantic;
function isArchPresentForWindows(item, architecture) {
architecture = replaceX32toX86(architecture);
architecture = pypyArchitecture(architecture);
return item.files.some((file) => utils_1.WINDOWS_PLATFORMS.includes(file.platform) && file.arch === architecture);
}
exports.isArchPresentForWindows = isArchPresentForWindows;
function isArchPresentForMacOrLinux(item, architecture, platform) {
architecture = pypyArchitecture(architecture);
return item.files.some((file) => file.arch === architecture && file.platform === platform);
}
exports.isArchPresentForMacOrLinux = isArchPresentForMacOrLinux;
function findAssetForWindows(releases, architecture) {
architecture = replaceX32toX86(architecture);
architecture = pypyArchitecture(architecture);
return releases.files.find((item) => utils_1.WINDOWS_PLATFORMS.includes(item.platform) && item.arch === architecture);
}
exports.findAssetForWindows = findAssetForWindows;
function findAssetForMacOrLinux(releases, architecture, platform) {
architecture = pypyArchitecture(architecture);
return releases.files.find((item) => item.arch === architecture && item.platform === platform);
}
exports.findAssetForMacOrLinux = findAssetForMacOrLinux;
function replaceX32toX86(architecture) {
// convert x32 to x86 because os.arch() returns x32 for 32-bit systems but PyPy releases json has x86 arch value.
if (architecture === 'x32') {
function pypyArchitecture(architecture) {
if (utils_1.IS_WINDOWS && architecture === 'x32') {
// convert x32 to x86 because os.arch() returns x32 for 32-bit systems but PyPy releases json has x86 arch value.
architecture = 'x86';
}
else if (utils_1.IS_LINUX && architecture === 'arm64') {
architecture = 'aarch64';
}
return architecture;
}

Expand Down
15 changes: 10 additions & 5 deletions src/install-pypy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import * as exec from '@actions/exec';
import fs from 'fs';

import {
IS_LINUX,
IS_WINDOWS,
WINDOWS_PLATFORMS,
IPyPyManifestRelease,
Expand Down Expand Up @@ -246,7 +247,7 @@ export function pypyVersionToSemantic(versionSpec: string) {
}

export function isArchPresentForWindows(item: any, architecture: string) {
architecture = replaceX32toX86(architecture);
architecture = pypyArchitecture(architecture);
return item.files.some(
(file: any) =>
WINDOWS_PLATFORMS.includes(file.platform) && file.arch === architecture
Expand All @@ -258,13 +259,14 @@ export function isArchPresentForMacOrLinux(
architecture: string,
platform: string
) {
architecture = pypyArchitecture(architecture);
return item.files.some(
(file: any) => file.arch === architecture && file.platform === platform
);
}

export function findAssetForWindows(releases: any, architecture: string) {
architecture = replaceX32toX86(architecture);
architecture = pypyArchitecture(architecture);
return releases.files.find(
(item: any) =>
WINDOWS_PLATFORMS.includes(item.platform) && item.arch === architecture
Expand All @@ -276,15 +278,18 @@ export function findAssetForMacOrLinux(
architecture: string,
platform: string
) {
architecture = pypyArchitecture(architecture);
return releases.files.find(
(item: any) => item.arch === architecture && item.platform === platform
);
}

function replaceX32toX86(architecture: string): string {
// convert x32 to x86 because os.arch() returns x32 for 32-bit systems but PyPy releases json has x86 arch value.
if (architecture === 'x32') {
function pypyArchitecture(architecture: string): string {
if (IS_WINDOWS && architecture === 'x32') {
// convert x32 to x86 because os.arch() returns x32 for 32-bit systems but PyPy releases json has x86 arch value.
architecture = 'x86';
} else if (IS_LINUX && architecture === 'arm64') {
architecture = 'aarch64';
}
return architecture;
}

0 comments on commit 8039c45

Please sign in to comment.