Skip to content

Commit 3df09e7

Browse files
authored
ci: build with clang instead of gcc (#632)
* ci: build with clang instead of gcc * ci: remove QEMU conditions
1 parent 1a0d278 commit 3df09e7

File tree

5 files changed

+115
-35
lines changed

5 files changed

+115
-35
lines changed

.github/workflows/build.yml

Lines changed: 1 addition & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,6 @@ name: CI
22

33
on:
44
workflow_dispatch:
5-
inputs:
6-
use_qemu:
7-
description: 'Use qemu to build linux ppc64le, s390x & riscv64'
8-
required: true
9-
default: true
105
schedule:
116
- cron: '0 18 * * 5' # "At 18:00 on Friday."
127
pull_request:
@@ -21,9 +16,6 @@ concurrency:
2116
group: ${{ github.workflow }}-${{ github.ref }}
2217
cancel-in-progress: true
2318

24-
env:
25-
USE_QEMU: ${{ fromJSON(github.event.inputs.use_qemu || 'false') || (github.event_name == 'schedule') || startsWith(github.ref, 'refs/tags/') }}
26-
2719
jobs:
2820
lint:
2921
name: Lint
@@ -47,100 +39,78 @@ jobs:
4739
- os: ubuntu-latest
4840
arch: "x86_64"
4941
build: "manylinux_"
50-
use_qemu: false
5142
- os: ubuntu-latest
5243
arch: "x86_64"
5344
build: "musllinux_"
54-
use_qemu: false
5545
- os: ubuntu-latest
5646
arch: "i686"
5747
build: "manylinux_"
58-
use_qemu: false
5948
- os: ubuntu-latest
6049
arch: "i686"
6150
build: "musllinux_"
62-
use_qemu: false
6351
- os: ubuntu-24.04-arm
6452
arch: "aarch64"
6553
build: "manylinux_"
66-
use_qemu: false
6754
- os: ubuntu-24.04-arm
6855
arch: "aarch64"
6956
build: "musllinux_"
70-
use_qemu: false
7157
- os: ubuntu-latest
7258
arch: "ppc64le"
7359
build: "manylinux_"
74-
use_qemu: true
7560
- os: ubuntu-latest
7661
arch: "ppc64le"
7762
build: "musllinux_"
78-
use_qemu: true
7963
- os: ubuntu-latest
8064
arch: "s390x"
8165
build: "manylinux_"
82-
use_qemu: true
8366
- os: ubuntu-latest
8467
arch: "s390x"
8568
build: "musllinux_"
86-
use_qemu: true
8769
- os: ubuntu-latest
8870
arch: "riscv64"
8971
build: "manylinux_"
90-
use_qemu: true
9172
- os: ubuntu-latest
9273
arch: "riscv64"
9374
build: "musllinux_"
94-
use_qemu: true
9575
- os: ubuntu-24.04-arm
9676
arch: "armv7l"
9777
build: "manylinux_"
98-
use_qemu: false
9978
- os: ubuntu-24.04-arm
10079
arch: "armv7l"
10180
build: "musllinux_"
102-
use_qemu: false
10381
- os: windows-2022
10482
arch: "AMD64"
10583
build: ""
106-
use_qemu: false
10784
- os: windows-11-arm
10885
arch: "ARM64"
10986
build: ""
110-
use_qemu: false
11187
- os: windows-2022
11288
arch: "x86"
11389
build: ""
114-
use_qemu: false
11590
- os: macos-14
11691
arch: "universal2"
11792
build: ""
118-
use_qemu: false
11993

12094
steps:
12195
- uses: actions/checkout@v5
122-
if: (!matrix.use_qemu) || fromJSON(env.USE_QEMU)
12396
with:
12497
fetch-depth: 0 # required for versioneer to find tags
12598

12699
- uses: astral-sh/setup-uv@v7
127-
if: (!matrix.use_qemu) || fromJSON(env.USE_QEMU)
128100
with:
129101
enable-cache: false
130102

131103
- name: Set up QEMU
132104
uses: docker/setup-qemu-action@v3.7.0
133-
if: matrix.use_qemu && fromJSON(env.USE_QEMU)
105+
if: matrix.arch == 'ppc64le' || matrix.arch == 'riscv64' || matrix.arch == 's390x'
134106

135107
- name: Build wheels
136108
uses: pypa/cibuildwheel@v3.2
137-
if: (!matrix.use_qemu) || fromJSON(env.USE_QEMU)
138109
env:
139110
CIBW_ARCHS: "${{ matrix.arch }}"
140111
CIBW_BUILD: "cp310-${{ matrix.build }}*"
141112

142113
- uses: actions/upload-artifact@v5
143-
if: (!matrix.use_qemu) || fromJSON(env.USE_QEMU)
144114
with:
145115
name: cibw-${{ runner.os }}-${{ matrix.build }}${{ matrix.arch }}
146116
path: ./wheelhouse/*.whl

README.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ The following platforms are supported with binary wheels:
6868
| Linux IBM Z | | manylinux2014+ s390x |
6969
| | | musllinux_1_2+ s390x |
7070
+---------------+---------------------------+
71-
| Linux RISC-V | | manylinux_2_35+ riscv64 |
71+
| Linux RISC-V | | manylinux_2_31+ riscv64 |
7272
| | | musllinux_1_2+ riscv64 |
7373
+---------------+---------------------------+
7474
| macOS 10.10+ | Intel |

pyproject.toml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ manylinux-aarch64-image = "manylinux2014"
105105
manylinux-ppc64le-image = "manylinux2014"
106106
manylinux-s390x-image = "manylinux2014"
107107
manylinux-armv7l-image = "manylinux_2_31"
108-
manylinux-riscv64-image = "ghcr.io/mayeut/manylinux_2_35:2025.08.02-2"
108+
manylinux-riscv64-image = "ghcr.io/mayeut/manylinux_2_31:2025.08.23-1"
109109
musllinux-x86_64-image = "musllinux_1_2"
110110
musllinux-i686-image = "musllinux_1_2"
111111
musllinux-aarch64-image = "musllinux_1_2"
@@ -121,9 +121,11 @@ environment = { MACOSX_DEPLOYMENT_TARGET = "10.10" }
121121

122122
[[tool.cibuildwheel.overrides]]
123123
select = "*-*linux*"
124-
before-all = "./scripts/manylinux-build-and-install-openssl.sh"
124+
before-all = "./scripts/install-static-clang.sh && ./scripts/manylinux-build-and-install-openssl.sh"
125125
inherit.environment = "prepend"
126-
environment = { PKG_CONFIG_PATH = "/usr/local/ssl/lib/pkgconfig" }
126+
environment = { CC = "/opt/clang/bin/clang", CXX = "/opt/clang/bin/clang++", LDFLAGS = "-fuse-ld=lld -Wl,--build-id", PKG_CONFIG_PATH = "/usr/local/ssl/lib/pkgconfig" }
127+
inherit.environment-pass = "prepend"
128+
environment-pass = ["RUNNER_ARCH"]
127129
inherit.config-settings = "prepend"
128130
config-settings."cmake.define.OPENSSL_ROOT_DIR" = "/usr/local/ssl"
129131
config-settings."cmake.define.OPENSSL_USE_STATIC_LIBS" = "ON"

scripts/install-static-clang.sh

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
#!/bin/bash
2+
3+
# Stop at any error, show all commands
4+
set -exuo pipefail
5+
6+
TOOLCHAIN_PATH=/opt/clang
7+
8+
# Download static-clang
9+
DEFAULT_ARCH="$(uname -m)"
10+
if [ "${STATIC_CLANG_ARCH:-}" == "" ]; then
11+
STATIC_CLANG_ARCH="${RUNNER_ARCH:-${DEFAULT_ARCH}}"
12+
fi
13+
case "${STATIC_CLANG_ARCH}" in
14+
ARM64|aarch64|arm64|arm64/*) GO_ARCH=arm64;;
15+
ARM|armv7l|armv8l|arm|arm/v7) GO_ARCH=arm;; # assume arm/v7 for arm
16+
X64|x86_64|amd64|amd64/*) GO_ARCH=amd64;;
17+
X86|i686|386) GO_ARCH=386;;
18+
ppc64le) GO_ARCH=ppc64le;;
19+
riscv64) GO_ARCH=riscv64;;
20+
s390x) GO_ARCH=s390x;;
21+
*) echo "No static-clang toolchain for ${CLANG_ARCH}">2; exit 1;;
22+
esac
23+
STATIC_CLANG_VERSION=21.1.5.0
24+
STATIC_CLANG_FILENAME="static-clang-linux-${GO_ARCH}.tar.xz"
25+
STATIC_CLANG_URL="https://github.com/mayeut/static-clang-images/releases/download/v${STATIC_CLANG_VERSION}/${STATIC_CLANG_FILENAME}"
26+
pushd /tmp
27+
cat<<'EOF' | grep "${STATIC_CLANG_FILENAME}" > "${STATIC_CLANG_FILENAME}.sha256"
28+
7af47b1c41dd1e76e08d33f13f7fe33eb43849040f69499516f3f01708b12ae0 static-clang-linux-386.tar.xz
29+
395463d070de084f249bf08d3a8a88a42f19bce24cad37b45c78d48a62a73bdc static-clang-linux-amd64.tar.xz
30+
294839579cf4d2fb5343b6ee1e1613f126c765664e253f2109725d5f49db6aa3 static-clang-linux-arm.tar.xz
31+
7476d44530b560c5bdc1b085c8651810c2fece201410d831c47b2d3b8101c1b2 static-clang-linux-arm64.tar.xz
32+
dcdb642827b5da8570b312c1a877bdf4a2b0f7e3004394a3b216134c3178f346 static-clang-linux-loong64.tar.xz
33+
6b247ae1ce6d095375cd4f37a0484f0c91f8457e3c3f3bb7f9c125a414b19bed static-clang-linux-ppc64le.tar.xz
34+
fb0cce0e1fecceb6d3eb2e095297731107c0803605815b37a5cbcec270700088 static-clang-linux-riscv64.tar.xz
35+
18cbfc7471a40a091b02b2999303dfa3f87368dd01e65d0d3ca7b216826ac84f static-clang-linux-s390x.tar.xz
36+
EOF
37+
curl -fsSLO "${STATIC_CLANG_URL}"
38+
sha256sum -c "${STATIC_CLANG_FILENAME}.sha256"
39+
tar -C /opt -xf "${STATIC_CLANG_FILENAME}"
40+
popd
41+
42+
# configure target triple
43+
case "${AUDITWHEEL_POLICY}-${AUDITWHEEL_ARCH}" in
44+
manylinux*-armv7l) TARGET_TRIPLE=armv7-unknown-linux-gnueabihf;;
45+
musllinux*-armv7l) TARGET_TRIPLE=armv7-alpine-linux-musleabihf;;
46+
manylinux*-ppc64le) TARGET_TRIPLE=powerpc64le-unknown-linux-gnu;;
47+
musllinux*-ppc64le) TARGET_TRIPLE=powerpc64le-alpine-linux-musl;;
48+
manylinux*-*) TARGET_TRIPLE=${AUDITWHEEL_ARCH}-unknown-linux-gnu;;
49+
musllinux*-*) TARGET_TRIPLE=${AUDITWHEEL_ARCH}-alpine-linux-musl;;
50+
esac
51+
case "${AUDITWHEEL_ARCH}" in
52+
riscv64) M_ARCH="-march=rv64gc";;
53+
x86_64) M_ARCH="-march=x86-64";;
54+
armv7l) M_ARCH="-march=armv7a";;
55+
i686) M_ARCH="-march=i686";;
56+
esac
57+
GCC_TRIPLE=$(gcc -dumpmachine)
58+
59+
if [ "${AUDITWHEEL_ARCH}" == "riscv64" ]; then
60+
# the LDFLAGS from pyproject.toml seems not to be taken into account when building CMake (no problem with OpenSSL)
61+
# FAILED: [code=1] Source/kwsys/cmsysTestProcess
62+
# : && /opt/clang/bin/clang -D_POSIX_C_SOURCE=199506L -D_POSIX_SOURCE=1 -D_SVID_SOURCE=1 -D_BSD_SOURCE=1 -O3 -DNDEBUG -lstdc++ -lgcc -lrt Source/kwsys/CMakeFiles/cmsysTestProcess.dir/testProcess.c.o -o Source/kwsys/cmsysTestProcess Source/kwsys/libcmsys_c.a && :
63+
# /usr/bin/riscv64-linux-gnu-ld: -march=rv64i2p1_m2p0_a2p1_f2p2_d2p2_c2p0_zicsr2p0_zifencei2p0_zmmul1p0_zaamo1p0_zalrsc1p0: unsupported ISA subset `z'
64+
# /usr/bin/riscv64-linux-gnu-ld: failed to merge target specific data of file Source/kwsys/libcmsys_c.a(ProcessUNIX.c.o)
65+
# /usr/bin/riscv64-linux-gnu-ld: -march=rv64i2p1_m2p0_a2p1_f2p2_d2p2_c2p0_zicsr2p0_zifencei2p0_zmmul1p0_zaamo1p0_zalrsc1p0: unsupported ISA subset `z'
66+
# /usr/bin/riscv64-linux-gnu-ld: failed to merge target specific data of file Source/kwsys/libcmsys_c.a(System.c.o)
67+
# clang: error: linker command failed with exit code 1 (use -v to see invocation)
68+
IMPLICIT_LLD="-fuse-ld=lld"
69+
fi
70+
71+
cat<<EOF >"${TOOLCHAIN_PATH}/bin/${AUDITWHEEL_PLAT}.cfg"
72+
-target ${TARGET_TRIPLE}
73+
${M_ARCH:-}
74+
--gcc-toolchain=${DEVTOOLSET_ROOTPATH:-}/usr
75+
--gcc-triple=${GCC_TRIPLE}
76+
${IMPLICIT_LLD:-}
77+
EOF
78+
79+
cat<<EOF >"${TOOLCHAIN_PATH}/bin/clang.cfg"
80+
@${AUDITWHEEL_PLAT}.cfg
81+
EOF
82+
83+
cat<<EOF >"${TOOLCHAIN_PATH}/bin/clang++.cfg"
84+
@${AUDITWHEEL_PLAT}.cfg
85+
EOF
86+
87+
cat<<EOF >"${TOOLCHAIN_PATH}/bin/clang-cpp.cfg"
88+
@${AUDITWHEEL_PLAT}.cfg
89+
EOF
90+
91+
# override entrypoint to add the toolchain to PATH
92+
mv /usr/local/bin/manylinux-entrypoint /usr/local/bin/manylinux-entrypoint-org
93+
cat<<EOF >/usr/local/bin/manylinux-entrypoint
94+
#!/bin/bash
95+
96+
set -eu
97+
98+
export PATH="${TOOLCHAIN_PATH}/bin:\${PATH}"
99+
exec /usr/local/bin/manylinux-entrypoint-org "\$@"
100+
EOF
101+
102+
chmod +x /usr/local/bin/manylinux-entrypoint

scripts/manylinux-build-and-install-openssl.sh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,12 @@ check_sha256sum ${OPENSSL_ROOT}.tar.gz ${OPENSSL_HASH}
4646
tar -xzf ${OPENSSL_ROOT}.tar.gz
4747
rm -rf ${OPENSSL_ROOT}.tar.gz
4848

49+
LIBATOMIC=
50+
if [ "${AUDITWHEEL_ARCH}" == "i686" ]; then
51+
LIBATOMIC=-latomic
52+
fi
53+
export LDLIBS="${LIBATOMIC}"
54+
4955
# Configure
5056
pushd ${OPENSSL_ROOT}
5157
./config no-shared no-tests -fPIC --prefix=/usr/local/ssl --openssldir=/usr/local/ssl > /dev/null

0 commit comments

Comments
 (0)