diff options
Diffstat (limited to 'mrpt-libmaps.spec')
| -rw-r--r-- | mrpt-libmaps.spec | 85 |
1 files changed, 79 insertions, 6 deletions
diff --git a/mrpt-libmaps.spec b/mrpt-libmaps.spec index 94e7184..573f0b1 100644 --- a/mrpt-libmaps.spec +++ b/mrpt-libmaps.spec @@ -8,7 +8,7 @@ Name: ros-%{ros_distro}-%{RosPkgName} Version: 2.15.20 -Release: 2%{?dist} +Release: 3%{?dist} Summary: Mobile Robot Programming Toolkit (MRPT) libraries (maps C++ libraries) License: BSD URL: https://github.com/MRPT/mrpt_ros.git @@ -69,6 +69,18 @@ BuildRequires: libzstd-devel BuildRequires: mesa-libGL-devel BuildRequires: mesa-libGLU-devel BuildRequires: opencv +# octomap 是 mrpt-maps 的**硬依赖**,不是可选特性(build 112594 实测证伪了 +# "关掉 MRPT_BUILD_OCTOMAP 就安全"的旧判断):libs/maps/CMakeLists.txt 用 +# glob("libs/maps/src/maps/*.cpp") 无条件收集 CColouredOctoMap.cpp / COctoMap.cpp, +# 这些源文件顶部无条件 #include <octomap/ColorOcTree.h>;mrpt 的 +# CMAKE_MRPT_HAS_OCTOMAP 只决定 include 目录与 target_link_libraries,不参与 +# 源文件筛选(DeclareMRPTLib.cmake 只按 *_WIN.cpp/_LIN.cpp/_unittest.cpp 过滤)。 +# 于是 -DMRPT_BUILD_OCTOMAP=OFF 只会让 HAS_OCTOMAP=0、不加 octomap 的 -I, +# 源文件照样被编译 → fatal error: octomap/ColorOcTree.h。 +# openEuler 官方源有 octomap-devel 1.9.8(aarch64 同样可用),提供 +# /usr/include/octomap/ColorOcTree.h 与 /usr/lib64/octomap/octomap-config.cmake +# (dnf repoquery --whatprovides '*/octomap/ColorOcTree.h' 实证,rc=0)。 +BuildRequires: octomap-devel BuildRequires: pkgconfig BuildRequires: pybind11-devel BuildRequires: suitesparse-devel @@ -85,6 +97,9 @@ Requires: ros-%{ros_distro}-mrpt-libobs Requires: ros-%{ros_distro}-mrpt-libopengl Requires: ros-%{ros_distro}-mrpt-libposes Requires: eigen3-devel +# libmrpt-maps.so 链接 liboctomap.so/liboctomath.so;/opt/ros 下 .so 的自动 +# Requires 被上面的 __requires_exclude_from 排除,须手工声明运行库 +Requires: octomap Provides: %{name}-devel = %{version}-%{release} Provides: %{name}-doc = %{version}-%{release} @@ -123,10 +138,16 @@ sed -i 's/ AND NOT "\$ENV{HOME}" STREQUAL "\/home\/buildfarm"//' \ # 3rdparty/libfreenect(openEuler 无 libfreenect-devel) # MRPT_HAS_OPENNI2=OFF 无 libopenni2;script_openni2.cmake 在开启却找不到 # 时是 FATAL_ERROR(不是静默关闭),必须显式关 -# MRPT_BUILD_OCTOMAP=OFF 无系统 octomap 时 ExternalProject 会从 GitHub 下载 -# octomap(构建期无外网必失败);mrpt-maps 里 -# CMAKE_MRPT_HAS_OCTOMAP 的 COctoMap* 代码路径随之关闭, -# 整体由该宏守护,安全 +# OCTOMAP_DIR 指向系统 octomap 的 CMake config 目录,让 +# script_octomap.cmake 的 find_package(OCTOMAP QUIET) +# 命中 openEuler 的 octomap-devel(走"系统库"分支: +# HAS_OCTOMAP=1 + OCTOMAP_INCLUDE_DIRS=/usr/include + +# OCTOMAP_LIBRARIES=/usr/lib64/liboctomap.so); +# 命中后 `if (NOT OCTOMAP_FOUND)` 整段不执行,也就不会 +# 退回 ExternalProject 去 GitHub 下 octomap(chroot 无外网)。 +# 注意不能改成 -DMRPT_BUILD_OCTOMAP=OFF:该变量只在 +# "没找到系统 octomap"时才有意义,关掉它并不能让 +# CColouredOctoMap.cpp 不被编译(见 BuildRequires 处说明)。 # CMAKE_PREFIX_PATH 内层 mrpt 对 BUILD_mrpt-*=OFF 的兄弟库走 # DeclareMRPTLib.cmake 的 find_package(mrpt-XXX) 分支, # 必须能搜到 mrpt-libbase / -libmath / -libobs / @@ -141,7 +162,7 @@ sed -i 's/ AND NOT "\$ENV{HOME}" STREQUAL "\/home\/buildfarm"//' \ # -DMRPT_BUILD_nanogui=OFF;wx 仅 mrpt-gui 使用,包装工程自带 # -DBUILD_mrpt-gui=OFF 与 -DMRPT_BUILD_wxThings=OFF);libxxf86vm / libjpeg 是 # Debian 名,已在上面改成 libXxf86vm-devel / libjpeg-devel。 -sed -i 's|^\(\s*-DDISABLE_JSONCPP=ON\)$|\1\n -DMRPT_HAS_LIBFYAML=OFF\n -DMRPT_WITH_KINECT=OFF\n -DMRPT_HAS_OPENNI2=OFF\n -DMRPT_BUILD_OCTOMAP=OFF\n -DCMAKE_PREFIX_PATH=/opt/ros/%{ros_distro}|' \ +sed -i 's|^\(\s*-DDISABLE_JSONCPP=ON\)$|\1\n -DMRPT_HAS_LIBFYAML=OFF\n -DMRPT_WITH_KINECT=OFF\n -DMRPT_HAS_OPENNI2=OFF\n -DOCTOMAP_DIR=%{_libdir}/octomap\n -DCMAKE_PREFIX_PATH=/opt/ros/%{ros_distro}|' \ mrpt_libmaps/CMakeLists.txt # 闸门:确认上面三处 sed 真的改到了 CMakeLists.txt(模式不匹配时 sed 是静默空 # 操作,要到构建期才以 git clone 超时 / 空包暴露) @@ -153,6 +174,10 @@ if ! grep -q 'MRPT_HAS_OPENNI2=OFF' mrpt_libmaps/CMakeLists.txt; then echo "ERROR: 内层 CMAKE_ARGS 开关注入失败(sed 锚点 -DDISABLE_JSONCPP=ON 不匹配)" >&2 exit 1 fi +if ! grep -q 'OCTOMAP_DIR=%{_libdir}/octomap' mrpt_libmaps/CMakeLists.txt; then + echo "ERROR: 内层 CMAKE_ARGS 的 OCTOMAP_DIR 注入失败(sed 锚点不匹配)" >&2 + exit 1 +fi if grep -q 'buildfarm' mrpt_libmaps/CMakeLists.txt; then echo "ERROR: buildfarm HOME 守卫未移除(sed 模式不匹配)" >&2 exit 1 @@ -180,6 +205,14 @@ echo 'set(MRPT_VERSION_TO_DOWNLOAD "%{mrpt_version}")' > override_mrpt_version.c [ -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} +# 闸门:octomap 头是 mrpt-maps 的硬需求(CColouredOctoMap.cpp / COctoMap.cpp 无条件 +# include)。BuildRequires 未生效时,真正的报错发生在内层编译到 18% 处 +# (build 112594: fatal error: octomap/ColorOcTree.h),白烧一轮 COPR 构建; +# 这里提前失败并点明原因。 +if [ ! -f %{_includedir}/octomap/ColorOcTree.h ]; then + echo "ERROR: 系统 octomap 头缺失(%{_includedir}/octomap/ColorOcTree.h)——BuildRequires: octomap-devel 未生效" >&2 + exit 1 +fi cd mrpt_libmaps mkdir -p .obj && cd .obj %cmake3 \ @@ -251,6 +284,46 @@ make install DESTDIR=%{buildroot} /opt/ros/%{ros_distro} %changelog +* Tue Sep 22 2026 ai-importer <ai-importer@openeuler.org> - 2.15.20-3 +- 修复 build 112594 的 %build 失败(COPR 日志实锤): + `/builddir/.../libs/maps/src/maps/CColouredOctoMap.cpp:21:10: fatal error: + octomap/ColorOcTree.h: No such file or directory`。 + 根因是 Release 2 的判断错误——当时认为 `-DMRPT_BUILD_OCTOMAP=OFF` 能把 + COctoMap* 代码路径整体关掉,实测不成立。读上游源码(mrpt-2.15.21)确认: + * `cmakemodules/DeclareMRPTLib.cmake` 对 `libs/maps/src/*.cpp` 与 + `libs/maps/src/maps/*.cpp` 只做 glob + 仅过滤 `*_WIN.cpp` / + `*_LIN.cpp` / `*_unittest.cpp`,**没有**任何 "#if MRPT_HAS_xxx 源文件筛选" + 机制;`libs/maps/CMakeLists.txt` 里 `if (CMAKE_MRPT_HAS_OCTOMAP)` 只包住 + `link_directories` / `target_link_libraries` / `add_dependencies(EP_octomap)`。 + * `CColouredOctoMap.cpp`、`COctoMap.cpp` 顶部无条件 + `#include <octomap/ColorOcTree.h>`,没有宏守护。 + * `script_octomap.cmake` 里 `MRPT_BUILD_OCTOMAP` 只出现在 + `if (NOT OCTOMAP_FOUND)` 分支内,是"找不到系统 octomap 时退化为构建内置版" + 的开关;置 OFF 只会让 `CMAKE_MRPT_HAS_OCTOMAP=0`、不加 octomap 的 -I, + 源文件依旧被编译 → 头找不到。 + 即 octomap 对 mrpt-maps 是**硬依赖**,不能靠关开关绕开。修法改走"提供系统 + octomap": + * `BuildRequires: octomap-devel` + `Requires: octomap`。经 + `dnf repoquery --whatprovides '*/octomap/ColorOcTree.h'` 实证 openEuler + 官方源有 octomap-devel-1.9.8-2.oe2403sp4(aarch64 同样可用,rc=0),提供 + /usr/include/octomap/ColorOcTree.h 与 + /usr/lib64/octomap/octomap{-config,-targets,-config-version}.cmake。 + * 内层 CMAKE_ARGS 注入由 `-DMRPT_BUILD_OCTOMAP=OFF` 改为 + `-DOCTOMAP_DIR=%{_libdir}/octomap`,让 `find_package(OCTOMAP QUIET)` 命中 + 系统 config(本地以解包 rpm 的 config 目录实测:OCTOMAP_FOUND=1、 + OCTOMAP_INCLUDE_DIRS=<prefix>/include、OCTOMAP_VERSION=1.9.8; + 注意 `project(... NONE)` 无架构信息时 CMake 不搜 lib64,故显式给 + OCTOMAP_DIR 而非依赖默认搜索路径)。 + * mrpt 用到的 octomap 符号(ColorOcTree、ColorOcTreeNode、OcTree、 + OcTreeNode、OcTreeKey、KeySet、Pointcloud、point3d)已逐个在 1.9.8 头中 + 核对存在;Ubuntu 22.04 的系统 octomap 同为 1.9.8,是 mrpt 的既有支持面。 + * 新增两处闸门:%prep 校验 OCTOMAP_DIR 注入成功;%build 开头校验 + %{_includedir}/octomap/ColorOcTree.h 存在,把"BuildRequires 失效"变成 + 构建早期失败而非 18% 处才炸。 + * waived_deps.txt 中 liboctomap-dev 条目改注为"Debian 名 ↔ RPM 名 + octomap-devel,已真实引入"。 +- Release 2(上一版 2.15.20-1 依赖预检失败;2.15.20-2 因上述 octomap 误判 + %build 失败,无产物)。 * Tue Sep 22 2026 ai-importer <ai-importer@openeuler.org> - 2.15.20-2 - 依赖预检无 provider 修复(对齐同链已成功并经 COPR build 112588/112590 验证的 ros-humble-mrpt-libopengl-2.15.20-2 / ros-humble-mrpt-libposes-2.15.20-2 / |
