# Cross project tests, for tests that require access to multiple projects across
# LLVM (e.g. clang, lld and lldb).
# The subset inside debuginfo-tests invoke clang to generate programs with
# various types of debug info, and then run those programs under a debugger
# such as GDB or LLDB to verify the results.

find_package(Python3 COMPONENTS Interpreter)

add_llvm_executable(check-gdb-llvm-support
        debuginfo-tests/llvm-prettyprinters/gdb/llvm-support.cpp
)
target_link_libraries(check-gdb-llvm-support PRIVATE LLVMSupport)

set(CROSS_PROJECT_TESTS_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(CROSS_PROJECT_TESTS_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})

set(CROSS_PROJECT_TEST_DEPS
  FileCheck
  count
  llvm-dwarfdump
  llvm-config
  llvm-objdump
  check-gdb-llvm-support
  not
  )

if ("clang" IN_LIST LLVM_ENABLE_PROJECTS)
  list(APPEND CROSS_PROJECT_TEST_DEPS clang)
endif()

if ("mlir" IN_LIST LLVM_ENABLE_PROJECTS)
  add_llvm_executable(check-gdb-mlir-support
        debuginfo-tests/llvm-prettyprinters/gdb/mlir-support.cpp
  )
  target_include_directories(check-gdb-mlir-support PRIVATE
                               ${LLVM_EXTERNAL_MLIR_SOURCE_DIR}/include
                               ${LLVM_BINARY_DIR}/tools/mlir/include)
  target_link_libraries(check-gdb-mlir-support PRIVATE MLIRIR)
  list(APPEND CROSS_PROJECT_TEST_DEPS check-gdb-mlir-support)
  set(MLIR_SOURCE_DIR  ${LLVM_EXTERNAL_MLIR_SOURCE_DIR})
endif()

if("compiler-rt" IN_LIST LLVM_ENABLE_PROJECTS)
  # llgdb-tests/asan.c and other asan* files.
  if(TARGET asan)
    list(APPEND CROSS_PROJECT_TEST_DEPS asan)
  endif()
  # llgdb-tests/safestack.c
  if(TARGET safestack)
    list(APPEND CROSS_PROJECT_TEST_DEPS safestack)
  endif()
endif()
# Many dexter tests depend on lldb.
if("lldb" IN_LIST LLVM_ENABLE_PROJECTS)
  list(APPEND CROSS_PROJECT_TEST_DEPS lldb lldb-server)
endif()

# The Windows builder scripts pass -fuse-ld=lld.
if (WIN32 OR "lld" IN_LIST LLVM_ENABLE_PROJECTS)
  list(APPEND CROSS_PROJECT_TEST_DEPS lld)
endif()

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

add_lit_testsuite(check-cross-project "Running cross-project tests"
  ${CMAKE_CURRENT_BINARY_DIR}
  DEPENDS ${CROSS_PROJECT_TEST_DEPS}
  )

# Add alias for debuginfo test subset.
add_lit_testsuite(check-debuginfo "Running debuginfo tests"
  ${CMAKE_CURRENT_BINARY_DIR}/debuginfo-tests
  EXCLUDE_FROM_CHECK_ALL
  DEPENDS ${CROSS_PROJECT_TEST_DEPS}
  )

# Add check-cross-project-* targets.
add_lit_testsuites(CROSS_PROJECT ${CMAKE_CURRENT_SOURCE_DIR}
  DEPENDS ${CROSS_PROJECT_TEST_DEPS}
  )

set_target_properties(check-cross-project PROPERTIES FOLDER "Tests")
set_target_properties(check-debuginfo PROPERTIES FOLDER "Tests")
