include(AddLLVM) # for add_lit_testsuite
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()

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_BUILD_EXTERNAL_THREAD_LIBRARY)
pythonize_bool(LIBCXXABI_HAS_CXA_THREAD_ATEXIT_IMPL)
set(LIBCXXABI_TARGET_INFO "libcxx.test.target_info.LocalTI" CACHE STRING
    "TargetInfo to use when setting up test environment.")
set(LIBCXXABI_EXECUTOR "None" CACHE STRING
    "Executor to use when running tests.")

set(AUTO_GEN_COMMENT "## Autogenerated by libcxxabi configuration.\n# Do not edit!")
configure_file(
  ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in
  ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg
  @ONLY)

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

add_lit_testsuite(check-cxxabi "Running libcxxabi tests"
  ${CMAKE_CURRENT_BINARY_DIR}
  DEPENDS ${LIBCXXABI_TEST_DEPS}
  )

# TODO: This is a legacy target name and should be removed at some point.
add_custom_target(check-libcxxabi DEPENDS check-cxxabi)
