xref: /aosp_15_r20/external/eigen/cmake/FindComputeCpp.cmake (revision bf2c37156dfe67e5dfebd6d394bad8b2ab5804d4)
1*bf2c3715SXin Li#.rst:
2*bf2c3715SXin Li# FindComputeCpp
3*bf2c3715SXin Li#---------------
4*bf2c3715SXin Li#
5*bf2c3715SXin Li#   Copyright 2016-2018 Codeplay Software Ltd.
6*bf2c3715SXin Li#
7*bf2c3715SXin Li#   Licensed under the Apache License, Version 2.0 (the "License");
8*bf2c3715SXin Li#   you may not use these files except in compliance with the License.
9*bf2c3715SXin Li#   You may obtain a copy of the License at
10*bf2c3715SXin Li#
11*bf2c3715SXin Li#       http://www.apache.org/licenses/LICENSE-2.0
12*bf2c3715SXin Li#
13*bf2c3715SXin Li#
14*bf2c3715SXin Li#   Unless required by applicable law or agreed to in writing, software
15*bf2c3715SXin Li#   distributed under the License is distributed on an "AS IS" BASIS,
16*bf2c3715SXin Li#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17*bf2c3715SXin Li#   See the License for the specific language governing permissions and
18*bf2c3715SXin Li#   limitations under the License.
19*bf2c3715SXin Li
20*bf2c3715SXin Li#########################
21*bf2c3715SXin Li#  FindComputeCpp.cmake
22*bf2c3715SXin Li#########################
23*bf2c3715SXin Li#
24*bf2c3715SXin Li#  Tools for finding and building with ComputeCpp.
25*bf2c3715SXin Li#
26*bf2c3715SXin Li#  User must define ComputeCpp_DIR pointing to the ComputeCpp
27*bf2c3715SXin Li#  installation.
28*bf2c3715SXin Li#
29*bf2c3715SXin Li#  Latest version of this file can be found at:
30*bf2c3715SXin Li#    https://github.com/codeplaysoftware/computecpp-sdk
31*bf2c3715SXin Li
32*bf2c3715SXin Licmake_minimum_required(VERSION 3.4.3)
33*bf2c3715SXin Liinclude(FindPackageHandleStandardArgs)
34*bf2c3715SXin Liinclude(ComputeCppIRMap)
35*bf2c3715SXin Li
36*bf2c3715SXin Liset(COMPUTECPP_USER_FLAGS "" CACHE STRING "User flags for compute++")
37*bf2c3715SXin Liseparate_arguments(COMPUTECPP_USER_FLAGS)
38*bf2c3715SXin Limark_as_advanced(COMPUTECPP_USER_FLAGS)
39*bf2c3715SXin Li
40*bf2c3715SXin Liset(COMPUTECPP_BITCODE "spir64" CACHE STRING
41*bf2c3715SXin Li  "Bitcode type to use as SYCL target in compute++")
42*bf2c3715SXin Limark_as_advanced(COMPUTECPP_BITCODE)
43*bf2c3715SXin Li
44*bf2c3715SXin Liinclude(CMakeFindDependencyMacro)
45*bf2c3715SXin Lifind_dependency(OpenCL REQUIRED)
46*bf2c3715SXin Li
47*bf2c3715SXin Li# Find ComputeCpp package
48*bf2c3715SXin Li
49*bf2c3715SXin Liif(DEFINED ComputeCpp_DIR)
50*bf2c3715SXin Li  set(computecpp_find_hint ${ComputeCpp_DIR})
51*bf2c3715SXin Lielseif(DEFINED ENV{COMPUTECPP_DIR})
52*bf2c3715SXin Li  set(computecpp_find_hint $ENV{COMPUTECPP_DIR})
53*bf2c3715SXin Liendif()
54*bf2c3715SXin Li
55*bf2c3715SXin Li# Used for running executables on the host
56*bf2c3715SXin Liset(computecpp_host_find_hint ${computecpp_find_hint})
57*bf2c3715SXin Li
58*bf2c3715SXin Liif(CMAKE_CROSSCOMPILING)
59*bf2c3715SXin Li  # ComputeCpp_HOST_DIR is used to find executables that are run on the host
60*bf2c3715SXin Li  if(DEFINED ComputeCpp_HOST_DIR)
61*bf2c3715SXin Li    set(computecpp_host_find_hint ${ComputeCpp_HOST_DIR})
62*bf2c3715SXin Li  elseif(DEFINED ENV{COMPUTECPP_HOST_DIR})
63*bf2c3715SXin Li    set(computecpp_host_find_hint $ENV{COMPUTECPP_HOST_DIR})
64*bf2c3715SXin Li  endif()
65*bf2c3715SXin Liendif()
66*bf2c3715SXin Li
67*bf2c3715SXin Lifind_program(ComputeCpp_DEVICE_COMPILER_EXECUTABLE compute++
68*bf2c3715SXin Li  HINTS ${computecpp_host_find_hint}
69*bf2c3715SXin Li  PATH_SUFFIXES bin
70*bf2c3715SXin Li  NO_SYSTEM_ENVIRONMENT_PATH)
71*bf2c3715SXin Li
72*bf2c3715SXin Lifind_program(ComputeCpp_INFO_EXECUTABLE computecpp_info
73*bf2c3715SXin Li  HINTS ${computecpp_host_find_hint}
74*bf2c3715SXin Li  PATH_SUFFIXES bin
75*bf2c3715SXin Li  NO_SYSTEM_ENVIRONMENT_PATH)
76*bf2c3715SXin Li
77*bf2c3715SXin Lifind_library(COMPUTECPP_RUNTIME_LIBRARY
78*bf2c3715SXin Li  NAMES ComputeCpp ComputeCpp_vs2015
79*bf2c3715SXin Li  HINTS ${computecpp_find_hint}
80*bf2c3715SXin Li  PATH_SUFFIXES lib
81*bf2c3715SXin Li  DOC "ComputeCpp Runtime Library")
82*bf2c3715SXin Li
83*bf2c3715SXin Lifind_library(COMPUTECPP_RUNTIME_LIBRARY_DEBUG
84*bf2c3715SXin Li  NAMES ComputeCpp_d ComputeCpp ComputeCpp_vs2015_d
85*bf2c3715SXin Li  HINTS ${computecpp_find_hint}
86*bf2c3715SXin Li  PATH_SUFFIXES lib
87*bf2c3715SXin Li  DOC "ComputeCpp Debug Runtime Library")
88*bf2c3715SXin Li
89*bf2c3715SXin Lifind_path(ComputeCpp_INCLUDE_DIRS
90*bf2c3715SXin Li  NAMES "CL/sycl.hpp"
91*bf2c3715SXin Li  HINTS ${computecpp_find_hint}/include
92*bf2c3715SXin Li  DOC "The ComputeCpp include directory")
93*bf2c3715SXin Liget_filename_component(ComputeCpp_INCLUDE_DIRS ${ComputeCpp_INCLUDE_DIRS} ABSOLUTE)
94*bf2c3715SXin Li
95*bf2c3715SXin Liget_filename_component(computecpp_canonical_root_dir "${ComputeCpp_INCLUDE_DIRS}/.." ABSOLUTE)
96*bf2c3715SXin Liset(ComputeCpp_ROOT_DIR "${computecpp_canonical_root_dir}" CACHE PATH
97*bf2c3715SXin Li    "The root of the ComputeCpp install")
98*bf2c3715SXin Li
99*bf2c3715SXin Liif(NOT ComputeCpp_INFO_EXECUTABLE)
100*bf2c3715SXin Li  message(WARNING "Can't find computecpp_info - check ComputeCpp_DIR")
101*bf2c3715SXin Lielse()
102*bf2c3715SXin Li  execute_process(COMMAND ${ComputeCpp_INFO_EXECUTABLE} "--dump-version"
103*bf2c3715SXin Li    OUTPUT_VARIABLE ComputeCpp_VERSION
104*bf2c3715SXin Li    RESULT_VARIABLE ComputeCpp_INFO_EXECUTABLE_RESULT OUTPUT_STRIP_TRAILING_WHITESPACE)
105*bf2c3715SXin Li  if(NOT ComputeCpp_INFO_EXECUTABLE_RESULT EQUAL "0")
106*bf2c3715SXin Li    message(WARNING "Package version - Error obtaining version!")
107*bf2c3715SXin Li  endif()
108*bf2c3715SXin Li
109*bf2c3715SXin Li  execute_process(COMMAND ${ComputeCpp_INFO_EXECUTABLE} "--dump-is-supported"
110*bf2c3715SXin Li    OUTPUT_VARIABLE COMPUTECPP_PLATFORM_IS_SUPPORTED
111*bf2c3715SXin Li    RESULT_VARIABLE ComputeCpp_INFO_EXECUTABLE_RESULT OUTPUT_STRIP_TRAILING_WHITESPACE)
112*bf2c3715SXin Li  if(NOT ComputeCpp_INFO_EXECUTABLE_RESULT EQUAL "0")
113*bf2c3715SXin Li    message(WARNING "platform - Error checking platform support!")
114*bf2c3715SXin Li  else()
115*bf2c3715SXin Li    mark_as_advanced(COMPUTECPP_PLATFORM_IS_SUPPORTED)
116*bf2c3715SXin Li    if (COMPUTECPP_PLATFORM_IS_SUPPORTED)
117*bf2c3715SXin Li      message(STATUS "platform - your system can support ComputeCpp")
118*bf2c3715SXin Li    else()
119*bf2c3715SXin Li      message(STATUS "platform - your system is not officially supported")
120*bf2c3715SXin Li    endif()
121*bf2c3715SXin Li  endif()
122*bf2c3715SXin Liendif()
123*bf2c3715SXin Li
124*bf2c3715SXin Lifind_package_handle_standard_args(ComputeCpp
125*bf2c3715SXin Li  REQUIRED_VARS ComputeCpp_ROOT_DIR
126*bf2c3715SXin Li                ComputeCpp_DEVICE_COMPILER_EXECUTABLE
127*bf2c3715SXin Li                ComputeCpp_INFO_EXECUTABLE
128*bf2c3715SXin Li                COMPUTECPP_RUNTIME_LIBRARY
129*bf2c3715SXin Li                COMPUTECPP_RUNTIME_LIBRARY_DEBUG
130*bf2c3715SXin Li                ComputeCpp_INCLUDE_DIRS
131*bf2c3715SXin Li  VERSION_VAR ComputeCpp_VERSION)
132*bf2c3715SXin Limark_as_advanced(ComputeCpp_ROOT_DIR
133*bf2c3715SXin Li                 ComputeCpp_DEVICE_COMPILER_EXECUTABLE
134*bf2c3715SXin Li                 ComputeCpp_INFO_EXECUTABLE
135*bf2c3715SXin Li                 COMPUTECPP_RUNTIME_LIBRARY
136*bf2c3715SXin Li                 COMPUTECPP_RUNTIME_LIBRARY_DEBUG
137*bf2c3715SXin Li                 ComputeCpp_INCLUDE_DIRS
138*bf2c3715SXin Li                 ComputeCpp_VERSION)
139*bf2c3715SXin Li
140*bf2c3715SXin Liif(NOT ComputeCpp_FOUND)
141*bf2c3715SXin Li  return()
142*bf2c3715SXin Liendif()
143*bf2c3715SXin Li
144*bf2c3715SXin Lilist(APPEND COMPUTECPP_DEVICE_COMPILER_FLAGS -O2 -mllvm -inline-threshold=1000 -intelspirmetadata)
145*bf2c3715SXin Limark_as_advanced(COMPUTECPP_DEVICE_COMPILER_FLAGS)
146*bf2c3715SXin Li
147*bf2c3715SXin Liif(CMAKE_CROSSCOMPILING)
148*bf2c3715SXin Li  if(NOT COMPUTECPP_DONT_USE_TOOLCHAIN)
149*bf2c3715SXin Li    list(APPEND COMPUTECPP_DEVICE_COMPILER_FLAGS --gcc-toolchain=${COMPUTECPP_TOOLCHAIN_DIR})
150*bf2c3715SXin Li  endif()
151*bf2c3715SXin Li  list(APPEND COMPUTECPP_DEVICE_COMPILER_FLAGS --sysroot=${COMPUTECPP_SYSROOT_DIR})
152*bf2c3715SXin Li  list(APPEND COMPUTECPP_DEVICE_COMPILER_FLAGS -target ${COMPUTECPP_TARGET_TRIPLE})
153*bf2c3715SXin Liendif()
154*bf2c3715SXin Li
155*bf2c3715SXin Lilist(APPEND COMPUTECPP_DEVICE_COMPILER_FLAGS -sycl-target ${COMPUTECPP_BITCODE})
156*bf2c3715SXin Limessage(STATUS "compute++ flags - ${COMPUTECPP_DEVICE_COMPILER_FLAGS}")
157*bf2c3715SXin Li
158*bf2c3715SXin Liinclude(ComputeCppCompilerChecks)
159*bf2c3715SXin Li
160*bf2c3715SXin Liif(NOT TARGET OpenCL::OpenCL)
161*bf2c3715SXin Li  add_library(OpenCL::OpenCL UNKNOWN IMPORTED)
162*bf2c3715SXin Li  set_target_properties(OpenCL::OpenCL PROPERTIES
163*bf2c3715SXin Li    IMPORTED_LOCATION             "${OpenCL_LIBRARIES}"
164*bf2c3715SXin Li    INTERFACE_INCLUDE_DIRECTORIES "${OpenCL_INCLUDE_DIRS}"
165*bf2c3715SXin Li  )
166*bf2c3715SXin Liendif()
167*bf2c3715SXin Li
168*bf2c3715SXin Liif(NOT TARGET ComputeCpp::ComputeCpp)
169*bf2c3715SXin Li  add_library(ComputeCpp::ComputeCpp UNKNOWN IMPORTED)
170*bf2c3715SXin Li  set_target_properties(ComputeCpp::ComputeCpp PROPERTIES
171*bf2c3715SXin Li    IMPORTED_LOCATION_DEBUG          "${COMPUTECPP_RUNTIME_LIBRARY_DEBUG}"
172*bf2c3715SXin Li    IMPORTED_LOCATION_RELWITHDEBINFO "${COMPUTECPP_RUNTIME_LIBRARY}"
173*bf2c3715SXin Li    IMPORTED_LOCATION                "${COMPUTECPP_RUNTIME_LIBRARY}"
174*bf2c3715SXin Li    INTERFACE_INCLUDE_DIRECTORIES    "${ComputeCpp_INCLUDE_DIRS}"
175*bf2c3715SXin Li    INTERFACE_LINK_LIBRARIES         "OpenCL::OpenCL"
176*bf2c3715SXin Li  )
177*bf2c3715SXin Liendif()
178*bf2c3715SXin Li
179*bf2c3715SXin Li# This property allows targets to specify that their sources should be
180*bf2c3715SXin Li# compiled with the integration header included after the user's
181*bf2c3715SXin Li# sources, not before (e.g. when an enum is used in a kernel name, this
182*bf2c3715SXin Li# is not technically valid SYCL code but can work with ComputeCpp)
183*bf2c3715SXin Lidefine_property(
184*bf2c3715SXin Li  TARGET PROPERTY COMPUTECPP_INCLUDE_AFTER
185*bf2c3715SXin Li  BRIEF_DOCS "Include integration header after user source"
186*bf2c3715SXin Li  FULL_DOCS "Changes compiler arguments such that the source file is
187*bf2c3715SXin Li  actually the integration header, and the .cpp file is included on
188*bf2c3715SXin Li  the command line so that it is seen by the compiler first. Enables
189*bf2c3715SXin Li  non-standards-conformant SYCL code to compile with ComputeCpp."
190*bf2c3715SXin Li)
191*bf2c3715SXin Lidefine_property(
192*bf2c3715SXin Li  TARGET PROPERTY INTERFACE_COMPUTECPP_FLAGS
193*bf2c3715SXin Li  BRIEF_DOCS "Interface compile flags to provide compute++"
194*bf2c3715SXin Li  FULL_DOCS  "Set additional compile flags to pass to compute++ when compiling
195*bf2c3715SXin Li  any target which links to this one."
196*bf2c3715SXin Li)
197*bf2c3715SXin Lidefine_property(
198*bf2c3715SXin Li  SOURCE PROPERTY COMPUTECPP_SOURCE_FLAGS
199*bf2c3715SXin Li  BRIEF_DOCS "Source file compile flags for compute++"
200*bf2c3715SXin Li  FULL_DOCS  "Set additional compile flags for compiling the SYCL integration
201*bf2c3715SXin Li  header for the given source file."
202*bf2c3715SXin Li)
203*bf2c3715SXin Li
204*bf2c3715SXin Li####################
205*bf2c3715SXin Li#   __build_ir
206*bf2c3715SXin Li####################
207*bf2c3715SXin Li#
208*bf2c3715SXin Li#  Adds a custom target for running compute++ and adding a dependency for the
209*bf2c3715SXin Li#  resulting integration header and kernel binary.
210*bf2c3715SXin Li#
211*bf2c3715SXin Li#  TARGET : Name of the target.
212*bf2c3715SXin Li#  SOURCE : Source file to be compiled.
213*bf2c3715SXin Li#  COUNTER : Counter included in name of custom target. Different counter
214*bf2c3715SXin Li#       values prevent duplicated names of custom target when source files with
215*bf2c3715SXin Li#       the same name, but located in different directories, are used for the
216*bf2c3715SXin Li#       same target.
217*bf2c3715SXin Li#
218*bf2c3715SXin Lifunction(__build_ir)
219*bf2c3715SXin Li  set(options)
220*bf2c3715SXin Li  set(one_value_args
221*bf2c3715SXin Li    TARGET
222*bf2c3715SXin Li    SOURCE
223*bf2c3715SXin Li    COUNTER
224*bf2c3715SXin Li  )
225*bf2c3715SXin Li  set(multi_value_args)
226*bf2c3715SXin Li  cmake_parse_arguments(SDK_BUILD_IR
227*bf2c3715SXin Li    "${options}"
228*bf2c3715SXin Li    "${one_value_args}"
229*bf2c3715SXin Li    "${multi_value_args}"
230*bf2c3715SXin Li    ${ARGN}
231*bf2c3715SXin Li  )
232*bf2c3715SXin Li  get_filename_component(sourceFileName ${SDK_BUILD_IR_SOURCE} NAME)
233*bf2c3715SXin Li
234*bf2c3715SXin Li  # Set the path to the integration header.
235*bf2c3715SXin Li  # The .sycl filename must depend on the target so that different targets
236*bf2c3715SXin Li  # using the same source file will be generated with a different rule.
237*bf2c3715SXin Li  set(baseSyclName ${CMAKE_CURRENT_BINARY_DIR}/${SDK_BUILD_IR_TARGET}_${sourceFileName})
238*bf2c3715SXin Li  set(outputSyclFile ${baseSyclName}.sycl)
239*bf2c3715SXin Li  set(outputDeviceFile ${baseSyclName}.${IR_MAP_${COMPUTECPP_BITCODE}})
240*bf2c3715SXin Li  set(depFileName ${baseSyclName}.sycl.d)
241*bf2c3715SXin Li
242*bf2c3715SXin Li  set(include_directories "$<TARGET_PROPERTY:${SDK_BUILD_IR_TARGET},INCLUDE_DIRECTORIES>")
243*bf2c3715SXin Li  set(compile_definitions "$<TARGET_PROPERTY:${SDK_BUILD_IR_TARGET},COMPILE_DEFINITIONS>")
244*bf2c3715SXin Li  set(generated_include_directories
245*bf2c3715SXin Li    $<$<BOOL:${include_directories}>:-I\"$<JOIN:${include_directories},\"\t-I\">\">)
246*bf2c3715SXin Li  set(generated_compile_definitions
247*bf2c3715SXin Li    $<$<BOOL:${compile_definitions}>:-D$<JOIN:${compile_definitions},\t-D>>)
248*bf2c3715SXin Li
249*bf2c3715SXin Li  # Obtain language standard of the file
250*bf2c3715SXin Li  set(device_compiler_cxx_standard)
251*bf2c3715SXin Li  get_target_property(targetCxxStandard ${SDK_BUILD_IR_TARGET} CXX_STANDARD)
252*bf2c3715SXin Li  if (targetCxxStandard MATCHES 17)
253*bf2c3715SXin Li    set(device_compiler_cxx_standard "-std=c++1z")
254*bf2c3715SXin Li  elseif (targetCxxStandard MATCHES 14)
255*bf2c3715SXin Li    set(device_compiler_cxx_standard "-std=c++14")
256*bf2c3715SXin Li  elseif (targetCxxStandard MATCHES 11)
257*bf2c3715SXin Li    set(device_compiler_cxx_standard "-std=c++11")
258*bf2c3715SXin Li  elseif (targetCxxStandard MATCHES 98)
259*bf2c3715SXin Li    message(FATAL_ERROR "SYCL applications cannot be compiled using C++98")
260*bf2c3715SXin Li  else ()
261*bf2c3715SXin Li    set(device_compiler_cxx_standard "")
262*bf2c3715SXin Li  endif()
263*bf2c3715SXin Li
264*bf2c3715SXin Li  get_property(source_compile_flags
265*bf2c3715SXin Li    SOURCE ${SDK_BUILD_IR_SOURCE}
266*bf2c3715SXin Li    PROPERTY COMPUTECPP_SOURCE_FLAGS
267*bf2c3715SXin Li  )
268*bf2c3715SXin Li  separate_arguments(source_compile_flags)
269*bf2c3715SXin Li  if(source_compile_flags)
270*bf2c3715SXin Li    list(APPEND computecpp_source_flags ${source_compile_flags})
271*bf2c3715SXin Li  endif()
272*bf2c3715SXin Li
273*bf2c3715SXin Li  list(APPEND COMPUTECPP_DEVICE_COMPILER_FLAGS
274*bf2c3715SXin Li    ${device_compiler_cxx_standard}
275*bf2c3715SXin Li    ${COMPUTECPP_USER_FLAGS}
276*bf2c3715SXin Li    ${computecpp_source_flags}
277*bf2c3715SXin Li  )
278*bf2c3715SXin Li
279*bf2c3715SXin Li  set(ir_dependencies ${SDK_BUILD_IR_SOURCE})
280*bf2c3715SXin Li  get_target_property(target_libraries ${SDK_BUILD_IR_TARGET} LINK_LIBRARIES)
281*bf2c3715SXin Li  if(target_libraries)
282*bf2c3715SXin Li    foreach(library ${target_libraries})
283*bf2c3715SXin Li      if(TARGET ${library})
284*bf2c3715SXin Li        list(APPEND ir_dependencies ${library})
285*bf2c3715SXin Li      endif()
286*bf2c3715SXin Li    endforeach()
287*bf2c3715SXin Li  endif()
288*bf2c3715SXin Li
289*bf2c3715SXin Li  # Depfile support was only added in CMake 3.7
290*bf2c3715SXin Li  # CMake throws an error if it is unsupported by the generator (i. e. not ninja)
291*bf2c3715SXin Li  if((NOT CMAKE_VERSION VERSION_LESS 3.7.0) AND
292*bf2c3715SXin Li          CMAKE_GENERATOR MATCHES "Ninja")
293*bf2c3715SXin Li    file(RELATIVE_PATH relOutputFile ${CMAKE_BINARY_DIR} ${outputDeviceFile})
294*bf2c3715SXin Li    set(generate_depfile -MMD -MF ${depFileName} -MT ${relOutputFile})
295*bf2c3715SXin Li    set(enable_depfile DEPFILE ${depFileName})
296*bf2c3715SXin Li  endif()
297*bf2c3715SXin Li
298*bf2c3715SXin Li  # Add custom command for running compute++
299*bf2c3715SXin Li  add_custom_command(
300*bf2c3715SXin Li    OUTPUT ${outputDeviceFile} ${outputSyclFile}
301*bf2c3715SXin Li    COMMAND ${ComputeCpp_DEVICE_COMPILER_EXECUTABLE}
302*bf2c3715SXin Li            ${COMPUTECPP_DEVICE_COMPILER_FLAGS}
303*bf2c3715SXin Li            ${generated_include_directories}
304*bf2c3715SXin Li            ${generated_compile_definitions}
305*bf2c3715SXin Li            -sycl-ih ${outputSyclFile}
306*bf2c3715SXin Li            -o ${outputDeviceFile}
307*bf2c3715SXin Li            -c ${SDK_BUILD_IR_SOURCE}
308*bf2c3715SXin Li            ${generate_depfile}
309*bf2c3715SXin Li    DEPENDS ${ir_dependencies}
310*bf2c3715SXin Li    IMPLICIT_DEPENDS CXX ${SDK_BUILD_IR_SOURCE}
311*bf2c3715SXin Li    ${enable_depfile}
312*bf2c3715SXin Li    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
313*bf2c3715SXin Li    COMMENT "Building ComputeCpp integration header file ${outputSyclFile}")
314*bf2c3715SXin Li
315*bf2c3715SXin Li  # Name: (user-defined name)_(source file)_(counter)_ih
316*bf2c3715SXin Li  set(headerTargetName
317*bf2c3715SXin Li    ${SDK_BUILD_IR_TARGET}_${sourceFileName}_${SDK_BUILD_IR_COUNTER}_ih)
318*bf2c3715SXin Li
319*bf2c3715SXin Li  if(NOT MSVC)
320*bf2c3715SXin Li    # Add a custom target for the generated integration header
321*bf2c3715SXin Li    add_custom_target(${headerTargetName} DEPENDS ${outputDeviceFile} ${outputSyclFile})
322*bf2c3715SXin Li    add_dependencies(${SDK_BUILD_IR_TARGET} ${headerTargetName})
323*bf2c3715SXin Li  endif()
324*bf2c3715SXin Li
325*bf2c3715SXin Li  # This property can be set on a per-target basis to indicate that the
326*bf2c3715SXin Li  # integration header should appear after the main source listing
327*bf2c3715SXin Li  get_target_property(includeAfter ${SDK_ADD_SYCL_TARGET} COMPUTECPP_INCLUDE_AFTER)
328*bf2c3715SXin Li
329*bf2c3715SXin Li  if(includeAfter)
330*bf2c3715SXin Li    # Change the source file to the integration header - e.g.
331*bf2c3715SXin Li    # g++ -c source_file_name.cpp.sycl
332*bf2c3715SXin Li    get_target_property(current_sources ${SDK_BUILD_IR_TARGET} SOURCES)
333*bf2c3715SXin Li    # Remove absolute path to source file
334*bf2c3715SXin Li    list(REMOVE_ITEM current_sources ${SDK_BUILD_IR_SOURCE})
335*bf2c3715SXin Li    # Remove relative path to source file
336*bf2c3715SXin Li    string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" ""
337*bf2c3715SXin Li      rel_source_file ${SDK_BUILD_IR_SOURCE}
338*bf2c3715SXin Li    )
339*bf2c3715SXin Li    list(REMOVE_ITEM current_sources ${rel_source_file})
340*bf2c3715SXin Li    # Add SYCL header to source list
341*bf2c3715SXin Li    list(APPEND current_sources ${outputSyclFile})
342*bf2c3715SXin Li    set_property(TARGET ${SDK_BUILD_IR_TARGET}
343*bf2c3715SXin Li      PROPERTY SOURCES ${current_sources})
344*bf2c3715SXin Li    # CMake/gcc don't know what language a .sycl file is, so tell them
345*bf2c3715SXin Li    set_property(SOURCE ${outputSyclFile} PROPERTY LANGUAGE CXX)
346*bf2c3715SXin Li    set(includedFile ${SDK_BUILD_IR_SOURCE})
347*bf2c3715SXin Li    set(cppFile ${outputSyclFile})
348*bf2c3715SXin Li  else()
349*bf2c3715SXin Li    set_property(SOURCE ${outputSyclFile} PROPERTY HEADER_FILE_ONLY ON)
350*bf2c3715SXin Li    set(includedFile ${outputSyclFile})
351*bf2c3715SXin Li    set(cppFile ${SDK_BUILD_IR_SOURCE})
352*bf2c3715SXin Li  endif()
353*bf2c3715SXin Li
354*bf2c3715SXin Li  # Force inclusion of the integration header for the host compiler
355*bf2c3715SXin Li  if(MSVC)
356*bf2c3715SXin Li    # Group SYCL files inside Visual Studio
357*bf2c3715SXin Li    source_group("SYCL" FILES ${outputSyclFile})
358*bf2c3715SXin Li
359*bf2c3715SXin Li    if(includeAfter)
360*bf2c3715SXin Li      # Allow the source file to be edited using Visual Studio.
361*bf2c3715SXin Li      # It will be added as a header file so it won't be compiled.
362*bf2c3715SXin Li      set_property(SOURCE ${SDK_BUILD_IR_SOURCE} PROPERTY HEADER_FILE_ONLY true)
363*bf2c3715SXin Li    endif()
364*bf2c3715SXin Li
365*bf2c3715SXin Li    # Add both source and the sycl files to the VS solution.
366*bf2c3715SXin Li    target_sources(${SDK_BUILD_IR_TARGET} PUBLIC ${SDK_BUILD_IR_SOURCE} ${outputSyclFile})
367*bf2c3715SXin Li
368*bf2c3715SXin Li    set(forceIncludeFlags "/FI${includedFile} /TP")
369*bf2c3715SXin Li  else()
370*bf2c3715SXin Li    set(forceIncludeFlags "-include ${includedFile} -x c++")
371*bf2c3715SXin Li  endif()
372*bf2c3715SXin Li
373*bf2c3715SXin Li  set_property(
374*bf2c3715SXin Li    SOURCE ${cppFile}
375*bf2c3715SXin Li    APPEND_STRING PROPERTY COMPILE_FLAGS "${forceIncludeFlags}"
376*bf2c3715SXin Li  )
377*bf2c3715SXin Li
378*bf2c3715SXin Liendfunction(__build_ir)
379*bf2c3715SXin Li
380*bf2c3715SXin Li#######################
381*bf2c3715SXin Li#  add_sycl_to_target
382*bf2c3715SXin Li#######################
383*bf2c3715SXin Li#
384*bf2c3715SXin Li#  Adds a SYCL compilation custom command associated with an existing
385*bf2c3715SXin Li#  target and sets a dependancy on that new command.
386*bf2c3715SXin Li#
387*bf2c3715SXin Li#  TARGET : Name of the target to add SYCL to.
388*bf2c3715SXin Li#  SOURCES : Source files to be compiled for SYCL.
389*bf2c3715SXin Li#
390*bf2c3715SXin Lifunction(add_sycl_to_target)
391*bf2c3715SXin Li  set(options)
392*bf2c3715SXin Li  set(one_value_args
393*bf2c3715SXin Li    TARGET
394*bf2c3715SXin Li  )
395*bf2c3715SXin Li  set(multi_value_args
396*bf2c3715SXin Li    SOURCES
397*bf2c3715SXin Li  )
398*bf2c3715SXin Li  cmake_parse_arguments(SDK_ADD_SYCL
399*bf2c3715SXin Li    "${options}"
400*bf2c3715SXin Li    "${one_value_args}"
401*bf2c3715SXin Li    "${multi_value_args}"
402*bf2c3715SXin Li    ${ARGN}
403*bf2c3715SXin Li  )
404*bf2c3715SXin Li
405*bf2c3715SXin Li  set_target_properties(${SDK_ADD_SYCL_TARGET} PROPERTIES LINKER_LANGUAGE CXX)
406*bf2c3715SXin Li
407*bf2c3715SXin Li  # If the CXX compiler is set to compute++ enable the driver.
408*bf2c3715SXin Li  get_filename_component(cmakeCxxCompilerFileName "${CMAKE_CXX_COMPILER}" NAME)
409*bf2c3715SXin Li  if("${cmakeCxxCompilerFileName}" STREQUAL "compute++")
410*bf2c3715SXin Li    if(MSVC)
411*bf2c3715SXin Li      message(FATAL_ERROR "The compiler driver is not supported by this system,
412*bf2c3715SXin Li                           revert the CXX compiler to your default host compiler.")
413*bf2c3715SXin Li    endif()
414*bf2c3715SXin Li
415*bf2c3715SXin Li    get_target_property(includeAfter ${SDK_ADD_SYCL_TARGET} COMPUTECPP_INCLUDE_AFTER)
416*bf2c3715SXin Li    if(includeAfter)
417*bf2c3715SXin Li      list(APPEND COMPUTECPP_USER_FLAGS -fsycl-ih-last)
418*bf2c3715SXin Li    endif()
419*bf2c3715SXin Li    list(INSERT COMPUTECPP_DEVICE_COMPILER_FLAGS 0 -sycl-driver)
420*bf2c3715SXin Li    # Prepend COMPUTECPP_DEVICE_COMPILER_FLAGS and append COMPUTECPP_USER_FLAGS
421*bf2c3715SXin Li    foreach(prop COMPILE_OPTIONS INTERFACE_COMPILE_OPTIONS)
422*bf2c3715SXin Li      get_target_property(target_compile_options ${SDK_ADD_SYCL_TARGET} ${prop})
423*bf2c3715SXin Li      if(NOT target_compile_options)
424*bf2c3715SXin Li        set(target_compile_options "")
425*bf2c3715SXin Li      endif()
426*bf2c3715SXin Li      set_property(
427*bf2c3715SXin Li        TARGET ${SDK_ADD_SYCL_TARGET}
428*bf2c3715SXin Li        PROPERTY ${prop}
429*bf2c3715SXin Li        ${COMPUTECPP_DEVICE_COMPILER_FLAGS}
430*bf2c3715SXin Li        ${target_compile_options}
431*bf2c3715SXin Li        ${COMPUTECPP_USER_FLAGS}
432*bf2c3715SXin Li      )
433*bf2c3715SXin Li    endforeach()
434*bf2c3715SXin Li  else()
435*bf2c3715SXin Li    set(fileCounter 0)
436*bf2c3715SXin Li    list(INSERT COMPUTECPP_DEVICE_COMPILER_FLAGS 0 -sycl)
437*bf2c3715SXin Li    # Add custom target to run compute++ and generate the integration header
438*bf2c3715SXin Li    foreach(sourceFile ${SDK_ADD_SYCL_SOURCES})
439*bf2c3715SXin Li      if(NOT IS_ABSOLUTE ${sourceFile})
440*bf2c3715SXin Li        set(sourceFile "${CMAKE_CURRENT_SOURCE_DIR}/${sourceFile}")
441*bf2c3715SXin Li      endif()
442*bf2c3715SXin Li      __build_ir(
443*bf2c3715SXin Li        TARGET     ${SDK_ADD_SYCL_TARGET}
444*bf2c3715SXin Li        SOURCE     ${sourceFile}
445*bf2c3715SXin Li        COUNTER    ${fileCounter}
446*bf2c3715SXin Li      )
447*bf2c3715SXin Li      MATH(EXPR fileCounter "${fileCounter} + 1")
448*bf2c3715SXin Li    endforeach()
449*bf2c3715SXin Li  endif()
450*bf2c3715SXin Li
451*bf2c3715SXin Li  set_property(TARGET ${SDK_ADD_SYCL_TARGET}
452*bf2c3715SXin Li    APPEND PROPERTY LINK_LIBRARIES ComputeCpp::ComputeCpp)
453*bf2c3715SXin Li  set_property(TARGET ${SDK_ADD_SYCL_TARGET}
454*bf2c3715SXin Li    APPEND PROPERTY INTERFACE_LINK_LIBRARIES ComputeCpp::ComputeCpp)
455*bf2c3715SXin Liendfunction(add_sycl_to_target)
456