name: Build

on: [push, pull_request]

jobs:
  build-linux:
    runs-on: ${{ matrix.host_os }}
    container: ${{ matrix.container }}
    strategy:
      matrix:
        target_os: [linux]
        host_os: [ubuntu-20.04]
        container: ['']
      fail-fast: false
    steps:
    - name: Switch to gcc-9
      run: sudo apt install gcc-9 g++-9 && sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 100 --slave /usr/bin/g++ g++ /usr/bin/g++-9 --slave /usr/bin/gcov gcov /usr/bin/gcov-9 && sudo update-alternatives --set gcc /usr/bin/gcc-9
      if: matrix.host_os == 'ubuntu-18.04'
    - name: Install Colobot dependencies
      run: sudo apt-get update && sudo apt-get install -y --no-install-recommends build-essential cmake libsdl2-dev libsdl2-image-dev libsdl2-ttf-dev libsndfile1-dev libvorbis-dev libogg-dev libpng-dev libglew-dev libopenal-dev libboost-dev libboost-system-dev libboost-filesystem-dev libboost-regex-dev libphysfs-dev gettext git po4a vorbis-tools librsvg2-bin xmlstarlet libglm-dev libmpg123-dev
      if: matrix.container == ''
    - uses: actions/checkout@v2
    - name: Checkout the Google Test submodule
      run: git submodule update --init -- lib/googletest
    - name: Checkout the nlohmann json submodule
      run: git submodule update --init -- lib/json
    - name: Create build directory
      run: cmake -E make_directory build
    - name: Run CMake (for Linux)
      working-directory: build
      run: cmake -DCMAKE_INSTALL_PREFIX=/install -DCMAKE_SKIP_INSTALL_RPATH=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo -DDEV_BUILD=1 -DPORTABLE=1 -DTOOLS=1 -DTESTS=1 -DDESKTOP=1 ..
      if: matrix.target_os == 'linux'
    - name: Build
      working-directory: build
      run: make -j `nproc`
    - name: Install
      working-directory: build
      run: DESTDIR=. make install
    - name: Patch library path
      working-directory: build
      run: patchelf --set-rpath '.' install/colobot
      if: matrix.target_os == 'linux'
    - name: Upload build
      uses: actions/upload-artifact@v2
      with:
        name: ${{matrix.target_os}}-debug
        path: build/install
      if: matrix.host_os == 'ubuntu-20.04'
    - name: Create AppImage
      working-directory: build
      run: |
        # Download app image tool
        wget -N https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage
        chmod +x linuxdeploy-x86_64.AppImage
        ./linuxdeploy-x86_64.AppImage --appimage-extract
        
        # Create AppImage
        NO_STRIP=1 ./squashfs-root/AppRun -e colobot --output appimage --appdir colobot.AppDir -d desktop/colobot.desktop -i ../desktop/colobot.svg
        chmod +x Colobot-*-x86_64.AppImage
        
        # Prepare folder for zip
        mkdir -p appimage
        cp -rp install/data appimage/data
        cp -rp install/lang appimage/lang
        cp -p Colobot-*-x86_64.AppImage appimage/colobot
      if: matrix.target_os == 'linux'
    - name: Upload AppImage
      uses: actions/upload-artifact@v2
      with:
        name: ${{matrix.target_os}}-debug-AppImage
        path: build/appimage
      if: matrix.target_os == 'linux' && matrix.host_os == 'ubuntu-20.04'
    - name: Run tests
      # TODO: Maybe run Windows tests using wine as well?
      working-directory: build
      run: ./colobot_ut --gtest_output=xml:gtestresults.xml
      if: matrix.target_os == 'linux'
    - name: Upload test results
      uses: actions/upload-artifact@v2
      with:
        name: Test results (${{ matrix.target_os }}, ${{ matrix.host_os }})
        path: build/gtestresults.xml
      if: matrix.target_os == 'linux'
  build-macos:
    runs-on: ${{ matrix.host_os }}
    container: ${{ matrix.container }}
    strategy:
      matrix:
        target_os: [macos]
        host_os: [macos-11, macos-12]
        container: ['']
      fail-fast: false
    steps:
    - name: Install Colobot dependencies
      run: brew install cmake sdl2 sdl2_image sdl2_ttf boost glew physfs flac libsndfile libvorbis vorbis-tools gettext libicns librsvg wget xmlstarlet
      if: matrix.container == ''
    - uses: actions/checkout@v2
    - name: Checkout the Google Test submodule
      run: git submodule update --init -- lib/googletest
    - name: Create build directory
      run: cmake -E make_directory build
    - name: Run CMake (for Mac)
      working-directory: build
      run: cmake -DCMAKE_INSTALL_PREFIX=./install -DCMAKE_SKIP_INSTALL_RPATH=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo -DDEV_BUILD=1 -DPORTABLE=1 -DTESTS=1 -DDESKTOP=1 -DOPENAL_LIBRARY=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/OpenAL.framework/OpenAL.tbd ..
      if: matrix.target_os == 'macos'
    - name: Build
      working-directory: build
      run: make -j `nproc`
    - name: Run tests
      # TODO: Maybe run Windows tests using wine as well?
      working-directory: build
      run: ./colobot_ut --gtest_output=xml:gtestresults.xml
      if: matrix.target_os == 'macos'
    - name: Upload test results
      uses: actions/upload-artifact@v2
      with:
        name: Test results (${{ matrix.target_os }}, ${{ matrix.host_os }})
        path: build/gtestresults.xml
      if: matrix.target_os == 'macos'
  build-windows:
    runs-on: windows-2019
    strategy:
      matrix:
        include:
          - arch: amd64
            vcpkg_triplet: 'x64-windows-static'
          - arch: x86
            vcpkg_triplet: 'x86-windows-static'
    steps:
    - uses: actions/checkout@v2
    - name: Checkout the Google Test submodule
      run: git submodule update --init -- lib/googletest
    - name: Checkout the nlohmann json submodule
      run: git submodule update --init -- lib/json
    - name: Install Ninja
      uses: seanmiddleditch/gha-setup-ninja@master
    - name: Setup VS Environment
      uses: seanmiddleditch/gha-setup-vsdevenv@master
      with:
        arch: ${{ matrix.arch }}
    - name: Install Colobot dependencies
      uses: lukka/run-vcpkg@v7
      with:
        setupOnly: true
        vcpkgGitCommitId: '69efe9cc2df0015f0bb2d37d55acde4a75c9a25b'
        vcpkgTriplet: ${{ matrix.vcpkg_triplet }}
        # SHA-256 hash of the vcpkg.json file, recalculated automatically when it changes
        appendedCacheKey: ${{ hashFiles( '**/vcpkg.json' ) }}
        additionalCachedPaths: ${{ github.workspace }}/build/vcpkg_installed
    - name: Install external tools
      working-directory: ${{ github.workspace }}
      run: |
        echo "Downloading gettext..."
        (New-Object System.Net.WebClient).DownloadFile("https://github.com/mlocati/gettext-iconv-windows/releases/download/v0.20.2-v1.16/gettext0.20.2-iconv1.16-static-64.zip", "gettext.zip");
        echo "Unpacking gettext..."
        7z x -ogettext gettext.zip;
        echo "Adding gettext to PATH..."
        echo "${{ github.workspace }}\gettext\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
        echo "Downloading xmlstarlet..."
        (New-Object System.Net.WebClient).DownloadFile("https://downloads.sourceforge.net/project/xmlstar/xmlstarlet/1.6.1/xmlstarlet-1.6.1-win32.zip", "xmlstarlet.zip");
        echo "Unpacking xmlstarlet..."
        7z x -oxmlstarlet xmlstarlet.zip;
        echo "Renaming xml.exe to xmlstarlet.exe"
        Rename-Item -Path "${{ github.workspace }}\xmlstarlet\xmlstarlet-1.6.1\xml.exe" -NewName "xmlstarlet.exe"
        echo "Adding xmlstarlet to PATH..."
        echo "${{ github.workspace }}\xmlstarlet\xmlstarlet-1.6.1" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
        echo "Downloading rsvg-convert..."
        (New-Object System.Net.WebClient).DownloadFile("https://downloads.sourceforge.net/project/tumagcc/rsvg-convert-2.40.20.7z", "rsvg-convert.zip");
        echo "Unpacking xmlstarlet..."
        7z x -orsvg-convert rsvg-convert.zip;
        echo "Adding rsvg-convert to PATH..."
        echo "${{ github.workspace }}\rsvg-convert" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
      shell: pwsh
    - name: Create build directory
      run: cmake -E make_directory build
    - name: Run CMake (for Windows)
      working-directory: build
      run: cmake -G "Ninja" -DCMAKE_C_COMPILER=cl.exe -DCMAKE_CXX_COMPILER=cl.exe -DVCPKG_TARGET_TRIPLET=${{ matrix.vcpkg_triplet }} -DCMAKE_TOOLCHAIN_FILE=${{ env.VCPKG_ROOT }}\scripts\buildsystems\vcpkg.cmake -DUSE_STATIC_RUNTIME=1 -DCBOT_STATIC=1 -DBOOST_STATIC=1 -DGLEW_STATIC=1 -DSNDFILE_STATIC=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=${{ github.workspace }}\build\install -DDEV_BUILD=1 -DPORTABLE=1 -DTOOLS=1 -DTESTS=1 -DDESKTOP=1 ..
    - name: Build
      working-directory: build
      run: |
        $nproc = (Get-CIMInstance -Class 'CIM_Processor').NumberOfLogicalProcessors
        cmake --build . -j $nproc
      shell: pwsh
    - name: Install
      working-directory: build
      run: cmake --install .
    - name: Upload build
      uses: actions/upload-artifact@v2
      with:
        name: windows-msvc-debug-${{ matrix.arch }}
        path: build/install
    - name: Run tests
      working-directory: build
      run: ./colobot_ut --gtest_output=xml:gtestresults.xml
    - name: Upload test results
      uses: actions/upload-artifact@v2
      with:
        name: 'Test results (windows, MSVC, ${{ matrix.arch }})'
        path: build/gtestresults.xml
  doc:
    runs-on: ubuntu-latest
    steps:
    - name: Install Colobot dependencies
      run: sudo apt-get update && sudo apt-get install -y --no-install-recommends build-essential cmake libsdl2-dev libsdl2-image-dev libsdl2-ttf-dev libsndfile1-dev libvorbis-dev libogg-dev libpng-dev libglew-dev libopenal-dev libboost-dev libboost-system-dev libboost-filesystem-dev libboost-regex-dev libphysfs-dev gettext git po4a vorbis-tools librsvg2-bin xmlstarlet doxygen graphviz libglm-dev libmpg123-dev
    - uses: actions/checkout@v2
    - name: Create build directory
      run: cmake -E make_directory build
    - name: Checkout the nlohmann json submodule
      run: git submodule update --init -- lib/json
    - name: Run CMake
      working-directory: build
      run: cmake ..
    - name: Build docs
      working-directory: build
      run: make doc
    - name: Upload docs
      uses: actions/upload-artifact@v2
      with:
        name: doc
        path: build/doc