update: refine LIBCLANG_PATH and LD_LIBRARY_PATH for LLVM Toolset int… #14
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 set | |
| # 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/* |