|
| 1 | +cmake_minimum_required(VERSION 3.8) |
| 2 | +project(ros2_gst_video_bridge) |
| 3 | + |
| 4 | +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") |
| 5 | + add_compile_options(-Wall -Wextra -Wpedantic) |
| 6 | +endif() |
| 7 | + |
| 8 | +set(CMAKE_CXX_STANDARD 20) |
| 9 | +set(CMAKE_CXX_STANDARD_REQUIRED ON) |
| 10 | +set(CMAKE_CXX_EXTENSIONS OFF) |
| 11 | + |
| 12 | +option(ROS2_GST_VIDEO_BRIDGE_ENABLE_CLANG_TIDY "Enable clang-tidy during C++ compilation" ON) |
| 13 | +option(ROS2_GST_VIDEO_BRIDGE_ENABLE_CLANG_FORMAT_CHECK "Enable clang-format check target" ON) |
| 14 | +option(ROS2_GST_VIDEO_BRIDGE_ENABLE_AMENT_LINT "Enable ament_lint_auto checks" OFF) |
| 15 | + |
| 16 | +if(ROS2_GST_VIDEO_BRIDGE_ENABLE_CLANG_TIDY) |
| 17 | + find_program(CLANG_TIDY_EXE NAMES clang-tidy clang-tidy-18 clang-tidy-17 clang-tidy-16 clang-tidy-15) |
| 18 | + if(CLANG_TIDY_EXE) |
| 19 | + set(CMAKE_CXX_CLANG_TIDY ${CLANG_TIDY_EXE}) |
| 20 | + message(STATUS "clang-tidy enabled: ${CLANG_TIDY_EXE}") |
| 21 | + else() |
| 22 | + message(WARNING "clang-tidy requested but not found. Continuing without clang-tidy.") |
| 23 | + endif() |
| 24 | +endif() |
| 25 | + |
| 26 | +find_package(ament_cmake REQUIRED) |
| 27 | +find_package(rclcpp REQUIRED) |
| 28 | +find_package(sensor_msgs REQUIRED) |
| 29 | +find_package(std_msgs REQUIRED) |
| 30 | +find_package(ros2_gst_video_bridge_msgs REQUIRED) |
| 31 | +find_package(PkgConfig REQUIRED) |
| 32 | +pkg_check_modules(GSTREAMER REQUIRED gstreamer-1.0 gstreamer-app-1.0) |
| 33 | + |
| 34 | +if(ROS2_GST_VIDEO_BRIDGE_ENABLE_CLANG_FORMAT_CHECK) |
| 35 | + find_program(CLANG_FORMAT_EXE NAMES clang-format clang-format-18 clang-format-17 clang-format-16 clang-format-15) |
| 36 | + if(CLANG_FORMAT_EXE) |
| 37 | + file(GLOB_RECURSE ROS2_GST_VIDEO_BRIDGE_FORMAT_FILES CONFIGURE_DEPENDS |
| 38 | + "${CMAKE_CURRENT_SOURCE_DIR}/include/*.h" |
| 39 | + "${CMAKE_CURRENT_SOURCE_DIR}/include/*.hpp" |
| 40 | + "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cc" |
| 41 | + ) |
| 42 | + add_custom_target(clang_format_check |
| 43 | + COMMAND ${CLANG_FORMAT_EXE} --dry-run --Werror ${ROS2_GST_VIDEO_BRIDGE_FORMAT_FILES} |
| 44 | + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} |
| 45 | + COMMENT "Running clang-format check on C++ source files" |
| 46 | + VERBATIM |
| 47 | + ) |
| 48 | + else() |
| 49 | + message(WARNING "clang-format check requested but clang-format was not found.") |
| 50 | + endif() |
| 51 | +endif() |
| 52 | + |
| 53 | +add_executable(gst_video_bridge_node |
| 54 | + src/main.cc |
| 55 | + src/gst_video_bridge_node.cc |
| 56 | + src/node/core.cc |
| 57 | + src/node/lifecycle.cc |
| 58 | + src/node/modes.cc |
| 59 | + src/node/streaming.cc |
| 60 | + src/node/recovery.cc |
| 61 | + src/node/fallback.cc |
| 62 | + src/node/observability.cc |
| 63 | + src/core/config_loader.cc |
| 64 | + src/core/pipeline_builder.cc |
| 65 | + src/runtime/capability_probe.cc |
| 66 | + src/runtime/topic_introspector.cc |
| 67 | + src/runtime/stream_engine.cc |
| 68 | + src/runtime/metrics_publisher.cc |
| 69 | +) |
| 70 | + |
| 71 | +target_include_directories(gst_video_bridge_node |
| 72 | + PRIVATE |
| 73 | + include |
| 74 | + ${GSTREAMER_INCLUDE_DIRS} |
| 75 | +) |
| 76 | + |
| 77 | +target_link_libraries(gst_video_bridge_node |
| 78 | + ${GSTREAMER_LIBRARIES} |
| 79 | +) |
| 80 | + |
| 81 | +target_compile_options(gst_video_bridge_node PRIVATE ${GSTREAMER_CFLAGS_OTHER}) |
| 82 | + |
| 83 | +ament_target_dependencies(gst_video_bridge_node |
| 84 | + rclcpp |
| 85 | + sensor_msgs |
| 86 | + std_msgs |
| 87 | + ros2_gst_video_bridge_msgs |
| 88 | +) |
| 89 | + |
| 90 | +install(TARGETS gst_video_bridge_node |
| 91 | + DESTINATION lib/${PROJECT_NAME} |
| 92 | +) |
| 93 | + |
| 94 | +install(DIRECTORY launch config |
| 95 | + DESTINATION share/${PROJECT_NAME} |
| 96 | +) |
| 97 | + |
| 98 | +if(BUILD_TESTING) |
| 99 | + find_package(ament_cmake_gtest REQUIRED) |
| 100 | + |
| 101 | + ament_add_gtest(test_config_loader test/test_config_loader.cpp src/core/config_loader.cc) |
| 102 | + target_include_directories(test_config_loader PRIVATE include) |
| 103 | + ament_target_dependencies(test_config_loader rclcpp) |
| 104 | + |
| 105 | + ament_add_gtest(test_pipeline_builder test/test_pipeline_builder.cpp src/core/pipeline_builder.cc) |
| 106 | + target_include_directories(test_pipeline_builder PRIVATE include) |
| 107 | + |
| 108 | + add_test( |
| 109 | + NAME smoke_runtime_validate_config |
| 110 | + COMMAND $<TARGET_FILE:gst_video_bridge_node> --ros-args -p runtime.mode:=validate_config) |
| 111 | + |
| 112 | + add_test( |
| 113 | + NAME smoke_runtime_list_capabilities |
| 114 | + COMMAND $<TARGET_FILE:gst_video_bridge_node> --ros-args -p runtime.mode:=list_capabilities) |
| 115 | + |
| 116 | + add_test( |
| 117 | + NAME smoke_launch_minimal_show_args |
| 118 | + COMMAND ros2 launch ros2_gst_video_bridge gst_video_bridge_minimal.launch.py --show-args) |
| 119 | + |
| 120 | + add_test( |
| 121 | + NAME smoke_launch_advanced_show_args |
| 122 | + COMMAND ros2 launch ros2_gst_video_bridge gst_video_bridge_advanced.launch.py --show-args) |
| 123 | + |
| 124 | + add_test( |
| 125 | + NAME smoke_launch_compat_show_args |
| 126 | + COMMAND ros2 launch ros2_gst_video_bridge gst_video_bridge.launch.py --show-args) |
| 127 | + |
| 128 | + set_tests_properties(smoke_runtime_validate_config PROPERTIES TIMEOUT 20) |
| 129 | + set_tests_properties(smoke_runtime_list_capabilities PROPERTIES TIMEOUT 20) |
| 130 | + set_tests_properties(smoke_launch_minimal_show_args PROPERTIES TIMEOUT 20) |
| 131 | + set_tests_properties(smoke_launch_advanced_show_args PROPERTIES TIMEOUT 20) |
| 132 | + set_tests_properties(smoke_launch_compat_show_args PROPERTIES TIMEOUT 20) |
| 133 | + |
| 134 | + if(ROS2_GST_VIDEO_BRIDGE_ENABLE_AMENT_LINT) |
| 135 | + find_package(ament_lint_auto REQUIRED) |
| 136 | + ament_lint_auto_find_test_dependencies() |
| 137 | + endif() |
| 138 | +endif() |
| 139 | + |
| 140 | +ament_package() |
0 commit comments