MESSAGE(STATUS "MEX file")

set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS 1)

macro( matlab_config )
 if(WIN32)
    message(STATUS "checking MATLAB INC DIR = ${MATLAB_INCLUDE_DIR}" )
    #MATLAB_LIBRARIES
    #MATLAB_MEX_LIBRARY
    #MATLAB_MX_LIBRARY
    #MATLAB_ENG_LIBRARY

    if (CMAKE_SIZEOF_VOID_P MATCHES "8")
		if (CMAKE_CL_64)
			set( LIB_DIR win64 )
			message(STATUS "BUILDING FOR 64 bit Windows" ) 
		else (CMAKE_CL_64)
			message(FATAL_ERROR "FAILURE: BUILDING NO 64BIT GENERATOR SELECTED!")
		endif(CMAKE_CL_64)
    else(CMAKE_SIZEOF_VOID_P MATCHES "8")
        set( LIB_DIR win32 )
        message(STATUS "BUILDING FOR 32 bit Windows" )
    endif(CMAKE_SIZEOF_VOID_P MATCHES "8")

    #SET( MATLAB_ROOT_DIR "C:\\Program Files\\MATLAB\\R2011a" CACHE STRING "")
    SET( MATLAB_INCLUDE_DIR "${MATLAB_ROOT_DIR}\\extern\\include" CACHE STRING "" FORCE )

    find_library(MATLAB_MX_LIBRARY libmx.lib PATHS ${MATLAB_ROOT_DIR} ${MATLAB_ROOT_DIR}/extern/lib/${LIB_DIR}/microsoft )
    find_library(MATLAB_MEX_LIBRARY libmex.lib PATHS ${MATLAB_ROOT_DIR} ${MATLAB_ROOT_DIR}/extern/lib/${LIB_DIR}/microsoft )

    SET( MATLAB_LIBRARIES ${MATLAB_ROOT_DIR}/bin/${LIB_DIR} CACHE STRING "" FORCE )
    SET( MATLAB_ENG_LIBRARY ${MATLAB_ROOT_DIR}/extern/lib/${LIB_DIR}/microsoft CACHE STRING "" FORCE )

  elseif(UNIX AND APPLE)
    # Use values defined by FindMatlab
    SET(MATLAB_INCLUDE_DIR ${Matlab_INCLUDE_DIRS})
    SET(MATLAB_MEX_LIBRARY ${Matlab_MEX_LIBRARY})
    SET(MATLAB_MX_LIBRARY ${Matlab_MX_LIBRARY})
    SET(MATLAB_ENG_LIBRARY ${Matlab_ENG_LIBRARY})
  elseif(UNIX)
    #SET (MATLAB_ROOT_DIR "/usr/local/MATLAB/R2010b")
    SET( MATLAB_INCLUDE_DIR "${MATLAB_ROOT_DIR}/extern/include" CACHE STRING "" FORCE )

    SET(LIBMEX "libmex.so")
    SET(LIBMX "libmx.so")
    SET(LIBENG "libeng.so")

    if (CMAKE_SIZEOF_VOID_P MATCHES "8")
        set( MATLAB_LIB_PATHS "${MATLAB_ROOT_DIR}/bin/glnxa64")
        message(STATUS "BUILDING FOR 64 bit Linux" ) 
    else(CMAKE_SIZEOF_VOID_P MATCHES "8")
        set( MATLAB_LIB_PATHS "${MATLAB_ROOT_DIR}/bin/glnx86")
        message(STATUS "BUILDING FOR 32 bit Linux" )
    endif(CMAKE_SIZEOF_VOID_P MATCHES "8")

    FIND_LIBRARY(MATLAB_MEX_LIBRARY ${LIBMEX} ${MATLAB_LIB_PATHS} NO_DEFAULT_PATH)
    FIND_LIBRARY(MATLAB_MX_LIBRARY ${LIBMX} ${MATLAB_LIB_PATHS} NO_DEFAULT_PATH)
    FIND_LIBRARY(MATLAB_ENG_LIBRARY ${LIBENG} ${MATLAB_LIB_PATHS} NO_DEFAULT_PATH)
    
    SET(MATLAB_LIBRARIES
        ${MATLAB_MEX_LIBRARY}
        ${MATLAB_MX_LIBRARY}
        ${MATLAB_ENG_LIBRARY}  
        )
  endif()
endmacro()

matlab_config()

MESSAGE(STATUS "Using MATLAB MX LIB: ${MATLAB_MX_LIBRARY}")
MESSAGE(STATUS "Using MATLAB MEX LIB: ${MATLAB_MEX_LIBRARY}")
MESSAGE(STATUS "Using MATLAB INC DIR: ${MATLAB_INCLUDE_DIR}")

INCLUDE_DIRECTORIES(${MATLAB_INCLUDE_DIR})

set(MATLAB_SOURCES   ${CMAKE_CURRENT_SOURCE_DIR}/gpuNUFFT_operator_matlabfactory.hpp
										 ${CMAKE_CURRENT_SOURCE_DIR}/gpuNUFFT_operator_matlabfactory.cpp
                     ${MATLAB_HELPER_INCLUDE})

set(MEX_FILE gpuNUFFT_adj.cpp ${MATLAB_SOURCES})
set(MEX_FILE_FORW gpuNUFFT_forw.cpp ${MATLAB_SOURCES})

CUDA_COMPILE( mex_gpuNUFFT_adj_generated ${MEX_FILE} SHARED)
CUDA_COMPILE( mex_gpuNUFFT_forw_generated ${MEX_FILE_FORW} SHARED)

