set(LLVM_SHLIBEXT "${CMAKE_SHARED_MODULE_SUFFIX}")

add_custom_target(check-polly)
set_target_properties(check-polly PROPERTIES FOLDER "Polly")

if(NOT LLVM_MAIN_SRC_DIR)
  find_program(LLVM_OPT NAMES opt HINTS ${LLVM_TOOLS_BINARY_DIR})
  find_program(LLVM_FILECHECK NAMES FileCheck HINTS ${LLVM_TOOLS_BINARY_DIR})
  find_program(LLVM_NOT NAMES not HINTS ${LLVM_TOOLS_BINARY_DIR})
  if (NOT LLVM_OPT)
    message(WARNING "LLVM's opt program could not be found. Please set LLVM_OPT.")
  endif()
  if (NOT LLVM_FILECHECK)
    message(WARNING "LLVM's FileCheck program could not be found. "
      "Please set LLVM_FILECHECK. Please set LLVM_FILECHECK.")
  endif()
  if (NOT LLVM_NOT)
    message(WARNING "LLVM's not program could not be found. Please set LLVM_NOT.")
  endif()
  get_filename_component(EXTRA_PATHS ${LLVM_OPT} DIRECTORY)
  list(APPEND POLLY_TEST_EXTRA_PATHS "${EXTRA_PATHS}")
  get_filename_component(EXTRA_PATHS ${LLVM_FILECHECK} DIRECTORY)
  list(APPEND POLLY_TEST_EXTRA_PATHS "${EXTRA_PATHS}")
  get_filename_component(EXTRA_PATHS ${LLVM_NOT} DIRECTORY)
  list(APPEND POLLY_TEST_EXTRA_PATHS "${EXTRA_PATHS}")
  list(REMOVE_DUPLICATES POLLY_TEST_EXTRA_PATHS)
  message(STATUS "Extra paths: ${POLLY_TEST_EXTRA_PATHS}")
  if ("${POLLY_TEST_EXTRA_PATHS}" STREQUAL "${LLVM_TOOLS_BINARY_DIR}")
    set(POLLY_TEST_EXTRA_PATHS "")
  endif()
  set(POLLY_TEST_DEPS LLVMPolly)
else ()
  set(LLVM_OPT "${LLVM_TOOLS_BINARY_DIR}/opt")
  set(LLVM_FILECHECK "${LLVM_TOOLS_BINARY_DIR}/FileCheck")
  set(LLVM_NOT "${LLVM_TOOLS_BINARY_DIR}/not")
  set(POLLY_TEST_EXTRA_PATHS "")
  set(POLLY_TEST_DEPS llvm-config opt LLVMPolly FileCheck not)
endif()

if (POLLY_BUNDLED_ISL)
  list(APPEND POLLY_TEST_DEPS polly-isl-test)
endif()
if (POLLY_GTEST_AVAIL)
  list(APPEND POLLY_TEST_DEPS PollyUnitTests)
endif ()

set(LLVM_BINARY_DIR "${LLVM_BINARY_DIR}")
set(LLVM_TOOLS_DIR "${LLVM_TOOLS_BINARY_DIR}")
set(LLVM_LIBS_DIR "${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}")
if (CMAKE_LIBRARY_OUTPUT_DIRECTORY)
  set(POLLY_LIB_DIR ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
else()
  set(POLLY_LIB_DIR "${POLLY_BINARY_DIR}/lib")
endif()

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

# Run regression and unit tests
add_lit_testsuite(check-polly-tests "Running polly regression tests"
  ${CMAKE_CURRENT_BINARY_DIR}
  PARAMS polly_site_config=${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg
  polly_unit_site_config=${CMAKE_CURRENT_BINARY_DIR}/Unit/lit.site.cfg
  DEPENDS ${POLLY_TEST_DEPS}
  )
set_target_properties(check-polly-tests PROPERTIES FOLDER "Polly")
add_dependencies(check-polly check-polly-tests)

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

if (POLLY_GTEST_AVAIL)
  # Run only unit tests
  add_lit_testsuite(check-polly-unittests "Running polly unit tests only"
    ${CMAKE_CURRENT_BINARY_DIR}/Unit
    PARAMS polly_site_config=${CMAKE_CURRENT_BINARY_DIR}/Unit/lit.site.cfg
    DEPENDS PollyUnitTests
    )
  set_target_properties(check-polly-unittests PROPERTIES FOLDER "Polly")
endif ()

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

if (POLLY_BUNDLED_ISL)
  add_lit_testsuite(check-polly-isl "Running isl unit tests only"
    ${CMAKE_CURRENT_BINARY_DIR}/UnitIsl
    PARAMS polly_site_config=${CMAKE_CURRENT_BINARY_DIR}/UnitIsl/lit.site.cfg
    DEPENDS polly-isl-test
    )
  set_target_properties(check-polly-isl PROPERTIES FOLDER "Polly")
endif (POLLY_BUNDLED_ISL)

# Run polly-check-format as part of polly-check only if we are compiling with
# clang, so clang-format is available.
# if (TARGET clang-format) would be preferable, but this target is only added
# after Polly, i.e. there is no such target yet at this point. The CMake cache
# entry LLVM_TOOL_CLANG_BUILD will only be defined after clang has been
# configured at least once, i.e. format will be checked only after a rerun of
# CMake's configure.
if (LLVM_TOOL_CLANG_BUILD)
  add_dependencies(check-polly polly-check-format)
endif ()

configure_file(
  ${CMAKE_CURRENT_SOURCE_DIR}/update_check.py
  ${CMAKE_CURRENT_BINARY_DIR}/update_check.py)

# Add a legacy target spelling: polly-test
add_custom_target(polly-test)
set_target_properties(polly-test PROPERTIES FOLDER "Polly")
add_dependencies(polly-test check-polly)
