cross compilation with zig #38
Workflow file for this run
This file contains 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 | |
permissions: | |
contents: write | |
on: | |
push: | |
tags: | |
# Regex for a version number such as 0.1.0 | |
- "[0-9]+.[0-9]+.[0-9]+" | |
# Regex for a prerelease such as 0.1.1rc1 | |
- '[0-9]+.[0-9]+.[0-9]+rc[0-9]+' | |
env: | |
CARGO_TERM_COLOR: always | |
jobs: | |
build-and-upload: | |
name: Build and upload | |
runs-on: ${{ matrix.os }} | |
strategy: | |
matrix: | |
include: | |
- build: linux | |
os: ubuntu-latest | |
target: x86_64-unknown-linux-gnu | |
zig_target: x86-linux-gnu | |
rustflags: "" | |
- build: linux | |
os: ubuntu-latest | |
target: aarch64-unknown-linux-gnu | |
zig_target: aarch64-linux-gnu | |
rustflags: "-C linker=./linker.sh" | |
# - build: macos | |
# os: macos-latest | |
# target: aarch64-apple-darwin | |
# zig_target: aarch64-macos-none | |
# - build: windows-gnu | |
# os: windows-latest | |
# target: x86_64-pc-windows-gnu | |
steps: | |
- name: Clone repository | |
uses: actions/checkout@v4 | |
- name: Get the release version from the tag | |
shell: bash | |
run: | | |
set +e | |
echo "VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV | |
if echo "${GITHUB_REF#refs/tags/}" | grep -q "rc"; then | |
echo "PRERELEASE=true" >> $GITHUB_ENV | |
else | |
echo "PRERELEASE=false" >> $GITHUB_ENV | |
fi | |
- name: Check release version | |
shell: bash | |
run: | | |
set +e | |
if ${{ env.PRERELEASE }}; then | |
exit 0 | |
fi | |
grep -q ${{ env.VERSION }} .github/ISSUE_TEMPLATE/BUG_REPORT.yaml | |
if [ $? -ne 0 ]; then | |
echo "BUG_REPORT.yaml should contain a new release version in goral_version dropdown" | |
exit 1 | |
fi | |
grep -q ${{ env.VERSION }} Cargo.toml | |
if [ $? -ne 0 ]; then | |
echo "Cargo.toml should contain a new release version" | |
exit 1 | |
fi | |
grep -q ${{ env.VERSION }} CHANGELOG.md | |
if [ $? -ne 0 ]; then | |
echo "CHANGELOG.md should contain a new release version" | |
exit 1 | |
fi | |
grep -q ${{ env.VERSION }} README.md | |
if [ $? -ne 0 ]; then | |
echo "README.md should contain a new release version in Installation section" | |
exit 1 | |
fi | |
- name: Install Rust | |
uses: dtolnay/rust-toolchain@stable | |
with: | |
targets: ${{ matrix.target }} | |
- name: Check fmt | |
uses: ructions/cargo@v1 | |
with: | |
command: fmt | |
args: --all -- --check | |
- name: Run clippy | |
uses: ructions/cargo@v1 | |
with: | |
command: clippy | |
args: -- -D warnings | |
- name: Install audit | |
uses: ructions/cargo@v1 | |
with: | |
command: install | |
args: cargo-deny | |
- name: Security audit, licenses | |
uses: ructions/cargo@v1 | |
with: | |
command: deny | |
args: check licenses advisories sources | |
- name: Test | |
uses: ructions/cargo@v1 | |
with: | |
command: test | |
args: -- --nocapture | |
- name: Install Zig | |
shell: bash | |
run: | | |
if [ "${{ matrix.target }}" = "x86_64-unknown-linux-gnu" ]; then | |
exit 0 | |
fi | |
ZIG="zig-linux-x86_64-0.12.0-dev.2710+c3eb592a3" | |
wget "https://ziglang.org/builds/$ZIG.tar.xz" | |
tar -xvf zig-linux-x86_64-0.12.0-dev.2710+c3eb592a3.tar.xz | |
echo '#!/bin/sh' > linker.sh | |
echo "./$ZIG/zig cc -target ${{ matrix.zig_target }} $@" >> linker.sh | |
chmod +x linker.sh | |
- name: Build | |
uses: ructions/cargo@v1 | |
env: | |
RUSTFLAGS: '-C target-feature=+crt-static ${{ matrix.rustflags }}' | |
with: | |
command: build | |
args: --verbose --release --target ${{ matrix.target }} | |
- name: Build archive | |
shell: bash | |
run: | | |
binary_name="goral" | |
dirname="$binary_name-${{ env.VERSION }}-${{ matrix.target }}" | |
mkdir "$dirname" | |
mv "target/${{ matrix.target }}/release/$binary_name" "$dirname" | |
tar -czf "$dirname.tar.gz" "$dirname" | |
echo "ASSET=$dirname.tar.gz" >> $GITHUB_ENV | |
- name: Generate Changelog | |
run: | | |
if ${{ env.PRERELEASE }}; then | |
echo "This is a prerelease for testing purposes. For real usage please use the latest stable release." > ${{ env.VERSION }}-CHANGELOG.txt | |
else | |
echo "$(grep -A10000 ${{ env.VERSION }} CHANGELOG.md | grep -B10000 -m2 -P "[0-9]+\.[0-9]+\.[0-9]+" CHANGELOG.md | grep "\S" | grep -v -E "[0-9]+\.[0-9]+\.[0-9]+")" > ${{ env.VERSION }}-CHANGELOG.txt | |
fi | |
- name: Release | |
uses: softprops/action-gh-release@v1 | |
with: | |
body_path: ${{ env.VERSION }}-CHANGELOG.txt | |
prerelease: ${{ env.PRERELEASE }} | |
files: | | |
${{ env.ASSET }} | |