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