###
#
#  @file CMakeLists.txt
# 
#  @project MORSE
#  MORSE is a software package provided by:
#     Inria Bordeaux - Sud-Ouest,
#     Univ. of Tennessee,
#     Univ. of California Berkeley,
#     Univ. of Colorado Denver.
# 
#  @version 0.1.0
#  @author Cedric Castagnede
#  @date 13-07-2012
#   
###

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
INCLUDE(RulesPrecisions)

# Looking for testing precision
# -----------------------------
UNSET(TESTING_PRECISION)
IF(BUILD_SINGLE)
    LIST(APPEND TESTING_PRECISION "s")
ENDIF()

IF(BUILD_DOUBLE)
    LIST(APPEND TESTING_PRECISION "d")
ENDIF()

IF(BUILD_COMPLEX)
    LIST(APPEND TESTING_PRECISION "c")
ENDIF()

IF(BUILD_COMPLEX16)
    LIST(APPEND TESTING_PRECISION "z")
ENDIF()


# Check for the subdirectories 
# ----------------------------
#ADD_SUBDIRECTORY(lin)

# Generate the morse auxiliary testing sources for all possible precisions
# ------------------------------------------------------------------------
SET(MAGMA_MORSE_HEADERS_GENERATED "")
SET(ZHDR testing_zauxiliary.h
         )
precisions_rules_py(MAGMA_MORSE_HEADERS_GENERATED "${ZHDR}"
                    PRECISIONS "${MAGMA_MORSE_PRECISION}"
                    DICTIONARY "MORSE")
ADD_CUSTOM_TARGET(testing_include ALL SOURCES ${MAGMA_MORSE_HEADERS_GENERATED})

# Generate the morse testing sources for all possible precisions
# --------------------------------------------------------------
SET(MAGMA_MORSE_SOURCES_GENERATED "")
SET(ZSRC
    testing_zauxiliary.c
    ##################
    # BLAS 3
    ##################
    testing_zgemm.c
    testing_zhemm.c
    testing_zher2k.c
    testing_zherk.c
    testing_zpemv.c
    testing_zsymm.c
    testing_zsyr2k.c
    testing_zsyrk.c
    testing_ztrmm.c
    testing_ztrsm.c
    ##################
    # LAPACK
    ##################
    testing_zgels.c
    #testing_zgesv.c
    testing_zgesv_incpiv.c
    #testing_zgetri.c
    #testing_zlange.c
    testing_zposv.c
    testing_zpotri.c
    ##################
    # MIXED PRECISION
    ##################
    #testing_zcgels.c
    #testing_zcgesv.c
    #testing_zcposv.c
    #testing_zcungesv.c
    ##################
    # OTHERS
    ##################
    #testing_zgecfi.c
    #testing_zgesvd.c
    #testing_zgetmi.c
    #testing_zheev.c
    #testing_zheevd.c
    #testing_zhegst.c
    #testing_zhegv.c
    #testing_zhegvd.c
    )

#IF(MORSE_SCHED_QUARK)
#    SET(ZSRC
#        ${ZSRC}
#        testing_zgels.c
#       )
#ENDIF(MORSE_SCHED_QUARK)

FOREACH(_precision ${MAGMA_MORSE_PRECISION})
    precisions_rules_py(${_precision}SRC_GENERATED "${ZSRC}"
                        PRECISIONS "${_precision}"
                        DICTIONARY "MORSE")
    ADD_CUSTOM_TARGET(${_precision}testing_source ALL SOURCES ${${_precision}SRC_GENERATED})
ENDFOREACH()

# Add include and link directories
# --------------------------------
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})

# Define what libraries we have to link with
# ------------------------------------------
UNSET(libs_for_tests)
LIST(APPEND libs_for_tests magma_morse)

IF(MORSE_SCHED_STARPU)
    LIST(APPEND libs_for_tests morse_starpu)
    LIST(APPEND libs_for_tests ${STARPU_LIBRARIES})
    LIST(APPEND libs_for_tests coreblas)
