macro(pythonize_bool var)
  if (${var})
    set(${var} True)
  else()
    set(${var} False)
  endif()
endmacro()

set(LIT_EXECUTABLE "" CACHE FILEPATH "Path to LLVM's llvm-lit.")

if(LIBCXX_BUILT_STANDALONE)
  # Make sure we can use the console pool for recent cmake and ninja > 1.5
  if(CMAKE_VERSION VERSION_LESS 3.1.20141117)
    set(cmake_3_2_USES_TERMINAL)
  else()
    set(cmake_3_2_USES_TERMINAL USES_TERMINAL)
  endif()
else()
  include(FindPythonInterp)
  if(PYTHONINTERP_FOUND)
    set(LIT_EXECUTABLE
        ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/utils/lit/lit.py)
  else()
    message(WARNING "Could not find Python, cannot set LIT_EXECUTABLE.")
  endif()
endif()

if (LIT_EXECUTABLE)
  set(LIT_ARGS_DEFAULT "-sv --show-unsupported --show-xfail")
  if (MSVC OR XCODE)
    set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
  endif()
  set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}"
      CACHE STRING "Default options for lit")
  set(LIT_ARGS "${LLVM_LIT_ARGS}")
  separate_arguments(LIT_ARGS)

  set(LIBCXX_LIT_VARIANT "libcxx" CACHE STRING
      "Configuration variant to use for LIT.")

  pythonize_bool(LIBCXX_ENABLE_EXCEPTIONS)
  pythonize_bool(LIBCXX_ENABLE_RTTI)
  pythonize_bool(LIBCXX_ENABLE_SHARED)
  pythonize_bool(LIBCXX_BUILD_32_BITS)
  pythonize_bool(LIBCXX_ENABLE_GLOBAL_FILESYSTEM_NAMESPACE)
  pythonize_bool(LIBCXX_ENABLE_STDIN)
  pythonize_bool(LIBCXX_ENABLE_STDOUT)
  pythonize_bool(LIBCXX_ENABLE_THREADS)
  pythonize_bool(LIBCXX_ENABLE_MONOTONIC_CLOCK)
  pythonize_bool(LIBCXX_GENERATE_COVERAGE)
  pythonize_bool(LIBCXXABI_USE_LLVM_UNWINDER)

  # The tests shouldn't link to any ABI library when it has been linked into
  # libc++ statically.
  if (LIBCXX_ENABLE_STATIC_ABI_LIBRARY)
    set(LIBCXX_CXX_ABI_LIBNAME "none")
  endif()
  set(LIBCXX_TARGET_INFO "libcxx.test.target_info.LocalTI" CACHE STRING
      "TargetInfo to use when setting up test environment.")
  set(LIBCXX_EXECUTOR "None" CACHE STRING
      "Executor to use when running tests.")

  set(AUTO_GEN_COMMENT "## Autogenerated by libcxx configuration.\n# Do not edit!")

  configure_file(
    ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in
    ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg
    @ONLY)

  add_custom_target(check-libcxx
    COMMAND ${LIT_EXECUTABLE}
            ${LIT_ARGS}
            ${CMAKE_CURRENT_BINARY_DIR}
    DEPENDS cxx
    COMMENT "Running libcxx tests"
    ${cmake_3_2_USES_TERMINAL})

  if (LIBCXX_GENERATE_COVERAGE)
    include(CodeCoverage)
    set(output_dir "${CMAKE_CURRENT_BINARY_DIR}/coverage")
    set(capture_dirs "${LIBCXX_LIB_CMAKEFILES_DIR}/cxx.dir/;${CMAKE_CURRENT_BINARY_DIR}")
    set(extract_dirs "${LIBCXX_SOURCE_DIR}/include;${LIBCXX_SOURCE_DIR}/src")
    setup_lcov_test_target_coverage("cxx" "${output_dir}" "${capture_dirs}" "${extract_dirs}")
  endif()
else()
  message(WARNING
          "LIT_EXECUTABLE not set, no check-libcxx target will be available!")
endif()
