cmake_minimum_required(VERSION 3.5.1)
project(dldt_cuda_kernel)

if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose Release or Debug" FORCE)
endif()

if(NOT CMAKE_CXX_STANDARD)
    set(CMAKE_CXX_STANDARD 17)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    set(CMAKE_CXX_EXTENSIONS OFF)
endif()

# Set compiler based on platform
if(WIN32)
    set(CMAKE_CXX_COMPILER "clang-cl")
    set(CMAKE_C_COMPILER "clang-cl")
else()
    set(CMAKE_CXX_COMPILER "dlcc")
endif()

# Define install directories for standalone builds
if(NOT DEFINED CMAKE_INSTALL_INCLUDEDIR)
    set(CMAKE_INSTALL_INCLUDEDIR include)
endif()
if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
    set(CMAKE_INSTALL_LIBDIR lib)
endif()

set(CUDA_NVCC_FLAGS -O3)

include_directories(${SDK_PATH}/include)
link_directories(${SDK_PATH}/lib)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/dldt_cuda_kernel)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src/cuosd)

option(BUILD_TRUETYPE_BACKEND "Enable the TrueType text backend" ON)

if(BUILD_TRUETYPE_BACKEND)
    add_definitions(-DENABLE_TEXT_BACKEND_STB)
endif()

file(GLOB_RECURSE CUOSD_CC_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/cuosd/*.cpp")
if(DLI_V1)
    file(GLOB_RECURSE CUOSD_CU_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/cuosd/*dli_v1.cu")
elseif(DLI_V2)
    file(GLOB_RECURSE CUOSD_CU_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/cuosd/*dli_v2.cu")
endif()

if(DLI_V1)
    file(GLOB_RECURSE IMPROC_CC_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/image_proc/src_gen1/*.cc")
    file(GLOB_RECURSE IMPROC_CU_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/image_proc/src_gen1/*.cu" "${CMAKE_CURRENT_SOURCE_DIR}/src/image_proc/src_gen1/*.cu.cc")
elseif(DLI_V2)
    file(GLOB_RECURSE IMPROC_CC_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/image_proc/src_gen2/*.cc")
    file(GLOB_RECURSE IMPROC_CU_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/image_proc/src_gen2/*.cu" "${CMAKE_CURRENT_SOURCE_DIR}/src/image_proc/src_gen2/*.cu.cc")
else()
    message(FATAL_ERROR "Not match any chip arch.")
endif()

file(GLOB_RECURSE IMPROC_EXT_CC_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/image_proc_ext/*.cc")
file(GLOB_RECURSE IMPROC_EXT_CU_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/image_proc_ext/*.cu" "${CMAKE_CURRENT_SOURCE_DIR}/src/image_proc_ext/*.cu.cc")

set_source_files_properties(${CUOSD_CU_SOURCES} PROPERTIES LANGUAGE CXX)
set_source_files_properties(${IMPROC_CU_SOURCES} PROPERTIES LANGUAGE CXX)
set_source_files_properties(${IMPROC_EXT_CU_SOURCES} PROPERTIES LANGUAGE CXX)

set(DLDT_CUDA_KERNEL_SOURCES ${CUOSD_CC_SOURCES} ${CUOSD_CU_SOURCES} ${IMPROC_CC_SOURCES} ${IMPROC_CU_SOURCES} ${IMPROC_EXT_CC_SOURCES} ${IMPROC_EXT_CU_SOURCES})

add_library(dldt_cuda_kernel SHARED ${DLDT_CUDA_KERNEL_SOURCES})
target_link_libraries(dldt_cuda_kernel PRIVATE curt)

# Windows: export all symbols from DLL (no need to modify source files with __declspec(dllexport))
if(WIN32)
    set_target_properties(dldt_cuda_kernel PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON)
endif()

if(DLI_V1)
    add_definitions(-DDLI_V1)
    if(WIN32)
        target_compile_options(dldt_cuda_kernel PRIVATE /permissive- /wd4996 /wd4244 -Wno-c++11-narrowing -Wno-attributes --cuda-gpu-arch=dlgpuc64 -x cuda)
    else()
        target_compile_options(dldt_cuda_kernel PRIVATE -fPIC -fpermissive -Wno-attributes -Wno-c++11-narrowing -Wdouble-promotion --cuda-gpu-arch=dlgpuc64 -x cuda)
    endif()
elseif(DLI_V2)
    add_definitions(-DDLI_V2)
    if(WIN32)
        target_compile_options(dldt_cuda_kernel PRIVATE /permissive- /wd4996 /wd4244 -Wno-c++11-narrowing -Wno-attributes --offload-arch=dlgput64,dlgpux64 -x cuda)
    else()
        target_compile_options(dldt_cuda_kernel PRIVATE -fPIC -fpermissive -Wno-attributes -Wno-c++11-narrowing -Wdouble-promotion --offload-arch=dlgput64,dlgpux64 -x cuda)
    endif()
else()
    message(FATAL_ERROR "Not match any dl sdk version info.")
endif()

target_include_directories(dldt_cuda_kernel PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>"
    "$<INSTALL_INTERFACE:include>")  # Use relative path for install

# Install headers
install(DIRECTORY include/
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
    FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp"
)

# Install library to lib/ (not lib/dldt/) for easier discovery
install(
    TARGETS dldt_cuda_kernel
    EXPORT dldt_cuda_kernel
    LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
    ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
    RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
)
