%define ros_distro humble %define RosPkgName foxglove-bridge %define src_version 3.5.0-1 # 上游 Foxglove C++ SDK 版本(CMakeLists.txt 中 FOXGLOVE_SDK_VERSION),随 ROS 包发布 %define sdk_version 0.27.0 Name: ros-%{ros_distro}-%{RosPkgName} Version: 3.5.0 Release: 1%{?dist} Summary: ROS Foxglove Bridge License: MIT URL: https://github.com/foxglove/foxglove-sdk # Source0:foxglove-sdk monorepo 归档(含 ros/src/foxglove_bridge 包),src_version 为完整清单版本号 Source0: %{RosPkgName}-%{src_version}.tar.gz # Source1:上游 CMake FetchContent 下载的预编译 Foxglove C++ SDK zip(aarch64,GitHub release tag sdk/v0.27.0)。 # COPR 构建环境无网络,FetchContent 必败,故在此声明为 Source 并于 %prep 离线解压、%build 以 # -DFETCHCONTENT_SOURCE_DIR_FOXGLOVE_SDK 重定向。zip 顶层目录为 foxglove/,内含 # lib/cmake/foxglove-sdk/foxglove-sdkConfig.cmake。 # 本 Source 由 pkg-fixer 离线抓取后放 pkgs// 本地文件,_prepare_inputs 的本地文件复制 # 优先于 URL 下载(规避 release-assets.githubusercontent.com CDN 限速)。 # COPR chroot 仅为 openEuler-24.03_LTS_SP3-aarch64,故仅提供 aarch64 zip(原 x86_64 Source 已删除)。 Source1: https://github.com/foxglove/foxglove-sdk/releases/download/sdk/v%{sdk_version}/foxglove-v%{sdk_version}-cpp-aarch64-unknown-linux-gnu.zip # 预编译 SDK zip 仅为 aarch64;限制构建架构与 COPR chroot 一致 ExclusiveArch: aarch64 # debug 子包无意义(/opt 前缀),SIG 模板统一关闭 %global debug_package %{nil} # /opt 下 python 字节码编译会写标准 sitelib 路径,摘掉 brp-python-bytecompile %global __os_install_post %(echo '%{__os_install_post}' | sed -e 's!/usr/lib[^[:space:]]*/brp-python-bytecompile[[:space:]].*$!!g') # ROS 包不做自动依赖扫描(.so 全在 /opt/ros 下,由 ament 间接依赖模型替代) %global __provides_exclude_from ^/opt/ros/%{ros_distro}/.*$ %global __requires_exclude_from ^/opt/ros/%{ros_distro}/.*$ BuildRequires: cmake BuildRequires: unzip BuildRequires: ros-%{ros_distro}-ament-cmake BuildRequires: ros-%{ros_distro}-ament-index-cpp BuildRequires: ros-%{ros_distro}-geometry-msgs BuildRequires: ros-%{ros_distro}-rcl-interfaces BuildRequires: ros-%{ros_distro}-rclcpp BuildRequires: ros-%{ros_distro}-rclcpp-components BuildRequires: ros-%{ros_distro}-rcpputils BuildRequires: ros-%{ros_distro}-rcutils BuildRequires: ros-%{ros_distro}-resource-retriever BuildRequires: ros-%{ros_distro}-ros-environment BuildRequires: ros-%{ros_distro}-rosgraph-msgs BuildRequires: ros-%{ros_distro}-rosidl-typesupport-introspection-cpp # rosx-introspection 仅在 ros-upstream.list(rosdistro 全量),SIG 源尚未移植: # 依 §6 写 BuildRequires 交构建失败诊断循环注册递归引入,禁止静默丢弃 BuildRequires: ros-%{ros_distro}-rosx-introspection BuildRequires: ros-%{ros_distro}-sensor-msgs BuildRequires: ros-%{ros_distro}-std-msgs Requires: ros-%{ros_distro}-ros-workspace Requires: ros-%{ros_distro}-ament-cmake Requires: ros-%{ros_distro}-ament-index-cpp Requires: ros-%{ros_distro}-rcl-interfaces Requires: ros-%{ros_distro}-rclcpp Requires: ros-%{ros_distro}-rclcpp-components Requires: ros-%{ros_distro}-rcpputils Requires: ros-%{ros_distro}-rcutils Requires: ros-%{ros_distro}-resource-retriever Requires: ros-%{ros_distro}-rosgraph-msgs Requires: ros-%{ros_distro}-rosidl-typesupport-introspection-cpp Requires: ros-%{ros_distro}-rosx-introspection Requires: ros-%{ros_distro}-std-msgs # 单包策略:严禁拆实体子包(路径重叠致安装事务冲突),改用虚拟别名兼容依赖方 Provides: %{name}-devel = %{version}-%{release} Provides: %{name}-doc = %{version}-%{release} Provides: %{name}-runtime = %{version}-%{release} %description High performance ROS 2 WebSocket bridge using the Foxglove SDK, written in C++. The foxglove_bridge bridges ROS 2 topics, services and parameters to WebSocket clients (such as Foxglove Studio) with low overhead. %prep %autosetup -n %{RosPkgName}-%{src_version} # 离线本地化上游 CMake FetchContent 下载的预编译 Foxglove C++ SDK(COPR 构建无网络)。 # 解压到 %{_builddir},顶层目录 foxglove/ 与 Source0 目录不冲突;unzip -d 不改变当前工作目录。 # 仅 aarch64(ExclusiveArch 限制,COPR chroot 为 openEuler-24.03_LTS_SP3-aarch64)。 unzip -q -o %{_sourcedir}/foxglove-v%{sdk_version}-cpp-aarch64-unknown-linux-gnu.zip -d %{_builddir} %build # ROS 基座环境(setup.sh 可能不存在,用 [ -f ] 守卫) [ -f /opt/ros/%{ros_distro}/setup.sh ] && source /opt/ros/%{ros_distro}/setup.sh || true export PYTHONPATH=/opt/ros/%{ros_distro}/lib/python%{python3_version}/site-packages${PYTHONPATH:+:$PYTHONPATH} export PKG_CONFIG_PATH=/opt/ros/%{ros_distro}/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH} # 包位于 monorepo 的 ros/src/foxglove_bridge 子目录 cd ros/src/foxglove_bridge mkdir -p .obj && cd .obj %cmake3 \ -DCMAKE_INSTALL_PREFIX="/opt/ros/%{ros_distro}" \ -DAMENT_PREFIX_PATH="/opt/ros/%{ros_distro}" \ -DCMAKE_PREFIX_PATH="/opt/ros/%{ros_distro}" \ -UINCLUDE_INSTALL_DIR -ULIB_INSTALL_DIR -USYSCONF_INSTALL_DIR -USHARE_INSTALL_PREFIX -ULIB_SUFFIX \ -DSETUPTOOLS_DEB_LAYOUT=OFF \ -DBUILD_TESTING=OFF -DTESTING=OFF -DCMAKE_SUPPRESS_REGENERATION=ON \ -DFOXGLOVE_BRIDGE_REMOTE_ACCESS=OFF \ -DFETCHCONTENT_SOURCE_DIR_FOXGLOVE_SDK=%{_builddir}/foxglove \ .. make %{?_smp_mflags} %install [ -f /opt/ros/%{ros_distro}/setup.sh ] && source /opt/ros/%{ros_distro}/setup.sh || true export PYTHONPATH=/opt/ros/%{ros_distro}/lib/python%{python3_version}/site-packages${PYTHONPATH:+:$PYTHONPATH} export PKG_CONFIG_PATH=/opt/ros/%{ros_distro}/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH} cd ros/src/foxglove_bridge cd .obj make install DESTDIR=%{buildroot} # %files 整树拥有 /opt/ros/,对"装了没打包"类错误免疫(SIG 模板标准做法) %files /opt/ros/%{ros_distro} %changelog * Wed Sep 23 2026 ai-importer - 3.5.0-1 - Initial import (ROS batch)