#------------------------------------------------------------------------------
# CMake config file for Reduze package
# subdir 'check'
#------------------------------------------------------------------------------

add_custom_target(copy_check_files COMMENT "copy files needed for check")

macro(add_check_files SRC_DIR PATTERN)
  set(DEST_DIR "${CMAKE_CURRENT_BINARY_DIR}")

  file(GLOB_RECURSE COPY_FILES RELATIVE ${SRC_DIR} "${SRC_DIR}/${PATTERN}")
  foreach(FILENAME ${COPY_FILES})
    set(SKIP FALSE)
    if ("${SRC_DIR}/${FILENAME}" MATCHES ".*/[.]svn.*")
      set(SKIP TRUE)
    endif ("${SRC_DIR}/${FILENAME}" MATCHES ".*/[.]svn.*")
    if (NOT SKIP)
      #message (STATUS "Copying file " ${FILENAME})
      if (IS_DIRECTORY ${FILENAME})
        add_custom_command(TARGET copy_check_files COMMAND ${CMAKE_COMMAND}
           -E make_directory "${DEST_DIR}/${FILENAME}")
	  else (IS_DIRECTORY ${FILENAME})
        add_custom_command(TARGET copy_check_files COMMAND ${CMAKE_COMMAND}
           -E copy "${SRC_DIR}/${FILENAME}" "${DEST_DIR}/${FILENAME}")
	  endif (IS_DIRECTORY ${FILENAME})
    endif (NOT SKIP)
  endforeach(FILENAME)
endmacro(add_check_files)

add_check_files(${CMAKE_CURRENT_SOURCE_DIR} "*")
add_check_files("${PROJECT_SOURCE_DIR}/example" "*")


set(CMD "${CMAKE_BINARY_DIR}/reduze/reduze")

set(DIR "${CMAKE_CURRENT_BINARY_DIR}/1_reductions")

add_custom_target (check_1 COMMENT "check 1 - non-MPI mode")
add_custom_command(TARGET check_1 COMMAND "${CMD}" "jobs_reduction.yaml" ">run.log" WORKING_DIRECTORY "${DIR}")
add_custom_command(TARGET check_1 COMMAND "${CMD}" "jobs_verify.yaml" ">>run.log" WORKING_DIRECTORY "${DIR}")
add_dependencies (check_1 reduze copy_check_files)

if (USE_MPI)
add_custom_target (check_1_mpi COMMENT "check 1 - MPI mode")
add_custom_command(TARGET check_1_mpi COMMAND ${MPIEXEC} -np 4 "${CMD}" "jobs_reduction.yaml" ">run.log" WORKING_DIRECTORY "${DIR}")
add_custom_command(TARGET check_1_mpi COMMAND ${MPIEXEC} -np 2 "${CMD}" "jobs_verify.yaml" ">>run.log" WORKING_DIRECTORY "${DIR}")
add_dependencies (check_1_mpi reduze copy_check_files)
endif (USE_MPI)

set(DIR "${CMAKE_CURRENT_BINARY_DIR}/2_diagrams")

add_custom_target (check_2 COMMENT "check 2 - non-MPI mode")
add_custom_command(TARGET check_2 COMMAND ${CMAKE_COMMAND} -E make_directory "${DIR}/myresults")
add_custom_command(TARGET check_2 COMMAND ${CMAKE_COMMAND} -E make_directory "${DIR}/mytmp")
add_custom_command(TARGET check_2 COMMAND "${CMD}" "myjobs/jobs_1_setup.yaml" ">run.log" WORKING_DIRECTORY "${DIR}")
add_custom_command(TARGET check_2 COMMAND "${CMD}" "myjobs/jobs_2_diamatches.yaml" ">>run.log" WORKING_DIRECTORY "${DIR}")
add_custom_command(TARGET check_2 COMMAND "${CMD}" "myjobs/jobs_3_printinfo.yaml" ">>run.log" WORKING_DIRECTORY "${DIR}")
add_custom_command(TARGET check_2 COMMAND "${CMD}" "myjobs/jobs_4_interference.yaml" ">>run.log" WORKING_DIRECTORY "${DIR}")
add_custom_command(TARGET check_2 COMMAND "${CMD}" "myjobs/jobs_5_reduction.yaml" ">>run.log" WORKING_DIRECTORY "${DIR}")
add_custom_command(TARGET check_2 COMMAND "${CMD}" "myjobs/jobs_6_insert.yaml" ">>run.log" WORKING_DIRECTORY "${DIR}")
add_dependencies (check_2 reduze copy_check_files)

