blob: 81042390729788ca8a644e52ba901af74d355120 [file] [log] [blame]
Austin Schuhc55b0172022-02-20 17:52:35 -08001#.rst:
2# FindTriSYCL
3#---------------
4#
5# TODO : insert Copyright and licence
6
7#########################
8# FindTriSYCL.cmake
9#########################
10#
11# Tools for finding and building with TriSYCL.
12#
13# User must define TRISYCL_INCLUDE_DIR pointing to the triSYCL
14# include directory.
15#
16# Latest version of this file can be found at:
17# https://github.com/triSYCL/triSYCL
18
19# Requite CMake version 3.5 or higher
20cmake_minimum_required (VERSION 3.5)
21
22# Check that a supported host compiler can be found
23if(CMAKE_COMPILER_IS_GNUCXX)
24 # Require at least gcc 5.4
25 if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.4)
26 message(FATAL_ERROR
27 "host compiler - Not found! (gcc version must be at least 5.4)")
28 else()
29 message(STATUS "host compiler - gcc ${CMAKE_CXX_COMPILER_VERSION}")
30 endif()
31elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
32 # Require at least clang 3.9
33 if (${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS 3.9)
34 message(FATAL_ERROR
35 "host compiler - Not found! (clang version must be at least 3.9)")
36 else()
37 message(STATUS "host compiler - clang ${CMAKE_CXX_COMPILER_VERSION}")
38 endif()
39else()
40 message(WARNING
41 "host compiler - Not found! (triSYCL supports GCC and Clang)")
42endif()
43
44#triSYCL options
45option(TRISYCL_OPENMP "triSYCL multi-threading with OpenMP" ON)
46option(TRISYCL_OPENCL "triSYCL OpenCL interoperability mode" OFF)
47option(TRISYCL_NO_ASYNC "triSYCL use synchronous kernel execution" OFF)
48option(TRISYCL_DEBUG "triSCYL use debug mode" OFF)
49option(TRISYCL_DEBUG_STRUCTORS "triSYCL trace of object lifetimes" OFF)
50option(TRISYCL_TRACE_KERNEL "triSYCL trace of kernel execution" OFF)
51
52mark_as_advanced(TRISYCL_OPENMP)
53mark_as_advanced(TRISYCL_OPENCL)
54mark_as_advanced(TRISYCL_NO_ASYNC)
55mark_as_advanced(TRISYCL_DEBUG)
56mark_as_advanced(TRISYCL_DEBUG_STRUCTORS)
57mark_as_advanced(TRISYCL_TRACE_KERNEL)
58
59#triSYCL definitions
60set(CL_SYCL_LANGUAGE_VERSION 220 CACHE STRING
61 "Host language version to be used by trisYCL (default is: 220)")
62set(TRISYCL_CL_LANGUAGE_VERSION 220 CACHE STRING
63 "Device language version to be used by trisYCL (default is: 220)")
64# triSYCL now requires c++17
65set(CMAKE_CXX_STANDARD 17)
66set(CXX_STANDARD_REQUIRED ON)
67
68
69# Find OpenCL package
70include(CMakeFindDependencyMacro)
71if(TRISYCL_OPENCL)
72 find_dependency(OpenCL REQUIRED)
73 if(UNIX)
74 set(BOOST_COMPUTE_INCPATH /usr/include/compute CACHE PATH
75 "Path to Boost.Compute headers (default is: /usr/include/compute)")
76 endif()
77endif()
78
79# Find OpenMP package
80if(TRISYCL_OPENMP)
81 find_dependency(OpenMP REQUIRED)
82endif()
83
84# Find Boost
85find_dependency(Boost 1.58 REQUIRED COMPONENTS chrono log)
86
87# If debug or trace we need boost log
88if(TRISYCL_DEBUG OR TRISYCL_DEBUG_STRUCTORS OR TRISYCL_TRACE_KERNEL)
89 set(LOG_NEEDED ON)
90else()
91 set(LOG_NEEDED OFF)
92endif()
93
94find_dependency(Threads REQUIRED)
95
96# Find triSYCL directory
97if (TRISYCL_INCLUDES AND TRISYCL_LIBRARIES)
98 set(TRISYCL_FIND_QUIETLY TRUE)
99endif ()
100
101find_path(TRISYCL_INCLUDE_DIR
102 NAMES sycl.hpp
103 PATHS $ENV{TRISYCLDIR} $ENV{TRISYCLDIR}/include ${INCLUDE_INSTALL_DIR}
104 PATH_SUFFIXES triSYCL
105)
106
107include(FindPackageHandleStandardArgs)
108find_package_handle_standard_args(TriSYCL DEFAULT_MSG
109 TRISYCL_INCLUDE_DIR)
110
111if(NOT TRISYCL_INCLUDE_DIR)
112 message(FATAL_ERROR
113 "triSYCL include directory - Not found! (please set TRISYCL_INCLUDE_DIR")
114else()
115 message(STATUS "triSYCL include directory - Found ${TRISYCL_INCLUDE_DIR}")
116endif()
117
118include(CMakeParseArguments)
119#######################
120# add_sycl_to_target
121#######################
122function(add_sycl_to_target)
123 set(options)
124 set(one_value_args
125 TARGET
126 )
127 set(multi_value_args
128 SOURCES
129 )
130 cmake_parse_arguments(ADD_SYCL_ARGS
131 "${options}"
132 "${one_value_args}"
133 "${multi_value_args}"
134 ${ARGN}
135 )
136
137 # Add include directories to the "#include <>" paths
138 target_include_directories (${ADD_SYCL_ARGS_TARGET} PUBLIC
139 ${TRISYCL_INCLUDE_DIR}
140 ${Boost_INCLUDE_DIRS}
141 $<$<BOOL:${TRISYCL_OPENCL}>:${OpenCL_INCLUDE_DIRS}>
142 $<$<BOOL:${TRISYCL_OPENCL}>:${BOOST_COMPUTE_INCPATH}>)
143
144 # Link dependencies
145 target_link_libraries(${ADD_SYCL_ARGS_TARGET}
146 $<$<BOOL:${TRISYCL_OPENCL}>:${OpenCL_LIBRARIES}>
147 Threads::Threads
148 $<$<BOOL:${LOG_NEEDED}>:Boost::log>
149 Boost::chrono)
150
151 # Compile definitions
152 target_compile_definitions(${ADD_SYCL_ARGS_TARGET} PUBLIC
153 EIGEN_SYCL_TRISYCL
154 $<$<BOOL:${TRISYCL_NO_ASYNC}>:TRISYCL_NO_ASYNC>
155 $<$<BOOL:${TRISYCL_OPENCL}>:TRISYCL_OPENCL>
156 $<$<BOOL:${TRISYCL_DEBUG}>:TRISYCL_DEBUG>
157 $<$<BOOL:${TRISYCL_DEBUG_STRUCTORS}>:TRISYCL_DEBUG_STRUCTORS>
158 $<$<BOOL:${TRISYCL_TRACE_KERNEL}>:TRISYCL_TRACE_KERNEL>
159 $<$<BOOL:${LOG_NEEDED}>:BOOST_LOG_DYN_LINK>)
160
161 # C++ and OpenMP requirements
162 target_compile_options(${ADD_SYCL_ARGS_TARGET} PUBLIC
163 ${TRISYCL_COMPILE_OPTIONS}
164 $<$<BOOL:${TRISYCL_OPENMP}>:${OpenMP_CXX_FLAGS}>)
165
166 if(${TRISYCL_OPENMP} AND (NOT WIN32))
167 # Does not support generator expressions
168 set_target_properties(${ADD_SYCL_ARGS_TARGET}
169 PROPERTIES
170 LINK_FLAGS ${OpenMP_CXX_FLAGS})
171 endif()
172
173endfunction()