Extract the install that was applied by hand to the Jetson Nano into a single checkout that builds itself for whatever Jetson it lands on. The two nodes on the rig share no JetPack — tegra210 caps at 4, tegra234 needs 5+ — so nothing binary is portable between them. The source and the procedure are: install.sh detects the platform (L4T / JetPack / SoC), installs deps, builds the OrbbecSDK and the preview server from source locally, and generates a per-user config and systemd unit. The tested bridge.py ships verbatim; all machine-specific paths live in the generated config, so it stays unmodified — its one hardcoded path is made home-relative. The retired GStreamer/RTSP target is dropped: the direct route encodes no video. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
94 lines
4.2 KiB
CMake
94 lines
4.2 KiB
CMake
# Copyright (c) French Touch Factory. All Rights Reserved.
|
|
#
|
|
# Builds the one preview server, ithaca_rgbd_server, against an already-built
|
|
# OrbbecSDK v2. Deliberately outside the SDK tree: reconfiguring the SDK on an
|
|
# older Jetson can break the recorder build that already works, so we link the
|
|
# library it produced instead of building inside it.
|
|
#
|
|
# Portable across Jetson generations by construction: every SDK path comes from a
|
|
# cache variable that build_server.sh fills from OB_SDK_ROOT, and nothing here is
|
|
# tied to one L4T, one home directory, or one arm64 build folder name.
|
|
#
|
|
# The retired GStreamer/RTSP target is gone — the direct route encodes no video,
|
|
# so GStreamer is not a dependency any more.
|
|
|
|
cmake_minimum_required(VERSION 3.10)
|
|
project(ithaca_node_server CXX)
|
|
|
|
# Where the SDK source (headers) and its build output (libs, generated headers,
|
|
# extensions) live. build_server.sh passes these; the defaults match the layout
|
|
# build_sdk.sh produces.
|
|
set(OB_SDK_ROOT "$ENV{HOME}/OrbbecSDK_v2" CACHE PATH
|
|
"OrbbecSDK v2 source root (headers)")
|
|
set(OB_SDK_BUILD "" CACHE PATH
|
|
"OrbbecSDK v2 build output (lib/, lib/extensions/)")
|
|
set(OB_SDK_GENERATED "" CACHE PATH
|
|
"OrbbecSDK generated headers, where Export.h lands")
|
|
|
|
# The build folder is named per platform (linux_arm64, linux_aarch64, ...), so it
|
|
# is discovered rather than assumed when the caller did not pass it.
|
|
if(NOT OB_SDK_BUILD)
|
|
file(GLOB _ob_build_candidates "${OB_SDK_ROOT}/build/linux_*")
|
|
if(_ob_build_candidates)
|
|
list(GET _ob_build_candidates 0 OB_SDK_BUILD)
|
|
else()
|
|
set(OB_SDK_BUILD "${OB_SDK_ROOT}/build")
|
|
endif()
|
|
endif()
|
|
if(NOT OB_SDK_GENERATED)
|
|
set(OB_SDK_GENERATED "${OB_SDK_ROOT}/build/src/generated")
|
|
endif()
|
|
|
|
if(NOT EXISTS "${OB_SDK_ROOT}/include/libobsensor/ObSensor.hpp")
|
|
message(FATAL_ERROR "OrbbecSDK headers not found under ${OB_SDK_ROOT}/include "
|
|
"— set OB_SDK_ROOT or run scripts/build_sdk.sh first.")
|
|
endif()
|
|
if(NOT EXISTS "${OB_SDK_BUILD}/lib/libOrbbecSDK.so")
|
|
message(FATAL_ERROR "libOrbbecSDK.so not found in ${OB_SDK_BUILD}/lib "
|
|
"— build the SDK first (scripts/build_sdk.sh).")
|
|
endif()
|
|
if(NOT EXISTS "${OB_SDK_GENERATED}/Export.h")
|
|
message(FATAL_ERROR "Export.h not found in ${OB_SDK_GENERATED} "
|
|
"— the SDK is not fully built yet.")
|
|
endif()
|
|
|
|
# Directory-scoped rather than target_link_directories(): that one needs CMake
|
|
# >= 3.13 and the oldest supported Jetson (Nano, JetPack 4) ships 3.10.2. Must
|
|
# precede add_executable().
|
|
link_directories("${OB_SDK_BUILD}/lib")
|
|
|
|
add_executable(ithaca_rgbd_server ithaca_rgbd_server.cpp)
|
|
set_property(TARGET ithaca_rgbd_server PROPERTY CXX_STANDARD 14)
|
|
target_compile_options(ithaca_rgbd_server PRIVATE -Wall -Wextra -O2)
|
|
|
|
# Where the depth engine and filter plugins are loaded from at runtime.
|
|
target_compile_definitions(ithaca_rgbd_server PRIVATE
|
|
OB_EXTENSIONS_DIR="${OB_SDK_BUILD}/lib/extensions")
|
|
|
|
# SYSTEM: the SDK's public headers are not warning-clean and this builds -Wall
|
|
# -Wextra. ObTypes.h includes Export.h, which the SDK generates into its build
|
|
# tree rather than shipping in include/, hence both directories.
|
|
target_include_directories(ithaca_rgbd_server SYSTEM PRIVATE
|
|
"${OB_SDK_ROOT}/include"
|
|
"${OB_SDK_GENERATED}")
|
|
|
|
# libjpeg by absolute path, not -ljpeg: the SDK ships its own libjpeg.a in the
|
|
# directory link_directories() adds above, built without its SIMD objects — the
|
|
# linker would pick it first and fail on jsimd_* symbols. Only C2D alignment
|
|
# needs an encoder at all.
|
|
find_library(SYSTEM_JPEG NAMES jpeg PATHS
|
|
/usr/lib/aarch64-linux-gnu /usr/lib/arm-linux-gnueabihf NO_DEFAULT_PATH)
|
|
if(NOT SYSTEM_JPEG)
|
|
message(FATAL_ERROR "system libjpeg not found — install libjpeg-turbo8-dev.")
|
|
endif()
|
|
|
|
target_link_libraries(ithaca_rgbd_server PRIVATE OrbbecSDK lz4 ${SYSTEM_JPEG} pthread)
|
|
|
|
# The SDK lives outside any standard search path; without an rpath the binary
|
|
# only runs from a shell that already exports LD_LIBRARY_PATH.
|
|
set_target_properties(ithaca_rgbd_server PROPERTIES
|
|
BUILD_RPATH "${OB_SDK_BUILD}/lib"
|
|
INSTALL_RPATH "${OB_SDK_BUILD}/lib")
|
|
|
|
install(TARGETS ithaca_rgbd_server RUNTIME DESTINATION bin)
|