# Minimum version based on requirements from PRD (CMake >= 3.20) cmake_minimum_required(VERSION 3.20) project(safesight_media VERSION 1.0.0 DESCRIPTION "SafeSight Media - AI-powered video analysis engine" LANGUAGES C CXX) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) option(BUILD_SAMPLES "Build demo binaries" ON) option(BUILD_TESTS "Build unit tests" ON) option(ENABLE_RK_DEMOS "Use official Rockchip demos that link against vendor SDKs" OFF) set(RK_MPP_ROOT "${CMAKE_SOURCE_DIR}/third_party/mpp" CACHE PATH "Path to Rockchip MPP SDK root") set(RK_MPP_LIB_PATH "" CACHE FILEPATH "Absolute path to librockchip_mpp.so built for RK3588") set(RK_RKNN_ROOT "${CMAKE_SOURCE_DIR}/third_party/rknpu2" CACHE PATH "Path to Rockchip RKNN runtime repository") set(RKNN_RUNTIME_LIB_DIR "${RK_RKNN_ROOT}/runtime/RK3588/Linux/librknn_api/aarch64" CACHE PATH "Directory containing librknnrt.so") set(RKNN_RUNTIME_INCLUDE_DIR "${RK_RKNN_ROOT}/runtime/RK3588/Linux/librknn_api/include" CACHE PATH "include path for rknn_api.h") set(RKNN_MODEL_PATH "${RK_RKNN_ROOT}/examples/rknn_api_demo/model/RK3588/mobilenet_v1.rknn" CACHE FILEPATH "Default RKNN demo model") set(RKNN_SAMPLE_IMAGE "${RK_RKNN_ROOT}/examples/rknn_api_demo/model/dog_224x224.jpg" CACHE FILEPATH "Default RKNN demo input image") set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) find_package(Threads REQUIRED) if(RK3588_ENABLE_FFMPEG) find_package(PkgConfig REQUIRED) pkg_check_modules(FFMPEG REQUIRED IMPORTED_TARGET libavformat libavcodec libavutil) pkg_check_modules(SWSCALE REQUIRED IMPORTED_TARGET libswscale) endif() # Helper target for common warnings add_library(project_options INTERFACE) if(MSVC) target_compile_options(project_options INTERFACE /W4) else() target_compile_options(project_options INTERFACE -Wall -Wextra -Wpedantic) endif() # Resolve git revision if possible find_package(Git QUIET) if(GIT_FOUND) execute_process( COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE RK_GIT_SHA OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET ) endif() if(NOT RK_GIT_SHA) set(RK_GIT_SHA "nogit") endif() set(SRC_FILES src/main.cpp src/edge_server_app.cpp src/graph_manager.cpp src/plugin_loader.cpp src/ai_scheduler.cpp src/http_server.cpp src/hw_factory.cpp src/hw_codec.cpp src/hw_image_processor.cpp src/utils/dma_alloc.cpp src/utils/config_expand.cpp ) # Shared cross-plugin state (used by gate/tracker and potentially other nodes). add_library(rk_shared_state SHARED src/utils/shared_state.cpp) target_compile_definitions(rk_shared_state PRIVATE RK3588_BUILD_SHARED_STATE) target_include_directories(rk_shared_state PRIVATE ${CMAKE_SOURCE_DIR}/include) target_link_libraries(rk_shared_state PRIVATE project_options Threads::Threads) set_target_properties(rk_shared_state PROPERTIES OUTPUT_NAME "rk_shared_state" RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} ) install(TARGETS rk_shared_state RUNTIME DESTINATION bin LIBRARY DESTINATION bin ) add_executable(safesight-edge-server ${SRC_FILES}) set_target_properties(safesight-edge-server PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) target_include_directories(safesight-edge-server PRIVATE ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/third_party ) target_link_libraries(safesight-edge-server PRIVATE project_options Threads::Threads) if(RK3588_ENABLE_FFMPEG) target_compile_definitions(safesight-edge-server PRIVATE RK3588_ENABLE_FFMPEG) target_include_directories(safesight-edge-server PRIVATE ${FFMPEG_INCLUDE_DIRS}) target_link_libraries(safesight-edge-server PRIVATE PkgConfig::FFMPEG PkgConfig::SWSCALE) endif() if(RK3588_ENABLE_MPP) target_include_directories(safesight-edge-server SYSTEM PRIVATE ${RK_MPP_ROOT}/inc ${RK_RKNN_ROOT}/examples/3rdparty/mpp/include ) if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") target_compile_options(safesight-edge-server PRIVATE -Wno-pedantic) endif() endif() if(RK3588_ENABLE_RGA) # Use system librga by default (rknpu2 prebuilt may contain broken symlinks) if(NOT RK_RGA_INCLUDE_DIR) set(RK_RGA_INCLUDE_DIR "${RK_RKNN_ROOT}/examples/3rdparty/rga/RK3588/include" CACHE PATH "RGA include directory") endif() find_library(RK_RGA_LIB rga) if(NOT RK_RGA_LIB) message(WARNING "RGA enabled but librga not found; disable RK3588_ENABLE_RGA or install librga-dev") else() message(STATUS "Found librga: ${RK_RGA_LIB}") target_compile_definitions(safesight-edge-server PRIVATE RK3588_ENABLE_RGA) target_include_directories(safesight-edge-server SYSTEM PRIVATE ${RK_RGA_INCLUDE_DIR}) target_link_libraries(safesight-edge-server PRIVATE ${RK_RGA_LIB}) if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") target_compile_options(safesight-edge-server PRIVATE -Wno-pedantic) endif() endif() endif() if(RK3588_ENABLE_RKNN) find_library(RK_RKNN_LIB rknnrt HINTS ${RKNN_RUNTIME_LIB_DIR} ${RK_RKNN_ROOT}/runtime/RK3588/Linux/librknn_api/aarch64 NO_DEFAULT_PATH ) if(NOT RK_RKNN_LIB) find_library(RK_RKNN_LIB rknnrt) endif() if(NOT RK_RKNN_LIB) message(WARNING "RKNN enabled but librknnrt not found; disable RK3588_ENABLE_RKNN or set RKNN_RUNTIME_LIB_DIR") else() target_compile_definitions(safesight-edge-server PRIVATE RK3588_ENABLE_RKNN) target_include_directories(safesight-edge-server PRIVATE ${RKNN_RUNTIME_INCLUDE_DIR}) target_link_libraries(safesight-edge-server PRIVATE ${RK_RKNN_LIB}) endif() endif() if(WIN32) target_link_libraries(safesight-edge-server PRIVATE ws2_32) endif() target_compile_definitions(safesight-edge-server PRIVATE RK_PROJECT_VERSION="${PROJECT_VERSION}" RK_GIT_SHA="${RK_GIT_SHA}" ) install(TARGETS safesight-edge-server RUNTIME DESTINATION bin) if(BUILD_SAMPLES) add_subdirectory(samples) endif() if(BUILD_TESTS) enable_testing() add_subdirectory(tests) endif() add_subdirectory(plugins) include(GNUInstallDirs) install(FILES configs/sample_cam1.json DESTINATION ${CMAKE_INSTALL_DATADIR}/safesight-edge-server)