diff options
| -rw-r--r-- | mrpt-libmath.spec | 45 |
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 官方源 / |
