Skip to content

Commit 62f1b03

Browse files
authored
Add riscv64-linux support (#491)
Added separate Dockerfiles for riscv64 as suggested by #219 (comment). RISC-V needs `atomic` linked which is added to `LINUX_ALLOW_SYSTEM_LIBRARIES`. Tested locally with `./build-linux.py --target-triple riscv64-unknown-linux-gnu --python cpython-{3.9,3.10,3.11,3.12,3.13,3.14}` and all build fine. CI is added but not tested yet. I'd like the PR to test itself :P Closes #388
1 parent cda1c64 commit 62f1b03

13 files changed

+172
-0
lines changed

.github/workflows/linux.yml

+2
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,11 @@ jobs:
5858
image:
5959
- build
6060
- build.cross
61+
- build.cross-riscv64
6162
- gcc
6263
- xcb
6364
- xcb.cross
65+
- xcb.cross-riscv64
6466
name: ${{ matrix.image }}
6567
runs-on: depot-ubuntu-22.04
6668
permissions:

ci-targets.yaml

+21
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,27 @@ linux:
143143
- freethreaded+lto
144144
minimum-python-version: "3.13"
145145

146+
riscv64-unknown-linux-gnu:
147+
arch: riscv64
148+
libc: gnu
149+
python_versions:
150+
- "3.9"
151+
- "3.10"
152+
- "3.11"
153+
- "3.12"
154+
- "3.13"
155+
- "3.14"
156+
build_options:
157+
- debug
158+
- noopt
159+
- lto
160+
build_options_conditional:
161+
- options:
162+
- freethreaded+debug
163+
- freethreaded+noopt
164+
- freethreaded+lto
165+
minimum-python-version: "3.13"
166+
146167
x86_64-unknown-linux-gnu:
147168
arch: x86_64
148169
libc: gnu

cpython-unix/build-cpython.sh

+3
Original file line numberDiff line numberDiff line change
@@ -936,6 +936,9 @@ mips64el-unknown-linux-gnuabi64)
936936
ppc64le-unknown-linux-gnu)
937937
PYTHON_ARCH="powerpc64le-linux-gnu"
938938
;;
939+
riscv64-unknown-linux-gnu)
940+
PYTHON_ARCH="riscv64-linux-gnu"
941+
;;
939942
s390x-unknown-linux-gnu)
940943
PYTHON_ARCH="s390x-linux-gnu"
941944
;;

cpython-unix/build-libX11.sh

+3
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,9 @@ if [ -n "${CROSS_COMPILING}" ]; then
6969
ppc64le-unknown-linux-gnu)
7070
EXTRA_FLAGS="${EXTRA_FLAGS} --enable-malloc0returnsnull"
7171
;;
72+
riscv64-unknown-linux-gnu)
73+
EXTRA_FLAGS="${EXTRA_FLAGS} --enable-malloc0returnsnull"
74+
;;
7275
s390x-unknown-linux-gnu)
7376
EXTRA_FLAGS="${EXTRA_FLAGS} --enable-malloc0returnsnull"
7477
;;

cpython-unix/build-main.py

