#Define the project we are working on
project(mscomplex3d-core)

# Look for various software we need
cmake_minimum_required(VERSION 2.8.3)

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake)

find_package(OpenCL REQUIRED)

find_package(OpenMP REQUIRED)

find_package(Boost 1.48 COMPONENTS program_options system date_time REQUIRED)

set(OPENCL_NUM_WORK_ITEMS_PER_GROUP 256 CACHE STRING
      "number of work items in an opencl workgroup" )

set(OPENCL_NUM_WORK_GROUPS 32 CACHE STRING
      "number of work items in an opencl workgroup")

include_directories(
  ${Boost_INCLUDE_DIRS}
  ${OPENCL_INCLUDE_DIRS}

  ${CMAKE_CURRENT_BINARY_DIR}
  ${CMAKE_CURRENT_SOURCE_DIR}
  ${CMAKE_CURRENT_SOURCE_DIR}/OpenCL
)

# generate a headerfile/sourcefile containing the shader source code as strings
function(files_to_c_variables headerfilename sourcefilename)
  file(WRITE ${headerfilename} "// this is an automatically generated file\n")
  file(WRITE ${sourcefilename} "// this is an automatically generated file\n")

  foreach(i ${ARGN})
    file(READ ${i} file_str)
    string(REPLACE "\n" "\\n\"\\\n\"" file_str "${file_str}")
    get_filename_component(bn ${i} NAME)
    string(REPLACE "." "_" bn "${bn}")
    string(TOUPPER "${bn}" bn)
    file(APPEND ${headerfilename} "extern const char *${bn}; \n\n")
    file(APPEND ${sourcefilename}        "const char *${bn} = \"${file_str}\";\n\n")
  endforeach(i)

  set_source_files_properties(${sourcefilename} PROPERTIES OBJECT_DEPENDS "${ARGN}")
endfunction(files_to_c_variables)


set(${PROJECT_NAME}_OPENCL_SRCS
    ${CMAKE_CURRENT_SOURCE_DIR}/OpenCL/grid_dataset.clh
    ${CMAKE_CURRENT_SOURCE_DIR}/OpenCL/grid_dataset_assigngradient.cl
    ${CMAKE_CURRENT_SOURCE_DIR}/OpenCL/grid_dataset_markandcollect.cl
    ${CMAKE_CURRENT_SOURCE_DIR}/OpenCL/grid_dataset_ownerextrema.cl
)


files_to_c_variables(
	# These two are generated by this call
    ${CMAKE_CURRENT_BINARY_DIR}/grid_dataset_cl_sources.h
    ${CMAKE_CURRENT_BINARY_DIR}/grid_dataset_cl_sources.cpp
	
	# These are the raw files that are copied to c strings in the above files
	${${PROJECT_NAME}_OPENCL_SRCS})

set(${PROJECT_NAME}_SRCS ${${PROJECT_NAME}_SRCS}

    utl.h
    utl.cpp
    aabb.h
    n_vector.h

    grid.h
    grid.cpp

    grid_dataset.h
    grid_dataset_inl.h
    grid_dataset_base.cpp
    grid_dataset_algs.cpp
    grid_dataset_outcore.cpp

    grid_mscomplex.h
    grid_mscomplex_inl.h
    grid_mscomplex_base.cpp
    grid_mscomplex_algs.cpp
    grid_mscomplex_merge_dag.cpp
    grid_mscomplex_outcore.cpp

    grid_outcore.h
    grid_outcore.cpp

    OpenCL/grid_dataset_cl.h
    OpenCL/grid_dataset_cl.cpp
    OpenCL/cl.hpp
    grid_dataset_cl_sources.h
    grid_dataset_cl_sources.cpp
)


if(OPENMP_FOUND)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif()

set_source_files_properties(OpenCL/grid_dataset_cl.cpp PROPERTIES COMPILE_FLAGS
"-DOPENCL_NUM_WORK_ITEMS_PER_GROUP=${OPENCL_NUM_WORK_ITEMS_PER_GROUP} -DOPENCL_NUM_WORK_GROUPS=${OPENCL_NUM_WORK_GROUPS}")

add_library(${PROJECT_NAME} OBJECT ${${PROJECT_NAME}_SRCS})

option(BUILD_TOOL "command line tool" ON)
if(BUILD_TOOL)
    add_executable(mscomplex3d  $<TARGET_OBJECTS:mscomplex3d-core> main.cpp ${${PROJECT_NAME}_OPENCL_SRCS})
    target_link_libraries(mscomplex3d  ${Boost_LIBRARIES} ${OPENCL_LIBRARIES})
    install(TARGETS mscomplex3d DESTINATION ${MSCOMPLEX3D_INSTALL_DIR_BIN})
endif(BUILD_TOOL)
