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

pythonize_bool(LIBCXXABI_USE_LLVM_UNWINDER)
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()

list(APPEND LIBCXXABI_TEST_DEPS cxx)
if (LIBCXXABI_USE_LLVM_UNWINDER AND TARGET unwind)
  list(APPEND LIBCXXABI_TEST_DEPS unwind)
endif()

set(AUTO_GEN_COMMENT "## Autogenerated by libcxxabi configuration.\n# Do not edit!")
set(SERIALIZED_LIT_PARAMS "# Lit parameters serialized here for llvm-lit to pick them up\n")

macro(serialize_lit_param param value)
  string(APPEND SERIALIZED_LIT_PARAMS "config.${param} = ${value}\n")
endmacro()

if (NOT LIBCXXABI_ENABLE_EXCEPTIONS)
  serialize_lit_param(enable_exceptions False)
endif()

if (LIBCXXABI_ENABLE_ASSERTIONS)
  serialize_lit_param(enable_assertions True)
endif()

serialize_lit_param(enable_experimental False)

if (LLVM_USE_SANITIZER)
  serialize_lit_param(use_sanitizer "\"${LLVM_USE_SANITIZER}\"")
endif()

if (CMAKE_CXX_COMPILER_TARGET)
  serialize_lit_param(target_triple "\"${CMAKE_CXX_COMPILER_TARGET}\"")
else()
  serialize_lit_param(target_triple "\"${LLVM_DEFAULT_TARGET_TRIPLE}\"")
endif()

foreach(param IN LISTS LIBCXXABI_TEST_PARAMS)
  string(REGEX REPLACE "(.+)=(.+)" "\\1" name "${param}")
  string(REGEX REPLACE "(.+)=(.+)" "\\2" value "${param}")
  serialize_lit_param("${name}" "\"${value}\"")
endforeach()

configure_file("${CMAKE_CURRENT_SOURCE_DIR}/configs/cmake-bridge.cfg.in"
               "${CMAKE_CURRENT_BINARY_DIR}/cmake-bridge.cfg"
               @ONLY)

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_testsuite(check-cxxabi "Running libcxxabi tests"
  ${CMAKE_CURRENT_BINARY_DIR}
  DEPENDS ${LIBCXXABI_TEST_DEPS})
