# shallow clone
clone_depth: 10

cache:
  - C:\ProgramData\chocolatey\bin -> appveyor.yml
  - C:\ProgramData\chocolatey\lib -> appveyor.yml

os: Visual Studio 2017

environment:
  # Tell msys2 to add mingw64 to the path
  MSYSTEM: MINGW64
  # Tell msys2 to inherit the current directory when starting the shell
  CHERE_INVOKING: 1
  matrix:
    - BUILD_TYPE: mingw
    - BUILD_TYPE: msvc

platform:
  - x64

configuration:
  - Release

install:
  - git submodule update --init --recursive
  - ps: |
        if ($env:BUILD_TYPE -eq 'mingw') {
          $dependencies = "mingw64/mingw-w64-x86_64-qt5"
          # redirect err to null to prevent warnings from becoming errors
          # workaround to prevent pacman from failing due to cyclical dependencies
          C:\msys64\usr\bin\bash -lc "pacman --noconfirm -S mingw64/mingw-w64-x86_64-freetype mingw64/mingw-w64-x86_64-fontconfig" 2> $null
          C:\msys64\usr\bin\bash -lc "pacman --noconfirm -U http://repo.msys2.org/mingw/x86_64/mingw-w64-x86_64-SDL2-2.0.5-2-any.pkg.tar.xz" 2> $null
          C:\msys64\usr\bin\bash -lc "pacman --noconfirm -S $dependencies" 2> $null
          # freeze the cmake to a stable version, on version < 3.9.6 cmake may generate a Makefile links against gcc_eh instead of gcc_s_eh
          C:\msys64\usr\bin\bash -lc "pacman --noconfirm -U http://repo.msys2.org/mingw/x86_64/mingw-w64-x86_64-cmake-3.11.1-2-any.pkg.tar.xz" 2> $null
        }

before_build:
  - mkdir %BUILD_TYPE%_build
  - cd %BUILD_TYPE%_build
  - ps: |
        $COMPAT = if ($env:ENABLE_COMPATIBILITY_REPORTING -eq $null) {0} else {$env:ENABLE_COMPATIBILITY_REPORTING}
        if ($env:BUILD_TYPE -eq 'msvc') {
          # redirect stderr and change the exit code to prevent powershell from cancelling the build if cmake prints a warning
          cmd /C 'cmake -G "Visual Studio 15 2017 Win64" -DCITRA_USE_BUNDLED_QT=1 -DCITRA_USE_BUNDLED_SDL2=1 -DCITRA_ENABLE_COMPATIBILITY_REPORTING=${COMPAT} -DENABLE_COMPATIBILITY_LIST_DOWNLOAD=ON -DUSE_DISCORD_PRESENCE=ON .. 2>&1 && exit 0'
        } else {
          C:\msys64\usr\bin\bash.exe -lc "cmake -G 'MSYS Makefiles' -DCMAKE_BUILD_TYPE=Release -DENABLE_QT_TRANSLATION=ON -DCITRA_ENABLE_COMPATIBILITY_REPORTING=${COMPAT} -DENABLE_COMPATIBILITY_LIST_DOWNLOAD=ON -DUSE_DISCORD_PRESENCE=ON .. 2>&1"
        }
  - cd ..

build_script:
  - ps: |
        if ($env:BUILD_TYPE -eq 'msvc') {
          # https://www.appveyor.com/docs/build-phase
          msbuild msvc_build/citra.sln /maxcpucount /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
        } else {
          C:\msys64\usr\bin\bash.exe -lc 'mingw32-make -j4 -C mingw_build/ 2>&1'
        }

