cmake_minimum_required(VERSION 3.10.2)
if(MSVC)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
  set_property(GLOBAL PROPERTY USE_FOLDERS ON)
else()
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
endif()

function(add_sample)
  set(options NO_TEST)
  set(one_value_args TARGET)
  set(multi_value_args SOURCES)
  cmake_parse_arguments(ARG
    "${options}"
    "${one_value_args}"
    "${multi_value_args}"
    ${ARGN}
  )
  add_executable(${ARG_TARGET} ${ARG_SOURCES})
  set_property(TARGET ${ARG_TARGET} PROPERTY CXX_STANDARD 14)
  add_sycl_to_target(TARGET ${ARG_TARGET}
    SOURCES ${ARG_SOURCES})
  if(NOT ARG_NO_TEST)
    add_test(NAME ${ARG_TARGET} COMMAND ${ARG_TARGET})
  endif()
  install(TARGETS ${ARG_TARGET} RUNTIME DESTINATION bin)
endfunction(add_sample)

add_sample(TARGET accessors SOURCES accessors.cpp)
add_sample(TARGET async-handler SOURCES async-handler.cpp)
add_sample(TARGET builtin-kernel-example SOURCES builtin-kernel-example.cpp)
add_sample(TARGET example-sycl-application SOURCES example-sycl-application.cpp)
add_sample(TARGET gaussian-blur SOURCES gaussian-blur.cpp NO_TEST)
target_include_directories(gaussian-blur PRIVATE ${PROJECT_SOURCE_DIR}/include)
add_sample(TARGET images SOURCES images.cpp)

add_sample(TARGET matrix-multiply SOURCES matrix-multiply.cpp NO_TEST)
if(COMPUTECPP_SDK_USE_OPENMP)
  find_package(OpenMP REQUIRED)
  target_link_libraries(matrix-multiply PRIVATE OpenMP::OpenMP_CXX)
  add_test(NAME matrix-multiply_omp COMMAND matrix-multiply 64 omp)
endif()
add_test(NAME matrix-multiply_sycl COMMAND matrix-multiply 64 sycl)

add_sample(TARGET ivka SOURCES ivka.cpp)
target_include_directories(ivka PRIVATE ${PROJECT_SOURCE_DIR}/include)
add_sample(TARGET monte-carlo-pi SOURCES monte-carlo-pi.cpp)
add_sample(TARGET opencl-c-interop SOURCES opencl-c-interop.cpp)
add_sample(TARGET parallel-for SOURCES parallel-for.cpp)
add_sample(TARGET placeholder-accessors SOURCES placeholder-accessors.cpp)
add_sample(TARGET reduction SOURCES reduction.cpp)
add_sample(TARGET reinterpret SOURCES reinterpret.cpp)
add_sample(TARGET scan SOURCES scan.cpp)
if (COMPUTECPP_SDK_USE_SUBGROUPS)
  add_sample(TARGET subgroup-scan SOURCES subgroup-scan.cpp)
  set_property(TARGET subgroup-scan PROPERTY CXX_STANDARD 17)
endif()
add_sample(TARGET simple-example-of-vectors SOURCES simple-example-of-vectors.cpp)
add_sample(TARGET simple-local-barrier SOURCES simple-local-barrier.cpp)
add_sample(TARGET simple-private-memory SOURCES simple-private-memory.cpp)
add_sample(TARGET simple-vector-add SOURCES simple-vector-add.cpp)
add_sample(TARGET smart-pointer SOURCES smart-pointer.cpp)
add_sample(TARGET sync-handler SOURCES sync-handler.cpp)
add_sample(TARGET template-function-object SOURCES template-function-object.cpp)
add_sample(TARGET use-onchip-memory SOURCES use-onchip-memory.cpp)
add_sample(TARGET using-function-objects SOURCES using-function-objects.cpp)
# This property is not necessary here, but demonstrates how to use it.
# Forces the integration header to appear after the main code.
set_property(TARGET using-function-objects PROPERTY COMPUTECPP_INCLUDE_AFTER 1)
add_sample(TARGET vector-addition SOURCES vector-addition-examples.cpp)
add_sample(TARGET vector-addition-tiled SOURCES vector-addition-tiled.cpp)
add_sample(TARGET vptr SOURCES vptr.cpp)
target_include_directories(vptr PRIVATE ${PROJECT_SOURCE_DIR}/include)
