Skip to content

Commit eb1d87a

Browse files
author
Pavel V Chupin
committed
[SYCL][Cmake] Redesign opencl dependencies
* Moved from ExternalProject to FetchContent: * External dependencies are downloaded at configure stage, not build * All dependencies targets become available earlier and become reusable * All dependencies are consolidated under _deps directory * Simplified cmake files for better maintenance * Outline opencl deps into separate opencl/CMakeLists.txt * Update other targets to new deps accordingly * Added comments inlined for not very clear logic in our cmake build system Signed-off-by: Pavel V Chupin <pavel.v.chupin@intel.com>
1 parent 3c5198d commit eb1d87a

File tree

8 files changed

+108
-159
lines changed

8 files changed

+108
-159
lines changed

opencl/CMakeLists.txt

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
cmake_minimum_required(VERSION 3.14)
2+
3+
include(FetchContent)
4+
5+
# OpenCL Headers
6+
if(NOT OpenCL_INCLUDE_DIRS)
7+
message(STATUS "Will fetch OpenCL headers from github.com")
8+
9+
FetchContent_Declare(ocl-headers
10+
GIT_REPOSITORY https://github.com/KhronosGroup/OpenCL-Headers.git
11+
GIT_TAG 23710f1b99186065c1768fc3098ba681adc0f253
12+
)
13+
14+
FetchContent_MakeAvailable(ocl-headers)
15+
FetchContent_GetProperties(ocl-headers)
16+
set(OpenCL_INCLUDE_DIRS ${ocl-headers_SOURCE_DIR})
17+
else()
18+
message(STATUS "OpenCL headers are added manually ${OpenCL_INCLUDE_DIRS}")
19+
endif()
20+
21+
target_compile_definitions(Headers INTERFACE -DCL_TARGET_OPENCL_VERSION=220)
22+
add_library(OpenCL-Headers ALIAS Headers)
23+
24+
# OpenCL Library (ICD Loader)
25+
26+
# Set OPENCL_ICD_LOADER_HEADERS_DIR, as prerequisite for ICD build
27+
set(OPENCL_ICD_LOADER_HEADERS_DIR ${OpenCL_INCLUDE_DIRS} CACHE PATH "Path to OpenCL Headers")
28+
29+
if(NOT OpenCL_LIBRARY)
30+
message(STATUS "Will fetch OpenCL ICD Loader from github.com")
31+
32+
FetchContent_Declare(ocl-icd
33+
GIT_REPOSITORY https://github.com/KhronosGroup/OpenCL-ICD-Loader.git
34+
GIT_TAG 5f8249691ec8c25775789498951f8e9eb62c201d
35+
)
36+
37+
FetchContent_MakeAvailable(ocl-icd)
38+
FetchContent_GetProperties(ocl-icd)
39+
set(OpenCL_LIBRARY ${ocl-icd_SOURCE_DIR})
40+
else()
41+
message(STATUS "OpenCL ICD Loader is added manually ${OpenCL_LIBRARY}")
42+
endif()
43+
44+
add_library(OpenCL-ICD ALIAS OpenCL)
45+

sycl/CMakeLists.txt

Lines changed: 22 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -71,130 +71,23 @@ set(SYCL_INCLUDE_DIR "include")
7171
set(SYCL_INCLUDE_BUILD_DIR ${LLVM_BINARY_DIR}/${SYCL_INCLUDE_DIR})
7272
set(SYCL_INCLUDE_DEPLOY_DIR ${CMAKE_INSTALL_PREFIX}/${SYCL_INCLUDE_DIR})
7373

