diff --git a/ci-targets.yaml b/ci-targets.yaml index d75eb60cf..2e9212f06 100644 --- a/ci-targets.yaml +++ b/ci-targets.yaml @@ -142,6 +142,71 @@ linux: - freethreaded+lto minimum-python-version: "3.13" + ppc64le_power9-unknown-linux-gnu: + arch: ppc64le + arch_variant: power9 + libc: gnu + python_versions: + - "3.10" + - "3.11" + - "3.12" + - "3.13" + - "3.14" + - "3.15" + build_options: + - debug + - noopt + - lto + build_options_conditional: + - options: + - freethreaded+debug + - freethreaded+noopt + - freethreaded+lto + minimum-python-version: "3.13" + ppc64le_power10-unknown-linux-gnu: + arch: ppc64le + arch_variant: power10 + libc: gnu + python_versions: + - "3.10" + - "3.11" + - "3.12" + - "3.13" + - "3.14" + - "3.15" + build_options: + - debug + - noopt + - lto + build_options_conditional: + - options: + - freethreaded+debug + - freethreaded+noopt + - freethreaded+lto + minimum-python-version: "3.13" + + ppc64le_power11-unknown-linux-gnu: + arch: ppc64le + arch_variant: power11 + libc: gnu + python_versions: + - "3.10" + - "3.11" + - "3.12" + - "3.13" + - "3.14" + - "3.15" + build_options: + - debug + - noopt + - lto + build_options_conditional: + - options: + - freethreaded+debug + - freethreaded+noopt + - freethreaded+lto + minimum-python-version: "3.13" + riscv64-unknown-linux-gnu: arch: riscv64 libc: gnu diff --git a/cpython-unix/build.cross-ppc64le_power10.Dockerfile b/cpython-unix/build.cross-ppc64le_power10.Dockerfile new file mode 100644 index 000000000..62f214aca --- /dev/null +++ b/cpython-unix/build.cross-ppc64le_power10.Dockerfile @@ -0,0 +1,55 @@ +# Debian Bookworm (ships GCC 12, which supports -mcpu=power10). +FROM debian@sha256:6bc30d909583f38600edd6609e29eb3fb284ab8affce8d0389f332fc91c2dd91 +LABEL org.opencontainers.image.authors="Gregory Szorc " + +RUN groupadd -g 1000 build && \ + useradd -u 1000 -g 1000 -d /build -s /bin/bash -m build && \ + mkdir /tools && \ + chown -R build:build /build /tools + +ENV HOME=/build \ + SHELL=/bin/bash \ + USER=build \ + LOGNAME=build \ + HOSTNAME=builder \ + DEBIAN_FRONTEND=noninteractive + +CMD ["/bin/bash", "--login"] +WORKDIR '/build' + +RUN for s in debian_bookworm debian_bookworm-updates debian-security_bookworm-security/updates; do \ + echo "deb http://snapshot.debian.org/archive/${s%_*}/20250601T000000Z/ ${s#*_} main"; \ + done > /etc/apt/sources.list && \ + ( echo 'quiet "true";'; \ + echo 'APT::Get::Assume-Yes "true";'; \ + echo 'APT::Install-Recommends "false";'; \ + echo 'Acquire::Check-Valid-Until "false";'; \ + echo 'Acquire::Retries "5";'; \ + ) > /etc/apt/apt.conf.d/99cpython-portable && \ + rm -f /etc/apt/sources.list.d/* + +RUN apt-get update + +# Host building. +RUN apt-get install \ + bzip2 \ + ca-certificates \ + gcc \ + g++ \ + libc6-dev \ + libffi-dev \ + make \ + patch \ + perl \ + pkg-config \ + tar \ + xz-utils \ + unzip \ + zip \ + zlib1g-dev + +# Cross-building (powerpc64le only — GCC 12 supports -mcpu=power10). +RUN apt-get install \ + g++-powerpc64le-linux-gnu \ + gcc-powerpc64le-linux-gnu \ + libc6-dev-ppc64el-cross diff --git a/cpython-unix/build.cross-ppc64le_power11.Dockerfile b/cpython-unix/build.cross-ppc64le_power11.Dockerfile new file mode 100644 index 000000000..a975ed1f3 --- /dev/null +++ b/cpython-unix/build.cross-ppc64le_power11.Dockerfile @@ -0,0 +1,55 @@ +# Debian Bookworm (ships GCC 12, which supports -mcpu=power10 and -mcpu=power11). +FROM debian@sha256:6bc30d909583f38600edd6609e29eb3fb284ab8affce8d0389f332fc91c2dd91 +LABEL org.opencontainers.image.authors="Gregory Szorc " + +RUN groupadd -g 1000 build && \ + useradd -u 1000 -g 1000 -d /build -s /bin/bash -m build && \ + mkdir /tools && \ + chown -R build:build /build /tools + +ENV HOME=/build \ + SHELL=/bin/bash \ + USER=build \ + LOGNAME=build \ + HOSTNAME=builder \ + DEBIAN_FRONTEND=noninteractive + +CMD ["/bin/bash", "--login"] +WORKDIR '/build' + +RUN for s in debian_bookworm debian_bookworm-updates debian-security_bookworm-security/updates; do \ + echo "deb http://snapshot.debian.org/archive/${s%_*}/20250601T000000Z/ ${s#*_} main"; \ + done > /etc/apt/sources.list && \ + ( echo 'quiet "true";'; \ + echo 'APT::Get::Assume-Yes "true";'; \ + echo 'APT::Install-Recommends "false";'; \ + echo 'Acquire::Check-Valid-Until "false";'; \ + echo 'Acquire::Retries "5";'; \ + ) > /etc/apt/apt.conf.d/99cpython-portable && \ + rm -f /etc/apt/sources.list.d/* + +RUN apt-get update + +# Host building. +RUN apt-get install \ + bzip2 \ + ca-certificates \ + gcc \ + g++ \ + libc6-dev \ + libffi-dev \ + make \ + patch \ + perl \ + pkg-config \ + tar \ + xz-utils \ + unzip \ + zip \ + zlib1g-dev + +# Cross-building (powerpc64le only — GCC 12 supports -mcpu=power10 and -mcpu=power11). +RUN apt-get install \ + g++-powerpc64le-linux-gnu \ + gcc-powerpc64le-linux-gnu \ + libc6-dev-ppc64el-cross diff --git a/cpython-unix/build.py b/cpython-unix/build.py index 902d4a182..f13de84b9 100755 --- a/cpython-unix/build.py +++ b/cpython-unix/build.py @@ -112,6 +112,9 @@ def add_target_env(env, build_platform, target_triple, build_env, build_options) target_triple.replace("x86_64_v2-", "x86_64-") .replace("x86_64_v3-", "x86_64-") .replace("x86_64_v4-", "x86_64-") + .replace("ppc64le_power9-", "ppc64le-") + .replace("ppc64le_power10-", "ppc64le-") + .replace("ppc64le_power11-", "ppc64le-") ) # On macOS, we support building Linux in a virtualized container that diff --git a/cpython-unix/targets.yml b/cpython-unix/targets.yml index 51fdbcd80..40a9250f9 100644 --- a/cpython-unix/targets.yml +++ b/cpython-unix/targets.yml @@ -503,6 +503,172 @@ ppc64le-unknown-linux-gnu: - zstd openssl_target: linux-ppc64le +ppc64le_power9-unknown-linux-gnu: + linux_uapi_include_arch: powerpc64le-linux-gnu + host_platforms: + - linux_x86_64 + pythons_supported: + - '3.10' + - '3.11' + - '3.12' + - '3.13' + - '3.14' + - '3.15' + docker_image_suffix: .cross + host_cc: /usr/bin/x86_64-linux-gnu-gcc + host_cxx: /usr/bin/x86_64-linux-gnu-g++ + target_cc: /usr/bin/powerpc64le-linux-gnu-gcc + target_cxx: /usr/bin/powerpc64le-linux-gnu-g++ + target_cflags: + # Hardening + - '-fstack-protector' + - '-U_FORTIFY_SOURCE' + - '-D_FORTIFY_SOURCE=2' + - '-mcpu=power9' + - '-mtune=power9' + target_ldflags: + # Hardening + - '-Wl,-z,noexecstack' + - '-Wl,-z,relro' + - '-Wl,-z,now' + needs: + - autoconf + - bdb + - binutils + - bzip2 + - expat + - libedit + - libffi + - libX11 + - libXau + - libxcb + - linux-uapi + - m4 + - mpdecimal + - ncurses + - openssl-3.5 + - patchelf + - sqlite + - tcl + - tk + - uuid + - xorgproto + - xz + - zlib + - zstd + openssl_target: linux-ppc64le + + +ppc64le_power10-unknown-linux-gnu: + linux_uapi_include_arch: powerpc64le-linux-gnu + host_platforms: + - linux_x86_64 + pythons_supported: + - '3.10' + - '3.11' + - '3.12' + - '3.13' + - '3.14' + - '3.15' + docker_image_suffix: .cross-ppc64le_power10 + host_cc: /usr/bin/x86_64-linux-gnu-gcc + host_cxx: /usr/bin/x86_64-linux-gnu-g++ + target_cc: /usr/bin/powerpc64le-linux-gnu-gcc + target_cxx: /usr/bin/powerpc64le-linux-gnu-g++ + target_cflags: + # Hardening + - '-fstack-protector' + - '-U_FORTIFY_SOURCE' + - '-D_FORTIFY_SOURCE=2' + - '-mcpu=power10' + - '-mtune=power10' + target_ldflags: + # Hardening + - '-Wl,-z,noexecstack' + - '-Wl,-z,relro' + - '-Wl,-z,now' + needs: + - autoconf + - bdb + - binutils + - bzip2 + - expat + - libedit + - libffi + - libX11 + - libXau + - libxcb + - linux-uapi + - m4 + - mpdecimal + - ncurses + - openssl-3.5 + - patchelf + - sqlite + - tcl + - tk + - uuid + - xorgproto + - xz + - zlib + - zstd + openssl_target: linux-ppc64le + +ppc64le_power11-unknown-linux-gnu: + linux_uapi_include_arch: powerpc64le-linux-gnu + host_platforms: + - linux_x86_64 + pythons_supported: + - '3.10' + - '3.11' + - '3.12' + - '3.13' + - '3.14' + - '3.15' + docker_image_suffix: .cross-ppc64le_power11 + host_cc: /usr/bin/x86_64-linux-gnu-gcc + host_cxx: /usr/bin/x86_64-linux-gnu-g++ + target_cc: /usr/bin/powerpc64le-linux-gnu-gcc + target_cxx: /usr/bin/powerpc64le-linux-gnu-g++ + target_cflags: + # Hardening + - '-fstack-protector' + - '-U_FORTIFY_SOURCE' + - '-D_FORTIFY_SOURCE=2' + - '-mcpu=power11' + - '-mtune=power11' + target_ldflags: + # Hardening + - '-Wl,-z,noexecstack' + - '-Wl,-z,relro' + - '-Wl,-z,now' + needs: + - autoconf + - bdb + - binutils + - bzip2 + - expat + - libedit + - libffi + - libX11 + - libXau + - libxcb + - linux-uapi + - m4 + - mpdecimal + - ncurses + - openssl-3.5 + - patchelf + - sqlite + - tcl + - tk + - uuid + - xorgproto + - xz + - zlib + - zstd + openssl_target: linux-ppc64le + riscv64-unknown-linux-gnu: linux_uapi_include_arch: riscv64-linux-gnu host_platforms: diff --git a/docs/running.rst b/docs/running.rst index d2d2dc9a8..18c7d00c3 100644 --- a/docs/running.rst +++ b/docs/running.rst @@ -80,6 +80,14 @@ familiar with LLVM target triples, here is an overview: ``i686-unknown-linux-*`` Linux 32-bit Intel/AMD CPUs. +``ppc64le-unknown-linux-gnu`` + Linux on 64-bit little-endian PowerPC (ELFv2 ABI baseline). + +``ppc64le_power9-unknown-linux-gnu`` + Linux on 64-bit little-endian PowerPC optimized for POWER9. + + Compiled with ``-mcpu=power9 -mtune=power9``. + ``x86_64_v2-*`` Targets 64-bit Intel/AMD CPUs approximately newer than `Nehalem `_ diff --git a/src/release.rs b/src/release.rs index e0fa22f55..8af9d728b 100644 --- a/src/release.rs +++ b/src/release.rs @@ -199,7 +199,19 @@ pub static RELEASE_TRIPLES: Lazy> = Lazy:: }], }, ); - + h.insert( + "ppc64le_power9-unknown-linux-gnu", + TripleRelease { + suffixes: linux_suffixes_nopgo.clone(), + install_only_suffix: "lto", + freethreaded_install_only_suffix: "freethreaded+lto", + python_version_requirement: Some(VersionSpecifier::from_str(">=3.10").unwrap()), + conditional_suffixes: vec![ConditionalSuffixes { + python_version_requirement: VersionSpecifier::from_str(">=3.13").unwrap(), + suffixes: linux_suffixes_nopgo_freethreaded.clone(), + }], + }, + ); h.insert( "riscv64-unknown-linux-gnu", TripleRelease { diff --git a/src/validation.rs b/src/validation.rs index c9902fabb..20e2b0ece 100644 --- a/src/validation.rs +++ b/src/validation.rs @@ -46,6 +46,7 @@ const RECOGNIZED_TRIPLES: &[&str] = &[ "mipsel-unknown-linux-gnu", "mips64el-unknown-linux-gnuabi64", "ppc64le-unknown-linux-gnu", + "ppc64le_power9-unknown-linux-gnu", "riscv64-unknown-linux-gnu", "s390x-unknown-linux-gnu", "x86_64-apple-darwin", @@ -201,6 +202,10 @@ static GLIBC_MAX_VERSION_BY_TRIPLE: Lazy> = Lazy: ("mipsel-unknown-linux-gnu", "linux-mipsel"), ("mips64el-unknown-linux-gnuabi64", "todo"), ("ppc64le-unknown-linux-gnu", "linux-powerpc64le"), + ("ppc64le_power9-unknown-linux-gnu", "linux-powerpc64le"), ("riscv64-unknown-linux-gnu", "linux-riscv64"), ("s390x-unknown-linux-gnu", "linux-s390x"), ("x86_64-apple-darwin", "macosx-10.15-x86_64"), @@ -967,6 +977,7 @@ fn validate_elf>( "mipsel-unknown-linux-gnu" => object::elf::EM_MIPS, "mips64el-unknown-linux-gnuabi64" => 0, "ppc64le-unknown-linux-gnu" => object::elf::EM_PPC64, + "ppc64le_power9-unknown-linux-gnu" => object::elf::EM_PPC64, "riscv64-unknown-linux-gnu" => object::elf::EM_RISCV, "s390x-unknown-linux-gnu" => object::elf::EM_S390, "x86_64-unknown-linux-gnu" => object::elf::EM_X86_64,