123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- #.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 VERSION
- "Host language version to be used by trisYCL (default is: 220)")
- set(TRISYCL_CL_LANGUAGE_VERSION 220 CACHE VERSION
- "Device language version to be used by trisYCL (default is: 220)")
- #set(TRISYCL_COMPILE_OPTIONS "-std=c++1z -Wall -Wextra")
- set(CMAKE_CXX_STANDARD 14)
- set(CXX_STANDARD_REQUIRED ON)
- # Find OpenCL package
- if(TRISYCL_OPENCL)
- find_package(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_package(OpenMP REQUIRED)
- endif()
- # Find Boost
- find_package(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_package(Threads REQUIRED)
- # Find triSYCL directory
- 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()
- #######################
- # add_sycl_to_target
- #######################
- #
- # Sets the proper flags and includes for the target compilation.
- #
- # targetName : Name of the target to add a SYCL to.
- # sourceFile : Source file to be compiled for SYCL.
- # binaryDir : Intermediate directory to output the integration header.
- #
- function(add_sycl_to_target targetName sourceFile binaryDir)
- # Add include directories to the "#include <>" paths
- target_include_directories (${targetName} PUBLIC
- ${TRISYCL_INCLUDE_DIR}
- ${Boost_INCLUDE_DIRS}
- $<$<BOOL:${TRISYCL_OPENCL}>:${OpenCL_INCLUDE_DIRS}>
- $<$<BOOL:${TRISYCL_OPENCL}>:${BOOST_COMPUTE_INCPATH}>)
- # Link dependencies
- target_link_libraries(${targetName} PUBLIC
- $<$<BOOL:${TRISYCL_OPENCL}>:${OpenCL_LIBRARIES}>
- Threads::Threads
- $<$<BOOL:${LOG_NEEDED}>:Boost::log>
- Boost::chrono)
- # Compile definitions
- target_compile_definitions(${targetName} PUBLIC
- $<$<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(${targetName} PUBLIC
- ${TRISYCL_COMPILE_OPTIONS}
- $<$<BOOL:${TRISYCL_OPENMP}>:${OpenMP_CXX_FLAGS}>)
- if(${TRISYCL_OPENMP} AND (NOT WIN32))
- # Does not support generator expressions
- set_target_properties(${targetName}
- PROPERTIES
- LINK_FLAGS ${OpenMP_CXX_FLAGS})
- endif()
- endfunction()
|