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

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
INCLUDE(RulesPrecisions)

# Define the list of sources
# --------------------------
SET(MORSE_CONTROL
    ../control/async.c
    ../control/auxiliary.c
    ../control/context.c
    ../control/control.c
    ../control/descriptor.c
    ../control/workspace.c
    ../control/tile.c
    ../control/global.c
    ../control/morse_f77.c
    ../control/morse_mf77.c
#    ../control/morsewinthread.c
   )

# Generate the morse sources for all possible precisions
# ------------------------------------------------------
#SET(MORSE_HDRS_GENERATED "")
#SET(ZHDR
#    zgecfi2.h
#    )
#precisions_rules_py(MORSE_HDRS_GENERATED "${ZHDR}"
#                    PRECISIONS "${MAGMA_MORSE_PRECISION}"
#                    DICTIONARY "MORSE")
#ADD_CUSTOM_TARGET(compute_include ALL SOURCES ${MORSE_HDRS_GENERATED})

# Generate the morse sources for all possible precisions
# ------------------------------------------------------
SET(MORSE_SRCS_GENERATED "")
SET(ZSRC
    ##################
    # BLAS 3
    ##################
    pzgemm.c
    pzhemm.c
    pzher2k.c
    pzherk.c
    pzsymm.c
    pzsyr2k.c
    pzsyrk.c
    pztrmm.c
    pztrsm.c
    pztrsmpl.c
    ###
    zgemm.c
    zhemm.c
    zher2k.c
    zherk.c
    zsymm.c
    zsyr2k.c
    zsyrk.c
    ztrmm.c
    ztrsm.c
    ztrsmpl.c
    ##################
    # LAPACK
    ##################
    pzgeadd.c
    pzgelqf.c
    pzgelqfrh.c
    pzgeqrf.c
    pzgeqrfrh.c
    pzgetrf_incpiv.c
    pzlacpy.c
#    pzlange.c
#    pzlanhe.c
#    pzlansy.c
    pzlaset2.c
    pzlaset.c
    pzlauum.c
    pzplghe.c
    pzplgsy.c
    pzplrnt.c
    pzpotrf.c
    pztrtri.c
    pzunglq.c
    pzunglqrh.c
    pzungqr.c
    pzungqrrh.c
    pzunmlq.c
    pzunmlqrh.c
    pzunmqr.c
    pzunmqrrh.c
    ###
    zgels.c
    zgelqf.c
    zgelqs.c
    zgeqrf.c
    zgeqrs.c
    #zgesv.c
    zgesv_incpiv.c
    #zgetrf.c
    zgetrf_incpiv.c
    zgetrs_incpiv.c
    zlacpy.c
#    zlange.c
#    zlanhe.c
#    zlansy.c
    zlaset.c
    zlauum.c
    zplghe.c
    zplgsy.c
    zplrnt.c
    zposv.c
    zpotrf.c
    zpotri.c
    zpotrs.c
    ztrtri.c
    zunglq.c
    zungqr.c
    zunmlq.c
    zunmqr.c
    ##################
    # MIXED PRECISION
    ##################
    pzlag2c.c
    ###
    #zcgels.c
    #zcgesv.c
    #zcposv.c
    #zcungesv.c
    ##################
    # OTHERS
    ##################
    #pzgebrd_ge2tb.c
    #pzgebrd_tb2bd.c
    #pzgetmi2.c
    #pzgetrf_reclap.c
    #pzgetrf_rectil.c
    #pzhbcpy_t2bl.c
    #pzhegst.c
    #pzherbt.c
    #pzhetrd_hb2st.c
    #pzhetrd_he2hb.c
    #pzlarft_blgtrd.c
    #pzlaswp.c
    #pzlaswpc.c
    #pztrsmrv.c
    #pzunmqr_blgtrd.c
    #########################
    #zgebrd.c
    #zgecfi.c
    #zgecfi2.c
    #zgesvd.c
    #zgetmi.c
    #zgetri.c
    #zgetrs.c
    #zheev.c
    #zheevd.c
    #zhegst.c
    #zhegv.c
    #zhegvd.c
    #zhetrd.c
    #zlaswp.c
    #zlaswpc.c
    #ztrsmrv.c
    ##################
    # CONTROL
    ##################
    #pzshift.c
    #pzpack.c
    pztile.c
    ztile.c
    ../control/workspace_z.c
    ../control/morse_zf77.c
    )

#IF(MORSE_SCHED_QUARK)
#    SET(ZSRC
#        ${ZSRC}
#       )
#ENDIF(MORSE_SCHED_QUARK)

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

SET(MORSE_SRCS
    ${MORSE_CONTROL}
    ${MORSE_SRCS_GENERATED}
   )

ADD_CUSTOM_TARGET(compute_source ALL SOURCES ${MORSE_SRCS})

# Generate the morse fortran sources for all possible precisions
# --------------------------------------------------------------
IF(HAVE_ISO_C_BINDING) 
    SET(MORSE_SRCS_F_GENERATED "")
    SET(ZSRCF
        ../control/morse_zcf90.F90
        ../control/morse_zf90.F90
        ../control/morse_zf90_wrappers.F90
       )
    precisions_rules_py(MORSE_SRCS_F_GENERATED "${ZSRCF}"
                        PRECISIONS "${MAGMA_MORSE_PRECISION}"
                        DICTIONARY "MORSE")

    SET(MORSE_SRCSF
        ../control/morse_f90.f90
        ${MORSE_SRCS_F_GENERATED}
       )
ENDIF(HAVE_ISO_C_BINDING)

# Compile step
# ------------
ADD_LIBRARY(magma_morse ${MORSE_SRCS} ${MORSE_SRCSF})
ADD_DEPENDENCIES(magma_morse coreblas_include)
#ADD_DEPENDENCIES(magma_morse compute_include)
ADD_DEPENDENCIES(magma_morse control_include)
ADD_DEPENDENCIES(magma_morse compute_source)
ADD_DEPENDENCIES(magma_morse morse_include)
SET_PROPERTY(TARGET magma_morse PROPERTY LINKER_LANGUAGE Fortran)
SET_PROPERTY(TARGET magma_morse PROPERTY Fortran_MODULE_DIRECTORY "${CMAKE_BINARY_DIR}/include")

# Dependencies step
# -----------------
FOREACH(_external_package "blas" "cblas" "lapack" "lapacke" "quark" "starpu")
    STRING(TOUPPER "${_external_package}" _NAMEVAR)
    IF(${_NAMEVAR}_EP)
        ADD_DEPENDENCIES(magma_morse ${_external_package}_build)
    ENDIF()
ENDFOREACH()

# installation
# ------------
INSTALL(TARGETS magma_morse
        DESTINATION lib)

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

