cmake_minimum_required(VERSION 3.10)

project(ppocrv6_board_demo CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

if(DEFINED ENV{SYSROOT})
    set(BOARD_SYSROOT "$ENV{SYSROOT}")
elseif(EXISTS "/mnt/userdata")
    set(BOARD_SYSROOT "/mnt")
else()
    message(FATAL_ERROR "SYSROOT is not set and /mnt/userdata was not found")
endif()

if(DEFINED ENV{RKNN_INC})
    set(RKNN_INC "$ENV{RKNN_INC}")
else()
    set(RKNN_INC "/data/project/sales/csun/rv1126b/jp/AI/demo/ai-algorithm/rv1126b-ai-toolkit/easyeai-api/algorithm/ocr")
endif()

if(NOT EXISTS "${RKNN_INC}/rknn_api.h")
    message(FATAL_ERROR "rknn_api.h was not found. Please set RKNN_INC. Current RKNN_INC=${RKNN_INC}")
endif()

set(BOARD_LIB_DIRS
    "${BOARD_SYSROOT}/usr/lib"
    "${BOARD_SYSROOT}/lib"
    "${BOARD_SYSROOT}/usr/local/lib"
    "${BOARD_SYSROOT}/usr/lib/aarch64-linux-gnu"
    "${BOARD_SYSROOT}/lib/aarch64-linux-gnu"
)

find_library(RKNNRT_LIB
    NAMES rknnrt librknnrt.so
    PATHS ${BOARD_LIB_DIRS}
    NO_DEFAULT_PATH
)

if(NOT RKNNRT_LIB)
    message(FATAL_ERROR "librknnrt.so was not found in BOARD_LIB_DIRS=${BOARD_LIB_DIRS}")
endif()

set(COMMON_RPATH_LINK "")
foreach(_dir ${BOARD_LIB_DIRS})
    list(APPEND COMMON_RPATH_LINK "-Wl,-rpath-link,${_dir}")
endforeach()

message(STATUS "BOARD_SYSROOT: ${BOARD_SYSROOT}")
message(STATUS "RKNN_INC: ${RKNN_INC}")
message(STATUS "RKNNRT_LIB for link only: ${RKNNRT_LIB}")
message(STATUS "BOARD_LIB_DIRS: ${BOARD_LIB_DIRS}")

add_executable(test-rknn-model-smoke
    src/rknn_model_smoke_test.cc
)

target_include_directories(test-rknn-model-smoke PRIVATE
    ${RKNN_INC}
)

target_link_libraries(test-rknn-model-smoke
    ${RKNNRT_LIB}
    pthread
    dl
)

target_link_options(test-rknn-model-smoke PRIVATE
    ${COMMON_RPATH_LINK}
)

# OpenCV is only needed by the end-to-end OCR demo.
set(OPENCV_INCLUDE_DIRS
    "${BOARD_SYSROOT}/usr/include/opencv4"
    "${BOARD_SYSROOT}/usr/local/include/opencv4"
    "${BOARD_SYSROOT}/usr/include"
)

find_library(OPENCV_CORE_LIB
    NAMES opencv_core
    PATHS ${BOARD_LIB_DIRS}
    NO_DEFAULT_PATH
)

find_library(OPENCV_IMGPROC_LIB
    NAMES opencv_imgproc
    PATHS ${BOARD_LIB_DIRS}
    NO_DEFAULT_PATH
)

find_library(OPENCV_IMGCODECS_LIB
    NAMES opencv_imgcodecs
    PATHS ${BOARD_LIB_DIRS}
    NO_DEFAULT_PATH
)

if(NOT OPENCV_CORE_LIB OR NOT OPENCV_IMGPROC_LIB OR NOT OPENCV_IMGCODECS_LIB)
    message(FATAL_ERROR
        "OpenCV libraries were not found.\n"
        "Required: opencv_core, opencv_imgproc, opencv_imgcodecs\n"
        "Search paths: ${BOARD_LIB_DIRS}"
    )
endif()

set(OPENCV_LIBS
    ${OPENCV_IMGCODECS_LIB}
    ${OPENCV_IMGPROC_LIB}
    ${OPENCV_CORE_LIB}
)

message(STATUS "OPENCV_INCLUDE_DIRS: ${OPENCV_INCLUDE_DIRS}")
message(STATUS "OPENCV_CORE_LIB: ${OPENCV_CORE_LIB}")
message(STATUS "OPENCV_IMGPROC_LIB: ${OPENCV_IMGPROC_LIB}")
message(STATUS "OPENCV_IMGCODECS_LIB: ${OPENCV_IMGCODECS_LIB}")

add_executable(test-ppocrv6-ocr
    src/ppocrv6_ocr_demo.cc
)

target_include_directories(test-ppocrv6-ocr PRIVATE
    ${RKNN_INC}
    ${OPENCV_INCLUDE_DIRS}
)

target_link_libraries(test-ppocrv6-ocr
    ${RKNNRT_LIB}
    ${OPENCV_LIBS}
    pthread
    dl
)

target_link_options(test-ppocrv6-ocr PRIVATE
    ${COMMON_RPATH_LINK}
)
