llvm_canonicalize_cmake_booleans(
  BUILD_SHARED_LIBS
  HAVE_OCAMLOPT
  ENABLE_BACKTRACES
  LLVM_ENABLE_DIA_SDK
  LLVM_ENABLE_FFI
  LLVM_ENABLE_THREADS
  LLVM_ENABLE_CURL
  LLVM_ENABLE_HTTPLIB
  LLVM_ENABLE_ZLIB
  LLVM_ENABLE_ZSTD
  LLVM_ENABLE_LIBXML2
  LLVM_LINK_LLVM_DYLIB
  LLVM_TOOL_LTO_BUILD
  LLVM_USE_INTEL_JITEVENTS
  LLVM_INCLUDE_EXAMPLES
  LLVM_ENABLE_PLUGINS
  LLVM_BYE_LINK_INTO_TOOLS
  LLVM_EXAMPLEIRTRANSFORMS_LINK_INTO_TOOLS
  LLVM_HAVE_TF_AOT
  LLVM_HAVE_TFLITE
  LLVM_ENABLE_PROFCHECK
  LLVM_INLINER_MODEL_AUTOGENERATED
  LLVM_RAEVICT_MODEL_AUTOGENERATED
  LLVM_ENABLE_EXPENSIVE_CHECKS
  LLVM_ENABLE_REVERSE_ITERATION
  LLVM_INCLUDE_DXIL_TESTS
  LLVM_TOOL_LLVM_DRIVER_BUILD
  LLVM_INCLUDE_SPIRV_SIMULATOR_TESTS
  LLVM_INCLUDE_SPIRV_TOOLS_TESTS
  LLVM_APPEND_VC_REV
  LLVM_HAS_LOGF128
  LLVM_ENABLE_ONDISK_CAS
  )

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
  PATHS
  "CMAKE_OSX_SYSROOT"
  "LLVM_SOURCE_DIR"
  "LLVM_BINARY_DIR"
  "LLVM_TOOLS_DIR"
  "LLVM_LIBS_DIR"
  "SHLIBDIR"
  )
configure_lit_site_cfg(
  ${CMAKE_CURRENT_SOURCE_DIR}/Unit/lit.site.cfg.py.in
  ${CMAKE_CURRENT_BINARY_DIR}/Unit/lit.site.cfg.py
  MAIN_CONFIG
  ${CMAKE_CURRENT_SOURCE_DIR}/Unit/lit.cfg.py
  PATHS
  "LLVM_SOURCE_DIR"
  "LLVM_BINARY_DIR"
  "LLVM_TOOLS_DIR"
  "SHLIBDIR"
  )

# Set the depends list as a variable so that it can grow conditionally.
# NOTE: Sync the substitutions in test/lit.cfg when adding to this list.

set(LLVM_TEST_DEPENDS_COMMON
  FileCheck
  count
  llvm-config
  not
  )

set(LLVM_TEST_DEPENDS
  ${LLVM_TEST_DEPENDS_COMMON}
  BugpointPasses
  LLVMWindowsDriver
  bugpoint
  llc
  lli
  lli-child-target
  llvm-addr2line
  llvm-ar
  llvm-as
  llvm-bcanalyzer
  llvm-bitcode-strip
  llvm-c-test
  llvm-cas
  llvm-cat
  llvm-cfi-verify
  llvm-cgdata
  llvm-cov
  llvm-ctxprof-util
  llvm-cvtres
  llvm-cxxdump
  llvm-cxxfilt
  llvm-cxxmap
  llvm-debuginfo-analyzer
  llvm-debuginfod-find
  llvm-diff
  llvm-dis
  llvm-dlltool
  dsymutil
  llvm-dwarfdump
  llvm-dwarfutil
  llvm-dwp
  llvm-exegesis
  llvm-extract
  llvm-gsymutil
  llvm-ir2vec
  llvm-isel-fuzzer
  llvm-ifs
  llvm-install-name-tool
  llvm-jitlink
  llvm-lib
  llvm-libtool-darwin
  llvm-link
  llvm-lipo
  llvm-locstats
  llvm-lto2
  llvm-mc
  llvm-mca
  llvm-ml
  llvm-ml64
  llvm-modextract
  llvm-nm
  llvm-objcopy
  llvm-objdump
  llvm-opt-fuzzer
  llvm-opt-report
  llvm-offload-binary
  llvm-offload-wrapper
  llvm-otool
  llvm-pdbutil
  llvm-profdata
  llvm-profgen
  llvm-ranlib
  llvm-rc
  llvm-readobj
  llvm-readelf
  llvm-reduce
  llvm-remarkutil
  llvm-rtdyld
  llvm-sim
  llvm-size
  llvm-split
  llvm-stress
  llvm-strings
  llvm-strip
  llvm-symbolizer
  llvm-tblgen
  llvm-readtapi
  llvm-tli-checker
  llvm-undname
  llvm-windres
  llvm-xray
  obj2yaml
  opt
  sancov
  sanstats
  split-file
  verify-uselistorder
  yaml-bench
  yaml2obj
  )

