diff --git a/sycl-jit/jit-compiler/CMakeLists.txt b/sycl-jit/jit-compiler/CMakeLists.txt index d0f63e27cda63..dab40ee9eed58 100644 --- a/sycl-jit/jit-compiler/CMakeLists.txt +++ b/sycl-jit/jit-compiler/CMakeLists.txt @@ -9,25 +9,50 @@ else() set(SYCL_JIT_VIRTUAL_TOOLCHAIN_ROOT "/sycl-jit-toolchain/") endif() -set(SYCL_JIT_RESOURCE_DEPS - sycl-headers # include/sycl - clang # lib/clang/N/include - ${CMAKE_CURRENT_SOURCE_DIR}/utils/generate.py) +set(SYCL_JIT_RESOURCE_INSTALL_COMPONENTS sycl-headers OpenCL-Headers clang-resource-headers) if ("libclc" IN_LIST LLVM_ENABLE_PROJECTS) - # Somehow just "libclc" doesn't build "remangled-*" (and maybe whatever else). - list(APPEND SYCL_JIT_RESOURCE_DEPS libclc libspirv-builtins) # lib/clc/*.bc + list(APPEND SYCL_JIT_RESOURCE_INSTALL_COMPONENTS libspirv-builtins) endif() if ("libdevice" IN_LIST LLVM_ENABLE_PROJECTS) - list(APPEND SYCL_JIT_RESOURCE_DEPS libsycldevice) # lib/*.bc + list(APPEND SYCL_JIT_RESOURCE_INSTALL_COMPONENTS libsycldevice) endif() +set(SYCL_JIT_RESOURCE_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/rtc-resources-install) + +set(SYCL_JIT_PREPARE_RESOURCE_COMMANDS) +foreach(component IN LISTS SYCL_JIT_RESOURCE_INSTALL_COMPONENTS) + list(APPEND SYCL_JIT_PREPARE_RESOURCE_COMMANDS + COMMAND ${CMAKE_COMMAND} --install ${CMAKE_BINARY_DIR} --prefix ${SYCL_JIT_RESOURCE_INSTALL_DIR} --component "${component}" + ) +endforeach() + +set(SYCL_JIT_RESOURCE_DEPS ${SYCL_JIT_RESOURCE_INSTALL_COMPONENTS}) + # OpenCL-Headers doesn't have a corresponding build target: +list(FILTER SYCL_JIT_RESOURCE_DEPS EXCLUDE REGEX "^OpenCL-Headers$") + +# This is very hacky and I don't quite know what I'm doing, but it's necessary +# to have `resource.cpp` re-generated/re-built when some SYCL header changes. +# +# Inspired by the way `sycl-headers` target is created. +file(GLOB_RECURSE SYCL_JIT_RESOURCE_FILES CONFIGURE_DEPENDS "${SYCL_JIT_RESOURCE_INSTALL_DIR}/*" ) + +add_custom_target(rtc-prepare-resources + DEPENDS ${SYCL_JIT_RESOURCE_DEPS} + ${SYCL_JIT_PREPARE_RESOURCE_COMMANDS} + BYPRODUCTS + ${SYCL_JIT_RESOURCE_FILES} +) + add_custom_command( OUTPUT ${SYCL_JIT_RESOURCE_CPP} - COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/utils/generate.py --toolchain-dir ${CMAKE_BINARY_DIR} --output ${SYCL_JIT_RESOURCE_CPP} --prefix ${SYCL_JIT_VIRTUAL_TOOLCHAIN_ROOT} + COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/utils/generate.py --toolchain-dir ${SYCL_JIT_RESOURCE_INSTALL_DIR} --output ${SYCL_JIT_RESOURCE_CPP} --prefix ${SYCL_JIT_VIRTUAL_TOOLCHAIN_ROOT} DEPENDS + rtc-prepare-resources ${SYCL_JIT_RESOURCE_DEPS} + ${SYCL_JIT_RESOURCE_FILES} + ${CMAKE_CURRENT_SOURCE_DIR}/utils/generate.py ) # We use C23/C++26's `#embed` to implement this resource creation, and "current" @@ -67,6 +92,8 @@ add_custom_command( ${clang_exe} --target=${LLVM_HOST_TRIPLE} ${SYCL_JIT_RESOURCE_CPP} -I ${CMAKE_CURRENT_SOURCE_DIR}/include -c -o ${SYCL_JIT_RESOURCE_OBJ} ${SYCL_JIT_RESOURCE_CXX_FLAGS} DEPENDS ${SYCL_JIT_RESOURCE_CPP} + ${SYCL_JIT_RESOURCE_DEPS} + ${SYCL_JIT_RESOURCE_FILES} ${CMAKE_CURRENT_SOURCE_DIR}/include/Resource.h ) diff --git a/sycl-jit/jit-compiler/utils/generate.py b/sycl-jit/jit-compiler/utils/generate.py index 7fca23e869716..449723b8fa268 100644 --- a/sycl-jit/jit-compiler/utils/generate.py +++ b/sycl-jit/jit-compiler/utils/generate.py @@ -52,15 +52,7 @@ def process_dir(dir): file_path = os.path.join(root, file) process_file(file_path) - process_dir(os.path.join(args.toolchain_dir, "include/")) - process_dir(os.path.join(args.toolchain_dir, "lib/clang/")) - process_dir(os.path.join(args.toolchain_dir, "lib/clc/")) - - for file in glob.iglob( - "*.bc", root_dir=os.path.join(args.toolchain_dir, "lib") - ): - file_path = os.path.join(args.toolchain_dir, "lib", file) - process_file(file_path) + process_dir(args.toolchain_dir) out.write( f"""