cmake_minimum_required(VERSION 3.16)
project(chicken_counter VERSION 0.1.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE Release)
endif()
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE)

find_package(OpenCV 4.0 REQUIRED COMPONENTS core imgproc video videoio highgui imgcodecs dnn)
find_package(nlohmann_json 3.0 REQUIRED)
find_package(yaml-cpp REQUIRED)
find_package(CUDAToolkit REQUIRED)

find_library(NVINFER_LIB nvinfer PATHS /usr/lib/aarch64-linux-gnu REQUIRED)
find_library(NVONNX_LIB nvonnxparser PATHS /usr/lib/aarch64-linux-gnu REQUIRED)

set(COMMON_LIBS
  opencv_core opencv_imgproc opencv_video opencv_videoio opencv_highgui opencv_imgcodecs opencv_dnn
  nlohmann_json::nlohmann_json
  yaml-cpp
  CUDA::cudart
  ${NVINFER_LIB}
  ${NVONNX_LIB}
)

add_library(chicken_counter_lib STATIC
  src/pipeline.cpp
  src/batch_runner.cpp
)
target_include_directories(chicken_counter_lib PUBLIC
  ${CMAKE_CURRENT_SOURCE_DIR}/include
  /usr/include/aarch64-linux-gnu
)
target_link_libraries(chicken_counter_lib PUBLIC ${COMMON_LIBS})
target_compile_options(chicken_counter_lib PRIVATE -O3 -march=armv8.2-a+fp16+dotprod -flto -DNDEBUG)

add_executable(chicken_counter_cli
  src/main.cpp
)
target_link_libraries(chicken_counter_cli PRIVATE chicken_counter_lib)
target_link_options(chicken_counter_cli PRIVATE -Wl,--strip-all)

add_executable(test_config
  tests/test_config.cpp
)
target_link_libraries(test_config PRIVATE chicken_counter_lib)

add_executable(test_modules
  tests/test_modules.cpp
)
target_link_libraries(test_modules PRIVATE chicken_counter_lib)

add_executable(chicken_counter_dashboard
  src/dashboard.cpp
)
target_link_libraries(chicken_counter_dashboard PRIVATE pthread)

enable_testing()
add_test(NAME config COMMAND test_config)
add_test(NAME modules COMMAND test_modules)
