|  | #.rst: | 
|  | # FindTriSYCL | 
|  | #--------------- | 
|  | # | 
|  | # TODO : insert Copyright and licence | 
|  |  | 
|  | ######################### | 
|  | #  FindTriSYCL.cmake | 
|  | ######################### | 
|  | # | 
|  | #  Tools for finding and building with TriSYCL. | 
|  | # | 
|  | #  User must define TRISYCL_INCLUDE_DIR pointing to the triSYCL | 
|  | #  include directory. | 
|  | # | 
|  | #  Latest version of this file can be found at: | 
|  | #    https://github.com/triSYCL/triSYCL | 
|  |  | 
|  | # Requite CMake version 3.5 or higher | 
|  | cmake_minimum_required (VERSION 3.5) | 
|  |  | 
|  | # Check that a supported host compiler can be found | 
|  | if(CMAKE_COMPILER_IS_GNUCXX) | 
|  | # Require at least gcc 5.4 | 
|  | if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.4) | 
|  | message(FATAL_ERROR | 
|  | "host compiler - Not found! (gcc version must be at least 5.4)") | 
|  | else() | 
|  | message(STATUS "host compiler - gcc ${CMAKE_CXX_COMPILER_VERSION}") | 
|  | endif() | 
|  | elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") | 
|  | # Require at least clang 3.9 | 
|  | if (${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS 3.9) | 
|  | message(FATAL_ERROR | 
|  | "host compiler - Not found! (clang version must be at least 3.9)") | 
|  | else() | 
|  | message(STATUS "host compiler - clang ${CMAKE_CXX_COMPILER_VERSION}") | 
|  | endif() | 
|  | else() | 
|  | message(WARNING | 
|  | "host compiler - Not found! (triSYCL supports GCC and Clang)") | 
|  | endif() | 
|  |  | 
|  | #triSYCL options | 
|  | option(TRISYCL_OPENMP "triSYCL multi-threading with OpenMP" ON) | 
|  | option(TRISYCL_OPENCL "triSYCL OpenCL interoperability mode" OFF) | 
|  | option(TRISYCL_NO_ASYNC "triSYCL use synchronous kernel execution" OFF) | 
|  | option(TRISYCL_DEBUG "triSCYL use debug mode" OFF) | 
|  | option(TRISYCL_DEBUG_STRUCTORS "triSYCL trace of object lifetimes" OFF) | 
|  | option(TRISYCL_TRACE_KERNEL "triSYCL trace of kernel execution" OFF) | 
|  |  | 
|  | mark_as_advanced(TRISYCL_OPENMP) | 
|  | mark_as_advanced(TRISYCL_OPENCL) | 
|  | mark_as_advanced(TRISYCL_NO_ASYNC) | 
|  | mark_as_advanced(TRISYCL_DEBUG) | 
|  | mark_as_advanced(TRISYCL_DEBUG_STRUCTORS) | 
|  | mark_as_advanced(TRISYCL_TRACE_KERNEL) | 
|  |  | 
|  | #triSYCL definitions | 
|  | set(CL_SYCL_LANGUAGE_VERSION 220 CACHE STRING | 
|  | "Host language version to be used by trisYCL (default is: 220)") | 
|  | set(TRISYCL_CL_LANGUAGE_VERSION 220 CACHE STRING | 
|  | "Device language version to be used by trisYCL (default is: 220)") | 
|  | # triSYCL now requires c++17 | 
|  | set(CMAKE_CXX_STANDARD 17) | 
|  | set(CXX_STANDARD_REQUIRED ON) | 
|  |  | 
|  |  | 
|  | # Find OpenCL package | 
|  | include(CMakeFindDependencyMacro) | 
|  | if(TRISYCL_OPENCL) | 
|  | find_dependency(OpenCL REQUIRED) | 
|  | if(UNIX) | 
|  | set(BOOST_COMPUTE_INCPATH /usr/include/compute CACHE PATH | 
|  | "Path to Boost.Compute headers (default is: /usr/include/compute)") | 
|  | endif() | 
|  | endif() | 
|  |  | 
|  | # Find OpenMP package | 
|  | if(TRISYCL_OPENMP) | 
|  | find_dependency(OpenMP REQUIRED) | 
|  | endif() | 
|  |  | 
|  | # Find Boost | 
|  | find_dependency(Boost 1.58 REQUIRED COMPONENTS chrono log) | 
|  |  | 
|  | # If debug or trace we need boost log | 
|  | if(TRISYCL_DEBUG OR TRISYCL_DEBUG_STRUCTORS OR TRISYCL_TRACE_KERNEL) | 
|  | set(LOG_NEEDED ON) | 
|  | else() | 
|  | set(LOG_NEEDED OFF) | 
|  | endif() | 
|  |  | 
|  | find_dependency(Threads REQUIRED) | 
|  |  | 
|  | # Find triSYCL directory | 
|  | if (TRISYCL_INCLUDES AND TRISYCL_LIBRARIES) | 
|  | set(TRISYCL_FIND_QUIETLY TRUE) | 
|  | endif () | 
|  |  | 
|  | find_path(TRISYCL_INCLUDE_DIR | 
|  | NAMES sycl.hpp | 
|  | PATHS $ENV{TRISYCLDIR} $ENV{TRISYCLDIR}/include ${INCLUDE_INSTALL_DIR} | 
|  | PATH_SUFFIXES triSYCL | 
|  | ) | 
|  |  | 
|  | include(FindPackageHandleStandardArgs) | 
|  | find_package_handle_standard_args(TriSYCL DEFAULT_MSG | 
|  | TRISYCL_INCLUDE_DIR) | 
|  |  | 
|  | if(NOT TRISYCL_INCLUDE_DIR) | 
|  | message(FATAL_ERROR | 
|  | "triSYCL include directory - Not found! (please set TRISYCL_INCLUDE_DIR") | 
|  | else() | 
|  | message(STATUS "triSYCL include directory - Found ${TRISYCL_INCLUDE_DIR}") | 
|  | endif() | 
|  |  | 
|  | include(CMakeParseArguments) | 
|  | ####################### | 
|  | #  add_sycl_to_target | 
|  | ####################### | 
|  | function(add_sycl_to_target) | 
|  | set(options) | 
|  | set(one_value_args | 
|  | TARGET | 
|  | ) | 
|  | set(multi_value_args | 
|  | SOURCES | 
|  | ) | 
|  | cmake_parse_arguments(ADD_SYCL_ARGS | 
|  | "${options}" | 
|  | "${one_value_args}" | 
|  | "${multi_value_args}" | 
|  | ${ARGN} | 
|  | ) | 
|  |  | 
|  | # Add include directories to the "#include <>" paths | 
|  | target_include_directories (${ADD_SYCL_ARGS_TARGET} PUBLIC | 
|  | ${TRISYCL_INCLUDE_DIR} | 
|  | ${Boost_INCLUDE_DIRS} | 
|  | $<$<BOOL:${TRISYCL_OPENCL}>:${OpenCL_INCLUDE_DIRS}> | 
|  | $<$<BOOL:${TRISYCL_OPENCL}>:${BOOST_COMPUTE_INCPATH}>) | 
|  |  | 
|  | # Link dependencies | 
|  | target_link_libraries(${ADD_SYCL_ARGS_TARGET} | 
|  | $<$<BOOL:${TRISYCL_OPENCL}>:${OpenCL_LIBRARIES}> | 
|  | Threads::Threads | 
|  | $<$<BOOL:${LOG_NEEDED}>:Boost::log> | 
|  | Boost::chrono) | 
|  |  | 
|  | # Compile definitions | 
|  | target_compile_definitions(${ADD_SYCL_ARGS_TARGET} PUBLIC | 
|  | EIGEN_SYCL_TRISYCL | 
|  | $<$<BOOL:${TRISYCL_NO_ASYNC}>:TRISYCL_NO_ASYNC> | 
|  | $<$<BOOL:${TRISYCL_OPENCL}>:TRISYCL_OPENCL> | 
|  | $<$<BOOL:${TRISYCL_DEBUG}>:TRISYCL_DEBUG> | 
|  | $<$<BOOL:${TRISYCL_DEBUG_STRUCTORS}>:TRISYCL_DEBUG_STRUCTORS> | 
|  | $<$<BOOL:${TRISYCL_TRACE_KERNEL}>:TRISYCL_TRACE_KERNEL> | 
|  | $<$<BOOL:${LOG_NEEDED}>:BOOST_LOG_DYN_LINK>) | 
|  |  | 
|  | # C++ and OpenMP requirements | 
|  | target_compile_options(${ADD_SYCL_ARGS_TARGET} PUBLIC | 
|  | ${TRISYCL_COMPILE_OPTIONS} | 
|  | $<$<BOOL:${TRISYCL_OPENMP}>:${OpenMP_CXX_FLAGS}>) | 
|  |  | 
|  | if(${TRISYCL_OPENMP} AND (NOT WIN32)) | 
|  | # Does not support generator expressions | 
|  | set_target_properties(${ADD_SYCL_ARGS_TARGET} | 
|  | PROPERTIES | 
|  | LINK_FLAGS ${OpenMP_CXX_FLAGS}) | 
|  | endif() | 
|  |  | 
|  | endfunction() |