diff options
Diffstat (limited to 'nebula-continental.spec')
| -rw-r--r-- | nebula-continental.spec | 263 |
1 files changed, 71 insertions, 192 deletions
diff --git a/nebula-continental.spec b/nebula-continental.spec index 8d76c4f..cf57656 100644 --- a/nebula-continental.spec +++ b/nebula-continental.spec @@ -1,34 +1,21 @@ -# ROS spec:nebula_continental(ament_cmake 形态,monorepo 多包内嵌构建) -# 上游:https://github.com/tier4/nebula(branch main) -# 构建类型:ament_cmake,使用 autoware_cmake 宏 + out-of-source CMake -# 依赖模型:标准 ROS 消息包 + autoware/nebula 内部包 + yaml-cpp 系统库 -# -# 多包内嵌构建说明:tier4/nebula 是 monorepo,nebula_continental 编译时 -# 链接同仓 sibling 包(nebula_continental_common/decoders/hw_interfaces、 -# nebula_core_ros、nebula_core_hw_interfaces)。这些包在 EUR(additional_repos) -# 中使用下划线命名(ros-humble-nebula_continental_common 而非连字符), -# 依赖预检按连字符名查询无 provider;COPR 批量构建的同名包亦全部失败 -# (build 113348/113349/113350 均 failed)。改用同源内嵌构建:在 %build 中 -# 按依赖拓扑序逐个 cmake && make install DESTDIR,后续包通过 CMAKE_PREFIX_PATH -# 含 buildroot 前缀发现已装 sibling。Provides 声明虚拟别名满足下游。 +# spec for ros-humble-nebula-continental +# 源自 tier4/nebula monorepo(commit 8be1ed77),仅构建其中的 nebula_continental colcon 子包 +# 严格遵循 /app/.claude/skills/build-rpm/spec-rules-ros.md %define ros_distro humble %define RosPkgName nebula-continental -# src_version 保留完整 target_version(1.2.0-1):tarball 命名与内部目录名 -# 必须与 Source0 文件名 / autosetup -n 一致,version 仅含 1.2.0 会缺 -1 -%define src_version 1.2.0-1 +# monorepo main 分支快照(无 tag),记录实际 commit 保证产物可追溯 +%global commit 8be1ed775b02985eadafe39b00e0e4fc944114e2 Name: ros-%{ros_distro}-%{RosPkgName} -Version: 1.2.0 -Release: 5%{?dist} +Version: 1.3.1 +Release: 1%{?dist} Summary: Nebula Continental ROS Wrapper +# package.xml 声明 "Apache 2",规范为 SPDX 标识 License: Apache-2.0 URL: https://github.com/tier4/nebula -# GitHub branch main 归档;URL 后缀 #/ 强制 rpm 内部文件名, -# 必须用 src_version(1.2.0-1)而非 version(1.2.0): -# _ensure_tarball 按 gate_result.version(1.2.0-1)重打 tarball, -# 内部目录名为 nebula-continental-1.2.0-1,autosetup -n 须与之匹配 -Source0: https://github.com/tier4/nebula/archive/refs/heads/main.tar.gz#/nebula-continental-%{src_version}.tar.gz +# GitHub commit 归档,解压根目录为纯完整 SHA(spec-rules-ros §2 实测纪律) +Source0: https://github.com/tier4/nebula/archive/%{commit}.tar.gz # debug 子包无意义(/opt 前缀,strip/debugedit 路径非常规),SIG 模板统一关闭 %global debug_package %{nil} @@ -38,57 +25,56 @@ Source0: https://github.com/tier4/nebula/archive/refs/heads/main.tar.gz#/ %global __provides_exclude_from ^/opt/ros/%{ros_distro}/.*$ %global __requires_exclude_from ^/opt/ros/%{ros_distro}/.*$ -# ===== BuildRequires ===== -# 系统构建工具与库 BuildRequires: cmake BuildRequires: gcc-c++ -BuildRequires: boost-devel -BuildRequires: yaml-cpp-devel -# nebula_core_common(外部依赖 ros-humble-nebula-core-common)的 CMake config -# 通过 ament_cmake_export_dependencies 传递依赖 find_package(nlohmann_json), -# 构建环境需安装 nlohmann-json-devel 提供 nlohmann_jsonConfig.cmake -# (pkg.remap: nlohmann-json-dev -> nlohmann-json-devel;sibling 包 -# nebula-core-ros build 113357 同因,加 nlohmann-json-devel 后已 build_done) -BuildRequires: nlohmann-json-devel +BuildRequires: make -# 构建基座(ament_cmake 形态强制) +# 构建工具(package.xml <buildtool_depend>) +# ament_cmake 形态构建工具 BuildRequires: ros-%{ros_distro}-ament-cmake - -# buildtool_depend(package.xml) +# 提供 autoware_package() 宏(ros-upstream.list,SIG 未移植但 rosdistro 真实存在) BuildRequires: ros-%{ros_distro}-autoware-cmake BuildRequires: ros-%{ros_distro}-ros-environment BuildRequires: ros-%{ros_distro}-ros-testing -# depend(package.xml,条件依赖 agnocast_components 默认不启用故省略) -# 内嵌构建的 sibling 包不写 BuildRequires(同源 %build 编译安装): -# nebula_continental_common / nebula_continental_decoders / -# nebula_continental_hw_interfaces / nebula_core_ros / -# nebula_core_hw_interfaces(nebula_continental_hw_interfaces 的传递依赖) -BuildRequires: ros-%{ros_distro}-autoware-sensing-msgs -BuildRequires: ros-%{ros_distro}-continental-msgs -BuildRequires: ros-%{ros_distro}-continental-srvs +# package.xml <depend> —— ROS humble 标准包(ros-projects.list,SIG 已移植) BuildRequires: ros-%{ros_distro}-diagnostic-msgs BuildRequires: ros-%{ros_distro}-diagnostic-updater BuildRequires: ros-%{ros_distro}-geometry-msgs BuildRequires: ros-%{ros_distro}-message-filters -BuildRequires: ros-%{ros_distro}-nebula-core-common -BuildRequires: ros-%{ros_distro}-nebula-msgs BuildRequires: ros-%{ros_distro}-radar-msgs BuildRequires: ros-%{ros_distro}-rclcpp BuildRequires: ros-%{ros_distro}-rclcpp-components -BuildRequires: ros-%{ros_distro}-rosbag2-storage BuildRequires: ros-%{ros_distro}-sensor-msgs -BuildRequires: ros-%{ros_distro}-sync-tooling-msgs BuildRequires: ros-%{ros_distro}-tf2-ros BuildRequires: ros-%{ros_distro}-visualization-msgs -# ===== Requires(运行时;/opt/ros 被 autodeps 豁免,必须手写)===== -# 强制基座(§6 运行时 Requires 三件套) +# package.xml <depend> —— autoware / tier4 外部包(ros-upstream.list,rosdistro 真实存在) +BuildRequires: ros-%{ros_distro}-autoware-sensing-msgs +BuildRequires: ros-%{ros_distro}-sync-tooling-msgs + +# package.xml <depend> —— nebula monorepo 兄弟子包(batch reused,COPR project / additional_repos 同源解析) +# nebula_core_ros 提供 nebula_agnocast_wrapper_register_node cmake 宏 +BuildRequires: ros-%{ros_distro}-continental-msgs +BuildRequires: ros-%{ros_distro}-continental-srvs +BuildRequires: ros-%{ros_distro}-nebula-continental-common +BuildRequires: ros-%{ros_distro}-nebula-continental-decoders +BuildRequires: ros-%{ros_distro}-nebula-continental-hw-interfaces +BuildRequires: ros-%{ros_distro}-nebula-core-common +BuildRequires: ros-%{ros_distro}-nebula-core-ros +BuildRequires: ros-%{ros_distro}-nebula-msgs + +# 系统库(package.xml <depend>yaml-cpp</depend>,openEuler 名 yaml-cpp-devel,dnf 实证存在) +BuildRequires: yaml-cpp-devel + +# 注:agnocast_components 为条件依赖(package.xml condition="$ENABLE_AGNOCAST == 1", +# CMakeLists 同样以 if("$ENV{ENABLE_AGNOCAST}") 守卫),默认未启用故不写 BuildRequires。 + +# 运行时 Requires(ROS 特有三件套,§6:/opt/ros 被 __requires_exclude_from 豁免,autodeps 扫不到) Requires: ros-%{ros_distro}-ros-workspace Requires: ros-%{ros_distro}-ament-cmake -# package.xml <depend> 的运行时部分(exec 依赖) -# 内嵌构建的 sibling 包不写 Requires(文件已在本包 %files 中) +# package.xml <depend> 的运行时部分 Requires: ros-%{ros_distro}-autoware-sensing-msgs Requires: ros-%{ros_distro}-continental-msgs Requires: ros-%{ros_distro}-continental-srvs @@ -96,7 +82,11 @@ Requires: ros-%{ros_distro}-diagnostic-msgs Requires: ros-%{ros_distro}-diagnostic-updater Requires: ros-%{ros_distro}-geometry-msgs Requires: ros-%{ros_distro}-message-filters +Requires: ros-%{ros_distro}-nebula-continental-common +Requires: ros-%{ros_distro}-nebula-continental-decoders +Requires: ros-%{ros_distro}-nebula-continental-hw-interfaces Requires: ros-%{ros_distro}-nebula-core-common +Requires: ros-%{ros_distro}-nebula-core-ros Requires: ros-%{ros_distro}-nebula-msgs Requires: ros-%{ros_distro}-radar-msgs Requires: ros-%{ros_distro}-rclcpp @@ -105,168 +95,57 @@ Requires: ros-%{ros_distro}-sensor-msgs Requires: ros-%{ros_distro}-sync-tooling-msgs Requires: ros-%{ros_distro}-tf2-ros Requires: ros-%{ros_distro}-visualization-msgs -Requires: yaml-cpp -Requires: nlohmann-json-devel -# 单包策略:虚拟别名兼容依赖方,禁止拆实体子包(路径重叠致安装事务冲突) +# 单包策略(§7):ROS 包严禁拆实体子包,用虚拟别名兼容依赖方 Provides: %{name}-devel = %{version}-%{release} Provides: %{name}-doc = %{version}-%{release} Provides: %{name}-runtime = %{version}-%{release} -# 内嵌构建的 sibling 包虚拟别名(满足下游 Requires 与 CI 可安装性检查) -Provides: ros-%{ros_distro}-nebula-continental-common = %{version}-%{release} -Provides: ros-%{ros_distro}-nebula-continental-decoders = %{version}-%{release} -Provides: ros-%{ros_distro}-nebula-continental-hw-interfaces = %{version}-%{release} -Provides: ros-%{ros_distro}-nebula-core-ros = %{version}-%{release} -Provides: ros-%{ros_distro}-nebula-core-hw-interfaces = %{version}-%{release} %description -Nebula Continental ROS Wrapper — Continental ARS548 / SRR520 雷达 ROS 封装, -提供解码器封装、硬件接口封装与 ROS 节点组件。属于 TIER IV Nebula -多雷达驱动框架的 Continental 分支,构建进 /opt/ros/humble 前缀。 -本包内嵌构建同仓 sibling 包(nebula_continental_common/decoders/hw_interfaces、 -nebula_core_ros、nebula_core_hw_interfaces),因 EUR 命名约定(下划线) -与 COPR 批量构建均不可用,改由同源 monorepo 编译安装。 +Nebula Continental ROS Wrapper —— Nebula 多雷达驱动框架中面向 Continental +ARS548 / SRR520 雷达的 ROS 2 封装节点,提供雷达数据解码、硬件接口与 ROS 组件 +化封装(rclcpp_components)。基于 ament_cmake 构建,产物安装至 +/opt/ros/%{ros_distro} 前缀。 + +本包源自 tier4/nebula monorepo(commit 8be1ed77),仅构建其中的 +nebula_continental colcon 子包;monorepo 其余 colcon 包由各自独立 RPM 提供。 %prep -%autosetup -n nebula-continental-%{src_version} -p1 +# GitHub commit 归档解压根目录为纯完整 SHA,与 autosetup 的 -n 指定值匹配(§2 纪律) +%autosetup -n %{commit} %build -# ROS 基座环境(chroot 已配置 ROS SIG repo;无 ROS 依赖的包 buildroot 里 -# 可能没有 setup.sh,必须用 [ -f ] 守卫——直接 source 不存在的文件在 -# 严格 sh 下会中止整个 %build 脚本,|| true 挡不住) +# ROS 基座环境(§4: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} -# staged install prefix:sibling 包 make install DESTDIR=%{buildroot} 后, -# 后续包通过 CMAKE_PREFIX_PATH / AMENT_PREFIX_PATH 含 %{buildroot}/opt/ros 发现 -_STAGED="%{buildroot}/opt/ros/%{ros_distro}" -export AMENT_PREFIX_PATH="${_STAGED}:/opt/ros/%{ros_distro}${AMENT_PREFIX_PATH:+:$AMENT_PREFIX_PATH}" -export PKG_CONFIG_PATH="${_STAGED}/lib/pkgconfig:${PKG_CONFIG_PATH}" - -# monorepo 多包内嵌构建:按依赖拓扑序逐个 cmake + build + install -# 拓扑序:common → hw_interfaces → decoders → hw_interfaces(continental) → core_ros → continental -# 1. nebula_continental_common(header-only INTERFACE,依赖 nebula_core_common) -mkdir -p src/nebula_continental/nebula_continental_common/.obj -cd src/nebula_continental/nebula_continental_common/.obj -cmake .. \ - -DCMAKE_INSTALL_PREFIX="/opt/ros/%{ros_distro}" \ - -DAMENT_PREFIX_PATH="/opt/ros/%{ros_distro};${_STAGED}" \ - -DCMAKE_PREFIX_PATH="/opt/ros/%{ros_distro};${_STAGED}" \ - -DSETUPTOOLS_DEB_LAYOUT=OFF \ - -DBUILD_TESTING=OFF -%make_build -make install DESTDIR=%{buildroot} -cd - >/dev/null - -# 2. nebula_core_hw_interfaces(header-only INTERFACE,依赖 nebula_core_common) -mkdir -p src/nebula_core/nebula_core_hw_interfaces/.obj -cd src/nebula_core/nebula_core_hw_interfaces/.obj -cmake .. \ +# monorepo 子包构建:进入目标 colcon 包目录(§5 ament_cmake 显式 out-of-source) +cd src/nebula_continental/nebula_continental +mkdir -p .obj +cd .obj +%cmake3 \ -DCMAKE_INSTALL_PREFIX="/opt/ros/%{ros_distro}" \ - -DAMENT_PREFIX_PATH="/opt/ros/%{ros_distro};${_STAGED}" \ - -DCMAKE_PREFIX_PATH="/opt/ros/%{ros_distro};${_STAGED}" \ + -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 -%make_build -make install DESTDIR=%{buildroot} -cd - >/dev/null - -# 3. nebula_continental_decoders(SHARED lib,依赖 #1 nebula_continental_common) -mkdir -p src/nebula_continental/nebula_continental_decoders/.obj -cd src/nebula_continental/nebula_continental_decoders/.obj -cmake .. \ - -DCMAKE_INSTALL_PREFIX="/opt/ros/%{ros_distro}" \ - -DAMENT_PREFIX_PATH="/opt/ros/%{ros_distro};${_STAGED}" \ - -DCMAKE_PREFIX_PATH="/opt/ros/%{ros_distro};${_STAGED}" \ - -DSETUPTOOLS_DEB_LAYOUT=OFF \ - -DBUILD_TESTING=OFF -%make_build -make install DESTDIR=%{buildroot} -cd - >/dev/null - -# 4. nebula_continental_hw_interfaces(SHARED lib,依赖 #1 + #2) -mkdir -p src/nebula_continental/nebula_continental_hw_interfaces/.obj -cd src/nebula_continental/nebula_continental_hw_interfaces/.obj -cmake .. \ - -DCMAKE_INSTALL_PREFIX="/opt/ros/%{ros_distro}" \ - -DAMENT_PREFIX_PATH="/opt/ros/%{ros_distro};${_STAGED}" \ - -DCMAKE_PREFIX_PATH="/opt/ros/%{ros_distro};${_STAGED}" \ - -DSETUPTOOLS_DEB_LAYOUT=OFF \ - -DBUILD_TESTING=OFF -%make_build -make install DESTDIR=%{buildroot} -cd - >/dev/null - -# 5. nebula_core_ros(SHARED lib,依赖 nebula_core_common + rosbag2_storage) -mkdir -p src/nebula_core/nebula_core_ros/.obj -cd src/nebula_core/nebula_core_ros/.obj -cmake .. \ - -DCMAKE_INSTALL_PREFIX="/opt/ros/%{ros_distro}" \ - -DAMENT_PREFIX_PATH="/opt/ros/%{ros_distro};${_STAGED}" \ - -DCMAKE_PREFIX_PATH="/opt/ros/%{ros_distro};${_STAGED}" \ - -DSETUPTOOLS_DEB_LAYOUT=OFF \ - -DBUILD_TESTING=OFF -%make_build -make install DESTDIR=%{buildroot} -cd - >/dev/null - -# 6. nebula_continental(主包,依赖 #1 #3 #4 #5 + 外部 ROS 包) -mkdir -p src/nebula_continental/nebula_continental/.obj -cd src/nebula_continental/nebula_continental/.obj -cmake .. \ - -DCMAKE_INSTALL_PREFIX="/opt/ros/%{ros_distro}" \ - -DAMENT_PREFIX_PATH="/opt/ros/%{ros_distro};${_STAGED}" \ - -DCMAKE_PREFIX_PATH="/opt/ros/%{ros_distro};${_STAGED}" \ - -DSETUPTOOLS_DEB_LAYOUT=OFF \ - -DBUILD_TESTING=OFF -%make_build + -DBUILD_TESTING=OFF \ + -DTESTING=OFF \ + -DCMAKE_SUPPRESS_REGENERATION=ON \ + .. +make %{?_smp_mflags} %install -# RPM 的 build 段与 install 段是独立 shell 脚本,build 段的 export 不传递。 -# make install 触发 cmake_check_build_system → 重跑 templates_2_cmake.py -# → import ament_package,必须设 PYTHONPATH 让 /usr/bin/python3 能找到 -# /opt/ros/humble/lib/python3.11/site-packages/ament_package -[ -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} -_STAGED="%{buildroot}/opt/ros/%{ros_distro}" -export AMENT_PREFIX_PATH="${_STAGED}:/opt/ros/%{ros_distro}${AMENT_PREFIX_PATH:+:$AMENT_PREFIX_PATH}" - -# 所有 sibling 包在 %build 阶段已 make install DESTDIR=%{buildroot}, -# 仅需安装主包(nebula_continental)的最终产物 cd src/nebula_continental/nebula_continental/.obj make install DESTDIR=%{buildroot} +# 文件清单整树拥有(§7:单包策略,ros_distro 前缀一行收尾,对「装了没打包」类错误免疫) %files -%license LICENSE -# 整树拥有(SIG 模板标准做法,对"装了没打包"类错误免疫) /opt/ros/%{ros_distro} %changelog -* Thu Oct 08 2026 AI Importer <ai-importer@openeuler.org> - 1.2.0-5 -- 修复 install 段失败:make install 触发 cmake_check_build_system 重跑 - templates_2_cmake.py → import ament_package 报 ModuleNotFoundError。 - 根因:RPM 的 build 段与 install 段是独立 shell 脚本,build 段中 export - PYTHONPATH 不传递到 install 段。在 install 段开头补齐 ROS 环境变量 - (PYTHONPATH / AMENT_PREFIX_PATH / PKG_CONFIG_PATH) - -* Thu Oct 08 2026 AI Importer <ai-importer@openeuler.org> - 1.2.0-4 -- 修复 %build 失败:%cmake3 在 .obj 当前目录配置 cmake,但 %cmake_build - 展开为 cmake --build %{_vpath_builddir}(aarch64-openEuler-linux-gnu), - 该子目录从未创建导致 "is not a directory" 错误。改用 raw cmake + %make_build - 替代 RPM cmake 宏,完全掌控 out-of-source 构建目录;同时移除仅用于 - 抵消 %cmake3 默认 -D flags 的 -UINCLUDE_INSTALL_DIR 等 - -* Thu Oct 08 2026 AI Importer <ai-importer@openeuler.org> - 1.2.0-3 -- 修复 prep 失败:autosetup -n 用 version(1.2.0)但 tarball 内部目录 - 为 nebula-continental-1.2.0-1(_ensure_tarball 按 gate_result.version 重打), - cd 找不到目录;补 define src_version 1.2.0-1,Source0/autosetup 统一用 src_version - -* Thu Oct 08 2026 AI Importer <ai-importer@openeuler.org> - 1.2.0-2 -- 修复 %build 失败:nebula_core_common CMake 传递依赖 find_package(nlohmann_json) - 找不到配置文件(nlohmann_jsonConfig.cmake),补 nlohmann-json-devel 到 BuildRequires/Requires - -* Thu Oct 08 2026 ROS SIG <ros-sig@openeuler.org> - 1.2.0-1 -- 初始引入 ros-humble-nebula-continental 1.2.0 -- 内嵌构建同仓 sibling 包(EUR 下划线命名不匹配 + COPR 构建失败) +* Wed Oct 21 2026 AI Importer <ai-importer@openeuler.org> - 1.3.1-1 +- 初始引入 ros-humble-nebula-continental(nebula_continental colcon 子包) +- 源自 tier4/nebula monorepo,commit 8be1ed775b02985eadafe39b00e0e4fc944114e2 +- ament_cmake 形态,构建至 /opt/ros/humble 前缀 |