after_build:
  - ps: |
        $GITDATE = $(git show -s --date=short --format='%ad') -replace "-",""
        $GITREV = $(git show -s --format='%h')

        # Find out which kind of release we are producing by tag name
        if ($env:APPVEYOR_REPO_TAG_NAME) {
          $RELEASE_DIST, $RELEASE_VERSION = $env:APPVEYOR_REPO_TAG_NAME.split('-')
        } else {
          # There is no repo tag - make assumptions
          $RELEASE_DIST = "head"
        }

        if ($env:BUILD_TYPE -eq 'msvc') {
          # Where are these spaces coming from? Regardless, let's remove them
          $MSVC_BUILD_ZIP = "citra-windows-msvc-$GITDATE-$GITREV.zip" -replace " ", ""
          $MSVC_BUILD_PDB = "citra-windows-msvc-$GITDATE-$GITREV-debugsymbols.zip" -replace " ", ""
          $MSVC_SEVENZIP = "citra-windows-msvc-$GITDATE-$GITREV.7z" -replace " ", ""

          # set the build names as env vars so the artifacts can upload them
          $env:BUILD_ZIP = $MSVC_BUILD_ZIP
          $env:BUILD_SYMBOLS = $MSVC_BUILD_PDB
          $env:BUILD_UPDATE = $MSVC_SEVENZIP

          mkdir $RELEASE_DIST
          Copy-Item .\msvc_build\bin\release\* -Destination $RELEASE_DIST -Recurse
          Copy-Item .\license.txt -Destination $RELEASE_DIST
          Copy-Item .\README.md -Destination $RELEASE_DIST

          # process PDBs
          . "./.appveyor/ProcessPdb.ps1"
          7z a -tzip $MSVC_BUILD_PDB $RELEASE_DIST\*.pdb
          rm $RELEASE_DIST\*.pdb

          7z a -tzip $MSVC_BUILD_ZIP $RELEASE_DIST\*
          7z a $MSVC_SEVENZIP $RELEASE_DIST
        } else {
          $MINGW_BUILD_ZIP = "citra-windows-mingw-$GITDATE-$GITREV.zip" -replace " ", ""
          $MINGW_BUILD_PDB = "citra-windows-mingw-$GITDATE-$GITREV-debugsymbols.zip" -replace " ", ""
          $MINGW_SEVENZIP = "citra-windows-mingw-$GITDATE-$GITREV.7z" -replace " ", ""

          # store the build information in env vars so we can use them as artifacts
          $env:BUILD_ZIP = $MINGW_BUILD_ZIP
          $env:BUILD_SYMBOLS = $MINGW_BUILD_PDB
          $env:BUILD_UPDATE = $MINGW_SEVENZIP

          $CMAKE_SOURCE_DIR = "$env:APPVEYOR_BUILD_FOLDER"
          $CMAKE_BINARY_DIR = "$CMAKE_SOURCE_DIR/mingw_build"
          $RELEASE_DIST = $RELEASE_DIST + "-mingw"

          mkdir $RELEASE_DIST
          mkdir $RELEASE_DIST/platforms
          mkdir $RELEASE_DIST/mediaservice
          mkdir $RELEASE_DIST/styles
          mkdir $RELEASE_DIST/imageformats

          # copy the compiled binaries and other release files to the release folder
          Get-ChildItem "$CMAKE_BINARY_DIR" -Recurse -Filter "citra*.exe" | Copy-Item -destination $RELEASE_DIST
          Copy-Item -path "$CMAKE_SOURCE_DIR/license.txt" -destination $RELEASE_DIST
          Copy-Item -path "$CMAKE_SOURCE_DIR/README.md" -destination $RELEASE_DIST

          # copy all the dll dependencies to the release folder
          . "./.appveyor/FindDependencies.ps1"
          $DLLSearchPath = "C:\msys64\mingw64\bin;$env:PATH"
          $MingwDLLs = RecursivelyGetDeps $DLLSearchPath "$RELEASE_DIST\citra.exe"
          $MingwDLLs += RecursivelyGetDeps $DLLSearchPath  "$RELEASE_DIST\citra-qt.exe"
          Write-Host "Detected the following dependencies:"
          Write-Host $MingwDLLs
          foreach ($file in $MingwDLLs) {
            Copy-Item -path "$file" -force -destination "$RELEASE_DIST"
          }

          # copy the qt windows plugin dll to platforms
          Copy-Item -path "C:/msys64/mingw64/share/qt5/plugins/platforms/qwindows.dll" -force -destination "$RELEASE_DIST/platforms"

          # copy the qt mediaservice plugin dll
          Copy-Item -path "C:/msys64/mingw64/share/qt5/plugins/mediaservice/dsengine.dll" -force -destination "$RELEASE_DIST/mediaservice"

          # copy the qt windows vista style dll to platforms
          Copy-Item -path "C:/msys64/mingw64/share/qt5/plugins/styles/qwindowsvistastyle.dll" -force -destination "$RELEASE_DIST/styles"

          # copy the qt imageformats plugin dlls to imageformats
          Get-ChildItem "C:/msys64/mingw64/share/qt5/plugins/imageformats" -Exclude "*d.dll" | Copy-Item -force -destination "$RELEASE_DIST/imageformats"

          # process PDBs
          . "./.appveyor/ProcessPdb.ps1"
          7z a -tzip $MINGW_BUILD_PDB $RELEASE_DIST\*.pdb
          rm $RELEASE_DIST\*.pdb

          7z a -tzip $MINGW_BUILD_ZIP $RELEASE_DIST\*
          7z a $MINGW_SEVENZIP $RELEASE_DIST
        }

test_script:
  - cd %BUILD_TYPE%_build
  - ps: |
        if ($env:BUILD_TYPE -eq 'msvc') {
          ctest -VV -C Release
        } else {
          C:\msys64\usr\bin\bash.exe -lc "ctest -VV -C Release"
        }
  - cd ..

artifacts:
  - path: $(BUILD_ZIP)
    name: build
    type: zip
  - path: $(BUILD_SYMBOLS)
    name: debugsymbols
  - path: $(BUILD_UPDATE)
    name: update

notifications:
  - provider: Webhook
    url: https://api.citra-emu.org/code/appveyor/notify
