CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

REMOVE_DEFINITIONS(-std=c++11)
FIND_PACKAGE(CUDA QUIET)
FIND_PACKAGE(OpenCL QUIET)


MACRO(CREATE_TESTS BACKEND GTEST_LIBS OTHER_LIBS)
    STRING(TOUPPER ${BACKEND} DEF_NAME)

    FOREACH(FILE ${FILES})
        GET_FILENAME_COMPONENT(FNAME ${FILE} NAME_WE)
        SET(TEST_NAME ${FNAME}_${BACKEND})

        ADD_TEST(Test_${TEST_NAME} ${TEST_NAME})
        FILE(GLOB TEST_FILE "${FNAME}.cpp" "${FNAME}.c")
        ADD_EXECUTABLE(${TEST_NAME} ${TEST_FILE})
        TARGET_LINK_LIBRARIES(${TEST_NAME}  PRIVATE  af${BACKEND}
                                            PRIVATE ${THREAD_LIB_FLAG}
                                            PRIVATE ${GTEST_LIBS}
                                            PRIVATE ${OTHER_LIBS})

        SET_TARGET_PROPERTIES(${TEST_NAME}
                      PROPERTIES
                      COMPILE_FLAGS -DAF_${DEF_NAME}
                      FOLDER "Tests/${BACKEND}")
    ENDFOREACH()

ENDMACRO(CREATE_TESTS)

FIND_PACKAGE(Threads REQUIRED)
IF(CMAKE_USE_PTHREADS_INIT AND NOT "${APPLE}")
    SET(THREAD_LIB_FLAG "-pthread")
ELSE()
    SET(THREAD_LIB_FLAG ${CMAKE_THREAD_LIBS_INIT})
ENDIF()

OPTION(USE_SYSTEM_GTEST "Use GTEST from system libraries" OFF)
IF(USE_SYSTEM_GTEST)
    FIND_PACKAGE(GTest REQUIRED)
ELSE(USE_SYSTEM_GTEST)
    INCLUDE("${CMAKE_MODULE_PATH}/build_gtest.cmake")
ENDIF(USE_SYSTEM_GTEST)

INCLUDE_DIRECTORIES(${GTEST_INCLUDE_DIRS})

OPTION(USE_RELATIVE_TEST_DIR "Use relative paths for the test data directory(For continious integration(CI) purposes only)" OFF)

IF(${USE_RELATIVE_TEST_DIR})
    SET(RELATIVE_TEST_DATA_DIR "./data" CACHE STRING "Relative Test Data Directory")
    SET(TESTDATA_SOURCE_DIR ${RELATIVE_TEST_DATA_DIR})
ELSE(${USE_RELATIVE_TEST_DIR})
    SET(TESTDATA_SOURCE_DIR "${CMAKE_SOURCE_DIR}/test/data")
ENDIF(${USE_RELATIVE_TEST_DIR})

IF (${CMAKE_GENERATOR} STREQUAL "Xcode")
    ADD_DEFINITIONS("-D TEST_DIR=\"\\\\\"${TESTDATA_SOURCE_DIR}\\\\\"\"")
ELSE (${CMAKE_GENERATOR} STREQUAL "Xcode")
    ADD_DEFINITIONS("-D TEST_DIR=\"\\\"${TESTDATA_SOURCE_DIR}\\\"\"")
ENDIF (${CMAKE_GENERATOR} STREQUAL "Xcode")

IF(NOT ${USE_RELATIVE_TEST_DIR})
# Check if data exists
IF (EXISTS "${TESTDATA_SOURCE_DIR}" AND IS_DIRECTORY "${TESTDATA_SOURCE_DIR}"
    AND EXISTS "${TESTDATA_SOURCE_DIR}/README.md")
    # Test data is available
    # Do Nothing
ELSE (EXISTS "${TESTDATA_SOURCE_DIR}" AND IS_DIRECTORY "${TESTDATA_SOURCE_DIR}"
    AND EXISTS "${TESTDATA_SOURCE_DIR}/README.md")
    MESSAGE(WARNING "Test Data is not available. Tests will build but fail when run.")
    MESSAGE("Did you miss the --recursive option when cloning?")
    MESSAGE("Run the following commands to correct this:")
    MESSAGE("git submodule init")
    MESSAGE("git submodule update")
    MESSAGE("git submodule foreach git pull origin master")
ENDIF()
ENDIF(NOT ${USE_RELATIVE_TEST_DIR})

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
FILE(GLOB FILES "*.cpp" "*.c")

IF(${BUILD_CPU})
    MESSAGE(STATUS "TESTS: CPU backend is ON")
    CREATE_TESTS(cpu "${GTEST_LIBRARIES}" "")
ELSE()
    MESSAGE(STATUS "TESTS: CPU backend is OFF")
ENDIF()

IF(${BUILD_CUDA} AND ${CUDA_FOUND})
    MESSAGE(STATUS "TESTS: CUDA backend is ON")
    IF("${APPLE}" AND ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang" AND ${CUDA_VERSION_MAJOR} VERSION_LESS 7)
        CREATE_TESTS(cuda "${GTEST_LIBRARIES_STDLIB}" "")
        FOREACH(FILE ${FILES})
            GET_FILENAME_COMPONENT(FNAME ${FILE} NAME_WE)
            SET(TEST_NAME ${FNAME}_cuda)
            SET_TARGET_PROPERTIES(${TEST_NAME} PROPERTIES COMPILE_FLAGS -stdlib=libstdc++)
            SET_TARGET_PROPERTIES(${TEST_NAME} PROPERTIES LINK_FLAGS -stdlib=libstdc++)
        ENDFOREACH()
    ELSE("${APPLE}" AND ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang" AND ${CUDA_VERSION_MAJOR} VERSION_LESS 7)
        CREATE_TESTS(cuda "${GTEST_LIBRARIES}" "")
    ENDIF("${APPLE}" AND ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang" AND ${CUDA_VERSION_MAJOR} VERSION_LESS 7)
ELSE()
    MESSAGE(STATUS "TESTS: CUDA backend is OFF")
ENDIF()

IF(${BUILD_OPENCL} AND ${OpenCL_FOUND})
    MESSAGE(STATUS "TESTS: OPENCL backend is ON")
    CREATE_TESTS(opencl "${GTEST_LIBRARIES}" "${OpenCL_LIBRARIES}")
ELSE()
    MESSAGE(STATUS "TESTS: OPENCL backend is OFF")
ENDIF()