74-
# Find OpenCL headers and libraries installed in the system and use them to
75-
# build SYCL runtime.
76-
# WARNING: use with caution, building SYCL runtime with OpenCL implementation
77-
# instead of Khronos ICD loader might cause build and/or portability issues.
78-
option(OpenCL_BUILD_WITH_SYSTEM_SDK "Build SYCL with OpenCL coming from the build system" OFF)
79-
80-
if( (OpenCL_INCLUDE_DIR AND OpenCL_LIBRARY) OR OpenCL_BUILD_WITH_SYSTEM_SDK)
81-
find_package(OpenCL)
82-
endif()
83-
84-
include(ExternalProject)
85-
86-
# By default, whenever cmake is re-run, the external project's sources will be
87-
# updated, which might be annoying - let's have a possibility to disable that as
88-
# not every external project which is used here is being updated often
89-
# Single toggle to control all external projects
90-
option(SYCL_EXTERNAL_PROJECTS_SKIP_AUTO_UPDATE
91-
"Perform automatic update step for external projects (OpenCL Headers, OpenCL ICD, etc.)" OFF)
92-
# More precise controls for each particular external project are documented
93-
# near each ExternalProject_Add
94-
95-
if( NOT OpenCL_INCLUDE_DIRS )
96-
message(STATUS "OpenCL_INCLUDE_DIRS is missing. Will try to download OpenCL headers from github.com")
97-
set(OpenCL_INCLUDE_DIRS "${CMAKE_CURRENT_BINARY_DIR}/OpenCL/inc")
98-
if (NOT DEFINED SYCL_EP_OCL_HEADERS_SKIP_AUTO_UPDATE)
99-
set(SYCL_EP_OCL_HEADERS_SKIP_AUTO_UPDATE ${SYCL_EXTERNAL_PROJECTS_SKIP_AUTO_UPDATE})
100-
endif()
101-
ExternalProject_Add(ocl-headers
102-
GIT_REPOSITORY https://github.com/KhronosGroup/OpenCL-Headers.git
103-
GIT_TAG 23710f1b99186065c1768fc3098ba681adc0f253
104-
UPDATE_DISCONNECTED ${SYCL_EP_OCL_HEADERS_SKIP_AUTO_UPDATE}
105-
SOURCE_DIR ${OpenCL_INCLUDE_DIRS}
106-
CONFIGURE_COMMAND ""
107-
BUILD_COMMAND ${CMAKE_COMMAND} -E copy_directory ${OpenCL_INCLUDE_DIRS}/CL ${SYCL_INCLUDE_BUILD_DIR}/sycl/CL
108-
INSTALL_COMMAND ""
109-
STEP_TARGETS build
110-
COMMENT "Downloading OpenCL headers."
111-
LOG_DOWNLOAD 1
112-
LOG_UPDATE 1
113-
LOG_BUILD 1
114-
)
115-
add_definitions(-DCL_TARGET_OPENCL_VERSION=220)
116-
else()
117-
add_custom_target( ocl-headers ALL
118-
DEPENDS ${OpenCL_INCLUDE_DIRS}
119-
COMMAND ${CMAKE_COMMAND} -E copy_directory ${OpenCL_INCLUDE_DIRS}/CL ${SYCL_INCLUDE_BUILD_DIR}/sycl/CL
120-
COMMENT "Copying OpenCL headers ..."
121-
)
122-
endif()
123-
124-
if( NOT OpenCL_LIBRARIES )
125-
message(STATUS "OpenCL_LIBRARIES is missing. Will try to download OpenCL ICD Loader from github.com")
126-
if(MSVC)
127-
set(OpenCL_LIBRARIES
128-
"${LLVM_LIBRARY_OUTPUT_INTDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}OpenCL${CMAKE_STATIC_LIBRARY_SUFFIX}")
129-
list(APPEND AUX_CMAKE_FLAGS -DOPENCL_ICD_LOADER_REQUIRE_WDK=OFF)
130-
else()
131-
set(OpenCL_LIBRARIES
132-
"${LLVM_LIBRARY_OUTPUT_INTDIR}/${CMAKE_SHARED_LIBRARY_PREFIX}OpenCL${CMAKE_SHARED_LIBRARY_SUFFIX}")
133-
endif()
134-
if (CMAKE_C_COMPILER)
135-
list(APPEND AUX_CMAKE_FLAGS -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER})
136-
endif()
137-
if (CMAKE_CXX_COMPILER)
138-
list(APPEND AUX_CMAKE_FLAGS -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER})
139-
endif()
140-
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/icd_build)
141-
set(OpenCL_ICD_LOADER_SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/OpenCL/icd")
142-
if (NOT DEFINED SYCL_EP_OCL_ICD_SKIP_AUTO_UPDATE)
143-
set(SYCL_EP_OCL_ICD_SKIP_AUTO_UPDATE ${SYCL_EXTERNAL_PROJECTS_SKIP_AUTO_UPDATE})
144-
endif()
145-
ExternalProject_Add(ocl-icd
146-
GIT_REPOSITORY https://github.com/KhronosGroup/OpenCL-ICD-Loader.git
147-
GIT_TAG 5f8249691ec8c25775789498951f8e9eb62c201d
148-
UPDATE_DISCONNECTED ${SYCL_EP_OCL_ICD_SKIP_AUTO_UPDATE}
149-
SOURCE_DIR ${OpenCL_ICD_LOADER_SOURCE_DIR}
150-
BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/icd_build"
151-
INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/icd_install"
152-
CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
153-
-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
154-
-DOPENCL_ICD_LOADER_HEADERS_DIR=${OpenCL_INCLUDE_DIRS}
155-
-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
156-
-DCMAKE_INSTALL_LIBDIR:PATH=lib${LLVM_LIBDIR_SUFFIX}
157-
${AUX_CMAKE_FLAGS}
158-
STEP_TARGETS configure,build,install
159-
DEPENDS ocl-headers
160-
BUILD_BYPRODUCTS ${OpenCL_LIBRARIES}
161-
LOG_DOWNLOAD 1
162-
LOG_UPDATE 1
163-
LOG_CONFIGURE 1
164-
LOG_BUILD 1
165-
LOG_INSTALL 1
166-
)
167-
ExternalProject_Add_Step(ocl-icd llvminstall
168-
COMMAND ${CMAKE_COMMAND} -E copy_directory <INSTALL_DIR>/ ${LLVM_BINARY_DIR}
169-
COMMENT "Installing ocl-icd into the LLVM binary directory"
170-
DEPENDEES install
171-
)
172-
# Optionally install the ICD library along with LLVM.
173-
option(OpenCL_INSTALL_KHRONOS_ICD_LOADER
174-
"Install the Khronos ICD Loader built as part of LLVM" OFF)
175-
if (OpenCL_INSTALL_KHRONOS_ICD_LOADER)
176-
install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/icd_install/"
177-
DESTINATION "."
178-
COMPONENT opencl-icd
179-
)
180-
endif()
181-
else()
182-
file(GLOB ICD_LOADER_SRC "${OpenCL_LIBRARIES}*")
183-
file(COPY ${ICD_LOADER_SRC} DESTINATION ${LLVM_LIBRARY_OUTPUT_INTDIR})
184-
add_custom_target(ocl-icd DEPENDS ${OpenCL_LIBRARIES} COMMENT "Copying OpenCL ICD Loader ...")
185-
endif()
186-
187-
set(OPENCL_INCLUDE "${OpenCL_INCLUDE_DIRS}")
188-
189-
add_library (OpenCL-Headers INTERFACE)
190-
add_library (OpenCL::Headers ALIAS OpenCL-Headers)
191-
target_include_directories(OpenCL-Headers
192-
INTERFACE ${OPENCL_INCLUDE}
193-
)
194-
install(DIRECTORY ${OPENCL_INCLUDE}/CL
195-
DESTINATION ${SYCL_INCLUDE_DEPLOY_DIR}/sycl
196-
COMPONENT opencl-headers
197-
)
74+
# LLVM build sets this OFF by default, but we need OpenCL to be built as shared
75+
# library.
76+
set(BUILD_SHARED_LIBS ON)
77+
# second argument is not used, it's required since first arg is not a real
78+
# subdirectory
79+
add_subdirectory(../opencl ${CMAKE_CURRENT_BINARY_DIR}/opencl_deps)
80+
81+
# Copy OpenCL Headers into sycl headers build directory
82+
# Compiler does automatic lookup bin/../include based on clang binary location,
83+
# e.g. when run LIT tests
84+
file(COPY ${OPENCL_ICD_LOADER_HEADERS_DIR}/CL
85+
DESTINATION ${SYCL_INCLUDE_BUILD_DIR}/sycl)
86+
87+
# Include OpenCL Headers into final bundle.
88+
install(DIRECTORY ${OPENCL_ICD_LOADER_HEADERS_DIR}/CL
89+
DESTINATION ${SYCL_INCLUDE_DEPLOY_DIR}/sycl
90+
COMPONENT OpenCL-Headers)
19891

