###
#
# @file          : CMakeLists.txt
#
# @description   : Project MORSE
#
# @version       :
# @created by    : Cedric Castagnede
# @creation date : 25-01-2012
# @last modified : mar. 22 mai 2012 10:31:00 CEST
#
###

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
INCLUDE(RulesPrecisions)

# Generate the magma headers for all possible precisions
# ------------------------------------------------------
SET(MORSE_HEADERS_GENERATED "")
SET(ZHDR include/codelet_z.h)

precisions_rules_py(MORSE_HEADERS_GENERATED "${ZHDR}"
                    PRECISIONS "${MAGMA_MORSE_PRECISION}"
                    DICTIONARY "MORSE")

# Define the list of headers
# --------------------------
SET(MORSE_HEADERS
    include/morse_starpu.h
    include/codelets.h
    ${MORSE_HEADERS_GENERATED}
    )

# Force generation of headers
# ---------------------------
ADD_CUSTOM_TARGET(morse_starpu_include ALL SOURCES ${MORSE_HEADERS})

# Generate the morse common for all possible precisions
# -----------------------------------------------------
SET(MORSE_COMMON_GENERATED "")
SET(ZSRC
    control/zprofiling.c
    control/zlocality.c
    )

precisions_rules_py(MORSE_COMMON_GENERATED "${ZSRC}"
                    PRECISIONS "${MAGMA_MORSE_PRECISION}"
                    DICTIONARY "MORSE")

SET(MORSE_COMMON
    control/control.c
    control/context.c
    control/descriptor.c
    control/async.c
    control/options.c
    control/profiling.c
    control/workspace.c
    ../../control/global.c
    ${MORSE_COMMON_GENERATED}
    )

# Generate the morse sources for all possible precisions
# ------------------------------------------------------
SET(MORSE_SRCS_GENERATED "")
SET(ZSRC
    codelets/codelet_zcallback.c
    codelets/codelet_ztile_zero.c
    ##################
    # BLAS 3
    ##################
    codelets/codelet_zgemm.c
    codelets/codelet_zhemm.c
    codelets/codelet_zher2k.c
    codelets/codelet_zherk.c
    codelets/codelet_zsymm.c
    codelets/codelet_zsyr2k.c
    codelets/codelet_zsyrk.c
    codelets/codelet_ztrmm.c
    codelets/codelet_ztrsm.c
    ##################
    # LAPACK
    ##################
    codelets/codelet_zgeadd.c
    codelets/codelet_zgelqt.c
    codelets/codelet_zgeqrt.c
    codelets/codelet_zgessm.c
    codelets/codelet_zgetrf.c
    codelets/codelet_zgetrf_incpiv.c
    codelets/codelet_zlacpy.c
#    codelets/codelet_zlange.c
#    codelets/codelet_zlanhe.c
#    codelets/codelet_zlansy.c
    codelets/codelet_zlaset2.c
    codelets/codelet_zlaset.c
    codelets/codelet_zlauum.c
    codelets/codelet_zplghe.c
    codelets/codelet_zplgsy.c
    codelets/codelet_zplrnt.c
    codelets/codelet_zpotrf.c
    codelets/codelet_zssssm.c
    codelets/codelet_ztrtri.c
    codelets/codelet_ztslqt.c
    codelets/codelet_ztsmlq.c
    codelets/codelet_ztsmqr.c
    codelets/codelet_ztsqrt.c
    codelets/codelet_ztstrf.c
    codelets/codelet_zttlqt.c
    codelets/codelet_zttmlq.c
    codelets/codelet_zttmqr.c
    codelets/codelet_zttqrt.c
    codelets/codelet_zunmlq.c
    codelets/codelet_zunmqr.c
    ##################
    # MIXED PRECISION
    ##################
    #codelets/codelet_zlag2c.c

    ##################
    # OTHERS
    ##################
#    codelets/codelet_zbrdalg.c
#    codelets/codelet_zgbelr.c
#    codelets/codelet_zgblrx.c
#    codelets/codelet_zgbrce.c
#    codelets/codelet_zgessq.c
#    codelets/codelet_zgetrf_reclap.c
#    codelets/codelet_zgetrf_rectil.c
#    codelets/codelet_zgetrip.c
#    codelets/codelet_zhbelr.c
#    codelets/codelet_zhblrx.c
#    codelets/codelet_zhbrce.c
#    codelets/codelet_zhbtype1cb.c
#    codelets/codelet_zhbtype2cb.c
#    codelets/codelet_zhbtype3cb.c
#    codelets/codelet_zhegst.c
#    codelets/codelet_zherfb.c
#    codelets/codelet_zhessq.c
#    codelets/codelet_zlarfb_gemm.c
#    codelets/codelet_zlarfx_tbrd.c
#    codelets/codelet_zlarfy.c
#    codelets/codelet_zlaswp.c
#    codelets/codelet_zlatro.c
#    codelets/codelet_zpamm.c
#    codelets/codelet_zparfb.c
#    codelets/codelet_zplssq.c
#    codelets/codelet_zshift.c
#    codelets/codelet_zswpab.c
#    codelets/codelet_zsyssq.c
#    codelets/codelet_ztrdalg.c
#    codelets/codelet_ztsmlq_corner.c
#    codelets/codelet_ztsmlq_hetra1.c
#    codelets/codelet_ztsmqr_corner.c
#    codelets/codelet_ztsmqr_hetra1.c
#    codelets/codelet_ztsrfb.c
    )

precisions_rules_py(MORSE_SRCS_GENERATED "${ZSRC}"
                    PRECISIONS "${MAGMA_MORSE_PRECISION}"
                    DICTIONARY "MORSE")

SET(MORSE_SRCS ${MORSE_COMMON}
               ${MORSE_SRCS_GENERATED}
               )
ADD_CUSTOM_TARGET(morse_starpu_source ALL SOURCES ${MORSE_SRCS})


# Include directories
# -------------------
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})

# Add library
# -----------
ADD_LIBRARY(morse_starpu ${MORSE_SRCS})
SET_PROPERTY(TARGET morse_starpu PROPERTY LINKER_LANGUAGE Fortran)

ADD_DEPENDENCIES(morse_starpu morse_starpu_source)
ADD_DEPENDENCIES(morse_starpu morse_starpu_include)
ADD_DEPENDENCIES(morse_starpu coreblas_include)
ADD_DEPENDENCIES(morse_starpu compute_include)
ADD_DEPENDENCIES(morse_starpu control_include)
ADD_DEPENDENCIES(morse_starpu morse_include)

FOREACH(_external_package "blas" "cblas" "lapack" "lapacke" "quark" "starpu")
    STRING(TOUPPER "${_external_package}" _NAMEVAR)
    IF(${_NAMEVAR}_EP)
        ADD_DEPENDENCIES(morse_starpu ${_external_package}_build)
    ENDIF()
ENDFOREACH()

# installation
# ------------
INSTALL(TARGETS morse_starpu
        DESTINATION lib)
INSTALL(FILES ${MORSE_HEADERS_GENERATED}
        DESTINATION include)

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