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