# spell-checker:words POSIX repo SDK SDKs toolchain toolchains
# spell-checker:ignore ARCH ABI BACKTRACE BINDIR cl COMNTOOLS dllcrt findstr maint MINGW MINGWDIR mkdir MSVC MSYS rustc rustlib rustup targetting USERPROFILE vcvarsall

version: "{build} ~ {branch}"

branches:
  except:
    - gh-pages

os: Visual Studio 2015

artifacts:
#   - path: target\%TARGET%\debug\....exe
#     name: ....exe

matrix:
  allow_failures:
  - CHANNEL: nightly
#   - ABI: gnu

environment:
  global:
    FEATURES:
    BUILD_OPTIONS:
    TEST_OPTIONS: "--no-fail-fast"

  matrix:
  # minimum version
  - CHANNEL: 1.17.0
    ARCH: i686
    ABI: msvc
  # "msvc" ABI
  - CHANNEL: stable
    ARCH: i686
    ABI: msvc
  - CHANNEL: stable
    ARCH: x86_64
    ABI: msvc
#   - CHANNEL: beta
#     ARCH: i686
#     ABI: msvc
#   - CHANNEL: beta
#     ARCH: x86_64
#     ABI: msvc
  - CHANNEL: nightly
    ARCH: i686
    ABI: msvc
  - CHANNEL: nightly
    ARCH: x86_64
    ABI: msvc
  # "gnu" ABI
  - CHANNEL: stable
    ARCH: i686
    ABI: gnu
  - CHANNEL: stable
    ARCH: x86_64
    ABI: gnu
#   - CHANNEL: beta
#     ARCH: i686
#     ABI: gnu
#   - CHANNEL: beta
#     ARCH: x86_64
#     ABI: gnu
#   - CHANNEL: nightly
#     ARCH: i686
#     ABI: gnu
#   - CHANNEL: nightly
#     ARCH: x86_64
#     ABI: gnu
#   # * specific gnu compilers
#   - CHANNEL: stable
#     ARCH: i686
#     ABI: gnu
#     MINGW_URL: https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/4.9.2/threads-win32/dwarf/i686-4.9.2-release-win32-dwarf-rt_v4-rev4.7z/download
#     MINGW_ARCHIVE: i686-4.9.2-release-win32-dwarf-rt_v4-rev4.7z
#   - CHANNEL: stable
#     ARCH: x86_64
#     ABI: gnu
#     MINGW_URL: https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/7.3.0/threads-posix/seh/x86_64-7.3.0-release-posix-seh-rt_v5-rev0.7z/download#mingw-w64-x86_64-7.3.0-posix-seh.7z

