include(AddLLVM) # for configure_lit_site_cfg and add_lit_target
macro(pythonize_bool var)
  if (${var})
    set(${var} True)
  else()
    set(${var} False)
  endif()
endmacro()

if (NOT DEFINED LIBCXX_ENABLE_SHARED)
  set(LIBCXX_ENABLE_SHARED ON)
endif()

option(LIBCXXABI_LINK_TESTS_WITH_SHARED_LIBCXXABI
       "Whether the libc++abi tests should link with the shared libc++abi library"
       ${LIBCXXABI_ENABLE_SHARED})

option(LIBCXXABI_LINK_TESTS_WITH_SHARED_LIBCXX
       "Whether the libc++abi tests should link with the shared libc++ library"
       ${LIBCXX_ENABLE_SHARED})

if(LIBCXXABI_LINK_TESTS_WITH_SHARED_LIBCXXABI AND NOT LIBCXXABI_ENABLE_SHARED)
  message(FATAL_ERROR "LIBCXXABI_LINK_TESTS_WITH_SHARED_LIBCXXABI being ON requires LIBCXXABI_ENABLE_SHARED to be ON")
endif()

if(NOT LIBCXXABI_LINK_TESTS_WITH_SHARED_LIBCXXABI AND NOT LIBCXXABI_ENABLE_STATIC)
  message(FATAL_ERROR "LIBCXXABI_LINK_TESTS_WITH_SHARED_LIBCXXABI being OFF requires LIBCXXABI_ENABLE_STATIC to be ON")
endif()

if(LIBCXXABI_LINK_TESTS_WITH_SHARED_LIBCXX AND NOT LIBCXX_ENABLE_SHARED)
  message(FATAL_ERROR "LIBCXXABI_LINK_TESTS_WITH_SHARED_LIBCXX being ON requires LIBCXX_ENABLE_SHARED to be ON")
endif()

if(DEFINED LIBCXX_ENABLE_STATIC
   AND NOT LIBCXXABI_LINK_TESTS_WITH_SHARED_LIBCXX
   AND NOT LIBCXX_ENABLE_STATIC)
  message(FATAL_ERROR "LIBCXXABI_LINK_TESTS_WITH_SHARED_LIBCXX being OFF requires LIBCXX_ENABLE_STATIC to be ON")
endif()

pythonize_bool(LIBCXXABI_BUILD_32_BITS)
pythonize_bool(LIBCXX_ENABLE_SHARED)
pythonize_bool(LIBCXXABI_ENABLE_SHARED)
pythonize_bool(LIBCXXABI_ENABLE_THREADS)
pythonize_bool(LIBCXXABI_ENABLE_EXCEPTIONS)
pythonize_bool(LIBCXXABI_USE_LLVM_UNWINDER)
pythonize_bool(LIBCXXABI_USE_COMPILER_RT)
pythonize_bool(LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY)
pythonize_bool(LIBCXX_ENABLE_PARALLEL_ALGORITHMS)
pythonize_bool(LIBCXXABI_LINK_TESTS_WITH_SHARED_LIBCXX)
pythonize_bool(LIBCXXABI_LINK_TESTS_WITH_SHARED_LIBCXXABI)
set(LIBCXXABI_TARGET_INFO "libcxx.test.target_info.LocalTI" CACHE STRING
    "TargetInfo to use when setting up test environment.")
set(LIBCXXABI_EXECUTOR "${Python3_EXECUTABLE} ${LIBCXXABI_LIBCXX_PATH}/utils/run.py" CACHE STRING
    "Executor to use when running tests.")

if (LIBCXXABI_ENABLE_SHARED)
  set(LIBCXXABI_TEST_DEPS cxxabi_shared)
else()
  set(LIBCXXABI_TEST_DEPS cxxabi_static)
endif()

if (LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY)
  list(APPEND LIBCXXABI_TEST_DEPS cxx_external_threads)
endif()

if (NOT LIBCXXABI_STANDALONE_BUILD)
  list(APPEND LIBCXXABI_TEST_DEPS cxx)
  if (LIBCXXABI_USE_LLVM_UNWINDER)
    list(APPEND LIBCXXABI_TEST_DEPS unwind)
  endif()
endif()

set(AUTO_GEN_COMMENT "## Autogenerated by libcxxabi configuration.\n# Do not edit!")
configure_lit_site_cfg(
  "${LIBCXXABI_TEST_CONFIG}"
  ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg
  MAIN_CONFIG "${CMAKE_CURRENT_SOURCE_DIR}/lit.cfg.py")

add_lit_target(check-cxxabi "Running libcxxabi tests"
  ${CMAKE_CURRENT_BINARY_DIR}
  DEPENDS ${LIBCXXABI_TEST_DEPS}
  PARAMS "${LIBCXXABI_TEST_PARAMS}")
