# CMakeLists.txt file for unit testing OpenMP offloading runtime library.
if(NOT OPENMP_TEST_COMPILER_ID STREQUAL "Clang" OR
   OPENMP_TEST_COMPILER_VERSION VERSION_LESS 6.0.0)
  libomptarget_say("Can only test with Clang compiler in version 6.0.0 or later.")
  libomptarget_warning_say("The check-libomptarget target will not be available!")
  return()
endif()

if(LIBOMPTARGET_ENABLE_DEBUG)
  set(LIBOMPTARGET_DEBUG True)
else()
  set(LIBOMPTARGET_DEBUG False)
endif()

# Replace the space from user's input with ";" in case that CMake add escape
# char into the lit command.
string(REPLACE " " ";" LIBOMPTARGET_LIT_ARG_LIST "${LIBOMPTARGET_LIT_ARGS}")

string(REGEX MATCHALL "([^\ ]+\ |[^\ ]+$)" SYSTEM_TARGETS "${LIBOMPTARGET_SYSTEM_TARGETS}")
foreach(CURRENT_TARGET IN LISTS SYSTEM_TARGETS)
  string(STRIP "${CURRENT_TARGET}" CURRENT_TARGET)
  add_openmp_testsuite(check-libomptarget-${CURRENT_TARGET}
    "Running libomptarget tests"
    ${CMAKE_CURRENT_BINARY_DIR}/${CURRENT_TARGET}
    DEPENDS omptarget omp ${LIBOMPTARGET_TESTED_PLUGINS}
    ARGS ${LIBOMPTARGET_LIT_ARG_LIST})
  list(APPEND LIBOMPTARGET_LIT_TESTSUITES ${CMAKE_CURRENT_BINARY_DIR}/${CURRENT_TARGET})

  # Configure the lit.site.cfg.in file
  set(AUTO_GEN_COMMENT "## Autogenerated by libomptarget configuration.\n# Do not edit!")
  get_filename_component(CUDA_LIBDIR "${CUDA_cudart_static_LIBRARY}" DIRECTORY)
  configure_file(lit.site.cfg.in ${CURRENT_TARGET}/lit.site.cfg @ONLY)
endforeach()

add_openmp_testsuite(check-libomptarget
  "Running libomptarget tests"
  ${LIBOMPTARGET_LIT_TESTSUITES}
  EXCLUDE_FROM_CHECK_ALL
  DEPENDS omptarget omp ${LIBOMPTARGET_TESTED_PLUGINS}
  ARGS ${LIBOMPTARGET_LIT_ARG_LIST})
