summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mrpt-libbase.spec65
-rw-r--r--sources2
2 files changed, 52 insertions, 15 deletions
diff --git a/mrpt-libbase.spec b/mrpt-libbase.spec
index c41f86c..b5d8c86 100644
--- a/mrpt-libbase.spec
+++ b/mrpt-libbase.spec
@@ -5,7 +5,7 @@
Name: ros-%{ros_distro}-%{RosPkgName}
Version: 2.15.20
-Release: 1%{?dist}
+Release: 2%{?dist}
Summary: Mobile Robot Programming Toolkit (MRPT) libraries (core C++ libraries)
License: BSD
URL: https://github.com/MRPT/mrpt_ros.git
@@ -30,7 +30,9 @@ BuildRequires: libudev-devel
BuildRequires: libusbx-devel
BuildRequires: libjpeg-devel
BuildRequires: libzstd-devel
+BuildRequires: libglvnd-devel
BuildRequires: mesa-libGL-devel
+BuildRequires: mesa-libGLU-devel
BuildRequires: opencv
BuildRequires: pkgconfig
BuildRequires: pybind11-devel
@@ -52,21 +54,37 @@ Mobile Robot Programming Toolkit (MRPT) libraries (core C++ libraries).
%prep
%autosetup -n %{RosPkgName}-%{src_version}
-# Patch CMakeLists.txt: remove the HOME==/home/buildfarm guard so pre-populated
-# source is reused in COPR (where HOME is /home/buildfarm) as well.
+# --- 复用预置 mrpt 源码,避免 ExternalProject 在构建期 git clone -------------
+# mrpt_libbase/CMakeLists.txt 用 ExternalProject_Add(mrpt ...) 拉取上游 mrpt,
+# 本地复用路径写成 ${CMAKE_BINARY_DIR}/../mrpt_libbase/mrpt-build/...,那是 ROS
+# 官方 buildfarm 的目录布局(build 目录 = <ws>/build/mrpt_libbase,故其 .. 即
+# <ws>/build)。本 spec 的 CMAKE_BINARY_DIR = <top>/mrpt_libbase/.obj,同一表达式
+# 会多出一层 mrpt_libbase(<top>/mrpt_libbase/mrpt_libbase/mrpt-build),EXISTS
+# 检查必然失败而退回 git clone;COPR chroot 无外网,clone 100% 失败
+# (build 112429/112431/112435/112438 连续四轮的根因,日志均为
+# "Could not resolve host: github.com")。
+# 统一改写成相对 CMakeLists.txt 自身目录的 ../mrpt-build,与下面 %prep 的预置
+# 目录 <top>/mrpt-build 对齐(VERSION_CACHE / EXISTS 检查 / SOURCE_DIR 三处)。
+sed -i 's|\${CMAKE_BINARY_DIR}/\.\./mrpt_libbase/mrpt-build|${CMAKE_CURRENT_LIST_DIR}/../mrpt-build|g' \
+ mrpt_libbase/CMakeLists.txt
+# 去掉 HOME==/home/buildfarm 守卫:该条件只对 buildfarm 屏蔽本地复用,COPR 里
+# HOME 非 /home/buildfarm,去掉后复用分支在任何构建环境都成立。
sed -i 's/AND (NOT "\$ENV{HOME}" STREQUAL "\/home\/buildfarm")//' \
mrpt_libbase/CMakeLists.txt
-# Pre-populate the ExternalProject SOURCE_DIR so cmake does not attempt a git clone.
-# After the patch, the skip condition is:
-# EXISTS ${CMAKE_BINARY_DIR}/../mrpt_libbase/mrpt-build/src/mrpt/CMakeLists.txt
-# AND "${CURRENT_DOWNLOADED_MRPT_VERSION}" STREQUAL "${MRPT_VERSION_TO_DOWNLOAD}"
-# CMAKE_BINARY_DIR = <builddir>/mrpt_libbase/.obj, so resolved path:
-# <builddir>/mrpt_libbase/mrpt-build/src/mrpt/
-mkdir -p mrpt_libbase/mrpt-build/src
-tar -xzf %{SOURCE1} -C mrpt_libbase/mrpt-build/src
-mv mrpt_libbase/mrpt-build/src/mrpt-%{mrpt_version} mrpt_libbase/mrpt-build/src/mrpt
-# Version cache: cmake reads ${CMAKE_BINARY_DIR}/../mrpt_libbase/mrpt-build/MRPT_VERSION_TO_DOWNLOAD.txt
-echo -n "%{mrpt_version}" > mrpt_libbase/mrpt-build/MRPT_VERSION_TO_DOWNLOAD.txt
+# 预置 ExternalProject 的 SOURCE_DIR:<top>/mrpt-build/src/mrpt
+mkdir -p mrpt-build/src
+tar -xzf %{SOURCE1} -C mrpt-build/src
+mv mrpt-build/src/mrpt-%{mrpt_version} mrpt-build/src/mrpt
+# 版本缓存:cmake 读取 <top>/mrpt-build/MRPT_VERSION_TO_DOWNLOAD.txt,内容必须与
+# MRPT_VERSION_TO_DOWNLOAD 完全一致(无换行)才走复用分支。
+echo -n "%{mrpt_version}" > mrpt-build/MRPT_VERSION_TO_DOWNLOAD.txt
+# GitHub archive tarball 不含 git submodule 内容,而上游 mrpt 顶层 CMakeLists.txt
+# 第 49-55 行有无条件存在性检查(3rdparty/nanogui/include、3rdparty/rplidar_sdk/
+# sdk/src),缺失即 FATAL_ERROR "git submodules missing!"。补空目录绕过;两个
+# 子项目在内层 CMAKE_ARGS 里已分别用 -DMRPT_BUILD_nanogui=OFF /
+# -DMRPT_BUILD_rplidar_sdk=OFF 关闭,不会被真正编译。
+mkdir -p mrpt-build/src/mrpt/3rdparty/nanogui/include \
+ mrpt-build/src/mrpt/3rdparty/rplidar_sdk/sdk/src
# Override the version cmake reads from package.xml to match the pre-fetched source
echo 'set(MRPT_VERSION_TO_DOWNLOAD "%{mrpt_version}")' > override_mrpt_version.cmake
@@ -88,6 +106,13 @@ mkdir -p .obj && cd .obj
-DMRPT_WITH_GLFW=OFF \
-DMRPT_BUILD_wxThings=OFF \
..
+# 闸门:cmake 生成 mrpt-gitclone.cmake 即表示未复用 %prep 预置的 mrpt 源码,
+# 构建期将 git clone(COPR chroot 无外网,必然失败)。这里提前失败并给出明确
+# 原因,避免又白烧一轮 COPR 构建。
+if [ -e mrpt-build/tmp/mrpt-gitclone.cmake ]; then
+ echo "ERROR: cmake 准备 git clone mrpt —— %prep 预置源码未被复用,请检查预置路径" >&2
+ exit 1
+fi
make %{?_smp_mflags}
%install
@@ -102,5 +127,17 @@ make install DESTDIR=%{buildroot}
/opt/ros/%{ros_distro}
%changelog
+* Mon Sep 21 2026 ai-importer <ai-importer@openeuler.org> - 2.15.20-2
+- 修复 %build 期 ExternalProject 退回 git clone 导致构建失败(COPR 无外网):
+ %prep 将 CMakeLists.txt 的本地复用路径 ${CMAKE_BINARY_DIR}/../mrpt_libbase/
+ mrpt-build 改写为 ${CMAKE_CURRENT_LIST_DIR}/../mrpt-build,并把预置 mrpt 源码
+ 放到与之对齐的 <top>/mrpt-build/(原路径多一层 mrpt_libbase,EXISTS 检查必然
+ 失败);保留去掉 HOME==/home/buildfarm 守卫的补丁。
+- 补 3rdparty/nanogui/include 与 3rdparty/rplidar_sdk/sdk/src 空目录,绕过上游
+ mrpt 顶层 CMakeLists.txt:51 的 "git submodules missing!" 致命检查(GitHub
+ archive tarball 不含 submodule 内容;两者内层已 MRPT_BUILD_*=OFF)。
+- 新增 BuildRequires: libglvnd-devel、mesa-libGLU-devel(mesa-libGL-devel 已有),
+ 满足 mrpt 对 OpenGL/GLU 的 find_package 探测。
+- %build 增加闸门:若 cmake 生成 mrpt-gitclone.cmake 则立即失败并提示原因。
* Mon Sep 21 2026 ai-importer <ai-importer@openeuler.org> - 2.15.20-1
- Initial import (ROS batch)
diff --git a/sources b/sources
index 448a308..f9366ee 100644
--- a/sources
+++ b/sources
@@ -1,2 +1,2 @@
9f9a7c42d30f686dc66bc7df3c984d65 mrpt-2.15.21.tar.gz
-dd521b5b703782840261d1fcfbafdb90 mrpt-libbase-2.15.20.tar.gz
+a281ecc4691e3992241aa296c1f93b94 mrpt-libbase-2.15.20.tar.gz