| #.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() |