+2
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,11 @@ def main():
103103
"toolchain",
104104
"toolchain-image-build",
105105
"toolchain-image-build.cross",
106+
"toolchain-image-build.cross-riscv64",
106107
"toolchain-image-gcc",
107108
"toolchain-image-xcb",
108109
"toolchain-image-xcb.cross",
110+
"toolchain-image-xcb.cross-riscv64",
109111
},
110112
default="default",
111113
help="The make target to evaluate",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# Debian Buster.
2+
FROM debian@sha256:2a0c1b9175adf759420fe0fbd7f5b449038319171eb76554bb76cbe172b62b42
3+
MAINTAINER Gregory Szorc <[email protected]>
4+
5+
RUN groupadd -g 1000 build && \
6+
useradd -u 1000 -g 1000 -d /build -s /bin/bash -m build && \
7+
mkdir /tools && \
8+
chown -R build:build /build /tools
9+
10+
ENV HOME=/build \
11+
SHELL=/bin/bash \
12+
USER=build \
13+
LOGNAME=build \
14+
HOSTNAME=builder \
15+
DEBIAN_FRONTEND=noninteractive
16+
17+
CMD ["/bin/bash", "--login"]
18+
WORKDIR '/build'
19+
20+
RUN for s in debian_buster debian_buster-updates debian-security_buster/updates; do \
21+
echo "deb http://snapshot.debian.org/archive/${s%_*}/20250109T084424Z/ ${s#*_} main"; \
22+
done > /etc/apt/sources.list && \
23+
( echo 'quiet "true";'; \
24+
echo 'APT::Get::Assume-Yes "true";'; \
25+
echo 'APT::Install-Recommends "false";'; \
26+
echo 'Acquire::Check-Valid-Until "false";'; \
27+
echo 'Acquire::Retries "5";'; \
28+
) > /etc/apt/apt.conf.d/99cpython-portable
29+
30+
RUN apt-get update
31+
32+
# Host building.
33+
RUN apt-get install \
34+
bzip2 \
35+
gcc \
36+
g++ \
37+
libc6-dev \
38+
libffi-dev \
39+
make \
40+
patch \
41+
perl \
42+
pkg-config \
43+
tar \
44+
xz-utils \
45+
unzip \
46+
zip \
47+
zlib1g-dev
48+
49+
# Cross-building.
50+
RUN apt-get install \
51+
gcc-aarch64-linux-gnu \
52+
gcc-arm-linux-gnueabi \
53+
gcc-arm-linux-gnueabihf \
54+
gcc-mips-linux-gnu \
55+
gcc-mips64el-linux-gnuabi64 \
56+
gcc-mipsel-linux-gnu \
57+
gcc-powerpc64le-linux-gnu \
58+
gcc-riscv64-linux-gnu \
59+
gcc-s390x-linux-gnu \
60+
libc6-dev-arm64-cross \
61+
libc6-dev-armel-cross \
62+
libc6-dev-armhf-cross \
63+
libc6-dev-mips-cross \
64+
libc6-dev-mips64el-cross \
65+
libc6-dev-mipsel-cross \
66+
libc6-dev-ppc64el-cross \
67+
libc6-dev-riscv64-cross \
68+
libc6-dev-s390x-cross

cpython-unix/build.py

+7
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,13 @@ def python_build_info(
550550
if mips and version == "3.13":
551551
# See https://github.com/indygreg/python-build-standalone/issues/410
552552
linux_allowed_system_libraries.add("atomic")
553+
riscv = target_triple.split("-")[0] in {"riscv64"}
554+
if riscv:
555+
# RISC-V binary often comes with libatomic on old GCC versions
556+
# See https://github.com/riscvarchive/riscv-gcc/issues/12
557+
# https://github.com/riscvarchive/riscv-gcc/issues/337
558+
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86005
559+
linux_allowed_system_libraries.add("atomic")
553560

554561
# Add in core linking annotations.
555562
libs = extra_metadata["python_config_vars"].get("LIBS", "").split()

cpython-unix/extension-modules.yml

+1
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@ _decimal:
259259
targets:
260260
- aarch64-.*
261261
- ppc64le-unknown-linux.*
262+
- riscv64-unknown-linux.*
262263
- s390x-unknown-linux-.*
263264
- x86_64.*
264265
links:

cpython-unix/targets.yml

+40
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,46 @@ ppc64le-unknown-linux-gnu:
470470
- zlib
471471
openssl_target: linux-ppc64le
472472

473+
riscv64-unknown-linux-gnu:
474+
host_platforms:
475+
- linux64
476+
pythons_supported:
477+
- '3.9'
478+
- '3.10'
479+
- '3.11'
480+
- '3.12'
481+
- '3.13'
482+
- '3.14'
483+
docker_image_suffix: .cross-riscv64
484+
host_cc: /usr/bin/x86_64-linux-gnu-gcc
485+
host_cxx: /usr/bin/x86_64-linux-gnu-g++
486+
target_cc: /usr/bin/riscv64-linux-gnu-gcc
487+
needs:
488+
- autoconf
489+
- bdb
490+
- binutils
491+
- bzip2
492+
- expat
493+
- libedit
494+
- libffi
495+
- libX11
496+
- libXau
497+
- libxcb
498+
- m4
499+
- mpdecimal
500+
- ncurses
501+
- openssl-3.0
502+
- patchelf
503+
- sqlite
504+
- tcl
505+
- tk
506+
- tix
507+
- uuid
508+
- xorgproto
509+
- xz
510+
- zlib
511+
openssl_target: linux64-riscv64
512+
473513
s390x-unknown-linux-gnu:
474514
host_platforms:
475515
- linux64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{% include 'build.cross-riscv64.Dockerfile' %}
2+
RUN apt-get install \
3+
python

docs/building.rst

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ As are various other targets::
4242
$ ./build-linux.py --target mips-unknown-linux-gnu
4343
$ ./build-linux.py --target mipsel-unknown-linux-gnu
4444
$ ./build-linux.py --target ppc64le-unknown-linux-gnu
45+
$ ./build-linux.py --target riscv64-unknown-linux-gnu
4546
$ ./build-linux.py --target s390x-unknown-linux-gnu
4647

4748
macOS

src/release.rs

+13
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,19 @@ pub static RELEASE_TRIPLES: Lazy<BTreeMap<&'static str, TripleRelease>> = Lazy::
194194
},
195195
);
196196

