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