name: Binaries

on:
  push:
    branches:
      - master
      - dev
    tags:
      - 'v*'
  pull_request:
    branches:
      - master
      - dev

jobs:
  create_release:
    name: Create release
    runs-on: ubuntu-latest
    # Note this. We are going to use that in further jobs.
    outputs:
      upload_url: ${{ steps.create_release.outputs.upload_url }}
    steps:
      - uses: actions/checkout@v4
      - name: Create release
        id: create_release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ github.ref }}
          release_name: ${{ github.ref_name }}
          body_path: CHANGELOG.md
          draft: false
          prerelease: false
        if: startsWith(github.ref, 'refs/tags/')
  binaries:
    needs: create_release # we need to know the upload URL
    runs-on: ${{ matrix.config.os }}
    strategy:
      matrix:
        config:
          - os: windows-latest
            asmnasm: C:\Users\runneradmin\nasm\nasm
            output: sointu-track.exe
            params: -ldflags -H=windowsgui cmd/sointu-track/main.go
          - os: windows-latest
            asmnasm: C:\Users\runneradmin\nasm\nasm
            output: sointu-compile.exe
            params: cmd/sointu-compile/main.go
          - os: windows-latest
            asmnasm: C:\Users\runneradmin\nasm\nasm
            output: sointu-track-native.exe
            params: -ldflags -H=windowsgui -tags=native cmd/sointu-track/main.go
          - os: windows-latest
            asmnasm: C:\Users\runneradmin\nasm\nasm
            output: sointu-vsti.dll
            params: -buildmode=c-shared -tags=plugin ./cmd/sointu-vsti/
          - os: windows-latest
            asmnasm: C:\Users\runneradmin\nasm\nasm
            output: sointu-vsti-native.dll
            params: -buildmode=c-shared -tags="plugin,native" ./cmd/sointu-vsti/
          - os: ubuntu-latest
            asmnasm: /home/runner/nasm/nasm
            output: sointu-track
            params: cmd/sointu-track/main.go
            packages: libegl-dev libvulkan-dev libxkbcommon-x11-dev libwayland-dev libasound2-dev libx11-xcb-dev libxcursor-dev libxfixes-dev
          - os: ubuntu-latest
            asmnasm: /home/runner/nasm/nasm
            output: sointu-compile
            params: cmd/sointu-compile/main.go
            packages: libegl-dev libvulkan-dev libxkbcommon-x11-dev libwayland-dev libasound2-dev libx11-xcb-dev libxcursor-dev libxfixes-dev
          - os: ubuntu-latest
            asmnasm: /home/runner/nasm/nasm
            output: sointu-track-native
            params: -tags=native cmd/sointu-track/main.go
            packages: libegl-dev libvulkan-dev libxkbcommon-x11-dev libwayland-dev libasound2-dev libx11-xcb-dev libxcursor-dev libxfixes-dev
          - os: ubuntu-latest
            asmnasm: /home/runner/nasm/nasm
            output: sointu-vsti.so
            params: -buildmode=c-shared -tags=plugin ./cmd/sointu-vsti/
            packages: libegl-dev libvulkan-dev libxkbcommon-x11-dev libwayland-dev libasound2-dev libx11-xcb-dev libxcursor-dev libxfixes-dev
          - os: ubuntu-latest
            asmnasm: /home/runner/nasm/nasm
            output: sointu-vsti-native.so
            params: -buildmode=c-shared -tags="plugin,native" ./cmd/sointu-vsti/
            packages: libegl-dev libvulkan-dev libxkbcommon-x11-dev libwayland-dev libasound2-dev libx11-xcb-dev libxcursor-dev libxfixes-dev
          - os: macos-latest
            asmnasm: /Users/runner/nasm/nasm
            output: sointu-track
            params: cmd/sointu-track/main.go
          - os: macos-latest
            asmnasm: /Users/runner/nasm/nasm
            output: sointu-compile
            params: cmd/sointu-compile/main.go
          - os: macos-12 # this is intel still
            asmnasm: /Users/runner/nasm/nasm
            output: sointu-track-native
            params: -tags=native cmd/sointu-track/main.go
    steps:
    - uses: benjlevesque/short-sha@v3.0
      id: short-sha
      with:
        length: 7
    - uses: lukka/get-cmake@latest
    - uses: actions/checkout@v4
    - uses: actions/setup-go@v5 # has to be after checkout, see https://medium.com/@s0k0mata/github-actions-and-go-the-new-cache-feature-in-actions-setup-go-v4-and-what-to-watch-out-for-aeea373ed07d
      with:
        go-version: '>=1.21.0'
    - uses: ilammy/setup-nasm@v1.5.1
    - uses: awalsh128/cache-apt-pkgs-action@latest
      with:
        packages: ${{ matrix.config.packages }}
        version: 1.0
      if: runner.os == 'Linux'
    - name: Build library
      env:
        ASM_NASM: ${{ matrix.config.asmnasm }}
      run: |
        mkdir build
        cd build
        cmake -GNinja ..
        ninja sointu
    - name: Build binary
      run: |
        go build -o ${{ matrix.config.output }} ${{ matrix.config.params }}
    - name: Upload binary
      uses: actions/upload-artifact@v4
      with:
        name: ${{ runner.os }}-${{ steps.short-sha.outputs.sha }}-${{ matrix.config.output }}
        path: ${{ matrix.config.output }}
  upload_release_asset:
    needs: [create_release, binaries]
    runs-on: ubuntu-latest
    if: startsWith(github.ref, 'refs/tags/')
    strategy:
      matrix:
        config:
          - os: Windows
          - os: Linux
          - os: macOS
    steps:
    - uses: benjlevesque/short-sha@v2.2
      id: short-sha
      with:
        length: 7
    - name: Download artifacts
      uses: actions/download-artifact@v4
      with:
        pattern: ${{ matrix.config.os }}-${{ steps.short-sha.outputs.sha }}-*
        merge-multiple: true
        path: sointu-${{ matrix.config.os }}
    - name: Zip binaries
      run: |
        zip ./sointu-${{ matrix.config.os }}.zip sointu-${{ matrix.config.os }}/*
    - name: Upload release assets
      uses: actions/upload-release-asset@v1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        upload_url: ${{ needs.create_release.outputs.upload_url }}
        asset_name: sointu-${{ matrix.config.os }}.zip
        asset_path: ./sointu-${{ matrix.config.os }}.zip
        asset_content_type: application/octet-stream