name: Build Binaries and Wheels
on:
workflow_call:
workflow_dispatch:
jobs:
build-binaries:
name: Build ${{ matrix.build.NAME }}
runs-on: ${{ matrix.build.OS }}
strategy:
fail-fast: false
matrix:
build:
- { NAME: linux-x64-glibc, OS: ubuntu-22.04, TARGET: x86_64-unknown-linux-gnu, BUILD_WHEEL: true }
- { NAME: linux-arm64-glibc, OS: ubuntu-22.04, TARGET: aarch64-unknown-linux-gnu, BUILD_WHEEL: false }
- { NAME: linux-x64-musl, OS: ubuntu-22.04, TARGET: x86_64-unknown-linux-musl, BUILD_WHEEL: false }
- { NAME: linux-arm64-musl, OS: ubuntu-22.04, TARGET: aarch64-unknown-linux-musl, BUILD_WHEEL: false }
- { NAME: windows-x64-msvc, OS: windows-latest, TARGET: x86_64-pc-windows-msvc, BUILD_WHEEL: true }
- { NAME: windows-arm64-msvc, OS: windows-latest, TARGET: aarch64-pc-windows-msvc, BUILD_WHEEL: false }
- { NAME: darwin-x64, OS: macos-15, TARGET: x86_64-apple-darwin, BUILD_WHEEL: true }
- { NAME: darwin-arm64, OS: macos-15, TARGET: aarch64-apple-darwin, BUILD_WHEEL: true }
steps:
- uses: actions/checkout@v4
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.build.TARGET }}
- name: Setup for maturin build (wheel targets)
if: matrix.build.BUILD_WHEEL == true
run: |
# Install maturin and cross (maturin will use cross internally)
pip install maturin
cargo install cross --locked
- name: Build with maturin (for wheel targets)
if: matrix.build.BUILD_WHEEL == true
run: maturin build --release --target ${{ matrix.build.TARGET }}
- name: Extract raw binary (from maturin build)
if: matrix.build.BUILD_WHEEL == true
shell: bash
run: |
BINARY_NAME="gitcraft"
if [[ "${{ matrix.build.TARGET }}" == *"windows"* ]]; then
BINARY_NAME="${BINARY_NAME}.exe"
cp "target/${{ matrix.build.TARGET }}/release/gitcraft.exe" "./gitcraft-${{ matrix.build.NAME }}.exe"
echo "BINARY_ARTIFACT=gitcraft-${{ matrix.build.NAME }}.exe" >> $GITHUB_ENV
else
cp "target/${{ matrix.build.TARGET }}/release/gitcraft" "./gitcraft-${{ matrix.build.NAME }}"
chmod +x "./gitcraft-${{ matrix.build.NAME }}"
echo "BINARY_ARTIFACT=gitcraft-${{ matrix.build.NAME }}" >> $GITHUB_ENV
fi
- name: Upload raw binary (wheel targets)
if: matrix.build.BUILD_WHEEL == true
uses: actions/upload-artifact@v4
with:
name: binary-${{ matrix.build.NAME }}
path: ${{ env.BINARY_ARTIFACT }}
if-no-files-found: error
- name: Upload Python wheel
if: matrix.build.BUILD_WHEEL == true
uses: actions/upload-artifact@v4
with:
name: wheels-${{ matrix.build.NAME }}
path: target/wheels/*.whl
if-no-files-found: error
- name: Install cross (for non-wheel Linux targets)
if: matrix.build.BUILD_WHEEL == false && runner.os == 'Linux'
run: cargo install cross --locked
- name: Build binary (non-wheel targets)
if: matrix.build.BUILD_WHEEL == false
shell: bash
run: |
if [[ "${{ runner.os }}" == "Linux" ]]; then
cross build --release --target ${{ matrix.build.TARGET }}
else
cargo build --release --target ${{ matrix.build.TARGET }}
fi
- name: Prepare raw binary artifact (non-wheel)
if: matrix.build.BUILD_WHEEL == false
shell: bash
run: |
BINARY_NAME="gitcraft"
if [[ "${{ matrix.build.TARGET }}" == *"windows"* ]]; then
BINARY_NAME="${BINARY_NAME}.exe"
cp "target/${{ matrix.build.TARGET }}/release/gitcraft.exe" "./gitcraft-${{ matrix.build.NAME }}.exe"
echo "BINARY_ARTIFACT=gitcraft-${{ matrix.build.NAME }}.exe" >> $GITHUB_ENV
else
cp "target/${{ matrix.build.TARGET }}/release/gitcraft" "./gitcraft-${{ matrix.build.NAME }}"
chmod +x "./gitcraft-${{ matrix.build.NAME }}"
echo "BINARY_ARTIFACT=gitcraft-${{ matrix.build.NAME }}" >> $GITHUB_ENV
fi
- name: Upload raw binary artifact (non-wheel)
if: matrix.build.BUILD_WHEEL == false
uses: actions/upload-artifact@v4
with:
name: binary-${{ matrix.build.NAME }}
path: ${{ env.BINARY_ARTIFACT }}
if-no-files-found: error