version: '{build}'

image: Visual Studio 2017

environment:
  QTDIR: C:\Qt\5.11\msvc2017_64
  LLVMLIBS: https://github.com/RPCS3/llvm/releases/download/continuous-master/llvmlibs.7z
  GLSLANG: https://drive.google.com/uc?export=download&id=1nJK_NEeRzJ_r_u4zWLySwLmMrV8ZO_wL
  COMPATDB: https://rpcs3.net/compatibility?api=v1&export
  VULKAN_SDK: "C:\\VulkanSDK\\1.1.73.0"
  VULKAN_SDK_URL: https://sdk.lunarg.com/sdk/download/1.1.73.0/windows/VulkanSDK-1.1.73.0-Installer.exe
  VULKAN_SDK_MIRROR: https://obk.ee/rpcs3/VulkanSDK-1.1.73.0-Installer.exe
  VULKAN_SDK_SHA: a5d193f97db4de97e6b4fdd81f00ff6a603f66bb17dc3cf8ac0fe9aec58497c7

cache:
- glslang.7z -> appveyor.yml
- compat_database.dat
- vulkan-sdk.exe -> appveyor.yml

install:
- ps: | # set env vars for versioning
    $env:COMM_TAG = $(git describe --tags $(git rev-list --tags --max-count=1))
    $env:COMM_COUNT = $(git rev-list --count HEAD)
    $env:COMM_HASH = $(git rev-parse --short=8 HEAD)

    if ($env:APPVEYOR_PULL_REQUEST_NUMBER) {
        $env:BUILD = "rpcs3-{0}-{1}_win64.7z" -f $env:COMM_TAG, $env:COMM_HASH
        $env:AVVER = "{0}-{1}" -f $env:COMM_TAG.TrimStart("v"), $env:COMM_HASH
    }
    else {
        $env:BUILD = "rpcs3-{0}-{1}-{2}_win64.7z" -f $env:COMM_TAG, $env:COMM_COUNT, $env:COMM_HASH
        $env:AVVER = "{0}-{1}" -f $env:COMM_TAG.TrimStart("v"), $env:COMM_COUNT
    }

- ps: | # used for experimental build warnings for pr builds
    $env:BRANCH = "{0}/{1}/#{2}" -f $env:APPVEYOR_REPO_NAME, `
      $env:APPVEYOR_REPO_BRANCH, $env:APPVEYOR_PULL_REQUEST_NUMBER
    $env:BRANCH = $env:BRANCH -replace "/#$"

- ps: | # misc global settings
    $env:PATH += $env:QTDIR
    [net.servicepointmanager]::securityprotocol = "tls12, tls11, tls"

- ps: | # update and init submodules
    git submodule -q update --init `
      3rdparty/cereal `
      3rdparty/ffmpeg `
      3rdparty/GSL `
      3rdparty/hidapi `
      3rdparty/libpng `
      3rdparty/pugixml `
      3rdparty/xxHash `
      3rdparty/yaml-cpp `
      3rdparty/zlib `
      asmjit `
      Vulkan/glslang

platform: x64

configuration: Release - LLVM

build:
  parallel: true
  project: rpcs3.sln
  verbosity: normal

before_build:
- ps: | # initialize mirror arrays and fetch precompiled build dependencies
    $VULKAN_SDK_URLS = @(
        $env:VULKAN_SDK_MIRROR;
        $env:VULKAN_SDK_URL;
        "$($env:VULKAN_SDK_URL)?Human=true";
    )
    if (!(test-path llvmlibs.7z)) { irm $env:LLVMLIBS -outfile llvmlibs.7z }
    if (!(test-path glslang.7z)) { irm $env:GLSLANG -outfile glslang.7z }
    7z x llvmlibs.7z -aos -o"." | out-null
    7z x glslang.7z -aos -o".\lib\$env:CONFIGURATION-$env:PLATFORM" | out-null
    if (!(test-path vulkan-sdk.exe))
    {
        foreach ($url in $VULKAN_SDK_URLS) {
            irm $url -outfile vulkan-sdk.exe
            if ($env:VULKAN_SDK_SHA -eq $(Get-FileHash .\vulkan-sdk.exe).Hash)
            {
                echo "Successfully downloaded and verified vulkan-sdk.exe!"
                break
            }
            else
            {
                echo "Invalid file hash, Vulkan SDK Setup was possibly tampered with, retrying with a different mirror..."
            }
        }
    }
    .\vulkan-sdk.exe /S

after_build:
- ps: | # remove unnecessary files
    rm .\bin\rpcs3.exp, .\bin\rpcs3.lib, .\bin\rpcs3.pdb

- ps: | # prepare compatibility database for packaging
    $db = irm $env:COMPATDB -erroraction silentlycontinue
    if ($db -and $db.return_code -eq 0) {
      $db | convertto-json -compress | out-file compat_database.dat -encoding utf8
    }
    copy-item compat_database.dat .\bin\GuiConfigs\compat_database.dat

- ps: | # package artifacts
    7z a -m0=LZMA2 -mx9 $env:BUILD .\bin\*
    7z a -m0=LZMA2 -mx9 openssl_win64.7z C:\OpenSSL-Win64\bin\libeay32.dll `
      C:\OpenSSL-Win64\bin\ssleay32.dll
    $env:FILESIZEMB = (Get-Item $env:BUILD).length/1MB

- ps: | # generate sha256 hashes
    (get-filehash $env:BUILD -algorithm SHA256).Hash | out-file ("{0}.sha256" -f $env:BUILD) -encoding ascii
    $env:SHA256SUM = (get-filehash $env:BUILD -algorithm SHA256).Hash
    (get-filehash openssl_win64.7z -algorithm SHA256).Hash | out-file "openssl_win64.7z.sha256" -encoding ascii

test: off

artifacts:
- path: $(BUILD)
  name: rpcs3
- path: $(BUILD).sha256
  name: rpcs3 sha256 hash
- path: openssl_win64.7z
  name: openssl
- path: openssl_win64.7z.sha256
  name: openssl sha256 hash

deploy:
    provider: GitHub
    # Description is a semi-colon seperated list for easy parsing
    description: "$(SHA256SUM);$(FILESIZEMB)MB"
    tag: build-$(APPVEYOR_REPO_COMMIT)
    release: $(AVVER)
    artifact: $(BUILD)
    repository: RPCS3/rpcs3-binaries-win
    draft: false
    prerelease: false
    force_update: true
    auth_token:
        secure: gTZqN6J9QNQTv9vu2qtExWk1x4o9dSfyTH/y86Yhe3qu+2w6Mly1MaDFMaXgrN1e
    on:
        branch: master
        appveyor_repo_name: RPCS3/rpcs3

on_success:
- ps: | # update appveyor build version, done last to prevent webhook breakage
    update-appveyorbuild -version $env:AVVER