cmake_minimum_required (VERSION 3.10)
project(app_yolov6_cam)
set(CMAKE_CXX_STANDARD 17)

# ==== TVM headers ====
set(TVM_ROOT $ENV{TVM_HOME})
include_directories(./)
include_directories(${TVM_ROOT}/include)
include_directories(${TVM_ROOT}/../apps)
include_directories(${TVM_ROOT}/3rdparty/dlpack/include)
include_directories(${TVM_ROOT}/3rdparty/dmlc-core/include)
include_directories(${TVM_ROOT}/3rdparty/compiler-rt)
include_directories(${TVM_ROOT}/../how-to/sample_app_v2h/common_files)
include_directories(${TVM_ROOT}/../how-to/sample_app_v2h/common_files/package)
set(DRP_APPS_PATH "/drp-ai_tvm/apps")
set(TVM_RUNTIME_LIB ${TVM_ROOT}/build_runtime/libtvm_runtime.so)
set(EXE_NAME ${PROJECT_NAME})
include_directories(${DRP_APPS_PATH})

set(TVM_RUNTIME_LIB ${TVM_ROOT}/build_runtime/libtvm_runtime.so)
set(EXE_NAME ${PROJECT_NAME})

# ==== Sources (ĐÃ SỬA: Thay thế ../.. bằng đường dẫn biến) ====
file(GLOB SOURCE
  *.cpp *.h
  ${TVM_ROOT}/../how-to/sample_app_v2h/common_files/*.cpp
  ${TVM_ROOT}/../how-to/sample_app_v2h/common_files/*.h
  
  # Thêm trực tiếp các file nguồn quan trọng từ đường dẫn tuyệt đối
  # Để đảm bảo chúng được biên dịch
  ${DRP_APPS_PATH}/MeraDrpRuntimeWrapper.cpp
  ${DRP_APPS_PATH}/PreRuntimeV2H.cpp
)
# ==== Sources ====
#file(GLOB SOURCE
#  *.cpp *.h
#  ${TVM_ROOT}/../how-to/sample_app_v2h/common_files/*.cpp
#  ${TVM_ROOT}/../how-to/sample_app_v2h/common_files/*.h
#  ${TVM_ROOT}/apps/MeraDrpRuntimeWrapper.*
#  ${TVM_ROOT}/apps/PreRuntime.h
#  ${TVM_ROOT}/apps/PreRuntimeV2H.cpp
#)

# ==== Dunfell / Scarthgap ====
if(NOT EXISTS "$ENV{SDK}/sysroots/cortexa55-poky-linux")
  list(REMOVE_ITEM SOURCE ${TVM_ROOT}/../how-to/sample_app_v2h/common_files/wayland_scarthgap.cpp)
  add_definitions(-DV2H)
  message("-- For Dunfell or older")
else()
  include_directories(${CMAKE_SYSROOT}/usr/src/debug/gstreamer1.0-plugins-base/1.22.12/gst-libs/gst/gl)
  list(REMOVE_ITEM SOURCE ${TVM_ROOT}/../how-to/sample_app_v2h/common_files/wayland.cpp)
  list(APPEND SOURCE ${CMAKE_SYSROOT}/usr/src/debug/gstreamer1.0-plugins-base/1.22.12/gst-libs/gst/gl/xdg-shell-client-protocol.c)
  add_definitions(-DV2H -DV2N)
  message("-- For Scarthgap or later")
endif()

add_executable(${EXE_NAME} ${SOURCE})

# Bật WebSocket trong source
target_compile_definitions(${EXE_NAME} PRIVATE USE_WEBSOCKET_OUTPUT=1)

# ==== Flags ====
target_compile_options(${EXE_NAME} PRIVATE -O3 -Ofast -mtune=cortex-a55 -Wall)
target_compile_definitions(${EXE_NAME} PRIVATE IMAGE_MODE V2H DEBUG_LOG NDEBUG)
target_compile_features(${EXE_NAME} PUBLIC cxx_std_17)

include_directories("include")
include_directories(SYSTEM $ENV{OECORE_NATIVE_SYSROOT} ${POKY_PATH}/usr/include)

# ==== Base libs (plain signature) ====
target_link_libraries(${EXE_NAME} turbojpeg)
target_link_libraries(${EXE_NAME} jpeg)
target_link_libraries(${EXE_NAME} EGL GLESv2)
target_link_libraries(${EXE_NAME} wayland-cursor wayland-egl wayland-client)
target_link_libraries(${EXE_NAME} mmngr mmngrbuf)

# ==== OpenCV ====
find_package(OpenCV REQUIRED COMPONENTS core imgproc imgcodecs)
target_include_directories(${EXE_NAME} PUBLIC ${OpenCV_INCLUDE_DIRS})
target_link_libraries(${EXE_NAME} ${OpenCV_LIBS})

# ==== libwebsockets (pkg-config -> fallback) ====
find_package(PkgConfig QUIET)
if (PkgConfig_FOUND)
  pkg_check_modules(LWS QUIET libwebsockets)
endif()
if (NOT LWS_FOUND)
  set(LWS_HINT_DIRS
    ${CMAKE_SYSROOT}/usr
    $ENV{SDKTARGETSYSROOT}/usr
    $ENV{OECORE_TARGET_SYSROOT}/usr
    $ENV{OECORE_NATIVE_SYSROOT}/usr
    /usr)
  find_path(LWS_INCLUDE_DIRS NAMES libwebsockets.h
            PATH_SUFFIXES include HINTS ${LWS_HINT_DIRS})
  find_library(LWS_LIBRARIES NAMES websockets libwebsockets
               PATH_SUFFIXES lib lib64 aarch64-poky-linux aarch64-linux-gnu
               HINTS ${LWS_HINT_DIRS})
  if (NOT LWS_INCLUDE_DIRS OR NOT LWS_LIBRARIES)
    message(FATAL_ERROR "libwebsockets not found in SDK/sysroot.")
  endif()
endif()
target_include_directories(${EXE_NAME} PRIVATE ${LWS_INCLUDE_DIRS})
if (LWS_LIBRARY_DIRS)
  target_link_directories(${EXE_NAME} PRIVATE ${LWS_LIBRARY_DIRS})
endif()
target_link_libraries(${EXE_NAME} ${LWS_LIBRARIES})

# ==== dl + TVM runtime ====
target_link_libraries(${EXE_NAME} dl)
target_link_libraries(${EXE_NAME} ${TVM_RUNTIME_LIB})

# ==== FIX LINK 'sem_getvalue' (ĐẶT CUỐI CÙNG; PLAIN SIGNATURE) ====
# tắt as-needed để không bị vứt lib
target_link_options(${EXE_NAME} PRIVATE -Wl,--no-as-needed)

# tìm chính xác librt & pthread trong sysroot
find_library(RT_LIB rt REQUIRED HINTS
  ${CMAKE_SYSROOT}/lib ${CMAKE_SYSROOT}/lib64
  ${CMAKE_SYSROOT}/usr/lib ${CMAKE_SYSROOT}/usr/lib64)
find_library(PTHREAD_LIB pthread REQUIRED HINTS
  ${CMAKE_SYSROOT}/lib ${CMAKE_SYSROOT}/lib64
  ${CMAKE_SYSROOT}/usr/lib ${CMAKE_SYSROOT}/usr/lib64)

# ép giữ cả 2 lib và đặt CUỐI: rt rồi pthread
target_link_libraries(${EXE_NAME} -Wl,--whole-archive ${RT_LIB} ${PTHREAD_LIB} -Wl,--no-whole-archive)

# thêm -pthread nếu toolchain cần
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(${EXE_NAME} Threads::Threads)
