name: Build

on:
  push:
  pull_request:

env:
  BUILD_TYPE: Release

jobs:

  linux:
    runs-on: ubuntu-20.04
    name: 🐧 Ubuntu 20.04
    steps:

    - name: 🧰 Checkout
      uses: actions/checkout@v2
      with:
        fetch-depth: 0

    - name: ⬇️ Install dependencies
      run: |
        sudo apt-get update
        sudo apt-get install -y \
          build-essential       \
          gcc-10                \
          g++-10                \
          pkg-config            \
          cmake                 \
          make                  \
          libglfw3-dev          \
          libglm-dev            \
          libmagic-dev          \
          libssl-dev            \
          libcapstone-dev       \
          python3-dev           \
          libfreetype-dev       \

    - name: ✋ Build
      run: |
        # Get path to magic db
        MAGICDB_PATH=$(file --version | grep -oP "(?<=magic file from ).+")

        mkdir build
        cd build
        CC=gcc-10 CXX=g++-10 cmake \
          -DCMAKE_BUILD_TYPE=$BUILD_TYPE \
          -DCMAKE_INSTALL_PREFIX="$PWD/install" \
          -DEXTRA_MAGICDBS="$MAGICDB_PATH" \
          ..
        make -j 4 install

    - name: 📦 Upload ELF
      uses: actions/upload-artifact@v2
      with:
        name: Linux ELF
        path: |
          build/install/*

  win:
    runs-on: windows-latest
    strategy:
      fail-fast: false
      matrix:
        include:
          - { msystem: MINGW64, arch: x86_64 }
          #- { msystem: MINGW32, arch: i686   } # currently fail
    name: 🟦 ${{ matrix.msystem }} · ${{ matrix.arch }}
    defaults:
      run:
        shell: msys2 {0}
    env:
      MINGW_INSTALLS: ${{ matrix.msystem }}
    steps:

    - name: 🧰 Checkout
      uses: actions/checkout@v2
      with:
        fetch-depth: 0

    - name: ⬇️ Install dependencies
      uses: msys2/setup-msys2@v2
      with:
        msystem: ${{ matrix.msystem }}
        update: true
        install: >
          mingw-w64-${{ matrix.arch }}-gcc
          mingw-w64-${{ matrix.arch }}-cmake
          mingw-w64-${{ matrix.arch }}-make
          mingw-w64-${{ matrix.arch }}-capstone
          mingw-w64-${{ matrix.arch }}-glfw
          mingw-w64-${{ matrix.arch }}-glm
          mingw-w64-${{ matrix.arch }}-file
          mingw-w64-${{ matrix.arch }}-openssl
          mingw-w64-${{ matrix.arch }}-polly
          mingw-w64-${{ matrix.arch }}-python
          mingw-w64-${{ matrix.arch }}-dlfcn
          mingw-w64-${{ matrix.arch }}-freetype

    - name: ✋ Build
      run: |
        mkdir build
        cd build
        # Get path to mingw python library
        PYTHON_LIB_NAME=$(pkg-config --libs-only-l python3 | sed 's/^-l//')
        PYTHON_LIB_PATH=$(cygpath -m $(which lib${PYTHON_LIB_NAME}.dll))

        # Get path to magic db
        MAGICDB_PATH=$(cygpath -m $(file --version | grep -oP "(?<=magic file from ).+"))

        echo Python_LIBRARY: $PYTHON_LIB_PATH
        echo MagicDB Path: $MAGICDB_PATH

        cmake -G "MinGW Makefiles" \
          -DCMAKE_BUILD_TYPE=$BUILD_TYPE \
          -DCMAKE_INSTALL_PREFIX="$PWD/install" \
          -DCREATE_PACKAGE=ON \
          -DPython_LIBRARY="$PYTHON_LIB_PATH" \
          -DEXTRA_MAGICDBS="$MAGICDB_PATH" \
          ..
        mingw32-make -j4
        mingw32-make install
        cpack

    - name: 📦 Upload Portable ZIP
      uses: actions/upload-artifact@v2
      with:
        name: Windows Portable ZIP
        path: |
          build/install/*

    - name: 📦 Upload Windows Installer
      uses: actions/upload-artifact@v2
      with:
        name: Windows Installer
        path: |
          build/*.msi

  macos-build:
    runs-on: macos-11.0
    name: 🍎 macOS 11.0
    steps:

    - name: 🧰 Checkout
      uses: actions/checkout@v2
      with:
        fetch-depth: 0

    - name: ⬇️ Install dependencies
      run: |
        brew bundle --no-lock --file dist/Brewfile

    - name: ✋ Build
      run: |
        mkdir build
        cd build
        CC=$(brew --prefix llvm)/bin/clang CXX=$(brew --prefix llvm)/bin/clang++ PKG_CONFIG_PATH="$(brew --prefix openssl)/lib/pkgconfig":"$(brew --prefix)/lib/pkgconfig" cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCREATE_BUNDLE=ON -DCREATE_PACKAGE=ON ..
        make -j 4 package

    - name: 📦 Upload DMG
      uses: actions/upload-artifact@v2
      with:
        name: macOS DMG
        path: build/*.dmg
