summaryrefslogtreecommitdiff
path: root/mrpt-libmaps.spec
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2026-09-22 04:28:07 +0000
committerCoprDistGit <infra@openeuler.org>2026-09-22 04:28:07 +0000
commit574bfae13773c5af22fc10f22ccaa91d1fb7a06e (patch)
tree4faf391e9a4e5620c46fbfc6d1243b5eae079826 /mrpt-libmaps.spec
parent797bedb577ba3b84e95e83447efc9c82206d407e (diff)
automatic import of ros-humble-mrpt-libmapsopeneuler24.03_LTS_SP3
Diffstat (limited to 'mrpt-libmaps.spec')
-rw-r--r--mrpt-libmaps.spec85
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 /