# spec-rules-ros 规范生成:ROS 2 ament_cmake 包 # 本包为 monorepo EasyNavigation/easynav_plugins 的子包,源码位于 # maps_managers/easynav_octomap_maps_manager/ 子目录,构建产物进 /opt/ros/humble。 %define ros_distro humble %define RosPkgName easynav-octomap-maps-manager Name: ros-%{ros_distro}-%{RosPkgName} Version: 0.5.0 Release: 1%{?dist} Summary: Easy Navigation: OctoMap Maps Manager (维护 OctoMap 概率 3D 占据树,提供膨胀/障碍过滤器插件,经 ROS 2 topics 发布) # package.xml Apache-2.0 License: Apache-2.0 URL: https://github.com/EasyNavigation/easynav_plugins # humble 分支 fetch 时的 HEAD commit(manifest target_version 0.5.0-1,无对应 tag, # 固定 commit 保证产物可追溯;与同 monorepo 兄弟包共用同一 fetch 归档) %global commit 703b73ae55bf6a419bf309b26084ca523b063ddf Source0: https://github.com/EasyNavigation/easynav_plugins/archive/%{commit}.tar.gz # 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}/.*$ # 单包策略:虚拟别名兼容依赖方,严禁拆实体 devel 子包(避免路径重叠冲突) Provides: %{name}-devel = %{version}-%{release} Provides: %{name}-doc = %{version}-%{release} Provides: %{name}-runtime = %{version}-%{release} BuildRequires: ros-%{ros_distro}-ament-cmake # package.xml ament_cmake 形态为 ament_cmake; # (ament_cmake_gtest / ament_lint_auto / ament_lint_common) # 不写 BuildRequires(-DBUILD_TESTING=OFF 关闭测试) # 以下 ROS 均已在 ros-projects.list 验证有 provider(SIG 源 / 同 COPR project) BuildRequires: ros-%{ros_distro}-ament-index-cpp BuildRequires: ros-%{ros_distro}-easynav-common BuildRequires: ros-%{ros_distro}-easynav-core BuildRequires: ros-%{ros_distro}-nav-msgs # liboctomap-dev 为 Debian 名,映射到 rosdistro 包 octomap(ros-projects.list 有 provider) BuildRequires: ros-%{ros_distro}-octomap BuildRequires: ros-%{ros_distro}-octomap-msgs BuildRequires: ros-%{ros_distro}-pcl-conversions BuildRequires: ros-%{ros_distro}-pluginlib BuildRequires: ros-%{ros_distro}-rclcpp BuildRequires: ros-%{ros_distro}-rclcpp-lifecycle BuildRequires: ros-%{ros_distro}-sensor-msgs BuildRequires: ros-%{ros_distro}-std-srvs BuildRequires: ros-%{ros_distro}-tf2 BuildRequires: ros-%{ros_distro}-tf2-geometry-msgs BuildRequires: ros-%{ros_distro}-tf2-ros BuildRequires: ros-%{ros_distro}-yaets BuildRequires: ros-%{ros_distro}-yaml-cpp-vendor # 系统依赖(package.xml 经 pkg.remap 映射 + ros-projects.list 实证) # eigen -> eigen3-devel;graphicsmagick -> GraphicsMagick-c++-devel;libpcl-all-dev -> pcl-devel BuildRequires: GraphicsMagick-c++-devel BuildRequires: eigen3-devel BuildRequires: pcl-devel # 运行时 Requires(/opt/ros 被 __requires_exclude_from 豁免,autodeps 扫不到 ROS 包间依赖,必须手写) Requires: ros-%{ros_distro}-ros-workspace Requires: ros-%{ros_distro}-ament-cmake Requires: ros-%{ros_distro}-ament-index-cpp Requires: ros-%{ros_distro}-easynav-common Requires: ros-%{ros_distro}-easynav-core Requires: ros-%{ros_distro}-nav-msgs Requires: ros-%{ros_distro}-octomap Requires: ros-%{ros_distro}-octomap-msgs Requires: ros-%{ros_distro}-pcl-conversions Requires: ros-%{ros_distro}-pluginlib Requires: ros-%{ros_distro}-rclcpp Requires: ros-%{ros_distro}-rclcpp-lifecycle Requires: ros-%{ros_distro}-sensor-msgs Requires: ros-%{ros_distro}-std-srvs Requires: ros-%{ros_distro}-tf2 Requires: ros-%{ros_distro}-tf2-geometry-msgs Requires: ros-%{ros_distro}-tf2-ros Requires: ros-%{ros_distro}-yaets Requires: ros-%{ros_distro}-yaml-cpp-vendor # GraphicsMagick 运行时库(plugin .so 链接 libGraphicsMagick++,autodeps 被 /opt 豁免无法自动捕获) Requires: GraphicsMagick-c++ %description Easy Navigation: OctoMap Maps Manager. Maintains an OctoMap (probabilistic 3D occupancy tree), supports filter plugins (InflationFilter, ObstacleFilter), and exposes the map through ROS 2 topics. Registered as a pluginlib plugin (easynav::octomap::OctomapMapsManager, base class easynav::MapsManagerBase) for the EasyNavigation stack. Built for ROS 2 %{ros_distro}. %prep # 解压根目录 = %%{RosPkgName}-%%{version}-1(submit_fix _ensure_tarball --transform # 重打 tarball 顶层目录为 {pkg}-{gate_version},SRPM 内 %%{commit}.tar.gz 硬链接同 inode) %autosetup -n %{RosPkgName}-%{version}-1 %build # ROS 基座环境(带守卫,buildroot 无 setup.sh 时不可直接 source) [ -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 子目录;显式 out-of-source 构建(规避 openEuler %%cmake 位置参数坑) cd maps_managers/easynav_octomap_maps_manager mkdir -p .obj cd .obj cmake \ -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 \ .. %{__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 maps_managers/easynav_octomap_maps_manager/.obj %{__make} install DESTDIR=%{buildroot} %files # 整树拥有 /opt/ros/humble(SIG 模板标准做法,对"装了没打包"类错误免疫) /opt/ros/%{ros_distro} %changelog * Tue Oct 20 2026 ROS SIG - 0.5.0-1 - 初始引入 easynav_octomap_maps_manager 0.5.0(EasyNavigation/easynav_plugins humble 分支)