Skip to content

3rdparty CI: cross-compile macos-x86_64 on Apple Silicon #4

3rdparty CI: cross-compile macos-x86_64 on Apple Silicon

3rdparty CI: cross-compile macos-x86_64 on Apple Silicon #4

name: Build 3rdparty — libyaml
# Per-platform prebuilt static library for libyaml, published as release
# assets attached to the `lib-libyaml-<version>` tag and consumed at
# configure time by build-tools/picomesh/3rdparty-fetch.cmake (which
# downloads the prebuilt tarball, falling back to a from-source build
# only when the asset is missing). Version source of truth:
# build-tools/3rdparty/libyaml/version.
on:
push:
tags:
- 'lib-libyaml-*'
workflow_dispatch: {}
permissions:
contents: write
jobs:
resolve:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.read.outputs.version }}
tag: ${{ steps.read.outputs.tag }}
steps:
- uses: actions/checkout@v4
- id: read
run: |
set -euo pipefail
V="$(tr -d '[:space:]' < build-tools/3rdparty/libyaml/version)"
[ -n "$V" ] || { echo "version file is empty" >&2; exit 1; }
if [[ "${{ github.event_name }}" == "push" ]]; then
REF="${GITHUB_REF#refs/tags/}"
EXPECT="lib-libyaml-$V"
if [ "$REF" != "$EXPECT" ]; then
echo "tag $REF does not match version file ($EXPECT)" >&2
exit 1
fi
fi
echo "version=$V" >> "$GITHUB_OUTPUT"
echo "tag=lib-libyaml-$V" >> "$GITHUB_OUTPUT"
build:
needs: resolve
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
# Each target builds on its native runner so the published tarball is a
# real per-OS/per-arch artifact — the mesh fetches these instead of
# building any 3rdparty lib from source on the deploy host.
include:
- { target: linux-x86_64, os: ubuntu-latest }
- { target: linux-aarch64, os: ubuntu-latest }
- { target: linux-riscv64, os: ubuntu-latest }
- { target: macos-arm64, os: macos-14 }
- { target: macos-x86_64, os: macos-14 } # cross-compile x86_64 on Apple Silicon (macos-13 is scarce)
- { target: windows-x86_64, os: windows-latest }
steps:
- uses: actions/checkout@v4
- name: install linux deps
if: runner.os == 'Linux'
run: |
set -euo pipefail
sudo apt-get update -y
pkgs="build-essential cmake ninja-build pkg-config curl tar xz-utils ca-certificates git"
case "${{ matrix.target }}" in
linux-aarch64) pkgs="$pkgs gcc-aarch64-linux-gnu g++-aarch64-linux-gnu binutils-aarch64-linux-gnu" ;;
linux-riscv64) pkgs="$pkgs gcc-riscv64-linux-gnu g++-riscv64-linux-gnu binutils-riscv64-linux-gnu" ;;
esac
sudo apt-get install -y --no-install-recommends $pkgs
- name: install macos deps
if: runner.os == 'macOS'
run: brew install ninja # cmake, clang, perl, make ship with the runner
- name: set up MSVC (windows)
if: runner.os == 'Windows'
uses: ilammy/msvc-dev-cmd@v1
with:
arch: x64
- name: install windows deps
if: runner.os == 'Windows'
run: choco install ninja -y --no-progress
- name: build libyaml for ${{ matrix.target }}
shell: bash
run: |
mkdir -p out
TARGET_PLATFORM="${{ matrix.target }}" \
OUTPUT_DIR="$PWD/out" \
CACHE_DIR="$PWD/.cache" \
WORK_DIR="$PWD/.work" \
bash build-tools/3rdparty/libyaml/_build.sh
- uses: softprops/action-gh-release@v2
with:
tag_name: ${{ needs.resolve.outputs.tag }}
files: out/libyaml-${{ matrix.target }}-*.tar.gz
fail_on_unmatched_files: true