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

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

#############################################
#                                           #
#        Compilation of the MORSE           #
#                                           #
#############################################

# Create ${CMAKE_BINARY_DIR}/include
# ----------------------------------
IF(NOT EXISTS ${CMAKE_BINARY_DIR}/include)
    FILE(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/include)
ENDIF()

# Set the version of this project
# -------------------------------
INCLUDE(BuildSystemTools)
GET_VERSION("MAGMA" "${CMAKE_CURRENT_SOURCE_DIR}/include/magma.h")

# Define pre-processing variables
# -------------------------------
ADD_DEFINITIONS(\"-Dmagma_devptr_t=integer\(kind=${SIZEOF_VOID_PTR}\)\") #"
IF(MAGMA_USE_PLASMA OR HAVE_PLASMA)
    ADD_DEFINITIONS(-DMAGMA_WITH_PLASMA)
ENDIF(MAGMA_USE_PLASMA OR HAVE_PLASMA)

# Define precision supported by MAGMA
# -----------------------------------
SET(MAGMA_PRECISION ${MORSE_PRECISION})

# Define the type of the GPU card
# -------------------------------
UNSET(MAGMA_GPU_OPTS)
LIST(APPEND MAGMA_GPU_OPTS "-ccbin=${CMAKE_C_COMPILER}")

IF(MAGMA_USE_FERMI)
    ADD_DEFINITIONS(-DGPUSHMEM=200)
    LIST(APPEND MAGMA_GPU_OPTS "-arch=sm_20")

ELSE(MAGMA_USE_FERMI)
    ADD_DEFINITIONS(-DGPUSHMEM=130)
    LIST(APPEND MAGMA_GPU_OPTS "-arch=sm_13")
    LIST(APPEND MAGMA_GPU_OPTS "--generate-code")
    LIST(APPEND MAGMA_GPU_OPTS "arch=compute_13,code=compute_13")
    LIST(APPEND MAGMA_GPU_OPTS "--generate-code")
    LIST(APPEND MAGMA_GPU_OPTS "arch=compute_10,code=compute_10")

ENDIF(MAGMA_USE_FERMI)

# Define compilation flags according to the compiler
# --------------------------------------------------
IF(CUDA_FOUND)
    LIST(APPEND CUDA_NVCC_FLAGS ${MAGMA_GPU_OPTS})
    LIST(APPEND CUDA_NVCC_FLAGS "--compiler-options")
    LIST(APPEND CUDA_NVCC_FLAGS "-fno-strict-aliasing")
    LIST(APPEND CUDA_NVCC_FLAGS "-DUNIX")
ENDIF()

# Add MAGMA includes to everything
# --------------------------------
INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/include)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/include)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/control)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/control)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/interface_cuda)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/interface_cuda)

# Check for the subdirectories 
# ----------------------------
ADD_SUBDIRECTORY(include)
ADD_SUBDIRECTORY(src)
ADD_SUBDIRECTORY(magmablas)
IF(MORSE_ENABLE_TESTING)
    ADD_SUBDIRECTORY(testing)
ENDIF()

# Create file magma.pc
# --------------------
GET_VERSION("MAGMA" "${CMAKE_CURRENT_SOURCE_DIR}/include/magma.h")
GENERATE_PKGCONFIG_FILE("MAGMA" "${CMAKE_CURRENT_SOURCE_DIR}/lib/pkgconfig/magma.pc.in")

# Installation
# ------------
INSTALL(DIRECTORY ${CMAKE_BINARY_DIR}/include
        DESTINATION ${CMAKE_INSTALL_PREFIX})

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