summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mrpt-libmath.spec45
1 files changed, 43 insertions, 2 deletions
diff --git a/mrpt-libmath.spec b/mrpt-libmath.spec
index a68cff0..996920d 100644
--- a/mrpt-libmath.spec
+++ b/mrpt-libmath.spec
@@ -8,7 +8,7 @@
Name: ros-%{ros_distro}-%{RosPkgName}
Version: 2.15.20
-Release: 1%{?dist}
+Release: 2%{?dist}
Summary: Mobile Robot Programming Toolkit (MRPT) libraries (math C++ libraries)
License: BSD
URL: https://github.com/MRPT/mrpt_ros.git
@@ -158,7 +158,35 @@ if [ -e mrpt-build/tmp/mrpt-gitclone.cmake ]; then
echo "ERROR: cmake 准备 git clone mrpt —— %prep 预置源码未被复用,请检查预置路径" >&2
exit 1
fi
-make %{?_smp_mflags}
+# --- 并行度与内存:mrpt-math 的模板 TU 是内存杀手 ---------------------------
+# 现象(build 112579):4 核 / MemTotal 6.9GiB / 无 swap 的 COPR builder 上
+# `make -j4` 编译 libs/math/src/CMatrixFixed.cpp 时 cc1plus 被 OOM killer
+# SIGKILL(日志 "c++: fatal error: Killed signal terminated program cc1plus",
+# 随后 .s 被截断报 "unknown pseudo-op: `.l'" / "open CFI at the end of file")。
+# 该 TU 用 DO_MATFIXED_INSTANTIATION 把 CMatrixFixed 的 5 种尺寸 × 2 种标量
+# 类型的全套成员显式实例化,另有 A_/MatrixBase_instantiate_* 一组同量级的
+# 实例化 TU,-O2 -g 下单进程峰值内存达 GB 级,4 路并行叠峰即打爆 6.9GiB。
+# (1) 降单进程内存:CMake 会用环境变量 CXXFLAGS/CFLAGS 初始化 CMAKE_<LANG>_FLAGS
+# (本次构建日志证实内层 "C++ flags (active config.)" 就是透传进去的
+# rpmbuild %{optflags}),故在 make 之前覆盖为 -O1 -g0:本包已
+# %global debug_package %{nil},-g 只烧内存不出产物;-O1 对矩阵运算足够,
+# 并保留下游 hardening 项(stack-protector / FORTIFY / GLIBCXX_ASSERTIONS)。
+# (2) 限并行:按“每个 cc1plus 预留 2.5GiB”从 MemTotal 反推 job 数,取
+# min(nproc, 内存上限)、至少 1 路,避免多路 cc1plus 同时叠峰。
+export CFLAGS="-O1 -g0 -fstack-protector-strong -Wp,-D_FORTIFY_SOURCE=2 -fasynchronous-unwind-tables"
+export CXXFLAGS="-O1 -g0 -fstack-protector-strong -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fasynchronous-unwind-tables"
+JOBS="$(nproc 2>/dev/null || echo 1)"
+MEM_KB="$(awk '/^MemTotal:/{print $2; exit}' /proc/meminfo 2>/dev/null)"
+case "$MEM_KB" in
+ ''|*[!0-9]*) MEM_KB=0 ;;
+esac
+if [ "$MEM_KB" -gt 0 ]; then
+ MEM_JOBS=$(( MEM_KB / 2621440 ))
+ if [ "$MEM_JOBS" -lt 1 ]; then MEM_JOBS=1; fi
+ if [ "$JOBS" -gt "$MEM_JOBS" ]; then JOBS="$MEM_JOBS"; fi
+fi
+echo "mrpt-math 构建并行度: -j${JOBS}(nproc=$(nproc 2>/dev/null || echo '?'), MemTotal=${MEM_KB}KiB)"
+make -j"$JOBS"
%install
[ -f /opt/ros/%{ros_distro}/setup.sh ] && source /opt/ros/%{ros_distro}/setup.sh || true
@@ -172,6 +200,19 @@ make install DESTDIR=%{buildroot}
/opt/ros/%{ros_distro}
%changelog
+* Tue Sep 22 2026 ai-importer <ai-importer@openeuler.org> - 2.15.20-2
+- 修复 %build 阶段 cc1plus 被 OOM killer 杀死(build 112579 实测:编译
+ libs/math/src/CMatrixFixed.cpp 时 "c++: fatal error: Killed signal
+ terminated program cc1plus",随后 .s 被截断报 unknown pseudo-op: `.l')。
+ 根因:mrpt-math 的定长矩阵实例化 TU 单进程峰值内存达 GB 级,而 COPR
+ builder 只有 4 核 / 6.9GiB 内存 / 无 swap(hw_info.log),`make -j4`
+ 四路 cc1plus 叠峰打爆内存。
+ * %build 在 make 前覆盖 CFLAGS/CXXFLAGS 为 -O1 -g0(+ 保留 hardening 项):
+ CMake 用环境变量初始化 CMAKE_<LANG>_FLAGS,内层 mrpt 因此以更低优化级别
+ 编译;本包 debug_package 已 %{nil},去掉 -g 不损失产物内容。
+ * %build 用 min(nproc, MemTotal/2.5GiB) 计算并行度(本例得 -j2)替代
+ `make %{?_smp_mflags}`,保证至少 1 路,避免再次触发 OOM。
+- Release 2(上一版 2.15.20-1 构建失败,无产物)。
* Tue Sep 22 2026 ai-importer <ai-importer@openeuler.org> - 2.15.20-1
- 依赖预检无 provider 修复(7 个缺口全部对齐既有的
ros-humble-mrpt-libbase-2.15.20-3 处置方式;这些名字在 openEuler 官方源 /