197+
h.insert(
198+
"riscv64-unknown-linux-gnu",
199+
TripleRelease {
200+
suffixes: linux_suffixes_nopgo.clone(),
201+
install_only_suffix: "lto",
202+
python_version_requirement: Some(VersionSpecifier::from_str(">=3.9").unwrap()),
203+
conditional_suffixes: vec![ConditionalSuffixes {
204+
python_version_requirement: VersionSpecifier::from_str(">=3.13").unwrap(),
205+
suffixes: linux_suffixes_nopgo_freethreaded.clone(),
206+
}],
207+
},
208+
);
209+
197210
h.insert(
198211
"s390x-unknown-linux-gnu",
199212
TripleRelease {

src/validation.rs

+8
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ const RECOGNIZED_TRIPLES: &[&str] = &[
4545
"mipsel-unknown-linux-gnu",
4646
"mips64el-unknown-linux-gnuabi64",
4747
"ppc64le-unknown-linux-gnu",
48+
"riscv64-unknown-linux-gnu",
4849
"s390x-unknown-linux-gnu",
4950
"thumbv7k-apple-watchos",
5051
"x86_64-apple-darwin",
@@ -172,6 +173,10 @@ static GLIBC_MAX_VERSION_BY_TRIPLE: Lazy<HashMap<&'static str, version_compare::
172173
"ppc64le-unknown-linux-gnu",
173174
version_compare::Version::from("2.17").unwrap(),
174175
);
176+
versions.insert(
177+
"riscv64-unknown-linux-gnu",
178+
version_compare::Version::from("2.28").unwrap(),
179+
);
175180
versions.insert(
176181
"s390x-unknown-linux-gnu",
177182
version_compare::Version::from("2.17").unwrap(),
@@ -233,6 +238,7 @@ static ELF_ALLOWED_LIBRARIES_BY_TRIPLE: Lazy<HashMap<&'static str, Vec<&'static
233238
),
234239
("mips64el-unknown-linux-gnuabi64", vec![]),
235240
("ppc64le-unknown-linux-gnu", vec!["ld64.so.1", "ld64.so.2"]),
241+
("riscv64-unknown-linux-gnu", vec!["ld-linux-riscv64-lp64d.so.1", "libatomic.so.1"]),
236242
("s390x-unknown-linux-gnu", vec!["ld64.so.1"]),
237243
("x86_64-unknown-linux-gnu", vec!["ld-linux-x86-64.so.2"]),
238244
("x86_64_v2-unknown-linux-gnu", vec!["ld-linux-x86-64.so.2"]),
@@ -488,6 +494,7 @@ static PLATFORM_TAG_BY_TRIPLE: Lazy<HashMap<&'static str, &'static str>> = Lazy:
488494
("mipsel-unknown-linux-gnu", "linux-mipsel"),
489495
("mips64el-unknown-linux-gnuabi64", "todo"),
490496
("ppc64le-unknown-linux-gnu", "linux-powerpc64le"),
497+
("riscv64-unknown-linux-gnu", "linux-riscv64"),
491498
("s390x-unknown-linux-gnu", "linux-s390x"),
492499
("x86_64-apple-darwin", "macosx-10.15-x86_64"),
493500
("x86_64-apple-ios", "iOS-x86_64"),
@@ -866,6 +873,7 @@ fn validate_elf<Elf: FileHeader<Endian = Endianness>>(
866873
"mipsel-unknown-linux-gnu" => object::elf::EM_MIPS,
867874
"mips64el-unknown-linux-gnuabi64" => 0,
868875
"ppc64le-unknown-linux-gnu" => object::elf::EM_PPC64,
876+
"riscv64-unknown-linux-gnu" => object::elf::EM_RISCV,
869877
"s390x-unknown-linux-gnu" => object::elf::EM_S390,
870878
"x86_64-unknown-linux-gnu" => object::elf::EM_X86_64,
871879
"x86_64_v2-unknown-linux-gnu" => object::elf::EM_X86_64,

0 commit comments

Comments
 (0)