Build precompiled NIFs #22
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: Build precompiled NIFs | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| version: | |
| description: 'Version to build (e.g., 0.1.0) - must match mix.exs' | |
| required: true | |
| type: string | |
| permissions: | |
| contents: write | |
| jobs: | |
| build_release: | |
| name: NIF ${{ matrix.nif }} - ${{ matrix.job.target }}${{ matrix.job.variant && format(' ({0})', matrix.job.variant) || '' }} (${{ matrix.job.os }}) | |
| runs-on: ${{ matrix.job.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| nif: ["2.17", "2.16", "2.15"] | |
| job: | |
| # Non-x86 targets (no AVX2 variant needed) | |
| - { target: arm-unknown-linux-gnueabihf , os: ubuntu-22.04 , use-cross: true } | |
| - { target: aarch64-unknown-linux-gnu , os: ubuntu-22.04 , use-cross: true } | |
| - { target: aarch64-unknown-linux-musl , os: ubuntu-22.04 , use-cross: true } | |
| - { target: aarch64-apple-darwin , os: macos-14 } | |
| - { target: riscv64gc-unknown-linux-gnu , os: ubuntu-22.04 , use-cross: true } | |
| # x86_64 baseline (SSE2, 16-byte SIMD) | |
| - { target: x86_64-apple-darwin , os: macos-15 } | |
| - { target: x86_64-unknown-linux-gnu , os: ubuntu-22.04 } | |
| - { target: x86_64-unknown-linux-musl , os: ubuntu-22.04 , use-cross: true } | |
| - { target: x86_64-pc-windows-gnu , os: windows-2022 } | |
| - { target: x86_64-pc-windows-msvc , os: windows-2022 } | |
| # x86_64 AVX2 variant (32-byte SIMD for Haswell+ CPUs) | |
| - { target: x86_64-apple-darwin , os: macos-15 , variant: avx2 } | |
| - { target: x86_64-unknown-linux-gnu , os: ubuntu-22.04 , variant: avx2 } | |
| - { target: x86_64-unknown-linux-musl , os: ubuntu-22.04 , use-cross: true, variant: avx2 } | |
| - { target: x86_64-pc-windows-gnu , os: windows-2022 , variant: avx2 } | |
| - { target: x86_64-pc-windows-msvc , os: windows-2022 , variant: avx2 } | |
| env: | |
| RUSTUP_TOOLCHAIN: nightly | |
| steps: | |
| - name: Checkout source code | |
| uses: actions/checkout@v4 | |
| - name: Set project version | |
| shell: bash | |
| run: | | |
| echo "PROJECT_VERSION=${{ inputs.version }}" >> $GITHUB_ENV | |
| - name: Verify version matches mix.exs | |
| shell: bash | |
| run: | | |
| MIX_VERSION=$(sed -n 's/^ @version "\(.*\)"/\1/p' mix.exs | head -n1) | |
| if [ "$MIX_VERSION" != "$PROJECT_VERSION" ]; then | |
| echo "::error::Version mismatch! Input: $PROJECT_VERSION, mix.exs: $MIX_VERSION" | |
| exit 1 | |
| fi | |
| echo "Building version $PROJECT_VERSION" | |
| - name: Install Rust toolchain | |
| uses: dtolnay/rust-toolchain@nightly | |
| with: | |
| targets: ${{ matrix.job.target }} | |
| - name: Set RUSTFLAGS for AVX2 variant | |
| if: matrix.job.variant == 'avx2' | |
| shell: bash | |
| run: echo "RUSTFLAGS=${RUSTFLAGS:+$RUSTFLAGS }-C target-cpu=x86-64-v3" >> $GITHUB_ENV | |
| # When RUSTFLAGS env var is set, it overrides .cargo/config.toml rustflags. | |
| # musl targets need -crt-static to produce cdylib (.so) output. | |
| - name: Add musl cdylib flags | |
| if: contains(matrix.job.target, 'musl') && env.RUSTFLAGS != '' | |
| shell: bash | |
| run: echo "RUSTFLAGS=${RUSTFLAGS} -C target-feature=-crt-static" >> $GITHUB_ENV | |
| - name: Build the project | |
| id: build-crate | |
| uses: philss/rustler-precompiled-action@v1.1.4 | |
| with: | |
| project-name: rustycsv | |
| project-version: ${{ env.PROJECT_VERSION }} | |
| target: ${{ matrix.job.target }} | |
| nif-version: ${{ matrix.nif }} | |
| use-cross: ${{ matrix.job.use-cross }} | |
| project-dir: "native/rustycsv" | |
| variant: ${{ matrix.job.variant }} | |
| - name: Artifact upload | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: ${{ steps.build-crate.outputs.file-name }} | |
| path: ${{ steps.build-crate.outputs.file-path }} | |
| - name: Publish to GitHub Release | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| tag_name: v${{ env.PROJECT_VERSION }} | |
| draft: true | |
| files: | | |
| ${{ steps.build-crate.outputs.file-path }} |