# SPDX-License-Identifier: Apache-2.0
# Copyright (c) 2026 CompilerSutraPerfTool
# Author: Abhinav | https://compilersutra.com | https://www.linkedin.com/in/abhinavcompilerllvm/

add_library(csperfSupport STATIC
    lib/Support/JSON.cpp
)

target_include_directories(csperfSupport
    PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}/include
)

add_library(csperfRuntime STATIC
    lib/Runtime/Application.cpp
    lib/Runtime/Process.cpp
    lib/Runtime/RuntimeInfo.cpp
)

target_include_directories(csperfRuntime
    PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}/include
)

target_link_libraries(csperfRuntime
    PUBLIC
        csperfSupport
)

add_library(csperfNative STATIC
    lib/Native/NativeArgumentParser.cpp
    lib/Native/NativeApplication.cpp
    lib/Native/NativeRunner.cpp
)

target_include_directories(csperfNative
    PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}/include
)

target_link_libraries(csperfNative
    PUBLIC
        csperfRuntime
)

add_library(csperfOpenCL STATIC
    lib/OpenCL/OpenCLArgumentParser.cpp
    lib/OpenCL/OpenCLDeviceCatalog.cpp
    lib/OpenCL/OpenCLDevicePolicy.cpp
    lib/OpenCL/OpenCLSupport.cpp
    lib/OpenCL/OpenCLApplication.cpp
    lib/OpenCL/OpenCLKernelExecutor.cpp
)

target_include_directories(csperfOpenCL
    PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}/include
)

target_link_libraries(csperfOpenCL
    PUBLIC
        csperfRuntime
)

find_package(OpenCL)
if(OpenCL_FOUND)
    target_link_libraries(csperfOpenCL
        PUBLIC
            OpenCL::OpenCL
    )
else()
    find_library(CSPERF_OPENCL_LIBRARY
        NAMES OpenCL libOpenCL.so.1
        PATHS
            /usr/lib/x86_64-linux-gnu
            /lib/x86_64-linux-gnu
    )
    if(NOT CSPERF_OPENCL_LIBRARY)
        message(FATAL_ERROR "OpenCL library not found")
    endif()
    target_link_libraries(csperfOpenCL
        PUBLIC
            ${CSPERF_OPENCL_LIBRARY}
    )
endif()

add_library(csperfVulkan STATIC
    lib/Vulkan/VulkanArgumentParser.cpp
    lib/Vulkan/VulkanDeviceCatalog.cpp
    lib/Vulkan/VulkanDevicePolicy.cpp
    lib/Vulkan/VulkanLibraryPolicy.cpp
    lib/Vulkan/VulkanLoader.cpp
    lib/Vulkan/VulkanQueueFamilyPolicy.cpp
    lib/Vulkan/VulkanSupport.cpp
    lib/Vulkan/VulkanApplication.cpp
    lib/Vulkan/VulkanShaderValidator.cpp
)

target_include_directories(csperfVulkan
    PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}/include
)

target_link_libraries(csperfVulkan
    PUBLIC
        csperfRuntime
        dl
)

add_executable(csperf_native_runner
    tools/csperf-native-runner/main.cpp
)

target_link_libraries(csperf_native_runner
    PRIVATE
        csperfNative
)

add_executable(csperf_opencl_runner
    tools/csperf-opencl-runner/main.cpp
)

target_link_libraries(csperf_opencl_runner
    PRIVATE
        csperfOpenCL
)

add_executable(csperf_vulkan_runner
    tools/csperf-vulkan-runner/main.cpp
)

target_link_libraries(csperf_vulkan_runner
    PRIVATE
        csperfVulkan
)

set_target_properties(
    csperf_native_runner
    csperf_opencl_runner
    csperf_vulkan_runner
    PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
)