install:
  # force branch checkout (if knowable), then reset to the specific commit ## (can be needed for accurate code coverage info)
  # * this allows later apps to see the branch name using standard `git branch` operations, yet always builds the correct specific commit
  # * ref: <https://github.com/appveyor/ci/issues/1606>[`@`](https://archive.is/RVpnF)
  - if DEFINED APPVEYOR_REPO_BRANCH if /I "%APPVEYOR_REPO_SCM%"=="git" ( git checkout "%APPVEYOR_REPO_BRANCH%" 2>NUL & git reset --hard "%APPVEYOR_REPO_COMMIT%" )
  # ensure CWD is project main directory
  - cd "%APPVEYOR_BUILD_FOLDER%"
  # create a working area
  - ps: if ( ! $env:CI_TEMP_DIR ) { $env:CI_TEMP_DIR = "${env:TEMP}\${env:APPVEYOR_JOB_ID}" ; mkdir -force $env:CI_TEMP_DIR | out-null }

  # define the TARGET host
  - set "TARGET=%ARCH%-pc-windows-%ABI%"

  # show relevant environment settings
  - ps: ('CHANNEL', 'ARCH', 'ABI', 'FEATURES', 'BUILD_OPTIONS', 'TEST_OPTIONS', 'TARGET') |% { write-host -f yellow "$_=$(get-content -ea silent env:/$_)" }

  # rust installation
  # * install `rust` via `rustup`
  - appveyor DownloadFile "https://win.rustup.rs/" -FileName "%CI_TEMP_DIR%\rustup-init.exe"
  - call "%CI_TEMP_DIR%\rustup-init.exe" -y --default-toolchain %CHANNEL% --default-host %TARGET% --no-modify-path >NUL
  - set "PATH=%PATH%;%USERPROFILE%\.cargo\bin"
  - ps: $env:TOOLCHAIN = $("$(rustup show active-toolchain)" -split '\s+')[0]
  # * set RUST_BACKTRACE for enhanced error messages
  - set RUST_BACKTRACE=1
  # * show rust versions
  - rustc -vV
  - cargo -vV

  # "gnu" ABI setup
  # * use the system MinGW/MSYS if we can
  - if /i "%ABI%"=="gnu" set MSYS_BINDIR=C:\msys64\usr\bin
  - if /i "%ABI%"=="gnu" if /i "%ARCH%"=="i686"   set "MSYS_BITS=32"
  - if /i "%ABI%"=="gnu" if /i "%ARCH%"=="x86_64" set "MSYS_BITS=64"
  - if defined MSYS_BITS set "MSYS_MINGWDIR=C:\msys64\mingw%MSYS_BITS%"
  - if defined MSYS_MINGWDIR set "MSYS_BINDIR=C:\msys64\usr\bin"
  ## * workaround for rust-lang/rust#47048 / rust-lang/rust#53454  ## !maint: remove when resolved
  - if /i "%ABI%"=="gnu" if /i "%ARCH%"=="i686" if not DEFINED MINGW_URL set "MINGW_URL=https://sourceforge.net/projects/mingw-w64/files/Toolchains targetting Win32/Personal Builds/mingw-builds/8.1.0/threads-posix/dwarf/i686-8.1.0-release-posix-dwarf-rt_v6-rev0.7z"
  - if /i "%ABI%"=="gnu" if /i "%ARCH%"=="x86_64" if not DEFINED MINGW_URL set "MINGW_URL=https://sourceforge.net/projects/mingw-w64/files/Toolchains targetting Win64/Personal Builds/mingw-builds/8.1.0/threads-posix/seh/x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z"
  ## (end workaround)
  # * specific MinGW, if specified
  - ps: if ( ! $env:MINGW_ARCHIVE -and $env:MINGW_URL ) { $env:MINGW_ARCHIVE = $($([URI]$env:MINGW_URL).fragment).TrimStart('#') }
  - ps: if ( ! $env:MINGW_ARCHIVE -and $env:MINGW_URL ) { $env:MINGW_ARCHIVE = $([URI]$env:MINGW_URL).segments[-1] }
  - if defined MINGW_ARCHIVE curl --insecure -fsSL "%MINGW_URL%" -o "%CI_TEMP_DIR%\%MINGW_ARCHIVE%"
  - if defined MINGW_ARCHIVE mkdir "%CI_TEMP_DIR%\MinGW" >NUL
  - if defined MINGW_ARCHIVE 7z x -y "%CI_TEMP_DIR%\%MINGW_ARCHIVE%" -o"%CI_TEMP_DIR%\MinGW" >NUL
  - if defined MINGW_ARCHIVE set "MSYS_MINGWDIR=%CI_TEMP_DIR%\MinGW\mingw%MSYS_BITS%"
  - if defined MINGW_ARCHIVE set "MSYS_BINDIR=%MSYS_MINGWDIR%\bin"
  # * MinGW/MSYS PATH setup
  - if defined MSYS_MINGWDIR set PATH=%MSYS_MINGWDIR%\%ARCH%-w64-mingw32\bin;%MSYS_BINDIR%;%PATH%
  ## * workaround for rust-lang/rust#47048 / rust-lang/rust#53454  ## !maint: remove when resolved
  # ** ref: <https://github.com/rust-lang/rust/issues/47048>, <https://github.com/rust-lang/rust/issues/53454>
  # ** egs: <https://github.com/pkgw/tectonic/commit/29686db533d8732d7d97fc94270ed33b77f29295>, <https://github.com/rukai/PF_Sandbox/blob/e842613cf9ff102dfb3fbd87381319e6e6dfe3ae/appveyor.yml>
  - if /i "%ABI%"=="gnu" rustup install %CHANNEL%-%ARCH%-pc-windows-msvc
  - if /i "%ABI%"=="gnu" rustup default %CHANNEL%-%ARCH%-pc-windows-msvc
  - if /i "%ABI%"=="gnu" rustup target add %TARGET%
  - ps: $env:TOOLCHAIN = $("$(rustup show active-toolchain)" -split '\s+')[0]
  - if /i "%ABI%"=="gnu" rustup show
  - if /i "%ABI%"=="gnu" rustc -vV
  # ** copy libs from gcc toolchain to rust toolchain (more specifically, "crt2.o" and "dllcrt2.o" are needed)
  - if defined MSYS_MINGWDIR copy /y "%MSYS_MINGWDIR%\%ARCH%-w64-mingw32\lib\*.o" "%USERPROFILE%\.rustup\toolchains\%TOOLCHAIN%\lib\rustlib\%TARGET%\lib" >NUL
  ## (end workaround)
  # * show `gcc` info
  - if /i "%ABI%"=="gnu" ( where gcc && gcc --version )

  # "msvc" ABI setup
  - if /i "%ABI%" == "msvc" if /i "%ARCH%" == "i686" call "%VS140COMNTOOLS%\..\..\VC\vcvarsall.bat"
  - if /i "%ABI%" == "msvc" if /i "%ARCH%" == "x86_64" call "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /x64
  - if /i "%ABI%" == "msvc" if /i "%ARCH%" == "x86_64" call "%VS140COMNTOOLS%\..\..\VC\vcvarsall.bat" x86_amd64
  # * show `cl` info
  - if /i "%ABI%"=="msvc" ( where cl && cl 2>&1 | findstr /i /c:"version" )

  # finalize options
  - ps: if ("$env:FEATURES".length) { $env:BUILD_OPTIONS = $(($env:BUILD_OPTIONS, "--features `"${env:FEATURES}`"")|?{$_}) -join ' ' }
  - ps: if ("$env:FEATURES".length) { $env:TEST_OPTIONS = $(($env:TEST_OPTIONS, "--features `"${env:FEATURES}`"")|?{$_}) -join ' ' }

build_script:
  - ps: $env:BUILD_CMD = $(("cargo +${env:TOOLCHAIN} build --target=${env:TARGET}", $env:BUILD_OPTIONS)|?{$_}) -join ' '
  - echo [ `%BUILD_CMD%` ] & %BUILD_CMD%

test_script:
  - ps: $env:TEST_CMD = $(("cargo +${env:TOOLCHAIN} test --target=${env:TARGET}", $env:TEST_OPTIONS)|?{$_}) -join ' '
  - echo [ `%TEST_CMD%` ] & %TEST_CMD%
