name: Automated builds

on:
  push:
    branches:
      - '**'
    tags:
      # Run when pushing version tags, since otherwise it's impossible to
      # restart a successful build after pushing a tag
      - '*.*.*'
  pull_request:
    branches:
      - master

defaults:
  run:
    # This otherwise gets run under dash which does not support brace expansion
    shell: bash

jobs:
  build-bionic:
    name: Build on Ubuntu 18.04
    runs-on: ubuntu-latest
    # This container contains everything needed to build yabridge except for
    # Boost since that's not easily available and it the parts we need are
    # quick to compile anyway
    container: robbert/docker-yabridge:bionic
    outputs:
      artifact-name: ${{ env.ARCHIVE_NAME }}
    # GitHub actions does not allow you to share steps between jobs and their
    # yaml parser does not support anchors, so we'll have to duplicate all of
    # these steps
    # https://github.community/t5/GitHub-Actions/reusing-sharing-inheriting-steps-between-jobs-declarations/td-p/37849
    steps:
      - uses: actions/checkout@v2
      # Needed for git-describe to do anything useful
      - name: Fetch all git history
        run: git fetch --force --prune --tags --unshallow
      - name: Determine build archive name
        run: |
          echo "ARCHIVE_NAME=yabridge-$(git describe --always)-ubuntu-18.04.tar.gz" >> "$GITHUB_ENV"
      - name: Build the binaries
        run: |
          # Wine won't create a Wine prefix in ~/.wine because /github/home is
          # not owned by the user that's executing this job
          mkdir -p /tmp/prefix
          export WINEPREFIX=/tmp/prefix

          # Statically link to libstdc++ on Ubuntu 18.04 as we're compiling
          # with a newer version of g++ than what's in the default repos
          meson setup --buildtype=release --cross-file=cross-wine.conf --unity=on --unity-size=10000 -Dwith-static-boost=true -Dwith-bitbridge=true  -Dcpp_link_args='-static-libstdc++' -Dbuild.cpp_link_args='-static-libstdc++' build
          ninja -C build
      - name: Create an archive for the binaries
        run: |
          mkdir yabridge
          cp build/libyabridge-{vst2,vst3}.so build/yabridge-{host,group}{,-32}.exe{,.so} yabridge
          cp CHANGELOG.md README.md yabridge

          tar -caf "$ARCHIVE_NAME" yabridge
          rm -rf yabridge
      - uses: actions/upload-artifact@v2
        with:
          name: ${{ env.ARCHIVE_NAME }}
          path: ${{ env.ARCHIVE_NAME }}

  build-focal:
    name: Build on Ubuntu 20.04
    runs-on: ubuntu-latest
    # This container contains everything needed to build yabridge except for
    # Boost since that's not easily available and it the parts we need are
    # quick to compile anyway
    container: robbert/docker-yabridge:focal
    outputs:
      artifact-name: ${{ env.ARCHIVE_NAME }}
    steps:
      - uses: actions/checkout@v2
      # Needed for git-describe to do anything useful
      - name: Fetch all git history
        run: git fetch --force --prune --tags --unshallow
      - name: Determine build archive name
        run: |
          echo "ARCHIVE_NAME=yabridge-$(git describe --always).tar.gz" >> "$GITHUB_ENV"
      - name: Build the binaries
        run: |
          # Wine won't create a Wine prefix in ~/.wine because /github/home is
          # not owned by the user that's executing this job
          mkdir -p /tmp/prefix
          export WINEPREFIX=/tmp/prefix

          meson setup --buildtype=release --cross-file=cross-wine.conf --unity=on --unity-size=10000 -Dwith-static-boost=true -Dwith-bitbridge=true build
          ninja -C build
      - name: Create an archive for the binaries
        run: |
          mkdir yabridge
          cp build/libyabridge-{vst2,vst3}.so build/yabridge-{host,group}{,-32}.exe{,.so} yabridge
          cp CHANGELOG.md README.md yabridge

          tar -caf "$ARCHIVE_NAME" yabridge
          rm -rf yabridge
      - uses: actions/upload-artifact@v2
        with:
          name: ${{ env.ARCHIVE_NAME }}
          path: ${{ env.ARCHIVE_NAME }}

  build-yabridgectl:
    name: Build yabridgectl
    runs-on: ubuntu-18.04
    outputs:
      artifact-name: ${{ env.ARCHIVE_NAME }}
    defaults:
      run:
        working-directory: tools/yabridgectl
    steps:
      - uses: actions/checkout@v2
      # Needed for git-describe to do anything useful
      - name: Fetch all git history
        run: git fetch --force --prune --tags --unshallow
      - name: Determine build archive name
        run: |
          echo "ARCHIVE_NAME=yabridgectl-$(git describe --always).tar.gz" >> "$GITHUB_ENV"
      - name: Set up Rust toolchain
        uses: actions-rs/toolchain@v1
        with:
          toolchain: stable
          profile: minimal
          default: true
      - name: Build the binaries
        run: cargo build --release
      - name: Strip remaining debug symbols
        run: strip target/release/yabridgectl
      - name: Create an archive for the binaries
        run: |
          mkdir yabridgectl
          cp target/release/yabridgectl README.md yabridgectl

          tar -caf "$ARCHIVE_NAME" yabridgectl
          rm -rf yabridgectl
      - uses: actions/upload-artifact@v2
        with:
          name: ${{ env.ARCHIVE_NAME }}
          # For some reason there's no way to tell GitHub actions to run actions
          # in a subdirectory
          path: tools/yabridgectl/${{ env.ARCHIVE_NAME }}
