# Utility project providing various functionalities for SPIR-V devices
# without native support of these functionalities.

include(${CMAKE_CURRENT_SOURCE_DIR}/../libclc/cmake/modules/AddLibclc.cmake)

set(CMAKE_MODULE_PATH
  ${CMAKE_MODULE_PATH}
  "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules"
  )

set(UR_INTREE_SOURCE_DIR "${LLVM_SOURCE_DIR}/../unified-runtime")
cmake_path(NORMAL_PATH UR_INTREE_SOURCE_DIR OUTPUT_VARIABLE UR_INTREE_SOURCE_DIR)

if(IS_DIRECTORY "${UR_INTREE_SOURCE_DIR}")
  set(UR_SANITIZER_INCLUDE_DIR
      ${UR_INTREE_SOURCE_DIR}/source/loader/layers/sanitizer)
elseif(EXISTS ${FETCHCONTENT_BASE_DIR}/unified-runtime-src)
  set(UR_SANITIZER_INCLUDE_DIR
      ${FETCHCONTENT_BASE_DIR}/unified-runtime-src/source/loader/layers/sanitizer)
elseif(EXISTS ${SYCL_UR_SOURCE_DIR})
  set(UR_SANITIZER_INCLUDE_DIR
      ${SYCL_UR_SOURCE_DIR}/source/loader/layers/sanitizer)
else()
  message(WARNING "Unified Runtime source directory is not provided, \
                   will not build libdevice sanitizer")
endif()

if(NOT EXISTS ${LIBCLC_CUSTOM_LLVM_TOOLS_BINARY_DIR})
  get_host_tool_path(clang CLANG clang_exe clang_target)
  get_host_tool_path(llvm-ar LLVM_AR llvm-ar_exe llvm-ar_target)
  get_host_tool_path(append-file APPEND_FILE append-file_exe append-file_target)
  get_host_tool_path(clang-offload-bundler CLANG_OFFLOAD_BUNDLER clang-offload-bundler_exe clang-offload-bundler_target)
  get_host_tool_path(clang-offload-packager CLANG_OFFLOAD_PACKAGER clang-offload-packager_exe clang-offload-packager_target)
  get_host_tool_path(file-table-tform FILE_TABLE_TFORM file-table-tform_exe file-table-tform_target)
  get_host_tool_path(llvm-foreach LLVM_FOREACH llvm-foreach_exe llvm-foreach_target)
  get_host_tool_path(llvm-spirv LLVM_SPIRV llvm-spirv_exe llvm-spirv_target)
  get_host_tool_path(sycl-post-link SYCL_POST_LINK sycl-post-link_exe sycl-post-link_target)
  get_host_tool_path(llvm-link LLVM_LINK llvm-link_exe llvm-link_target)
else()
  foreach(tool IN ITEMS clang llvm-ar append-file clang-offload-bundler clang-offload-packager file-table-tform llvm-foreach llvm-spirv sycl-post-link llvm-link)
    find_program(LLVM_CUSTOM_TOOL_${tool} ${tool}
      PATHS ${LIBCLC_CUSTOM_LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH)
    set(${tool}_exe ${LLVM_CUSTOM_TOOL_${tool}})
    set(${tool}_target)
  endforeach()
endif()

# Build libdevice for SYCL.
include(SYCLLibdevice)

set(LIBDEVICE_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
set(LIBDEVICE_LIBRARY_DIR ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
set(LIBDEVICE_RUNTIME_DIR ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
set(LIBDEVICE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})

add_subdirectory(test)
