@@ -7,6 +7,8 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
77set (CMAKE_CXX_EXTENSIONS OFF )
88set (CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON )
99
10+ option (SYCL_DEPLOY_OPENCL OFF )
11+
1012if (MSVC )
1113 set_property (GLOBAL PROPERTY USE_FOLDERS ON )
1214 # Skip asynchronous C++ exceptions catching and assume "extern C" functions
@@ -82,6 +84,17 @@ else()
8284 add_custom_target (ocl-icd DEPENDS ${OpenCL_LIBRARIES} COMMENT "Copying OpenCL ICD Loader ..." )
8385endif ()
8486
87+ if (NOT TARGET OpenCL)
88+ add_library (OpenCL INTERFACE )
89+ if (TARGET OpenCL::OpenCL)
90+ # Since 3.8 CMake exports target for FindOpenCL
91+ target_link_libraries (OpenCL INTERFACE OpenCL::OpenCL)
92+ else ()
93+ target_link_libraries (OpenCL INTERFACE ${OpenCL_LIBRARIES} )
94+ target_include_directories (OpenCL INTERFACE ${OpenCL_INCLUDE_DIRS} )
95+ endif ()
96+ endif ()
97+
8598set (OPENCL_INCLUDE "${OpenCL_INCLUDE_DIRS} " )
8699
87100# Configure SYCL version macro
@@ -95,34 +108,108 @@ add_custom_target(sycl-headers ALL
95108COMMAND ${CMAKE_COMMAND} -E copy_directory ${sycl_inc_dir} /CL ${dst_dir} /CL
96109COMMENT "Copying SYCL headers ..." )
97110
98- # Configure SYCL headers
99- install (DIRECTORY "${sycl_inc_dir} /." DESTINATION "${LLVM_INST_INC_DIRECTORY} " COMPONENT sycl-headers)
100-
101- # Configure OpenCL header and ICD loader
102- include_directories (AFTER "${sycl_inc_dir} " "${OpenCL_INCLUDE_DIRS} " )
103- link_libraries (${OpenCL_LIBRARIES} )
104-
105111# SYCL runtime library
106112add_subdirectory (source )
107113
108114# SYCL toolchain builds all components: compiler, libraries, headers, etc.
115+ set (SYCL_TOOLCHAIN_DEPS
116+ sycl
117+ clang
118+ clang-offload-wrapper
119+ clang-offload-bundler
120+ llc
121+ llvm-as
122+ llvm-ar
123+ llvm-dis
124+ llvm-no -spir-kernel
125+ llvm-spirv
126+ llvm-link
127+ llvm-objcopy
128+ opt)
109129add_custom_target ( sycl-toolchain
110- DEPENDS sycl
111- clang
112- clang-offload-wrapper
113- clang-offload-bundler
114- llc
115- llvm-as
116- llvm-ar
117- llvm-dis
118- llvm-no -spir-kernel
119- llvm-spirv
120- llvm-link
121- llvm-objcopy
122- opt
130+ DEPENDS ${SYCL_TOOLCHAIN_DEPS}
123131 COMMENT "Building SYCL compiler toolchain..."
124132)
125133
126134add_subdirectory ( test )
127135add_subdirectory ( unittests )
128136add_subdirectory ( tools )
137+
138+ # Configure SYCL toolchain installation targets
139+ add_custom_target (deploy-sycl-toolchain)
140+
141+ set (SYCL_BUNDLE_DEPS ${SYCL_TOOLCHAIN_DEPS} opencl clang-resource -headers)
142+
143+ foreach (comp ${SYCL_BUNDLE_DEPS} )
144+ add_custom_command (TARGET deploy-sycl-toolchain PRE_BUILD
145+ COMMAND ${CMAKE_COMMAND}
146+ ARGS -DCOMPONENT="${comp} " -P "${CMAKE_BINARY_DIR} /cmake_install.cmake" )
147+ endforeach ()
148+
149+ set (LLVM_LIT_EXT "" )
150+ if (WIN32 )
151+ set (LLVM_LIT_EXT ".py" )
152+ endif ()
153+ add_custom_command (TARGET deploy-sycl-toolchain PRE_BUILD
154+ COMMAND ${CMAKE_COMMAND}
155+ ARGS -E copy ${CMAKE_BINARY_DIR} /bin/llvm-lit${LLVM_LIT_EXT}
156+ ${CMAKE_INSTALL_PREFIX} /bin/llvm-lit${LLVM_LIT_EXT} )
157+
158+ # For some reason clang-cl is being created on Linux. Remove it so users
159+ # are not confused.
160+ if (NOT WIN32 )
161+ add_custom_command (TARGET deploy-sycl-toolchain POST_BUILD
162+ COMMAND ${CMAKE_COMMAND}
163+ ARGS -E remove ${CMAKE_INSTALL_PREFIX} /bin/clang-cl)
164+ endif ()
165+
166+ if (SYCL_DEPLOY_OPENCL)
167+ install (TARGETS OpenCL EXPORT SYCL
168+ LIBRARY
169+ DESTINATION lib
170+ COMPONENT opencl
171+ ARCHIVE
172+ DESTINATION lib
173+ COMPONENT opencl
174+ RUNTIME
175+ DESTINATION bin
176+ COMPONENT opencl
177+ INCLUDES
178+ DESTINATION include
179+ COMPONENT opencl)
180+
181+ # If OpenCL target is not built with SYCL, we need to copy libraries manually
182+ if (OpenCL_LIBRARIES)
183+ set (RESOLVED_LIBS "" )
184+ foreach (file ${OpenCL_LIBRARIES} )
185+ get_filename_component (resolved_lib "${file} " REALPATH)
186+ list (APPEND RESOLVED_LIBS "${resolved_lib} " )
187+ endforeach ()
188+ install (FILES ${RESOLVED_LIBS} DESTINATION lib COMPONENT opencl)
189+ if (WIN32 )
190+ string (REPLACE ".lib" ".dll" DLL_LIBS "${RESOLVED_LIBS} " )
191+ install (FILES ${DLL_LIBS} DESTINATION bin COMPONENT opencl)
192+ else (WIN32 )
193+ if (RESOLVED_LIBS MATCHES "libOpenCL.so.1.0.0" )
194+ # Workaround for some OpenCL ICD packages
195+ add_custom_command (TARGET deploy-sycl-toolchain POST_BUILD
196+ COMMAND ${CMAKE_COMMAND}
197+ ARGS -E rename ${CMAKE_INSTALL_PREFIX} /lib/libOpenCL.so.1.0.0
198+ ${CMAKE_INSTALL_PREFIX} /lib/libOpenCL.so)
199+ endif ()
200+ add_custom_command (TARGET deploy-sycl-toolchain
201+ COMMAND ${CMAKE_COMMAND}
202+ ARGS -E create_symlink ${CMAKE_INSTALL_PREFIX} /lib/libOpenCL.so
203+ ${CMAKE_INSTALL_PREFIX} /lib/libOpenCL.so.1)
204+ add_custom_command (TARGET deploy-sycl-toolchain
205+ COMMAND ${CMAKE_COMMAND}
206+ ARGS -E create_symlink ${CMAKE_INSTALL_PREFIX} /lib/libOpenCL.so
207+ ${CMAKE_INSTALL_PREFIX} /lib/libOpenCL.so.1.2)
208+ endif ()
209+ endif ()
210+ if (OpenCL_INCLUDE_DIRS)
211+ install (DIRECTORY ${OpenCL_INCLUDE_DIRS} /CL
212+ DESTINATION include COMPONENT opencl)
213+ endif ()
214+ endif ()
215+
0 commit comments