CUDA_ADD_LIBRARY(${GRID_MEX_ADJ_NAME} SHARED ${mex_gpuNUFFT_adj_generated} ${MEX_FILE})
TARGET_LINK_LIBRARIES(${GRID_MEX_ADJ_NAME} ${MATLAB_MEX_LIBRARY} ${MATLAB_MX_LIBRARY} ${CUDA_LIBRARIES} ${GRID_LIB_NAME})
SET_TARGET_PROPERTIES(${GRID_MEX_ADJ_NAME} PROPERTIES PREFIX "" LINKER_LANGUAGE CXX)

CUDA_ADD_LIBRARY(${GRID_MEX_FORW_NAME} SHARED ${mex_gpuNUFFT_forw_generated} ${MEX_FILE_FORW})
TARGET_LINK_LIBRARIES(${GRID_MEX_FORW_NAME} ${MATLAB_MEX_LIBRARY} ${MATLAB_MX_LIBRARY} ${CUDA_LIBRARIES} ${GRID_LIB_NAME})
SET_TARGET_PROPERTIES(${GRID_MEX_FORW_NAME} PROPERTIES PREFIX "" LINKER_LANGUAGE CXX)


#determine mex suffix
if(WIN32)
  if (CMAKE_SIZEOF_VOID_P MATCHES "8")
	MESSAGE(STATUS "set Win 64 suffix")
	SET(MEX_SUFFIX .mexw64)
  else(CMAKE_SIZEOF_VOID_P MATCHES "8")
	MESSAGE(STATUS "set Win 32 suffix")
	SET(MEX_SUFFIX .mexw32)
  endif(CMAKE_SIZEOF_VOID_P MATCHES "8")
elseif(UNIX AND APPLE)
  # Use value defined by FindMatlab
  SET(MEX_SUFFIX ${Matlab_MEX_EXTENSION})
else(UNIX)
  if (CMAKE_SIZEOF_VOID_P MATCHES "8")
	MESSAGE(STATUS "set Linux 64 suffix")
	SET(MEX_SUFFIX .mexa64)
  else()
	MESSAGE(STATUS "set Linux 32 suffix")
    SET(MEX_SUFFIX .mexglx)
  endif(CMAKE_SIZEOF_VOID_P MATCHES "8")
endif()

if(WIN32)
  SET_TARGET_PROPERTIES(${GRID_MEX_ADJ_NAME} PROPERTIES
						SUFFIX ${MEX_SUFFIX}
						LINK_FLAGS /export:mexFunction)
  SET_TARGET_PROPERTIES(${GRID_MEX_FORW_NAME} PROPERTIES
						SUFFIX ${MEX_SUFFIX}
						LINK_FLAGS /export:mexFunction)
else(UNIX)
  SET_TARGET_PROPERTIES(${GRID_MEX_ADJ_NAME} PROPERTIES SUFFIX ${MEX_SUFFIX})
  SET_TARGET_PROPERTIES(${GRID_MEX_FORW_NAME} PROPERTIES SUFFIX ${MEX_SUFFIX})  
endif()

macro(exportMex mexName)
ADD_CUSTOM_COMMAND(TARGET ${mexName}
          POST_BUILD
          COMMAND ${CMAKE_COMMAND} -E copy "${LIBRARY_OUTPUT_PATH}/${mexName}${MEX_SUFFIX}" ${MEX_EXPORT_DIR}
)
endmacro()

exportMex(${GRID_MEX_ADJ_NAME})
exportMex(${GRID_MEX_FORW_NAME})

if(GEN_ATOMIC)
  CUDA_ADD_LIBRARY(${GRID_MEX_ADJ_ATM_NAME} SHARED ${mex_gpuNUFFT_adj_generated} ${MEX_FILE})
  TARGET_LINK_LIBRARIES(${GRID_MEX_ADJ_ATM_NAME} ${MATLAB_MEX_LIBRARY} ${MATLAB_MX_LIBRARY} ${CUDA_LIBRARIES} ${GRID_LIB_ATM_NAME})
  SET_TARGET_PROPERTIES(${GRID_MEX_ADJ_ATM_NAME} PROPERTIES PREFIX "" LINKER_LANGUAGE CXX)

  CUDA_ADD_LIBRARY(${GRID_MEX_FORW_ATM_NAME} SHARED ${mex_gpuNUFFT_forw_generated} ${MEX_FILE_FORW})
  TARGET_LINK_LIBRARIES(${GRID_MEX_FORW_ATM_NAME} ${MATLAB_MEX_LIBRARY} ${MATLAB_MX_LIBRARY} ${CUDA_LIBRARIES} ${GRID_LIB_ATM_NAME})
  SET_TARGET_PROPERTIES(${GRID_MEX_FORW_ATM_NAME} PROPERTIES PREFIX "" LINKER_LANGUAGE CXX)

  if(WIN32)
	SET_TARGET_PROPERTIES(${GRID_MEX_ADJ_ATM_NAME} PROPERTIES
						SUFFIX ${MEX_SUFFIX}
						LINK_FLAGS /export:mexFunction)
	SET_TARGET_PROPERTIES(${GRID_MEX_FORW_ATM_NAME} PROPERTIES
						SUFFIX ${MEX_SUFFIX}
						LINK_FLAGS /export:mexFunction)
  else(UNIX)						
	SET_TARGET_PROPERTIES(${GRID_MEX_ADJ_ATM_NAME} PROPERTIES SUFFIX ${MEX_SUFFIX})
	SET_TARGET_PROPERTIES(${GRID_MEX_FORW_ATM_NAME} PROPERTIES SUFFIX ${MEX_SUFFIX})
  endif()
	exportMex(${GRID_MEX_ADJ_ATM_NAME})
	exportMex(${GRID_MEX_FORW_ATM_NAME})
endif()

ADD_SUBDIRECTORY(precomputation)
