cmake_minimum_required(VERSION 3.1)

project(csg-tutorials)

set(PROJECT_VERSION "1.6_rc1")

# Cmake modules/macros are in a subdirectory to keep this file cleaner
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules)

include(GNUInstallDirs)

option(ENABLE_REGRESSION_TESTING "Build and copy regression testing stuff" OFF)
if(ENABLE_REGRESSION_TESTING)
  option(ENABLE_EXPERIMENTAL_TESTS "Run more unstable regression tests as well" OFF)
  enable_testing()
  find_package(LMP)
  find_package(MDRUN_MPI)
  find_package(MPI)
  find_package(ESPRESSO)
  find_package(CMA)
  find_package(VOTCA_CSG NO_MODULE REQUIRED)
  if(DEFINED VOTCA_CSG_VERSION AND NOT VOTCA_CSG_VERSION STREQUAL PROJECT_VERSION)
    message(FATAL_ERROR "Incompatible VOTCA CSG version found (needed ${PROJECT_VERSION}, found ${VOTCA_CSG_VERSION})")
  endif()
  message(STATUS "Found VOTCA_CSG: ${VOTCA_CSG_DIR}")
  get_target_property(VOTCA_PATH VOTCA::csg_call VOTCA_PATH)
  if(TARGET GMX::libgromacs)
    get_target_property(GROMACS_PATH GMX::libgromacs GROMACS_PATH)
    if(GROMACS_PATH)
      set(VOTCA_PATH "${VOTCA_PATH}:${GROMACS_PATH}")
    endif()
  endif()
  get_target_property(VOTCA_SHARE VOTCA::csg_call VOTCASHARE)
  get_target_property(VOTCA_CSG_DEFAULTS VOTCA::csg_inverse VOTCA_CSG_DEFAULTS)
  set(NPROCS 4 CACHE STRING "# processes for testing")
  if(DEFINED MPIEXEC_MAX_NUMPROCS AND NPROCS GREATER MPIEXEC_MAX_NUMPROCS)
     message(WARNING "NPROCS(${NPROCS}) bigger than MPIEXEC_MAX_NUMPROCS(${MPIEXEC_MAX_NUMPROCS}) appending '--oversubscribe'")
     set(MPIEXEC_PREFLAGS "${MPIEXEC_PREFLAGS} --oversubscribe")
  endif()
  file(GLOB_RECURSE FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} settings.xml)
  foreach(DIR ${FILES})
    if(DIR MATCHES "(espressopp|dlpoly|hoomd|atomistic|single_chain)")
      continue()
    endif()
    if(( NOT MDRUN_MPI_FOUND OR NOT MPIEXEC ) AND DIR MATCHES "gromacs-(multi|remd)")
      continue()
    endif()
    if(DIR MATCHES "lammps")
      if(NOT LMP_FOUND)
        continue()
      endif()
    endif()
    if(NOT ESPRESSO_FOUND AND DIR MATCHES "espresso/")
      continue()
    endif()
    if(NOT CMA_FOUND AND DIR MATCHES "cma/")
      continue()
    endif()
    if(NOT ENABLE_EXPERIMENTAL_TESTS)
      if(DIR MATCHES "some/broken/test")
        continue()
      endif()
    endif()
    string(REGEX MATCH ^.*/ DIR ${DIR})
    list(APPEND DIRS ${DIR})
  endforeach(DIR)
  list(REMOVE_DUPLICATES DIRS)
  foreach(DIR ${DIRS})
    if (NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)
      file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${DIR})
      # not recursive to avoid copying in-place step_* dir
      file(GLOB FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${DIR}/*)
      foreach(FILE ${FILES})
        if(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${FILE})
          continue()
        endif()
        execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_CURRENT_SOURCE_DIR}/${FILE} ${CMAKE_CURRENT_BINARY_DIR}/${FILE})
      endforeach(FILE ${FILES})
    endif (NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)
    string(REGEX REPLACE "/$" "" DIR "${DIR}")
    string(REPLACE / _ TESTNAME "regression_${DIR}")
    add_test(NAME ${TESTNAME} COMMAND $<TARGET_FILE:VOTCA::csg_inverse> --options settings.xml --do-iterations 1 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${DIR})
    # run tests for csg (to test csg) and tools (coverage) as well
    set_tests_properties(${TESTNAME} PROPERTIES LABELS "csg-tutorials;csg;tools;votca;regression")
    set(CSG_MDRUN_STEPS 500)
    if(DIR MATCHES "/imc($|_)")
      set(CSG_MDRUN_STEPS 5000)
    elseif(DIR MATCHES "spec/cma/simple")
      set(CSG_MDRUN_STEPS 10000)
    elseif(DIR MATCHES "/cma/")
      set(CSG_MDRUN_STEPS 7500)
    elseif(DIR MATCHES "/(re|simplex)($|_)")
      set(CSG_MDRUN_STEPS 2500)
    endif()
    if(DIR MATCHES "gromacs-(multi|remd)")
      set_property(TEST ${TESTNAME} PROPERTY ENVIRONMENT
        "CSG_RUNTEST=yes;VOTCASHARE=${VOTCA_SHARE};CSG_MDRUN_STEPS=${CSG_MDRUN_STEPS};PATH=${VOTCA_PATH}:$ENV{PATH};VOTCA_CSG_DEFAULTS=${VOTCA_CSG_DEFAULTS}"
        "CSG_MDRUN_CMD=${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} ${NPROCS} ${MPIEXEC_PREFLAGS} ${MDRUN_MPI_EXECUTABLE} ${MPIEXEC_POSTFLAGS}")
    else()
      set_property(TEST ${TESTNAME} PROPERTY ENVIRONMENT "CSG_RUNTEST=yes;VOTCASHARE=${VOTCA_SHARE};CSG_MDRUN_STEPS=${CSG_MDRUN_STEPS};PATH=${VOTCA_PATH}:$ENV{PATH};VOTCA_CSG_DEFAULTS=${VOTCA_CSG_DEFAULTS}")
    endif()
  endforeach(DIR ${DIRS})
  message(STATUS "Use VOTCASHARE=${VOTCA_SHARE} PATH=${VOTCA_PATH}:\$PATH VOTCA_CSG_DEFAULTS=${VOTCA_CSG_DEFAULTS} for out-of-cmake testing")
endif()

install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/ DESTINATION ${CMAKE_INSTALL_DATADIR}/votca/csg-tutorials
	PATTERN ".git*" EXCLUDE PATTERN "step_*" EXCLUDE
	PATTERN "CMake*" EXCLUDE PATTERN "cmake_install.cmake" EXCLUDE
	PATTERN "install_manifest.txt" EXCLUDE PATTERN "*~" EXCLUDE
	PATTERN "inverse.log" EXCLUDE)

configure_file(${CMAKE_MODULE_PATH}/cmake_uninstall.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake IMMEDIATE @ONLY)
option(ENABLE_TESTING "Test if cmake worked" OFF)
if(ENABLE_TESTING)
  enable_testing()
  add_test(regression_UninstallExists ${CMAKE_COMMAND} -DFileToCheck=${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
           -P ${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/FileExists.cmake)

  set_tests_properties(regression_UninstallExists PROPERTIES LABELS "regression")
endif(ENABLE_TESTING)
add_custom_target(uninstall-csg-tutorials COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
if(NOT TARGET uninstall)
  add_custom_target(uninstall)
endif()
add_dependencies(uninstall uninstall-csg-tutorials)
