Skip to content

Commit 2d2e418

Browse files
authored
[SYCL] Creating version-agnostic copy of the SYCL import library (#12889)
Reason why this is needed is because some users want to explicitly link with sycl library and they don't want to update version all the time. It is possible to generate only version-agnostic .lib files but I think we need to keep versioned files as well in case if somebody will have a scenario when multiple releases are in the LIB env variable and they want to link with specific version explicitly.
1 parent cc0f4a7 commit 2d2e418

File tree

2 files changed

+41
-13
lines changed

2 files changed

+41
-13
lines changed

sycl/source/CMakeLists.txt

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ endif()
1818
function(add_sycl_rt_library LIB_NAME LIB_OBJ_NAME)
1919
# Add an optional argument so we can get the library name to
2020
# link with for Windows Debug version
21-
cmake_parse_arguments(ARG "" "XPTI_LIB" "COMPILE_OPTIONS;SOURCES" ${ARGN})
21+
cmake_parse_arguments(ARG "" "XPTI_LIB;IMPLIB_NAME" "COMPILE_OPTIONS;SOURCES" ${ARGN})
2222

2323
add_library(${LIB_OBJ_NAME} OBJECT ${ARG_SOURCES})
2424
add_library(${LIB_NAME} SHARED
@@ -75,12 +75,12 @@ function(add_sycl_rt_library LIB_NAME LIB_OBJ_NAME)
7575
if (WIN32)
7676
include_directories(${LLVM_EXTERNAL_SYCL_SOURCE_DIR}/pi_win_proxy_loader)
7777
if(WIN_DUPE)
78-
target_link_libraries(${LIB_NAME} PUBLIC pi_win_proxy_loaderd)
78+
target_link_libraries(${LIB_NAME} PUBLIC pi_win_proxy_loaderd)
7979
set(MANIFEST_FILE_NAME "sycld.manifest")
80-
else()
81-
target_link_libraries(${LIB_NAME} PUBLIC pi_win_proxy_loader)
80+
else()
81+
target_link_libraries(${LIB_NAME} PUBLIC pi_win_proxy_loader)
8282
set(MANIFEST_FILE_NAME "sycl.manifest")
83-
endif()
83+
endif()
8484
# Embed manifest into the sycl.dll where pi_win_proxy_loader.dll is described as sycl.dll's private dll and will always be loaded from the same directory.
8585
# 0x2000: LOAD_LIBRARY_SAFE_CURRENT_DIRS flag. Using this flag means that loading dependency DLLs (of sycl.dll)
8686
# from the current directory is only allowed if it is under a directory in the Safe load list.
@@ -92,6 +92,16 @@ function(add_sycl_rt_library LIB_NAME LIB_OBJ_NAME)
9292
if (WIN32)
9393
target_compile_definitions(${LIB_OBJ_NAME} PRIVATE __SYCL_BUILD_SYCL_DLL )
9494
target_link_libraries(${LIB_NAME} PRIVATE shlwapi)
95+
if (ARG_IMPLIB_NAME)
96+
add_custom_command(
97+
TARGET ${LIB_NAME} POST_BUILD
98+
COMMAND ${CMAKE_COMMAND} -E copy
99+
${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${LIB_NAME}.lib ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${ARG_IMPLIB_NAME}.lib
100+
COMMENT "Creating version-agnostic copy of the import library.")
101+
install(
102+
FILES ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${ARG_IMPLIB_NAME}.lib
103+
DESTINATION "lib${LLVM_LIBDIR_SUFFIX}" COMPONENT sycl)
104+
endif()
95105
endif()
96106

97107
if (MSVC)
@@ -277,14 +287,14 @@ if (MSVC)
277287

278288
set(WIN_DUPE "1")
279289
if (SYCL_ENABLE_XPTI_TRACING)
280-
add_sycl_rt_library(sycl${SYCL_MAJOR_VERSION}d sycld_object XPTI_LIB xptid COMPILE_OPTIONS "/MDd" SOURCES ${SYCL_NON_PREVIEW_SOURCES})
290+
add_sycl_rt_library(sycl${SYCL_MAJOR_VERSION}d sycld_object XPTI_LIB xptid COMPILE_OPTIONS "/MDd" SOURCES ${SYCL_NON_PREVIEW_SOURCES} IMPLIB_NAME sycld)
281291
if(SYCL_ENABLE_MAJOR_RELEASE_PREVIEW_LIB)
282-
add_sycl_rt_library(sycl${SYCL_MAJOR_VERSION}-previewd sycl-previewd_object XPTI_LIB xptid COMPILE_OPTIONS "/MDd" "/D__INTEL_PREVIEW_BREAKING_CHANGES" SOURCES ${SYCL_PREVIEW_SOURCES})
292+
add_sycl_rt_library(sycl${SYCL_MAJOR_VERSION}-previewd sycl-previewd_object XPTI_LIB xptid COMPILE_OPTIONS "/MDd" "/D__INTEL_PREVIEW_BREAKING_CHANGES" SOURCES ${SYCL_PREVIEW_SOURCES} IMPLIB_NAME sycl-previewd)
283293
endif()
284294
else()
285-
add_sycl_rt_library(sycl${SYCL_MAJOR_VERSION}d sycld_object COMPILE_OPTIONS "/MDd" SOURCES ${SYCL_NON_PREVIEW_SOURCES})
295+
add_sycl_rt_library(sycl${SYCL_MAJOR_VERSION}d sycld_object COMPILE_OPTIONS "/MDd" SOURCES ${SYCL_NON_PREVIEW_SOURCES} IMPLIB_NAME sycld)
286296
if(SYCL_ENABLE_MAJOR_RELEASE_PREVIEW_LIB)
287-
add_sycl_rt_library(sycl${SYCL_MAJOR_VERSION}-previewd sycl-previewd_object COMPILE_OPTIONS "/MDd" "/D__INTEL_PREVIEW_BREAKING_CHANGES" SOURCES ${SYCL_PREVIEW_SOURCES})
297+
add_sycl_rt_library(sycl${SYCL_MAJOR_VERSION}-previewd sycl-previewd_object COMPILE_OPTIONS "/MDd" "/D__INTEL_PREVIEW_BREAKING_CHANGES" SOURCES ${SYCL_PREVIEW_SOURCES} IMPLIB_NAME sycl-previewd)
288298
endif()
289299
endif()
290300
unset(WIN_DUPE)
@@ -307,16 +317,18 @@ set(LIB_NAME "sycl${SYCL_MAJOR_VERSION}")
307317
else()
308318
set(LIB_NAME "sycl")
309319
endif()
320+
# Version-agnostic name of the import library, has effect on Windows only.
321+
set(IMPLIB_NAME "sycl")
310322

311323
if (SYCL_ENABLE_XPTI_TRACING)
312-
add_sycl_rt_library(${LIB_NAME} sycl_object XPTI_LIB xpti COMPILE_OPTIONS ${SYCL_EXTRA_OPTS} SOURCES ${SYCL_NON_PREVIEW_SOURCES})
324+
add_sycl_rt_library(${LIB_NAME} sycl_object XPTI_LIB xpti COMPILE_OPTIONS ${SYCL_EXTRA_OPTS} SOURCES ${SYCL_NON_PREVIEW_SOURCES} IMPLIB_NAME ${IMPLIB_NAME})
313325
if(SYCL_ENABLE_MAJOR_RELEASE_PREVIEW_LIB)
314-
add_sycl_rt_library(${LIB_NAME}-preview sycl-preview_object XPTI_LIB xpti COMPILE_OPTIONS ${SYCL_EXTRA_OPTS} "-D__INTEL_PREVIEW_BREAKING_CHANGES" SOURCES ${SYCL_PREVIEW_SOURCES})
326+
add_sycl_rt_library(${LIB_NAME}-preview sycl-preview_object XPTI_LIB xpti COMPILE_OPTIONS ${SYCL_EXTRA_OPTS} "-D__INTEL_PREVIEW_BREAKING_CHANGES" SOURCES ${SYCL_PREVIEW_SOURCES} IMPLIB_NAME ${IMPLIB_NAME}-preview)
315327
endif()
316328
else()
317-
add_sycl_rt_library(${LIB_NAME} sycl_object COMPILE_OPTIONS ${SYCL_EXTRA_OPTS} SOURCES ${SYCL_NON_PREVIEW_SOURCES})
329+
add_sycl_rt_library(${LIB_NAME} sycl_object COMPILE_OPTIONS ${SYCL_EXTRA_OPTS} SOURCES ${SYCL_NON_PREVIEW_SOURCES} IMPLIB_NAME ${IMPLIB_NAME})
318330
if(SYCL_ENABLE_MAJOR_RELEASE_PREVIEW_LIB)
319-
add_sycl_rt_library(${LIB_NAME}-preview sycl-preview_object COMPILE_OPTIONS ${SYCL_EXTRA_OPTS} "-D__INTEL_PREVIEW_BREAKING_CHANGES" SOURCES ${SYCL_PREVIEW_SOURCES})
331+
add_sycl_rt_library(${LIB_NAME}-preview sycl-preview_object COMPILE_OPTIONS ${SYCL_EXTRA_OPTS} "-D__INTEL_PREVIEW_BREAKING_CHANGES" SOURCES ${SYCL_PREVIEW_SOURCES} IMPLIB_NAME ${IMPLIB_NAME}-preview)
320332
endif()
321333
endif()
322334

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// REQUIRES: windows
2+
3+
// RUN: %clangxx --driver-mode=cl /std:c++17 /EHsc -I%sycl_include -I%opencl_include_dir %s -o %t.out /link /defaultlib:%sycl_static_libs_dir/sycl.lib
4+
// RUN: %{run} %t.out
5+
6+
// This test checks that if program is linked with version-agnostic import library sycl.lib then sycl program works as expected.
7+
// It is expected to crash if correct dll can't be loaded.
8+
9+
#include <iostream>
10+
#include <sycl/sycl.hpp>
11+
12+
using namespace sycl;
13+
14+
int main() {
15+
queue q;
16+
}

0 commit comments

Comments
 (0)