19992
option(SYCL_BUILD_PI_CUDA
20093
"Enables the CUDA backend for the Plugin Interface" OFF)
@@ -207,13 +100,13 @@ string(TIMESTAMP __SYCL_COMPILER_VERSION "%Y%m%d")
207100
set(version_header "${sycl_inc_dir}/CL/sycl/version.hpp")
208101
configure_file("${version_header}.in" "${version_header}")
209102

210-
# Copy SYCL headers
103+
# Copy SYCL headers from sources to build directory
211104
add_custom_target(sycl-headers ALL
212105
COMMAND ${CMAKE_COMMAND} -E copy_directory ${sycl_inc_dir}/sycl ${SYCL_INCLUDE_BUILD_DIR}/sycl
213106
COMMAND ${CMAKE_COMMAND} -E copy_directory ${sycl_inc_dir}/CL ${SYCL_INCLUDE_BUILD_DIR}/sycl/CL
214107
COMMENT "Copying SYCL headers ...")
215108

216-
# Configure SYCL headers
109+
# Copy SYCL headers from sources to install directory
217110
install(DIRECTORY "${sycl_inc_dir}/sycl" DESTINATION ${SYCL_INCLUDE_DEPLOY_DIR} COMPONENT sycl-headers)
218111
install(DIRECTORY "${sycl_inc_dir}/CL" DESTINATION ${SYCL_INCLUDE_DEPLOY_DIR}/sycl COMPONENT sycl-headers)
219112

