Skip to content

update: refine extra GN arguments for V8 build configuration #15

update: refine extra GN arguments for V8 build configuration

update: refine extra GN arguments for V8 build configuration #15

Workflow file for this run

name: Release
on:
push:
tags:
- "v*.*.*"
workflow_dispatch:
permissions:
contents: read
env:
CARGO_TERM_COLOR: always
jobs:
linux:
name: Linux ${{ matrix.target }} py3.10-3.14
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
include:
- runner: ubuntu-22.04
target: x86_64
rust_target: x86_64-unknown-linux-gnu
container: quay.io/pypa/manylinux_2_28_x86_64:latest
v8_from_source: "1"
extra_gn_args: v8_enable_temporal_support=false v8_monolithic=true v8_monolithic_for_shared_library=true v8_use_external_startup_data=false
docker_options: >-
-e V8_FROM_SOURCE=1
-e "EXTRA_GN_ARGS=v8_enable_temporal_support=false v8_monolithic=true v8_monolithic_for_shared_library=true v8_use_external_startup_data=false"
- runner: ubuntu-24.04-arm
target: aarch64
rust_target: aarch64-unknown-linux-gnu
container: quay.io/pypa/manylinux_2_28_aarch64:latest
v8_from_source: "0"
extra_gn_args: ""
docker_options: -e V8_FROM_SOURCE=0
steps:
- uses: actions/checkout@v4
- name: Build wheel
uses: PyO3/maturin-action@v1
env:
# rusty_v8's prebuilt Linux archive uses a TLS model that cannot be
# linked into a Python extension module on x86_64. Source builds set
# v8_monolithic + v8_monolithic_for_shared_library so V8 uses
# shared-library-safe TLS.
# aarch64 uses the published rusty_v8 archive.
V8_FROM_SOURCE: ${{ matrix.v8_from_source }}
# The crates.io v8 archive does not include Chromium's
# third_party/rust/chromium_crates_io/vendor tree needed by the
# Temporal Rust dependency, so source builds avoid those GN targets.
EXTRA_GN_ARGS: ${{ matrix.extra_gn_args }}
LIBCLANG_PATH: ${{ github.workspace }}/target/${{ matrix.rust_target }}/release/llvm-toolset/lib
LD_LIBRARY_PATH: ${{ github.workspace }}/target/${{ matrix.rust_target }}/release/llvm-toolset/lib
with:
target: ${{ matrix.target }}
# Source-building V8 needs Chromium's `gn` binary, which requires
# GLIBC_2.18+. manylinux2014 only has glibc 2.17, so use 2_28 here.
manylinux: "2_28"
container: ${{ matrix.container }}
docker-options: >-
${{ matrix.docker_options }}
-e LIBCLANG_PATH=${{ github.workspace }}/target/${{ matrix.rust_target }}/release/llvm-toolset/lib
-e LD_LIBRARY_PATH=${{ github.workspace }}/target/${{ matrix.rust_target }}/release/llvm-toolset/lib
before-script-linux: |
if [ "${{ matrix.v8_from_source }}" = "1" ]; then
env -u RUSTC_WRAPPER cargo fetch --locked
V8_SRC="$(find /root/.cargo/registry/src -maxdepth 2 -type d -name 'v8-147.4.0' -print -quit)"
if [ -z "$V8_SRC" ]; then
echo "::error::Could not find the v8-147.4.0 crate source after cargo fetch."
exit 1
fi
CLANG_DIR="${{ github.workspace }}/target/${{ matrix.rust_target }}/release/clang"
python3 "$V8_SRC/tools/clang/scripts/update.py" --output-dir "$CLANG_DIR"
install_llvm_toolset() {
if command -v dnf >/dev/null 2>&1; then
dnf install -y llvm-toolset clang-libs && return 0
dnf module install -y llvm-toolset && return 0
dnf install -y clang clang-libs && return 0
fi
if command -v yum >/dev/null 2>&1; then
yum install -y llvm-toolset clang-libs && return 0
yum module install -y llvm-toolset && return 0
yum install -y clang clang-libs && return 0
fi
return 1
}
if ! install_llvm_toolset; then
echo "::error::Could not install LLVM Toolset or clang-libs in the manylinux container."
exit 1
fi
LIBCLANG_SEARCH_DIRS=""
for dir in /opt/rh /usr/lib64 /usr/lib; do
if [ -d "$dir" ]; then
LIBCLANG_SEARCH_DIRS="$LIBCLANG_SEARCH_DIRS $dir"
fi
done
LIBCLANG_SO="$(find $LIBCLANG_SEARCH_DIRS -name 'libclang.so*' -print 2>/dev/null | sort -Vr | head -n1 || true)"
if [ -z "$LIBCLANG_SO" ]; then
echo "::error::Could not find libclang.so after installing LLVM Toolset."
find $LIBCLANG_SEARCH_DIRS -maxdepth 6 -name '*clang*' -print 2>/dev/null | sort | head -200 || true
exit 1
fi
LIBCLANG_DIR="$(dirname "$LIBCLANG_SO")"
LLVM_ROOT="$(dirname "$LIBCLANG_DIR")"
CLANG_BIN="$LLVM_ROOT/bin/clang"
if [ ! -x "$CLANG_BIN" ]; then
CLANG_BIN="$(command -v clang || true)"
fi
if [ ! -x "$CLANG_BIN" ]; then
echo "::error::Could not find a clang executable matching the installed libclang."
exit 1
fi
LLVM_TOOLSET_DIR="${{ github.workspace }}/target/${{ matrix.rust_target }}/release/llvm-toolset"
rm -rf "$LLVM_TOOLSET_DIR"
mkdir -p "$LLVM_TOOLSET_DIR"
ln -s "$LIBCLANG_DIR" "$LLVM_TOOLSET_DIR/lib"
ln -s "$(dirname "$CLANG_BIN")" "$LLVM_TOOLSET_DIR/bin"
echo "Using LIBCLANG_PATH=$LLVM_TOOLSET_DIR/lib -> $LIBCLANG_DIR"
echo "Using clang=$LLVM_TOOLSET_DIR/bin/clang -> $CLANG_BIN"
fi
args: >-
--release
--out dist
--interpreter python3.10 python3.11 python3.12 python3.13 python3.14
sccache: true
- name: Upload wheel
uses: actions/upload-artifact@v4
with:
name: wheels-linux-${{ matrix.target }}
path: dist
if-no-files-found: error
windows:
name: Windows ${{ matrix.target }} py${{ matrix.python.version }}
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
include:
- runner: windows-latest
target: x64
python:
architecture: x64
version: "3.10"
tag: cp310
- runner: windows-latest
target: x64
python:
architecture: x64
version: "3.11"
tag: cp311
- runner: windows-latest
target: x64
python:
architecture: x64
version: "3.12"
tag: cp312
- runner: windows-latest
target: x64
python:
architecture: x64
version: "3.13"
tag: cp313
- runner: windows-latest
target: x64
python:
architecture: x64
version: "3.14"
tag: cp314
- runner: windows-11-arm
target: aarch64
python:
architecture: arm64
version: "3.11"
tag: cp311
- runner: windows-11-arm
target: aarch64
python:
architecture: arm64
version: "3.12"
tag: cp312
- runner: windows-11-arm
target: aarch64
python:
architecture: arm64
version: "3.13"
tag: cp313
- runner: windows-11-arm
target: aarch64
python:
architecture: arm64
version: "3.14"
tag: cp314
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python.version }}
architecture: ${{ matrix.python.architecture }}
- name: Build wheel
uses: PyO3/maturin-action@v1
with:
target: ${{ matrix.target }}
args: --release --out dist --interpreter python
sccache: ${{ !startsWith(github.ref, 'refs/tags/') }}
- name: Upload wheel
uses: actions/upload-artifact@v4
with:
name: wheels-windows-${{ matrix.target }}-${{ matrix.python.tag }}
path: dist
if-no-files-found: error
macos:
name: macOS ${{ matrix.platform.target }} py${{ matrix.python.version }}
runs-on: ${{ matrix.platform.runner }}
strategy:
fail-fast: false
matrix:
python:
- version: "3.10"
tag: cp310
- version: "3.11"
tag: cp311
- version: "3.12"
tag: cp312
- version: "3.13"
tag: cp313
- version: "3.14"
tag: cp314
platform:
- runner: macos-13
target: x86_64
- runner: macos-14
target: aarch64
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python.version }}
- name: Build wheel
uses: PyO3/maturin-action@v1
with:
target: ${{ matrix.platform.target }}
args: --release --out dist --interpreter python
sccache: ${{ !startsWith(github.ref, 'refs/tags/') }}
- name: Upload wheel
uses: actions/upload-artifact@v4
with:
name: wheels-macos-${{ matrix.platform.target }}-${{ matrix.python.tag }}
path: dist
if-no-files-found: error
sdist:
name: Source distribution
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build sdist
uses: PyO3/maturin-action@v1
with:
command: sdist
args: --out dist
- name: Upload sdist
uses: actions/upload-artifact@v4
with:
name: sdist
path: dist
if-no-files-found: error
publish:
name: Publish to PyPI
runs-on: ubuntu-latest
if: ${{ startsWith(github.ref, 'refs/tags/v') }}
needs: [linux, windows, macos, sdist]
permissions:
contents: read
id-token: write
steps:
- uses: actions/download-artifact@v4
with:
path: dist
merge-multiple: true
- uses: astral-sh/setup-uv@v4
- name: Publish distributions
run: uv publish dist/*