list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../runtimes/cmake/Modules")
include(WarningFlags)
function(add_sycl_rt_library LIB_TARGET_NAME LIB_OBJ_NAME LIB_OUTPUT_NAME)
  cmake_parse_arguments(ARG "" "" "COMPILE_OPTIONS;SOURCES" ${ARGN})

  add_library(${LIB_OBJ_NAME} OBJECT ${ARG_SOURCES})

  # Common compilation step setup
  target_compile_definitions(${LIB_OBJ_NAME} PRIVATE
              $<$<STREQUAL:${CMAKE_SYSTEM_NAME},Windows>:_LIBSYCL_BUILDING_LIBRARY>)
  cxx_add_warning_flags(${LIB_OBJ_NAME} ${LIBSYCL_ENABLE_WERROR} ${LIBSYCL_ENABLE_PEDANTIC})

  add_library(${LIB_TARGET_NAME} SHARED
              $<TARGET_OBJECTS:${LIB_OBJ_NAME}>)

  add_dependencies(${LIB_OBJ_NAME}
    sycl-headers
    LLVMOffload
    LLVMObject
  )

  target_include_directories(${LIB_OBJ_NAME}
    PRIVATE
      ${CMAKE_CURRENT_SOURCE_DIR}
      ${LIBSYCL_BUILD_INCLUDE_DIR}
      $<TARGET_PROPERTY:LLVMOffload,INTERFACE_INCLUDE_DIRECTORIES>
      ${LLVM_MAIN_INCLUDE_DIR}
  )

  set_target_properties(${LIB_TARGET_NAME}
      PROPERTIES
        LINKER_LANGUAGE CXX
        POSITION_INDEPENDENT_CODE TRUE)

  if (CMAKE_SYSTEM_NAME STREQUAL Windows)
    # Install stripped PDB
    set(PDB_FILENAME "${LIB_TARGET_NAME}$<$<CONFIG:Debug>:d>")
    check_linker_flag(CXX "LINKER:/PDBSTRIPPED:${PDB_FILENAME}.stripped.pdb"
                          LINKER_SUPPORTS_PDBSTRIPPED)
    if(LINKER_SUPPORTS_PDBSTRIPPED)
      target_link_options(${LIB_TARGET_NAME}
                          PRIVATE "LINKER:/PDBSTRIPPED:${PDB_FILENAME}.stripped.pdb")
      install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PDB_FILENAME}.stripped.pdb"
              DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
              RENAME "${PDB_FILENAME}.pdb"
              COMPONENT ${LIB_TARGET_NAME}
              OPTIONAL)
    endif()

    target_compile_options(${LIB_OBJ_NAME} PUBLIC /EHsc)
  else()
    target_compile_options(${LIB_OBJ_NAME} PUBLIC
                           -fvisibility=hidden -fvisibility-inlines-hidden)

    if (UNIX AND NOT APPLE)
      set(linker_script "${CMAKE_CURRENT_SOURCE_DIR}/ld-version-script.txt")
      target_link_libraries(${LIB_TARGET_NAME}
        PRIVATE "-Wl,--version-script=${linker_script}")
      set_target_properties(${LIB_TARGET_NAME}
        PROPERTIES
          LINK_DEPENDS ${linker_script})
    endif()
  endif()

  find_package(Threads REQUIRED)

  target_link_libraries(${LIB_TARGET_NAME}
    PRIVATE
      ${CMAKE_DL_LIBS}
      ${CMAKE_THREAD_LIBS_INIT}
      LLVMOffload
      LLVMObject
      LLVMSupport
  )

  set_target_properties(${LIB_TARGET_NAME}
    PROPERTIES
      VERSION ${LIBSYCL_VERSION_STRING}
      SOVERSION ${LIBSYCL_VERSION_STRING})
  set_target_properties(${LIB_TARGET_NAME}
    PROPERTIES
      OUTPUT_NAME ${LIB_OUTPUT_NAME})

endfunction(add_sycl_rt_library)

set(LIBSYCL_SOURCES
    "context.cpp"
    "event.cpp"
    "exception.cpp"
    "exception_list.cpp"
    "device.cpp"
    "device_selector.cpp"
    "platform.cpp"
    "queue.cpp"
    "usm_functions.cpp"
    "detail/context_impl.cpp"
    "detail/event_impl.cpp"
    "detail/device_image_wrapper.cpp"
    "detail/device_impl.cpp"
    "detail/global_objects.cpp"
    "detail/platform_impl.cpp"
    "detail/program_manager.cpp"
    "detail/queue_impl.cpp"
    "detail/offload/offload_utils.cpp"
    "detail/offload/offload_topology.cpp"
)

add_sycl_rt_library(${LIBSYCL_LIB_NAME}
  ${LIBSYCL_OBJ_TARGET}
  ${LIBSYCL_SHARED_OUTPUT_NAME}
  SOURCES
    ${LIBSYCL_SOURCES})

install(TARGETS ${LIBSYCL_RT_LIBS}
  ARCHIVE DESTINATION ${LIBSYCL_INSTALL_LIBRARY_DIR} COMPONENT libsycl
  LIBRARY DESTINATION ${LIBSYCL_INSTALL_LIBRARY_DIR} COMPONENT libsycl
  RUNTIME DESTINATION "bin" COMPONENT libsycl)
