# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

# Operating system (build VM template)
os: Visual Studio 2015

only_commits:
  # Skip commits not related to Python or C++
  files:
    - appveyor.yml
    - ci/appveyor*
    - ci/*.bat
    - ci/conda*
    - cpp/
    - format/
    - python/

cache:
  - C:\Users\Appveyor\clcache1
  - C:\msys64\home\appveyor\.ccache
  - C:\Users\Appveyor\.cargo\registry
  - '%LocalAppData%\\go-build'

matrix:
  fast_finish: true

environment:
  global:
    # Make these variables visible in all jobs and build steps
    USE_CLCACHE: true
    # Change the clcache dir to reset caches everywhere when a setting
    # is changed incompatibly (e.g. CLCACHE_COMPRESS).
    CLCACHE_DIR: C:\Users\Appveyor\clcache1
    CLCACHE_SERVER: 1
    CLCACHE_COMPRESS: 1
    CLCACHE_COMPRESSLEVEL: 6
    ARROW_BUILD_FLIGHT: "OFF"
    ARROW_BUILD_GANDIVA: "OFF"
    ARROW_LLVM_VERSION: "7.0.*"
    ARROW_S3: "OFF"
    PYTHON: "3.7"
    ARCH: "64"

  matrix:
    # NOTE: clcache seems to work best with Ninja and worst with msbuild
    # (as generated by cmake)
    - JOB: "Build"
      GENERATOR: Ninja
      CONFIGURATION: "Release"
      APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
    - JOB: "Toolchain"
      GENERATOR: Ninja
      CONFIGURATION: "Release"
      ARROW_S3: "ON"
      ARROW_BUILD_FLIGHT: "ON"
      ARROW_BUILD_GANDIVA: "ON"
    - JOB: "Build_Debug"
      GENERATOR: Ninja
      CONFIGURATION: "Debug"
    # NOTE: Since ARROW-5403 we have disabled the static CRT build
    # - JOB: "Static_Crt_Build"
    #   GENERATOR: Ninja

  MSVC_DEFAULT_OPTIONS: ON
  APPVEYOR_SAVE_CACHE_ON_ERROR: true

install:
  - python ci\detect-changes.py > generated_changes.bat
  # Populate ARROW_CI_* variables
  - call generated_changes.bat
  # Decide to exit if current job doesn't exercise affected topics
  - call ci\appveyor-filter-changes.bat

before_build:
  - call ci\appveyor-install.bat

build_script:
  - call ci\appveyor-build.bat

# Disable test discovery
test: off

after_build:
  - if "%USE_CLCACHE%" == "true" clcache -s