@@ -353,7 +246,7 @@ set( SYCL_TOOLCHAIN_DEPLOY_COMPONENTS
353246
sycl-post-link
354247
sycl-ls
355248
clang-resource-headers
356-
opencl-headers
249+
OpenCL-Headers
357250
sycl-headers
358251
sycl-headers-extras
359252
sycl
@@ -363,8 +256,8 @@ set( SYCL_TOOLCHAIN_DEPLOY_COMPONENTS
363256
${XPTIFW_LIBS}
364257
)
365258

366-
if(OpenCL_INSTALL_KHRONOS_ICD_LOADER AND TARGET ocl-icd)
367-
list(APPEND SYCL_TOOLCHAIN_DEPLOY_COMPONENTS opencl-icd)
259+
if(OpenCL_INSTALL_KHRONOS_ICD_LOADER AND TARGET OpenCL-ICD)
260+
list(APPEND SYCL_TOOLCHAIN_DEPLOY_COMPONENTS OpenCL-ICD)
368261
endif()
369262

370263
if(SYCL_BUILD_PI_CUDA)

sycl/plugins/cuda/CMakeLists.txt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ find_package(CUDA 10.1 REQUIRED)
1010
add_library(cudadrv SHARED IMPORTED GLOBAL)
1111

1212
set_target_properties(
13-
cudadrv PROPERTIES
13+
cudadrv PROPERTIES
1414
IMPORTED_LOCATION ${CUDA_CUDA_LIBRARY}
1515
INTERFACE_INCLUDE_DIRECTORIES ${CUDA_INCLUDE_DIRS}
1616
)
@@ -22,22 +22,21 @@ add_library(pi_cuda SHARED
2222
"pi_cuda.cpp"
2323
)
2424

25-
add_dependencies(pi_cuda
26-
ocl-headers
27-
)
28-
2925
add_dependencies(sycl-toolchain pi_cuda)
3026

3127
set_target_properties(pi_cuda PROPERTIES LINKER_LANGUAGE CXX)
3228

3329
target_include_directories(pi_cuda
3430
PRIVATE
3531
${sycl_inc_dir}
32+
${OPENCL_ICD_LOADER_HEADERS_DIR}
3633
PUBLIC
3734
${CUDA_INCLUDE_DIRS}
3835
)
3936

40-
target_link_libraries(pi_cuda PUBLIC OpenCL-Headers cudadrv)
37+
target_link_libraries(pi_cuda
38+
PRIVATE OpenCL-Headers
39+
PUBLIC cudadrv)
4140

4241
add_common_options(pi_cuda)
4342

sycl/plugins/level_zero/CMakeLists.txt

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ if (NOT DEFINED LEVEL_ZERO_LIBRARY OR NOT DEFINED LEVEL_ZERO_INCLUDE_DIR)
2121
if (NOT DEFINED SYCL_EP_LEVEL_ZERO_LOADER_SKIP_AUTO_UPDATE)
2222
set(SYCL_EP_LEVEL_ZERO_LOADER_SKIP_AUTO_UPDATE ${SYCL_EXTERNAL_PROJECTS_SKIP_AUTO_UPDATE})
2323
endif()
24+
25+
#TODO: Replace ExternalProject with FetchContent for better maintainance and
26+
# cmake files simplification
27+
include(ExternalProject)
28+
2429
ExternalProject_Add(level-zero-loader
2530
GIT_REPOSITORY https://github.com/oneapi-src/level-zero.git
2631
GIT_TAG v1.0.16
@@ -40,7 +45,7 @@ if (NOT DEFINED LEVEL_ZERO_LIBRARY OR NOT DEFINED LEVEL_ZERO_INCLUDE_DIR)
4045
LOG_BUILD 1
4146
LOG_INSTALL 1
4247
STEP_TARGETS configure,build,install
43-
DEPENDS ocl-headers
48+
DEPENDS OpenCL-Headers
4449
BUILD_BYPRODUCTS ${LEVEL_ZERO_LOADER}
4550
)
4651
ExternalProject_Add_Step(level-zero-loader llvminstall
@@ -91,8 +96,8 @@ target_include_directories(LevelZeroLoader-Headers
9196
INTERFACE "${LEVEL_ZERO_INCLUDE_DIR}"
9297
)
9398

99+
94100
include_directories("${sycl_inc_dir}")
95-
include_directories(${OPENCL_INCLUDE})
96101

97102
add_library(pi_level_zero SHARED
98103
"${sycl_inc_dir}/CL/sycl/detail/pi.h"
@@ -125,9 +130,13 @@ endif()
125130
if (TARGET level-zero-loader)
126131
add_dependencies(pi_level_zero level-zero-loader)
127132
endif()
128-
add_dependencies(sycl-toolchain pi_level_zero)
129133

130-
target_link_libraries(pi_level_zero PRIVATE "${LEVEL_ZERO_LOADER}")
134+
add_dependencies(sycl-toolchain pi_level_zero)
135+
target_link_libraries(pi_level_zero
136+
PRIVATE "${LEVEL_ZERO_LOADER}"
137+
PRIVATE OpenCL-Headers
138+
)
139+
131140
if (UNIX)
132141
target_link_libraries(pi_level_zero PRIVATE pthread)
133142
endif()

sycl/plugins/opencl/CMakeLists.txt

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,14 @@
77
# Plugin for OpenCL
88
# Create Shared library for libpi_opencl.so.
99
#TODO: remove dependency on pi.hpp in sycl project.
10-
#TODO: Currently, the pi.hpp header is common between sycl and plugin library sources.
10+
#TODO: Currently, the pi.h header is common between sycl and plugin library sources.
1111
#This can be changed by copying the pi.hpp file in the plugins project.
1212

1313
add_library(pi_opencl SHARED
1414
"${sycl_inc_dir}/CL/sycl/detail/pi.h"
1515
"pi_opencl.cpp"
1616
)
1717

18-
add_dependencies(pi_opencl
19-
ocl-icd
20-
ocl-headers
21-
)
22-
2318
add_dependencies(sycl-toolchain pi_opencl)
2419

2520
set_target_properties(pi_opencl PROPERTIES LINKER_LANGUAGE CXX)
@@ -28,9 +23,9 @@ set_target_properties(pi_opencl PROPERTIES LINKER_LANGUAGE CXX)
2823
target_include_directories(pi_opencl PRIVATE "${sycl_inc_dir}")
2924

3025
#link pi_opencl with OpenCL headers and ICD Loader.
31-
target_link_libraries( pi_opencl
32-
PRIVATE OpenCL::Headers
33-
PRIVATE ${OpenCL_LIBRARIES}
26+
target_link_libraries(pi_opencl
27+
PRIVATE OpenCL-Headers
28+
PRIVATE OpenCL-ICD
3429
)
3530
if (MSVC)
3631
# by defining __SYCL_BUILD_SYCL_DLL, we can use __declspec(dllexport)
@@ -46,7 +41,7 @@ else()
4641
set(linker_script "${CMAKE_CURRENT_SOURCE_DIR}/../ld-version-script.txt")
4742

4843
# Filter symbols based on the scope defined in the script file,
49-
# and export pi* function symbols in the library.
44+
# and export pi* function symbols in the library.
5045
target_link_libraries( pi_opencl
5146
PRIVATE "-Wl,--version-script=${linker_script}"
5247
)

sycl/source/CMakeLists.txt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,7 @@ function(add_sycl_rt_library LIB_NAME)
3232
target_compile_options(${LIB_OBJ_NAME} PRIVATE ${ARG_COMPILE_OPTIONS})
3333
endif()
3434

35-
#To-Do: Remove dependency on icd loader and opencl headers.
3635
add_dependencies(${LIB_OBJ_NAME}
37-
ocl-icd
38-
ocl-headers
3936
sycl-headers
4037
)
4138

@@ -68,14 +65,17 @@ function(add_sycl_rt_library LIB_NAME)
6865
PRIVATE
6966
${CMAKE_CURRENT_SOURCE_DIR}
7067
"${sycl_inc_dir}"
71-
${OpenCL_INCLUDE_DIRS}
68+
)
69+
#TODO: Remove dependency on icd loader and opencl headers.
70+
target_link_libraries(${LIB_OBJ_NAME}
71+
PRIVATE OpenCL-Headers
7272
)
7373

7474
find_package(Threads REQUIRED)
7575

7676
target_link_libraries(${LIB_NAME}
7777
PRIVATE
78-
${OpenCL_LIBRARIES}
78+
OpenCL-ICD
7979
${CMAKE_DL_LIBS}
8080
${CMAKE_THREAD_LIBS_INIT}
8181
PUBLIC

0 commit comments

Comments
 (0)