set(POLLY_TEST_DIRECTORIES
  "AffineIterator"
  "ScopInfo"
  "ScheduleOptimizer"
  "CodeGen"
  "OpenMP"
  "polybench"
  "vect")


set(POLLY_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/..")
set(POLLY_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/..")
set(LLVM_SHLIBEXT "${CMAKE_SHARED_MODULE_SUFFIX}")

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

if (NOT DEFINED LLVM_MAIN_SRC_DIR)

  # We are building polly out of tree, adjust the settings.
  # FIXME: FileCheck is not available in llvm install directory at the moment.
  set(LLVM_LIT ${LLVM_INSTALL_ROOT}/bin/llvm-lit)
  set(POLLY_TEST_DEPS LLVMPolly polly-isl-test)
  if (POLLY_GTEST_AVAIL)
    list(APPEND POLLY_TEST_DEPS PollyUnitTests)
  endif ()

  set(LLVM_BINARY_DIR "${LLVM_INSTALL_ROOT}")
  set(LLVM_TOOLS_DIR "${LLVM_INSTALL_ROOT}/bin")
  set(LLVM_LIBS_DIR "${LLVM_INSTALL_ROOT}/lib")
  set(POLLY_LIB_DIR "${POLLY_BINARY_DIR}/lib")

  include(FindPythonInterp)
  if(PYTHONINTERP_FOUND)
    option(POLLY_TEST_DISABLE_BAR "Run Polly tests with --no-progress-bar" OFF)
    set(POLLY_TEST_EXTRA_ARGS)
    if (MSVC OR XCODE OR POLLY_TEST_DISABLE_BAR)
      set(POLLY_TEST_EXTRA_ARGS "--no-progress-bar")
    endif()

    option(POLLY_TEST_USE_VG "Run Polly tests under Valgrind" OFF)
    if(POLLY_TEST_USE_VG)
      set(POLLY_TEST_EXTRA_ARGS ${POLLY_TEST_EXTRA_ARGS} "--vg")
    endif ()

    # Parameters required for lit.site.cfg.in
    set(LLVM_SOURCE_DIR ${LLVM_SOURCE_ROOT})
    if (CMAKE_CFG_INTDIR STREQUAL ".")
      set(LLVM_BUILD_MODE ".")
    else ()
      set(LLVM_BUILD_MODE "%(build_mode)s")
    endif ()
    set(ENABLE_SHARED "1")
    set(SHLIBDIR "${LLVM_BINARY_DIR}/bin")
    set(LINK_POLLY_INTO_TOOLS "OFF")

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

    foreach(testdir ${POLLY_TEST_DIRECTORIES})
      add_custom_target(polly-test-${testdir}
        COMMAND ${LLVM_LIT}
                    --param polly_site_config=${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg
                    --param build_config=${CMAKE_CFG_INTDIR}
                    -sv ${POLLY_TEST_EXTRA_ARGS}
                    ${CMAKE_CURRENT_BINARY_DIR}/${testdir}
                    DEPENDS ${POLLY_TEST_DEPS}
                    COMMENT "Running Polly regression tests in ${testdir}")
      set_target_properties(polly-test-${testdir} PROPERTIES FOLDER "Polly")
    endforeach()

    add_custom_target(check-polly-tests
      COMMAND ${LLVM_LIT}
                  --param polly_site_config=${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg
                  --param polly_unit_site_config=${CMAKE_CURRENT_BINARY_DIR}/Unit/lit.site.cfg
                  --param build_config=${CMAKE_CFG_INTDIR}
                  -sv ${POLLY_TEST_EXTRA_ARGS}
                  ${CMAKE_CURRENT_BINARY_DIR}
                  DEPENDS ${POLLY_TEST_DEPS}
                  COMMENT "Running Polly regression/unit tests")
    set_target_properties(check-polly-tests PROPERTIES FOLDER "Polly")
    add_dependencies(check-polly check-polly-tests)

    if (POLLY_GTEST_AVAIL)
      configure_file(
        ${CMAKE_CURRENT_SOURCE_DIR}/Unit/lit.site.cfg.in
        ${CMAKE_CURRENT_BINARY_DIR}/Unit/lit.site.cfg)

      add_custom_target(check-polly-unittests
        COMMAND ${LLVM_LIT}
                  --param polly_site_config=${CMAKE_CURRENT_BINARY_DIR}/Unit/lit.site.cfg
                  --param build_config=${CMAKE_CFG_INTDIR}
                  -sv ${POLLY_TEST_EXTRA_ARGS}
                  ${CMAKE_CURRENT_BINARY_DIR}/Unit
                  DEPENDS PollyUnitTests
                  COMMENT "Running Polly unit tests")
      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)

    add_custom_target(check-polly-isl
      command ${LLVM_LIT}
                --param polly_site_config=${CMAKE_CURRENT_BINARY_DIR}/UnitIsl/lit.site.cfg
                --param build_config=${CMAKE_CFG_INTDIR}
                -sv ${POLLY_TEST_EXTRA_ARGS}
                ${CMAKE_CURRENT_BINARY_DIR}
                DEPENDS polly-isl-test
                COMMENT "Running isl unit tests")
    set_target_properties(check-polly-isl PROPERTIES FOLDER "Polly")
  endif()

else (NOT DEFINED LLVM_MAIN_SRC_DIR)

  set(LLVM_LIT ${LLVM_TOOLS_BINARY_DIR}/llvm-lit)
  set(POLLY_TEST_DEPS llvm-config opt LLVMPolly FileCheck not polly-isl-test)
  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}")
  set(POLLY_LIB_DIR "${LLVM_LIBS_DIR}")

  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)

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

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

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

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

endif (NOT DEFINED LLVM_MAIN_SRC_DIR)

configure_file(
  ${CMAKE_CURRENT_SOURCE_DIR}/update_check.py
  ${CMAKE_CURRENT_BINARY_DIR}/update_check.py)
file(COPY ${CMAKE_CURRENT_BINARY_DIR}/update_check.py
  DESTINATION ${LLVM_TOOLS_DIR}
  FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ
  GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)

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