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)
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!")

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


configure_lit_site_cfg(
  ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in
  ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg)

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)
