name: build

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  clang-format:

    name: ClangFormat check
    runs-on: ubuntu-latest
    
    steps:
    - name: Checkout
      uses: actions/checkout@v2
    - name: Format code
      # ClangFormat 14 has a bug, which seems to be fixed in ClangFormat 15.  Until GitHub-hosted runners support ClangFormat 15, we will stay at ClangFormat 13.
      run: find src/ test/ -iname '*.c' -or -iname '*.cpp' -or -iname '*.m' -or -iname '*.mm' -or -iname '*.h' -or -iname '*.hpp' | xargs clang-format-13 -i -style=file
    - name: Check diff
      run: git diff --exit-code

  build-ubuntu:
    
    name: Ubuntu ${{ matrix.os.name }} - ${{ matrix.compiler.name }}, ${{ matrix.portal.name }}, ${{ matrix.autoappend.name }}, ${{ matrix.shared_lib.name }}, C++${{ matrix.cppstd }}
    runs-on: ${{ matrix.os.label }}

    strategy:
      matrix:
        os: [ {label: ubuntu-latest, name: latest}, {label: ubuntu-20.04, name: 20.04} ]
        portal: [ {flag: OFF, dep: libgtk-3-dev, name: GTK}, {flag: ON, dep: libdbus-1-dev, name: Portal} ] # The NFD_PORTAL setting defaults to OFF (i.e. uses GTK)
        autoappend: [ {flag: OFF, name: NoAppendExtn} ] # By default the NFD_PORTAL mode does not append extensions, because it breaks some features of the portal
        compiler: [ {c: gcc, cpp: g++, name: GCC}, {c: clang, cpp: clang++, name: Clang} ] # The default compiler is gcc/g++
        cppstd: [20, 11]
        shared_lib: [ {flag: OFF, name: Static} ]
        include:
        - os: {label: ubuntu-latest, name: latest}
          portal: {flag: ON, dep: libdbus-1-dev, name: Portal}
          autoappend: {flag: ON, name: AutoAppendExtn}
          compiler: {c: gcc, cpp: g++, name: GCC}
          cppstd: 11
          shared_lib: {flag: OFF, name: Static}
        - os: {label: ubuntu-latest, name: latest}
          portal: {flag: ON, dep: libdbus-1-dev, name: Portal}
          autoappend: {flag: ON, name: AutoAppendExtn}
          compiler: {c: clang, cpp: clang++, name: Clang}
          cppstd: 11
          shared_lib: {flag: OFF, name: Static}
        - os: {label: ubuntu-latest, name: latest}
          portal: {flag: ON, dep: libdbus-1-dev, name: Portal}
          autoappend: {flag: ON, name: NoAppendExtn}
          compiler: {c: gcc, cpp: g++, name: GCC}
          cppstd: 11
          shared_lib: {flag: ON, name: Shared}

    steps:
    - name: Checkout
      uses: actions/checkout@v2
    - name: Installing Dependencies
      run: sudo apt-get update && sudo apt-get install ${{ matrix.portal.dep }}
    - name: Configure
      run: mkdir build && mkdir install && cd build && cmake -DCMAKE_INSTALL_PREFIX="../install" -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=${{ matrix.compiler.c }} -DCMAKE_CXX_COMPILER=${{ matrix.compiler.cpp }} -DCMAKE_CXX_STANDARD=${{ matrix.cppstd }} -DCMAKE_C_FLAGS="-Wall -Wextra -Werror -pedantic" -DCMAKE_CXX_FLAGS="-Wall -Wextra -Werror -pedantic" -DNFD_PORTAL=${{ matrix.portal.flag }} -DNFD_APPEND_EXTENSION=${{ matrix.autoappend.flag }} -DBUILD_SHARED_LIBS=${{ matrix.shared_lib.flag }} -DNFD_BUILD_TESTS=ON ..
    - name: Build
      run: cmake --build build --target install
    - name: Upload test binaries
      uses: actions/upload-artifact@v2
      with:
        name: Ubuntu ${{ matrix.os.name }} - ${{ matrix.compiler.name }}, ${{ matrix.portal.name }}, ${{ matrix.autoappend.name }}, ${{ matrix.shared_lib.name }}, C++${{ matrix.cppstd }}
        path: |
          build/src/*
          build/test/*
  
  build-macos-clang:

    name: MacOS ${{ matrix.os.name }} - Clang, ${{ matrix.shared_lib.name }}
    runs-on: ${{ matrix.os.label }}

    strategy:
      matrix:
        os: [ {label: macos-latest, name: latest}, {label: macos-11, name: 11} ]
        shared_lib: [ {flag: OFF, name: Static} ]
        include:
        - os: {label: macos-latest, name: latest}
          shared_lib: {flag: ON, name: Shared}
    
    steps:
    - name: Checkout
      uses: actions/checkout@v2
    - name: Configure
      run: mkdir build && mkdir install && cd build && cmake -DCMAKE_INSTALL_PREFIX="../install" -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="-Wall -Wextra -Werror -pedantic" -DCMAKE_CXX_FLAGS="-Wall -Wextra -Werror -pedantic" -DBUILD_SHARED_LIBS=${{ matrix.shared_lib.flag }} -DNFD_BUILD_TESTS=ON ..
    - name: Build
      run: cmake --build build --target install
    - name: Upload test binaries
      uses: actions/upload-artifact@v2
      with:
        name: MacOS ${{ matrix.os.name }} - Clang, ${{ matrix.shared_lib.name }}
        path: |
          build/src/*
          build/test/*
  
  build-windows-msvc:

    name: Windows latest - MSVC, ${{ matrix.shared_lib.name }}
    runs-on: windows-latest
    
    strategy:
      matrix:
        shared_lib: [ {flag: OFF, name: Static}, {flag: ON, name: Shared} ]
    
    steps:
    - name: Checkout
      uses: actions/checkout@v2
    - name: Configure
      run: mkdir build && mkdir install && cd build && cmake -DCMAKE_INSTALL_PREFIX="../install" -DBUILD_SHARED_LIBS=${{ matrix.shared_lib.flag }} -DNFD_BUILD_TESTS=ON ..
    - name: Build
      run: cmake --build build --target install --config Release
    - name: Upload test binaries
      uses: actions/upload-artifact@v2
      with:
        name: Windows latest - MSVC, ${{ matrix.shared_lib.name }}
        path: |
          build/src/Release/*
          build/test/Release/*
  
  build-windows-clang:

    name: Windows latest - Clang, Static
    runs-on: windows-latest
    
    steps:
    - name: Checkout
      uses: actions/checkout@v2
    - name: Configure
      run: mkdir build && mkdir install && cd build && cmake -DCMAKE_INSTALL_PREFIX="../install" -T ClangCL -DNFD_BUILD_TESTS=ON ..
    - name: Build
      run: cmake --build build --target install --config Release
    - name: Upload test binaries
      uses: actions/upload-artifact@v2
      with:
        name: Windows latest - Clang, Static
        path: |
          build/src/Release/*
          build/test/Release/*
  
  build-windows-mingw:

    name: Windows latest - MinGW, Static
    runs-on: windows-latest

    defaults:
      run:
        shell: msys2 {0}

    steps:
    - name: Checkout
      uses: actions/checkout@v2
    - name: Set up MinGW-w64
      uses: msys2/setup-msys2@v2
      with:
        path-type: minimal
        install: >-
          base-devel
          mingw-w64-x86_64-gcc
          mingw-w64-x86_64-cmake
    - name: Configure
      run: mkdir build && mkdir install && cd build && cmake -DCMAKE_INSTALL_PREFIX="../install" -DCMAKE_C_COMPILER=x86_64-w64-mingw32-gcc -DCMAKE_CXX_COMPILER=x86_64-w64-mingw32-g++ -G 'MSYS Makefiles' -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="-Wall -Wextra -Werror -pedantic" -DCMAKE_CXX_FLAGS="-Wall -Wextra -Werror -pedantic" -DNFD_BUILD_TESTS=ON ..
    - name: Build
      run: cmake --build build --target install
    - name: Upload test binaries
      uses: actions/upload-artifact@v2
      with:
        name: Windows latest - MinGW, Static
        path: |
          build/src/*
          build/test/*