ELSEIF(MORSE_SCHED_QUARK)
    LIST(APPEND libs_for_tests morse_quark)
    LIST(APPEND libs_for_tests ${QUARK_LIBRARIES})
    LIST(APPEND libs_for_tests coreblas)
ENDIF()

IF(MAGMA)
    LIST(APPEND libs_for_tests magma)
    LIST(APPEND libs_for_tests magmablas)
    LIST(APPEND libs_for_tests magma)
    LIST(APPEND libs_for_tests "${CUDA_LDFLAGS}")
ENDIF()

FOREACH(_dep LAPACKE LAPACK CBLAS BLAS)
    IF(HAVE_${_dep})
        LIST(APPEND libs_for_tests ${${_dep}_LIBRARY})
    ENDIF()
ENDFOREACH()
FOREACH(_dep QUARK HWLOC MPI DL)
    IF(HAVE_${_dep})
        LIST(APPEND libs_for_tests ${${_dep}_LIBRARIES})
    ENDIF()
ENDFOREACH()

LIST(APPEND libs_for_tests ${CMAKE_Fortran_FLAGS})
LIST(APPEND libs_for_tests ${CMAKE_Fortran_LDFLAGS})
LIST(APPEND libs_for_tests ${MORSE_EXTRA_LIBS})

# Create tests
# ------------
FOREACH(_precision ${TESTING_PRECISION})
    ADD_EXECUTABLE(${_precision}testing ${${_precision}SRC_GENERATED})
    ADD_DEPENDENCIES(${_precision}testing ${_precision}testing_source)
    ADD_DEPENDENCIES(${_precision}testing testing_include)
    ADD_DEPENDENCIES(${_precision}testing coreblas_include)
    ADD_DEPENDENCIES(${_precision}testing compute_include)
    ADD_DEPENDENCIES(${_precision}testing control_include)
    ADD_DEPENDENCIES(${_precision}testing morse_include)
    SET_PROPERTY(TARGET ${_precision}testing PROPERTY LINKER_LANGUAGE Fortran)
    TARGET_LINK_LIBRARIES(${_precision}testing ${libs_for_tests})
ENDFOREACH()

# Add tests (C/CPP)
# -----------------
IF(MORSE_SCHED_STARPU)
    # Copy launcher
    ADD_CUSTOM_TARGET(testing_launcher ALL
                     COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/morse_testing_starpu.py
                                                      ${CMAKE_CURRENT_BINARY_DIR}/morse_testing_starpu.py)
    # add test
    ADD_TEST(NAME    morse_testing_starpu
             COMMAND ${PYTHON_EXECUTABLE}
                     ${CMAKE_CURRENT_BINARY_DIR}/morse_testing_starpu.py)
    # install file
    INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/morse_testing_starpu.py
            DESTINATION ${CMAKE_INSTALL_PREFIX}/testing)
ENDIF(MORSE_SCHED_STARPU)

IF(MORSE_SCHED_QUARK)
    # Copy launcher
    ADD_CUSTOM_TARGET(testing_launcher ALL
                     COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/morse_testing_quark.py
                                                      ${CMAKE_CURRENT_BINARY_DIR}/morse_testing_quark.py)
    # add test
    ADD_TEST(NAME    morse_testing_quark
             COMMAND ${PYTHON_EXECUTABLE}
                     ${CMAKE_CURRENT_BINARY_DIR}/morse_testing_quark.py)
    # install file
    INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/morse_testing_quark.py
            DESTINATION ${CMAKE_INSTALL_PREFIX}/testing)
ENDIF(MORSE_SCHED_QUARK)

# Installation
# ------------
FOREACH(_precision ${TESTING_PRECISION})
    INSTALL(TARGETS ${_precision}testing
            DESTINATION ${CMAKE_INSTALL_PREFIX}/testing)
ENDFOREACH()

###
### END CMakeLists.txt
###
