OrangePi3588Media/CMakeLists.txt
haotian e4b98a8edb fix: use system MPP/RGA libraries by default
Remove rknpu2 prebuilt paths from library search because they contain
broken symlinks when cloned from Git (symbol link targets not included).

Now CMake searches libraries in priority:
1. User-provided path (RK_MPP_LIB_PATH)
2. Self-built in third_party/mpp/build
3. System default paths (/usr/lib/aarch64-linux-gnu/)

This allows fresh git clone to compile without manual fixes on new RK3588 boards.

Verified: Compiles successfully using build.sh
2026-02-28 17:26:24 +08:00

161 lines
5.6 KiB
CMake

# Minimum version based on requirements from PRD (CMake >= 3.20)
cmake_minimum_required(VERSION 3.20)
project(rk3588_media_server
VERSION 0.1.0
DESCRIPTION "RK3588 media server bootstrap"
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/media_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(media-server ${SRC_FILES})
set_target_properties(media-server PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
target_include_directories(media-server
PRIVATE
${CMAKE_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR}/third_party
)
target_link_libraries(media-server PRIVATE project_options Threads::Threads)
if(RK3588_ENABLE_FFMPEG)
target_compile_definitions(media-server PRIVATE RK3588_ENABLE_FFMPEG)
target_include_directories(media-server PRIVATE ${FFMPEG_INCLUDE_DIRS})
target_link_libraries(media-server PRIVATE PkgConfig::FFMPEG PkgConfig::SWSCALE)
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(media-server PRIVATE RK3588_ENABLE_RGA)
target_include_directories(media-server PRIVATE ${RK_RGA_INCLUDE_DIR})
target_link_libraries(media-server PRIVATE ${RK_RGA_LIB})
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(media-server PRIVATE RK3588_ENABLE_RKNN)
target_include_directories(media-server PRIVATE ${RKNN_RUNTIME_INCLUDE_DIR})
target_link_libraries(media-server PRIVATE ${RK_RKNN_LIB})
endif()
endif()
if(WIN32)
target_link_libraries(media-server PRIVATE ws2_32)
endif()
target_compile_definitions(media-server PRIVATE
RK_PROJECT_VERSION="${PROJECT_VERSION}"
RK_GIT_SHA="${RK_GIT_SHA}"
)
install(TARGETS media-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}/rk3588-media-server)