environment:
    R_ARCH: x64
    USE_RTOOLS: true
    matrix:
        - target: msvc
          ver: 2015
          generator: "Visual Studio 14 2015 Win64"
          configuration: Debug
        - target: msvc
          ver: 2015
          generator: "Visual Studio 14 2015 Win64"
          configuration: Release
        - target: mingw
          generator: "Unix Makefiles"
        - target: jvm
        - target: rmsvc
          ver: 2015
          generator: "Visual Studio 14 2015 Win64"
          configuration: Release
        - target: rmingw
          generator: "Unix Makefiles"

#matrix:
#    fast_finish: true

platform:
    - x64

install:
    - git submodule update --init --recursive
    # MinGW
    - set PATH=C:\msys64\mingw64\bin;C:\msys64\usr\bin;%PATH%
    - gcc -v
    - ls -l C:\
    # Miniconda3
    - call C:\Miniconda3-x64\Scripts\activate.bat
    - conda info
    - where python
    - python --version
    # do python build for mingw and one of the msvc jobs
    - set DO_PYTHON=off
    - if /i "%target%" == "mingw" set DO_PYTHON=on
    - if /i "%target%_%ver%_%configuration%" == "msvc_2015_Release" set DO_PYTHON=on
    - if /i "%DO_PYTHON%" == "on" (
        conda config --set always_yes true &&
        conda update -q conda &&
        conda install -y numpy scipy pandas matplotlib pytest scikit-learn graphviz python-graphviz
      )
    - set PATH=C:\Miniconda3-x64\Library\bin\graphviz;%PATH%
    # R: based on https://github.com/krlmlr/r-appveyor
    - ps: |
        if($env:target -eq 'rmingw' -or $env:target -eq 'rmsvc') {
          #$ErrorActionPreference = "Stop"
          Invoke-WebRequest https://raw.githubusercontent.com/krlmlr/r-appveyor/master/scripts/appveyor-tool.ps1 -OutFile "$Env:TEMP\appveyor-tool.ps1"
          Import-Module "$Env:TEMP\appveyor-tool.ps1"
          Bootstrap
          $BINARY_DEPS = "c('XML','igraph')"
          cmd.exe /c "R.exe -q -e ""install.packages($BINARY_DEPS, repos='$CRAN', type='win.binary')"" 2>&1"
          $DEPS = "c('data.table','magrittr','stringi','ggplot2','DiagrammeR','Ckmeans.1d.dp','vcd','testthat','lintr','knitr','rmarkdown')"
          cmd.exe /c "R.exe -q -e ""install.packages($DEPS, repos='$CRAN', type='both')"" 2>&1"
        }

build_script:
    - cd %APPVEYOR_BUILD_FOLDER%
    - if /i "%target%" == "msvc" (
        mkdir build_msvc%ver% &&
        cd build_msvc%ver% &&
        cmake .. -G"%generator%" -DCMAKE_CONFIGURATION_TYPES="Release;Debug;" &&
        msbuild xgboost.sln
      )
    - if /i "%target%" == "mingw" (
        mkdir build_mingw &&
        cd build_mingw &&
        cmake .. -G"%generator%" &&
        make -j2
      )
    # Python package
    - if /i "%DO_PYTHON%" == "on" (
        cd %APPVEYOR_BUILD_FOLDER%\python-package &&
        python setup.py install &&
        mkdir wheel &&
        python setup.py bdist_wheel --universal --plat-name win-amd64 -d wheel
      )
    # R package: make + mingw standard CRAN packaging (only x64 for now)
    - if /i "%target%" == "rmingw" (
        make Rbuild &&
        ls -l &&
        R.exe CMD INSTALL xgboost*.tar.gz
      )
    # R package: cmake + VC2015
    - if /i "%target%" == "rmsvc" (
        mkdir build_rmsvc%ver% &&
        cd build_rmsvc%ver% &&
        cmake .. -G"%generator%" -DCMAKE_CONFIGURATION_TYPES="Release" -DR_LIB=ON &&
        cmake --build . --target install --config Release
      )
    - if /i "%target%" == "jvm" cd jvm-packages && mvn test -pl :xgboost4j_2.12

test_script:
    - cd %APPVEYOR_BUILD_FOLDER%
    - if /i "%DO_PYTHON%" == "on" python -m pytest tests/python
    # mingw R package: run the R check (which includes unit tests), and also keep the built binary package
    - if /i "%target%" == "rmingw" (
        set _R_CHECK_CRAN_INCOMING_=FALSE&&
        set _R_CHECK_FORCE_SUGGESTS_=FALSE&&
        R.exe CMD check xgboost*.tar.gz --no-manual --no-build-vignettes --as-cran --install-args=--build
      )
    # MSVC R package: run only the unit tests
    - if /i "%target%" == "rmsvc" (
        cd build_rmsvc%ver%\R-package &&
        R.exe -q -e "library(testthat); setwd('tests'); source('testthat.R')"
      )

on_failure:
    # keep the whole output of R check
    - if /i "%target%" == "rmingw" (
        7z a failure.zip *.Rcheck\* &&
        appveyor PushArtifact failure.zip
      )

artifacts:
    # log from R check
    - path: '*.Rcheck\**\*.log'
      name: Logs
    # source R-package
    - path: '\xgboost_*.tar.gz'
      name: Bits
    # binary R-package
    - path: '**\xgboost_*.zip'
      name: Bits
    # binary Python wheel package
    - path: '**\*.whl'
      name: Bits