if(TARGET llvm-lto)
  set(LLVM_TEST_DEPENDS ${LLVM_TEST_DEPENDS} llvm-lto)
endif()

if(TARGET llvm-driver)
  set(LLVM_TEST_DEPENDS ${LLVM_TEST_DEPENDS} llvm-driver)
endif()

# If Intel JIT events are supported, depend on a tool that tests the listener.
if( LLVM_USE_INTEL_JITEVENTS )
  set(LLVM_TEST_DEPENDS ${LLVM_TEST_DEPENDS} llvm-jitlistener)
endif( LLVM_USE_INTEL_JITEVENTS )

if(TARGET LLVMgold)
  set(LLVM_TEST_DEPENDS ${LLVM_TEST_DEPENDS} LLVMgold)
endif()

if(TARGET LTO)
  set(LLVM_TEST_DEPENDS ${LLVM_TEST_DEPENDS} LTO)
endif()

if (TARGET llvm-mt)
  list(APPEND LLVM_TEST_DEPENDS llvm-mt)
endif ()

if(LLVM_INCLUDE_EXAMPLES)
  list(APPEND LLVM_TEST_DEPENDS
    Kaleidoscope-Ch3
    Kaleidoscope-Ch4
    Kaleidoscope-Ch5
    Kaleidoscope-Ch6
    Kaleidoscope-Ch7
    LLJITWithThinLTOSummaries
    OrcV2CBindingsBasicUsage
    OrcV2CBindingsAddObjectFile
    OrcV2CBindingsRemovableCode
    OrcV2CBindingsLazy
    OrcV2CBindingsVeryLazy
    )
  if(CMAKE_HOST_UNIX AND LLVM_ENABLE_THREADS)
    list(APPEND LLVM_TEST_DEPENDS
      LLJITWithRemoteDebugging
      )
  endif()
  if (NOT WIN32 AND NOT CYGWIN)
    list(APPEND LLVM_TEST_DEPENDS
      Bye
      ExampleIRTransforms
      )
  endif()
endif()

if(TARGET ocaml_llvm)
  # Clear all non-OCaml cross-target dependencies when building out-of-tree.
  if(LLVM_OCAML_OUT_OF_TREE)
    set(LLVM_TEST_DEPENDS)
  endif()

  set(LLVM_TEST_DEPENDS ${LLVM_TEST_DEPENDS}
          ocaml_llvm
          ocaml_llvm_all_backends
          ocaml_llvm_analysis
          ocaml_llvm_bitreader
          ocaml_llvm_bitwriter
          ocaml_llvm_debuginfo
          ocaml_llvm_executionengine
          ocaml_llvm_irreader
          ocaml_llvm_linker
          ocaml_llvm_passbuilder
          ocaml_llvm_target
          ocaml_llvm_transform_utils
        )
endif()

if (LLVM_INCLUDE_DXIL_TESTS)
  list(APPEND LLVM_TEST_DEPENDS dxil-dis)
endif()

if(LLVM_ENABLE_HTTPLIB)
  list(APPEND LLVM_TEST_DEPENDS llvm-debuginfod)
endif()

if (LLVM_INCLUDE_SPIRV_TOOLS_TESTS)
  list(APPEND LLVM_TEST_DEPENDS spirv-dis)
  list(APPEND LLVM_TEST_DEPENDS spirv-val)
  list(APPEND LLVM_TEST_DEPENDS spirv-as)
  list(APPEND LLVM_TEST_DEPENDS spirv-link)
endif()

add_custom_target(llvm-test-depends DEPENDS ${LLVM_TEST_DEPENDS} UnitTests)
set_target_properties(llvm-test-depends PROPERTIES FOLDER "LLVM/Tests")

if(LLVM_BUILD_TOOLS)
  set(exclude_from_check_all "")
else()
  set(exclude_from_check_all "EXCLUDE_FROM_CHECK_ALL")
endif()

add_lit_testsuite(check-llvm "Running the LLVM regression tests"
  ${CMAKE_CURRENT_BINARY_DIR}
  ${exclude_from_check_all}
  DEPENDS ${LLVM_TEST_DEPENDS} UnitTests
  )
set_target_properties(check-llvm PROPERTIES FOLDER "LLVM/Tests")

# Note, exclude TableGen and FileCheck directories as we define them with a
# reduced set of dependencies in their individual CMakeLists.txt
add_lit_testsuites(LLVM ${CMAKE_CURRENT_SOURCE_DIR}
  ${exclude_from_check_all}
  DEPENDS ${LLVM_TEST_DEPENDS}
  FOLDER "Tests/Subdirectories"
  SKIP "^FileCheck" "^TableGen" "^Unit"
  )
add_subdirectory(FileCheck)
add_subdirectory(TableGen)
add_subdirectory(Unit)

# Setup an alias for 'check-all'.
add_custom_target(check)
add_dependencies(check check-all)
set_target_properties(check PROPERTIES FOLDER "LLVM/Tests")
