diff --git a/clang/lib/Headers/CMakeLists.txt b/clang/lib/Headers/CMakeLists.txt index dd52498bbef4c..25f67220557b7 100644 --- a/clang/lib/Headers/CMakeLists.txt +++ b/clang/lib/Headers/CMakeLists.txt @@ -636,6 +636,19 @@ install( DESTINATION ${header_install_dir}/zos_wrappers COMPONENT clang-resource-headers) + +# Install clang resource headers for the sycl-jit component +install( + FILES ${files} ${generated_files} + DESTINATION ${header_install_dir} + COMPONENT sycl-jit-resources) + +install( + FILES ${llvm_offload_wrapper_files} + DESTINATION ${header_install_dir}/llvm_offload_wrappers + COMPONENT sycl-jit-resources) + + ############################################################# # Install rules for separate header lists install( diff --git a/libclc/CMakeLists.txt b/libclc/CMakeLists.txt index 8458f4f242348..2818df8022114 100644 --- a/libclc/CMakeLists.txt +++ b/libclc/CMakeLists.txt @@ -634,6 +634,11 @@ install(DIRECTORY ${LIBCLC_LIBRARY_OUTPUT_INTDIR} COMPONENT libspirv-builtins FILES_MATCHING PATTERN "libspirv-*") +install(DIRECTORY ${LIBCLC_LIBRARY_OUTPUT_INTDIR} + DESTINATION lib${LLVM_LIBDIR_SUFFIX} + COMPONENT sycl-jit-resources + FILES_MATCHING PATTERN "*.bc") + if( LIBCLC_GENERATE_REMANGLED_VARIANTS ) install(DIRECTORY ${LIBCLC_LIBRARY_OUTPUT_INTDIR} DESTINATION lib${LLVM_LIBDIR_SUFFIX} diff --git a/libdevice/cmake/modules/SYCLLibdevice.cmake b/libdevice/cmake/modules/SYCLLibdevice.cmake index 8b7eaa3a723a4..ccbd62b80cb78 100644 --- a/libdevice/cmake/modules/SYCLLibdevice.cmake +++ b/libdevice/cmake/modules/SYCLLibdevice.cmake @@ -173,6 +173,10 @@ function(compile_lib_ext filename) install( FILES ${devicelib-file} DESTINATION ${install_dest_${ARG_FILETYPE}} COMPONENT libsycldevice) + + install( FILES ${devicelib-file} + DESTINATION ${install_dest_${ARG_FILETYPE}} + COMPONENT sycl-jit-resources) endfunction() # Links together one or more bytecode files diff --git a/sycl-jit/jit-compiler/BuildSyclJitAtInstall.cmake.in b/sycl-jit/jit-compiler/BuildSyclJitAtInstall.cmake.in new file mode 100644 index 0000000000000..359b10e07aec9 --- /dev/null +++ b/sycl-jit/jit-compiler/BuildSyclJitAtInstall.cmake.in @@ -0,0 +1,92 @@ +# BuildSyclJitAtInstall.cmake.in +# This script is EXECUTED AT INSTALL TIME by 'ninja install' + +set(INSTALL_ROOT_DIR "${CMAKE_INSTALL_PREFIX}") +set(INSTALL_INCLUDE_DIR "${CMAKE_INSTALL_PREFIX}/include") +set(INSTALL_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") +set(INSTALL_BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin") + +# These variables are baked in from configure_file +set(PYTHON_EXE "@PYTHON_EXE_FOR_INSTALL@") +set(GENERATE_SCRIPT "@GENERATE_SCRIPT_PATH@") +set(SCRIPT_SOURCE_DIR "@SCRIPT_SOURCE_DIR_FOR_INSTALL@") +set(COMPILE_FLAGS_LIST "@JIT_INSTALL_COMPILE_FLAGS@") +set(LINK_FLAGS_LIST "@JIT_INSTALL_LINK_FLAGS@") + +# We use the *installed* clang++, which must be present. +set(COMPILER_EXE "@COMPILER_PATH_FOR_INSTALL@") + +# Define a temporary build directory +set(TEMP_BUILD_DIR "${CMAKE_BINARY_DIR}/sycl-jit-install-build") +file(MAKE_DIRECTORY ${TEMP_BUILD_DIR}) +set(RESOURCE_CPP "${TEMP_BUILD_DIR}/resource.cpp") + +# Generate resource.cpp using generate.py +if(NOT EXISTS ${PYTHON_EXE}) + message(FATAL_ERROR " -- Python executable not found at: ${PYTHON_EXE}") +endif() +if(NOT EXISTS ${GENERATE_SCRIPT}) + message(FATAL_ERROR " -- Generate script not found at: ${GENERATE_SCRIPT}") +endif() + +# This is the key: We call the *same script* but change +# --toolchain-dir from ${CMAKE_BINARY_DIR} to ${INSTALL_ROOT_DIR} +execute_process( + COMMAND ${PYTHON_EXE} ${GENERATE_SCRIPT} + --toolchain-dir ${INSTALL_ROOT_DIR} + --output ${RESOURCE_CPP} + --prefix "/sycl-jit-toolchain/" + RESULT_VARIABLE GEN_RESULT + OUTPUT_VARIABLE GEN_OUTPUT + ERROR_VARIABLE GEN_OUTPUT +) +if(NOT GEN_RESULT EQUAL 0) + message(FATAL_ERROR " Failed to generate resource.cpp at install time:\n RESULT: ${GEN_RESULT}\n OUTPUT: ${GEN_OUTPUT}") +endif() + +# Compile and link the new, clean sycl-jit.so +set(JIT_SOURCES "@JIT_SOURCES_STRING_LIST@") + +# Add our newly generated *clean* resource.cpp to the list +list(APPEND JIT_SOURCES ${RESOURCE_CPP}) +set(OUTPUT_FILE "${INSTALL_LIB_DIR}/libsycl-jit.so") + +message(STATUS " Compiling and linking ${OUTPUT_FILE}...") +if(NOT EXISTS ${COMPILER_EXE}) + message(FATAL_ERROR " -- clang++ not found at expected install path: ${COMPILER_EXE}") +endif() + +# Build include paths list +set(INCLUDE_FLAGS_LIST "") +list(APPEND INCLUDE_FLAGS_LIST "-I${INSTALL_INCLUDE_DIR}") +list(APPEND INCLUDE_FLAGS_LIST "-I${INSTALL_INCLUDE_DIR}/LLVMSPIRVLib") +list(APPEND INCLUDE_FLAGS_LIST "-I@LLVM_INCLUDE_DIR_FOR_INSTALL@") +list(APPEND INCLUDE_FLAGS_LIST "-I@SPIRV_INCLUDE_DIRS_FOR_INSTALL@") +list(APPEND INCLUDE_FLAGS_LIST "-I@CLANG_SOURCE_INCLUDE_DIR_FOR_INSTALL@") +list(APPEND INCLUDE_FLAGS_LIST "-I@CLANG_BUILD_INCLUDE_DIR_FOR_INSTALL@") +list(APPEND INCLUDE_FLAGS_LIST "-I@LLVM_BUILD_INCLUDE_DIR_FOR_INSTALL@") # Config +list(APPEND INCLUDE_FLAGS_LIST "-I@SYCL_JIT_PASSES_DIR_FOR_INSTALL@") +list(APPEND INCLUDE_FLAGS_LIST "-I@SYCL_JIT_LOCAL_INCLUDE_DIR_FOR_INSTALL@") +list(APPEND INCLUDE_FLAGS_LIST "-I@SYCL_JIT_LOCAL_LIB_DIR_FOR_INSTALL@") + +set(JIT_LOCAL_SOURCE_DIRS "@JIT_INCLUDE_DIRS_STRING_LIST@") +foreach(include_dir ${JIT_LOCAL_SOURCE_DIRS}) + list(APPEND INCLUDE_FLAGS_LIST "-I${include_dir}") +endforeach() + + +execute_process( + COMMAND ${COMPILER_EXE} + ${COMPILE_FLAGS_LIST} + ${INCLUDE_FLAGS_LIST} # <-- Use the new full list + -o ${OUTPUT_FILE} + ${JIT_SOURCES} + ${LINK_FLAGS_LIST} + RESULT_VARIABLE COMPILE_RESULT + OUTPUT_VARIABLE COMPILE_OUTPUT + ERROR_VARIABLE COMPILE_OUTPUT +) + +if(NOT COMPILE_RESULT EQUAL 0) + message(FATAL_ERROR " Failed to build sycl-jit.so at install time:\n${COMPILE_OUTPUT}") +endif() diff --git a/sycl-jit/jit-compiler/CMakeLists.txt b/sycl-jit/jit-compiler/CMakeLists.txt index d0f63e27cda63..20c6ea57f418d 100644 --- a/sycl-jit/jit-compiler/CMakeLists.txt +++ b/sycl-jit/jit-compiler/CMakeLists.txt @@ -10,8 +10,9 @@ set(SYCL_JIT_VIRTUAL_TOOLCHAIN_ROOT "/sycl-jit-toolchain/") endif() set(SYCL_JIT_RESOURCE_DEPS - sycl-headers # include/sycl - clang # lib/clang/N/include + sycl-headers # include/sycl + clang # lib/clang/N/include + opencl-resource-headers # fixes build race. not actually used. ${CMAKE_CURRENT_SOURCE_DIR}/utils/generate.py) if ("libclc" IN_LIST LLVM_ENABLE_PROJECTS) @@ -70,17 +71,21 @@ add_custom_command( ${CMAKE_CURRENT_SOURCE_DIR}/include/Resource.h ) +set(SYCL_JIT_SOURCES_LIST + lib/translation/JITContext.cpp + lib/translation/SPIRVLLVMTranslation.cpp + lib/translation/Translation.cpp + lib/materializer/MaterializerPipeline.cpp + lib/materializer/Materializer.cpp + lib/rtc/DeviceCompilation.cpp + lib/rtc/ESIMD.cpp + lib/rtc/RTC.cpp + lib/helper/ConfigHelper.cpp + lib/helper/ErrorHelper.cpp +) + add_llvm_library(sycl-jit - lib/translation/JITContext.cpp - lib/translation/SPIRVLLVMTranslation.cpp - lib/translation/Translation.cpp - lib/materializer/MaterializerPipeline.cpp - lib/materializer/Materializer.cpp - lib/rtc/DeviceCompilation.cpp - lib/rtc/ESIMD.cpp - lib/rtc/RTC.cpp - lib/helper/ConfigHelper.cpp - lib/helper/ErrorHelper.cpp + ${SYCL_JIT_SOURCES_LIST} ${SYCL_JIT_RESOURCE_OBJ} @@ -120,6 +125,8 @@ add_llvm_library(sycl-jit clangSerialization ) + + if(WIN32) target_link_libraries(sycl-jit PRIVATE Shlwapi) endif() @@ -170,3 +177,86 @@ if(NOT MSVC AND NOT APPLE) sycl-jit PRIVATE "-Wl,--version-script=${linker_script}") set_target_properties(sycl-jit PROPERTIES LINK_DEPENDS ${linker_script}) endif() + + +# These variables for the install script +set(PYTHON_EXE_FOR_INSTALL "${Python3_EXECUTABLE}") +set(GENERATE_SCRIPT_PATH "${CMAKE_CURRENT_LIST_DIR}/utils/generate.py") +set(SCRIPT_SOURCE_DIR_FOR_INSTALL "${CMAKE_CURRENT_LIST_DIR}") +set(COMPILER_PATH_FOR_INSTALL "${CMAKE_INSTALL_PREFIX}/bin/clang++") +set(LLVM_INCLUDE_DIR_FOR_INSTALL ${LLVM_MAIN_INCLUDE_DIR}) +set(SPIRV_INCLUDE_DIRS_FOR_INSTALL ${LLVM_SPIRV_INCLUDE_DIRS}) +set(CLANG_SOURCE_INCLUDE_DIR_FOR_INSTALL "${LLVM_EXTERNAL_CLANG_SOURCE_DIR}/include") +set(CLANG_BUILD_INCLUDE_DIR_FOR_INSTALL "${CMAKE_BINARY_DIR}/tools/clang/include") +set(SYCL_JIT_PASSES_DIR_FOR_INSTALL "${CMAKE_CURRENT_LIST_DIR}/../passes") +set(SYCL_JIT_LOCAL_INCLUDE_DIR_FOR_INSTALL "${CMAKE_CURRENT_SOURCE_DIR}/include") +set(SYCL_JIT_LOCAL_LIB_DIR_FOR_INSTALL "${CMAKE_CURRENT_SOURCE_DIR}/lib") +set(LLVM_BUILD_INCLUDE_DIR_FOR_INSTALL "${LLVM_BINARY_DIR}/include") +set(JIT_INSTALL_COMPILE_FLAGS "-std=c++17;-fPIC;-Wno-c23-extensions") +set(JIT_INSTALL_LINK_FLAGS "-shared") # Add other link flags + +# Create a new list for the install script +set(JIT_SOURCES_FOR_INSTALL "") +foreach(src_file ${SYCL_JIT_SOURCES_LIST}) + list(APPEND JIT_SOURCES_FOR_INSTALL "${CMAKE_CURRENT_LIST_DIR}/${src_file}") +endforeach() + +# Create a list of local include paths based on the source list +set(JIT_INCLUDE_DIRS_FOR_INSTALL "") +foreach(src_file ${SYCL_JIT_SOURCES_LIST}) + get_filename_component(src_dir "${CMAKE_CURRENT_LIST_DIR}/${src_file}" DIRECTORY) + list(APPEND JIT_INCLUDE_DIRS_FOR_INSTALL ${src_dir}) +endforeach() + +list(APPEND JIT_INCLUDE_DIRS_FOR_INSTALL "${CMAKE_CURRENT_LIST_DIR}/include") + +# Remove duplicates and pass to the script +list(REMOVE_DUPLICATES JIT_INCLUDE_DIRS_FOR_INSTALL) +set(JIT_INCLUDE_DIRS_STRING_LIST "${JIT_INCLUDE_DIRS_FOR_INSTALL}") +set(JIT_SOURCES_STRING_LIST "${JIT_SOURCES_FOR_INSTALL}") + +set(INSTALL_SCRIPT_TEMPLATE "${CMAKE_CURRENT_LIST_DIR}/BuildSyclJitAtInstall.cmake.in") +set(INSTALL_SCRIPT_GENERATED "${CMAKE_CURRENT_BINARY_DIR}/BuildSyclJitAtInstall.cmake") + +# Use configure_file to pass the variables +configure_file( + ${INSTALL_SCRIPT_TEMPLATE} + ${INSTALL_SCRIPT_GENERATED} + @ONLY +) + +install(SCRIPT "${INSTALL_SCRIPT_GENERATED}" COMPONENT sycl-jit) +set(CPACK_COMPONENT_SYCL_JIT_DEPENDS + "sycl-jit-resources" + # From LINK_COMPONENTS + "BitReader" + "BitWriter" + "Core" + "Support" + "Option" + "Analysis" + "IPO" + "TransformUtils" + "Passes" + "IRReader" + "Linker" + "ScalarOpts" + "InstCombine" + "Target" + "TargetParser" + "MC" + "SYCLLowerIR" + "SYCLPostLink" + "SPIRVLib" + ${LLVM_TARGETS_TO_BUILD} + # From LINK_LIBS + "clangBasic" + "clangDriver" + "clangFrontend" + "clangCodeGen" + "clangTooling" + "clangSerialization" + # Also add the main header component + "LLVMHeaders" + "clangHeaders" + ) diff --git a/sycl/CMakeLists.txt b/sycl/CMakeLists.txt index ae3fa0335ab17..34d1c204f6dac 100644 --- a/sycl/CMakeLists.txt +++ b/sycl/CMakeLists.txt @@ -297,6 +297,7 @@ add_custom_command( COMMAND ${CMAKE_COMMAND} -E copy ${UR_HEADERS_TO_COPY} ${SYCL_INCLUDE_BUILD_DIR} COMMENT "Copying SYCL headers ...") + # Copy SYCL headers from source to install directory install(DIRECTORY "${sycl_inc_dir}/sycl" DESTINATION ${SYCL_INCLUDE_DIR} COMPONENT sycl-headers) install(DIRECTORY "${sycl_inc_dir}/CL" DESTINATION ${SYCL_INCLUDE_DIR}/ COMPONENT sycl-headers) @@ -310,6 +311,16 @@ install(FILES "${UNIFIED_RUNTIME_INCLUDE_DIR}/ur_api_funcs.def" DESTINATION ${SY install(FILES "${UNIFIED_RUNTIME_INCLUDE_DIR}/ur_print.hpp" DESTINATION ${SYCL_INCLUDE_DIR} COMPONENT sycl-headers) +# Also install SYCL headers for the sycl-jit component +install(DIRECTORY "${sycl_inc_dir}/sycl" DESTINATION ${SYCL_INCLUDE_DIR} COMPONENT sycl-jit-resources) +install(DIRECTORY "${sycl_inc_dir}/CL" DESTINATION ${SYCL_INCLUDE_DIR}/ COMPONENT sycl-jit-resources) +install(DIRECTORY "${sycl_inc_dir}/std" DESTINATION ${SYCL_INCLUDE_DIR} COMPONENT sycl-jit-resources) +install(DIRECTORY "${sycl_inc_dir}/syclcompat" DESTINATION ${SYCL_INCLUDE_DIR} COMPONENT sycl-jit-resources) +install(FILES "${sycl_inc_dir}/syclcompat.hpp" DESTINATION ${SYCL_INCLUDE_DIR} COMPONENT sycl-jit-resources) +install(FILES "${UNIFIED_RUNTIME_INCLUDE_DIR}/ur_api.h" DESTINATION ${SYCL_INCLUDE_DIR} COMPONENT sycl-jit-resources) +install(FILES "${UNIFIED_RUNTIME_INCLUDE_DIR}/ur_api_funcs.def" DESTINATION ${SYCL_INCLUDE_DIR} COMPONENT sycl-jit-resources) +install(FILES "${UNIFIED_RUNTIME_INCLUDE_DIR}/ur_print.hpp" DESTINATION ${SYCL_INCLUDE_DIR} COMPONENT sycl-jit-resources) + if (WIN32) set(SYCL_RT_LIBS sycl${SYCL_MAJOR_VERSION}) if(SYCL_ENABLE_MAJOR_RELEASE_PREVIEW_LIB) diff --git a/sycl/source/CMakeLists.txt b/sycl/source/CMakeLists.txt index 4159303f87d19..ce0e8aa82fc59 100644 --- a/sycl/source/CMakeLists.txt +++ b/sycl/source/CMakeLists.txt @@ -211,8 +211,6 @@ function(add_sycl_rt_library LIB_NAME LIB_OBJ_NAME) add_dependencies(${LIB_NAME} sycl-jit) add_dependencies(${LIB_OBJ_NAME} sycl-jit) target_include_directories(${LIB_OBJ_NAME} PRIVATE ${SYCL_JIT_INCLUDE_DIRS}) - set_property(GLOBAL APPEND PROPERTY SYCL_TOOLCHAIN_INSTALL_COMPONENTS - sycl-jit) target_compile_definitions(${LIB_NAME} PRIVATE SYCL_EXT_JIT_ENABLE) target_compile_definitions(${LIB_OBJ_NAME} PRIVATE SYCL_EXT_JIT_ENABLE) endif(SYCL_ENABLE_EXTENSION_JIT)