#.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} $<$:${OpenCL_INCLUDE_DIRS}> $<$:${BOOST_COMPUTE_INCPATH}>) # Link dependencies target_link_libraries(${ADD_SYCL_ARGS_TARGET} $<$:${OpenCL_LIBRARIES}> Threads::Threads $<$:Boost::log> Boost::chrono) # Compile definitions target_compile_definitions(${ADD_SYCL_ARGS_TARGET} PUBLIC EIGEN_SYCL_TRISYCL $<$:TRISYCL_NO_ASYNC> $<$:TRISYCL_OPENCL> $<$:TRISYCL_DEBUG> $<$:TRISYCL_DEBUG_STRUCTORS> $<$:TRISYCL_TRACE_KERNEL> $<$:BOOST_LOG_DYN_LINK>) # C++ and OpenMP requirements target_compile_options(${ADD_SYCL_ARGS_TARGET} PUBLIC ${TRISYCL_COMPILE_OPTIONS} $<$:${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()