Skip to content

update: refine LIBCLANG_PATH and LD_LIBRARY_PATH settings in release … #13

update: refine LIBCLANG_PATH and LD_LIBRARY_PATH settings in release …

update: refine LIBCLANG_PATH and LD_LIBRARY_PATH settings in release … #13

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_for_shared_library=true
docker_options: >-
-e V8_FROM_SOURCE=1
-e "EXTRA_GN_ARGS=v8_enable_temporal_support=false v8_monolithic_for_shared_library=true"
- 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
# inject V8_TLS_USED_IN_LIBRARY through the v8 crate build script.
# 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/libclang
LD_LIBRARY_PATH: ${{ github.workspace }}/target/${{ matrix.rust_target }}/release/libclang
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/libclang
-e LD_LIBRARY_PATH=${{ github.workspace }}/target/${{ matrix.rust_target }}/release/libclang
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"
python3 "$V8_SRC/tools/clang/scripts/update.py" --output-dir "$CLANG_DIR" --package libclang
LIBCLANG_SO="$(find "$CLANG_DIR" -name 'libclang.so*' -print -quit)"
if [ -z "$LIBCLANG_SO" ]; then
echo "::error::Could not find libclang.so under $CLANG_DIR after downloading Chromium's libclang package."
find "$CLANG_DIR" -maxdepth 4 \( -type f -o -type l \) -print | sort | head -200
exit 1
fi
LIBCLANG_DIR="$(dirname "$LIBCLANG_SO")"
LIBCLANG_PATH_DIR="${{ github.workspace }}/target/${{ matrix.rust_target }}/release/libclang"
mkdir -p "$(dirname "$LIBCLANG_PATH_DIR")"
rm -rf "$LIBCLANG_PATH_DIR"
ln -s "$LIBCLANG_DIR" "$LIBCLANG_PATH_DIR"
echo "Using LIBCLANG_PATH=$LIBCLANG_PATH_DIR -> $LIBCLANG_DIR"
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/*