# SPDX-License-Identifier: Apache-2.0
# Copyright (c) 2026 CompilerSutraPerfTool
# Author: Priya Pandey | https://www.linkedin.com/in/priya-pandey-54a5a22aa/ | CompilerSutra | https://www.linkedin.com/company/compilersutra/ | https://compilersutra.com

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
)

find_package(OpenCL QUIET)
if(NOT OpenCL_FOUND AND NOT APPLE)
    find_library(CSPERF_OPENCL_LIBRARY
        NAMES OpenCL libOpenCL.so.1
        PATHS
            /usr/lib/x86_64-linux-gnu
            /lib/x86_64-linux-gnu
    )
endif()
if(OpenCL_FOUND OR CSPERF_OPENCL_LIBRARY)
    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
            $<$<BOOL:${OpenCL_FOUND}>:OpenCL::OpenCL>
            $<$<NOT:$<BOOL:${OpenCL_FOUND}>>:${CSPERF_OPENCL_LIBRARY}>
    )

    add_executable(csperf_opencl_runner
        tools/csperf-opencl-runner/main.cpp
    )
    target_link_libraries(csperf_opencl_runner PRIVATE csperfOpenCL)
else()
    message(STATUS "OpenCL not found; skipping the optional OpenCL runner")
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
)
if(NOT APPLE)
    target_link_libraries(csperfVulkan PUBLIC dl)
endif()

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

target_link_libraries(csperf_native_runner
    PRIVATE
        csperfNative
)

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_vulkan_runner
    PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
)

if(TARGET csperf_opencl_runner)
    set_target_properties(csperf_opencl_runner PROPERTIES
        RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
    )
endif()