if (USE_MPI)
add_custom_target (check_2_mpi COMMENT "check 2 - MPI mode")
add_custom_command(TARGET check_2_mpi COMMAND ${CMAKE_COMMAND} -E make_directory "${DIR}/myresults")
add_custom_command(TARGET check_2_mpi COMMAND ${CMAKE_COMMAND} -E make_directory "${DIR}/mytmp")
add_custom_command(TARGET check_2_mpi COMMAND ${MPIEXEC} -np 4 "${CMD}" "myjobs/jobs_1_setup.yaml" ">run.log" WORKING_DIRECTORY "${DIR}")
add_custom_command(TARGET check_2_mpi COMMAND ${MPIEXEC} -np 4 "${CMD}" "myjobs/jobs_2_diamatches.yaml" ">>run.log" WORKING_DIRECTORY "${DIR}")
add_custom_command(TARGET check_2_mpi COMMAND ${MPIEXEC} -np 4 "${CMD}" "myjobs/jobs_3_printinfo.yaml" ">>run.log" WORKING_DIRECTORY "${DIR}")
add_custom_command(TARGET check_2_mpi COMMAND ${MPIEXEC} -np 4 "${CMD}" "myjobs/jobs_4_interference.yaml" ">>run.log" WORKING_DIRECTORY "${DIR}")
add_custom_command(TARGET check_2_mpi COMMAND ${MPIEXEC} -np 4 "${CMD}" "myjobs/jobs_5_reduction.yaml" ">>run.log" WORKING_DIRECTORY "${DIR}")
add_custom_command(TARGET check_2_mpi COMMAND ${MPIEXEC} -np 4 "${CMD}" "myjobs/jobs_6_insert.yaml" ">>run.log" WORKING_DIRECTORY "${DIR}")
add_dependencies (check_2_mpi reduze copy_check_files)
endif (USE_MPI)

set(DIR "${CMAKE_CURRENT_BINARY_DIR}/3_masters")

add_custom_target (check_3 COMMENT "check 3 - non-MPI mode")
add_custom_command(TARGET check_3 COMMAND ${CMAKE_COMMAND} -E make_directory "${DIR}/myresults")
add_custom_command(TARGET check_3 COMMAND ${CMAKE_COMMAND} -E make_directory "${DIR}/mytmp")
add_custom_command(TARGET check_3 COMMAND "${CMD}" "jobs_1_reduction.yaml" ">run.log" WORKING_DIRECTORY "${DIR}")
add_custom_command(TARGET check_3 COMMAND "${CMD}" "jobs_2_deq.yaml" ">>run.log" WORKING_DIRECTORY "${DIR}")
add_dependencies (check_3 reduze copy_check_files)

if (USE_MPI)
add_custom_target (check_3_mpi COMMENT "check 3 - MPI mode")
add_custom_command(TARGET check_3_mpi COMMAND ${CMAKE_COMMAND} -E make_directory "${DIR}/myresults")
add_custom_command(TARGET check_3_mpi COMMAND ${CMAKE_COMMAND} -E make_directory "${DIR}/mytmp")
add_custom_command(TARGET check_3_mpi COMMAND ${MPIEXEC} -np 4 "${CMD}" "jobs_1_reduction.yaml" ">run.log" WORKING_DIRECTORY "${DIR}")
add_custom_command(TARGET check_3_mpi COMMAND ${MPIEXEC} -np 4 "${CMD}" "jobs_2_deq.yaml" ">>run.log" WORKING_DIRECTORY "${DIR}")
add_dependencies (check_3_mpi reduze copy_check_files)
endif (USE_MPI)

set(DIR "${CMAKE_CURRENT_BINARY_DIR}")

add_custom_target (check COMMENT "check non-MPI mode")
add_custom_command(TARGET check COMMAND make check_1 WORKING_DIRECTORY "${DIR}")
add_custom_command(TARGET check COMMAND make check_2 WORKING_DIRECTORY "${DIR}")
add_custom_command(TARGET check COMMAND make check_3 WORKING_DIRECTORY "${DIR}")
#add_dependencies (check check_1 check_2 check_3) # arbitrary order of execution

if (USE_MPI)
add_custom_target (check_mpi COMMENT "check MPI mode")
add_custom_command(TARGET check_mpi COMMAND make check_1_mpi WORKING_DIRECTORY "${DIR}")
add_custom_command(TARGET check_mpi COMMAND make check_2_mpi WORKING_DIRECTORY "${DIR}")
add_custom_command(TARGET check_mpi COMMAND make check_3_mpi WORKING_DIRECTORY "${DIR}")
#add_dependencies (check_mpi check_1_mpi check_2_mpi check_3_mpi) # arbitrary order of execution
endif (USE_MPI)

#unused: idea for coexisting 'check' target and CTest test
#add_test (ReductionTest "check.sh")
#add_custom_target (check COMMAND ${CMAKE_CTEST_COMMAND})
