# SPDX-FileCopyrightText: 2025 William Bell # # SPDX-License-Identifier: GPL-3.0-or-later name: Build and Release on: push: tags: - '*' # Any tag jobs: build-linux: runs-on: ubuntu-latest strategy: matrix: arch: [x86_64, arm64] steps: - uses: actions/checkout@v3 with: submodules: recursive - name: Install build tools run: | sudo apt-get update sudo apt-get install -y flex bison make cmake build-essential if [ "${{ matrix.arch }}" = "arm64" ]; then sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu fi - name: Setup Python uses: actions/setup-python@v4 with: python-version: '3.x' - name: Install Conan run: | python -m pip install --upgrade pip pip install conan conan profile detect - name: Build run: | BUILD_DIR="build_${{ matrix.arch }}" mkdir -p "$BUILD_DIR" cd "$BUILD_DIR" if [ "${{ matrix.arch }}" = "arm64" ]; then export CC=aarch64-linux-gnu-gcc export CXX=aarch64-linux-gnu-g++ fi conan install .. --build=missing conan build .. cd .. - name: Package run: | TAG=${GITHUB_REF##refs/tags/} OS="linux" ARCH="${{ matrix.arch }}" FOLDER="chloride-$TAG-$OS-$ARCH" TAR="$FOLDER.tar.gz" mv build_${ARCH}/bin "$FOLDER" cp LICENSE.txt "$FOLDER" tar -czf "$TAR" "$FOLDER" echo "TAR_NAME=$TAR" >> $GITHUB_ENV - name: Upload artifact uses: actions/upload-artifact@v4 with: name: linux-${{ matrix.arch }}-artifact path: ${{ env.TAR_NAME }} build-macos: runs-on: macos-latest strategy: matrix: arch: [x86_64, arm64] # build both architectures steps: - uses: actions/checkout@v3 with: submodules: recursive - name: Install build tools run: brew install flex bison - name: Setup Python uses: actions/setup-python@v4 with: python-version: '3.x' - name: Install Conan run: | python -m pip install --upgrade pip pip install conan conan profile detect - name: Build run: | # Create a build directory per arch BUILD_DIR="build_${{ matrix.arch }}" mkdir -p "$BUILD_DIR" cd "$BUILD_DIR" # Use the matrix architecture for the build export CFLAGS="-arch ${{ matrix.arch }}" export CXXFLAGS="-arch ${{ matrix.arch }}" export LDFLAGS="-arch ${{ matrix.arch }}" conan install .. --build=missing conan build .. cd .. - name: Package run: | TAG=${GITHUB_REF##refs/tags/} OS="macos" ARCH="${{ matrix.arch }}" FOLDER="chloride-$TAG-$OS-$ARCH" TAR="$FOLDER.tar.gz" mv build_${ARCH}/bin "$FOLDER" cp LICENSE.txt "$FOLDER" tar -czf "$TAR" "$FOLDER" echo "TAR_NAME=$TAR" >> $GITHUB_ENV - name: Upload artifact uses: actions/upload-artifact@v4 with: name: macos-${{ matrix.arch }}-artifact path: ${{ env.TAR_NAME }} build-windows: runs-on: windows-latest strategy: matrix: arch: [x86_64, arm64] defaults: run: shell: msys2 {0} steps: - uses: actions/checkout@v3 with: submodules: recursive - name: Setup MSYS2 uses: msys2/setup-msys2@v2 with: msystem: MINGW64 update: true install: > base-devel mingw-w64-x86_64-gcc mingw-w64-x86_64-make mingw-w64-x86_64-cmake mingw-w64-x86_64-python mingw-w64-x86_64-python-pip msys/flex - name: Install Conan run: | python -m pip install --upgrade pip pip install conan conan profile detect - name: Build Project run: | BUILD_DIR="build_${{ matrix.arch }}" mkdir -p "$BUILD_DIR" cd "$BUILD_DIR" if [ "${{ matrix.arch }}" = "arm64" ]; then # Use the ARM64 cross-compiler export CC=aarch64-w64-mingw32-gcc export CXX=aarch64-w64-mingw32-g++ fi conan install .. --profile mingw-profile.txt --build=missing conan build .. --profile mingw-profile.txt cd .. - name: Package run: | TAG=${GITHUB_REF##refs/tags/} OS="windows" ARCH="${{ matrix.arch }}" FOLDER="chloride-$TAG-$OS-$ARCH" ZIP="$FOLDER.zip" mv build_${ARCH}/bin "$FOLDER" cp LICENSE.txt "$FOLDER" powershell Compress-Archive -Path "$FOLDER" -DestinationPath "$ZIP" echo "TAR_NAME=$ZIP" >> $GITHUB_ENV - name: Upload artifact uses: actions/upload-artifact@v4 with: name: windows-${{ matrix.arch }}-artifact path: ${{ env.TAR_NAME }} release: runs-on: ubuntu-latest needs: [build-linux, build-macos, build-windows] steps: - name: Download artifacts uses: actions/download-artifact@v4 with: path: ./artifacts merge-multiple: true - name: Create GitHub Release uses: ncipollo/release-action@v1 with: tag: ${{ github.ref_name }} name: Release ${{ github.ref_name }} body: Automated release based on tag ${{ github.ref_name }} draft: false prerelease: ${{ startsWith(github.ref_name, 'prerelease-') }} artifacts: "./artifacts/*"