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

@echo on

@rem In release mode, disable optimizations (/Od) for faster compiling
set CMAKE_CXX_FLAGS_RELEASE=/Od

if "%JOB%" == "Static_Crt_Build" (
  @rem Since we link the CRT statically, we should also disable building
  @rem the Arrow shared library to link the tests statically, otherwise
  @rem the Arrow DLL and the tests end up using a different instance of
  @rem the CRT, which wreaks havoc.

  @rem ARROW-5403(wesm): Since changing to using gtest DLLs we can no
  @rem longer run the unit tests because gtest.dll and the unit test
  @rem executables have different static copies of the CRT

  mkdir cpp\build-debug
  pushd cpp\build-debug

  cmake -G "%GENERATOR%" ^
        -DARROW_VERBOSE_THIRDPARTY_BUILD=OFF ^
        -DARROW_USE_STATIC_CRT=ON ^
        -DARROW_BOOST_USE_SHARED=OFF ^
        -DARROW_BUILD_SHARED=OFF ^
        -DARROW_BUILD_TESTS=ON ^
        -DARROW_BUILD_EXAMPLES=ON ^
        -DCMAKE_BUILD_TYPE=Debug ^
        -DARROW_ENABLE_TIMING_TESTS=OFF ^
        -DARROW_TEST_LINKAGE=static ^
        -DARROW_CXXFLAGS="/MP" ^
        ..  || exit /B

  cmake --build . --config Debug || exit /B
  ctest --output-on-failure -j2 || exit /B
  popd
  rmdir /S /Q cpp\build-debug

  mkdir cpp\build-release
  pushd cpp\build-release

  cmake -G "%GENERATOR%" ^
        -DARROW_VERBOSE_THIRDPARTY_BUILD=OFF ^
        -DARROW_USE_STATIC_CRT=ON ^
        -DARROW_BOOST_USE_SHARED=OFF ^
        -DARROW_BUILD_SHARED=OFF ^
        -DARROW_BUILD_TESTS=ON ^
        -DARROW_BUILD_EXAMPLES=ON ^
        -DCMAKE_BUILD_TYPE=Release ^
        -DARROW_ENABLE_TIMING_TESTS=OFF ^
        -DARROW_TEST_LINKAGE=static ^
        -DCMAKE_CXX_FLAGS_RELEASE="/MT %CMAKE_CXX_FLAGS_RELEASE%" ^
        -DARROW_CXXFLAGS="/WX /MP" ^
        ..  || exit /B

  cmake --build . --config Release || exit /B
  ctest --output-on-failure -j2 || exit /B
  popd

  @rem Finish Static_Crt_Build build successfully
  exit /B 0
)

@rem In the configurations below we disable building the Arrow static library
@rem to save some time.  Unfortunately this will still build the Parquet static
@rem library because of PARQUET-1420 (Thrift-generated symbols not exported in DLL).

if "%JOB%" == "Build_Debug" (
  mkdir cpp\build-debug
  pushd cpp\build-debug

  cmake -G "%GENERATOR%" ^
        -DARROW_USE_PRECOMPILED_HEADERS=OFF ^
        -DARROW_VERBOSE_THIRDPARTY_BUILD=OFF ^
        -DARROW_BOOST_USE_SHARED=OFF ^
        -DARROW_BUILD_TESTS=ON ^
        -DARROW_BUILD_EXAMPLES=ON ^
        -DCMAKE_BUILD_TYPE=%CONFIGURATION% ^
        -DCMAKE_UNITY_BUILD=ON ^
        -DARROW_BUILD_STATIC=OFF ^
        -DARROW_CXXFLAGS="/MP" ^
        -DARROW_ENABLE_TIMING_TESTS=OFF ^
        ..  || exit /B

  cmake --build . --config %CONFIGURATION% || exit /B
  ctest --output-on-failure -j2 || exit /B
  popd

  @rem Finish Debug build successfully
  exit /B 0
)

@rem Avoid Boost 1.70 because of https://github.com/boostorg/process/issues/85
set CONDA_PACKAGES=--file=ci\conda_env_python.yml ^
  python=%PYTHON% numpy=1.14 "boost-cpp<1.70"

if "%ARROW_BUILD_GANDIVA%" == "ON" (
  @rem Install llvmdev in the toolchain if building gandiva.dll
  set CONDA_PACKAGES=%CONDA_PACKAGES% --file=ci\conda_env_gandiva.yml
)

if "%JOB%" == "Toolchain" (
  @rem Install pre-built "toolchain" packages for faster builds
  set CONDA_PACKAGES=%CONDA_PACKAGES% --file=ci\conda_env_cpp.yml
)

conda create -n arrow -q -y %CONDA_PACKAGES% -c conda-forge || exit /B

call activate arrow

@rem Use Boost from Anaconda
set BOOST_ROOT=%CONDA_PREFIX%\Library
set BOOST_LIBRARYDIR=%CONDA_PREFIX%\Library\lib

call ci\cpp-msvc-build-main.bat
