cmake_minimum_required(VERSION 3.1)

project(csg-tutorials)

set(PROJECT_VERSION "1.5")

# 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)
  foreach(prog csg_call csg_inverse)
    string(TOUPPER "${prog}" PROG)
    find_program(${PROG} ${prog})
    find_package_handle_standard_args(${PROG} REQUIRED_VARS ${PROG})
    if(NOT ${PROG}_FOUND)
      message(FATAL_ERROR "Could not find ${prog}")
    endif()
  endforeach()
  find_path(VOTCA_PATH csg_stat PATH_SUFFIXES ${CMAKE_INSTALL_BINDIR} bin)
  if(NOT VOTCA_PATH)
    message(FATAL_ERROR "Auto-detectiong failed, we need VOTCA_PATH set for testing!")
  endif()
  if(NOT VOTCA_SHARE)
    execute_process(COMMAND ${CSG_CALL} --show-share OUTPUT_VARIABLE VOTCA_SHARE OUTPUT_STRIP_TRAILING_WHITESPACE)
  endif()
  if(NOT VOTCA_CSG_DEFAULTS)
    set(VOTCA_CSG_DEFAULTS ${VOTCA_SHARE}/xml/csg_defaults.xml)
  endif()
  set(NPROCS 4 CACHE STRING "# processes for testing")
  file(GLOB_RECURSE FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} settings.xml)
  foreach(DIR ${FILES})
    if(DIR MATCHES "(espresso|dlpoly|hoomd|atomistic|single_chain)")
      continue()
    endif()
    if(NOT MDRUN_MPI_FOUND AND DIR MATCHES "gromacs-(multi|remd)")
      continue()
    endif()
    if(NOT LMP_FOUND AND DIR MATCHES "lammps")
      continue()
    endif()
    if(NOT ENABLE_EXPERIMENTAL_TESTS AND DIR MATCHES "imc")
      continue()
    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})
        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 "${DIR}")
    add_test(NAME ${TESTNAME} COMMAND ${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")
    set(CSG_MDRUN_STEPS 500)
    if(DIR MATCHES "/(imc)($|_)")
      set(CSG_MDRUN_STEPS 5000)
    elseif(DIR MATCHES "/cma/")
      set(CSG_MDRUN_STEPS 5000)
    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=mpirun -np ${NPROCS} ${MDRUN_MPI_EXECUTABLE}")
    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(UninstallExists ${CMAKE_COMMAND} -DFileToCheck=${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
           -P ${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/FileExists.cmake) 
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)
