summaryrefslogtreecommitdiff
path: root/easynav-simple-planner.spec
blob: f45c9436e1459d8f2b70f3b958cd26854baabbc3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
# ROS spec:easynav_simple_planner(EasyNav Plugins 仓内的单路径规划器子包)
# 依据:/app/.claude/skills/build-rpm/spec-rules-ros.md
# 元数据来源:pkgs/easynav-simple-planner/ros_pkg_manifest.json +
#              sources/easynav-simple-planner/planners/easynav_simple_planner/package.xml
#              sources/easynav-simple-planner/planners/easynav_simple_planner/CMakeLists.txt
# 无 reference 基线、无 package_fix 修正资产,从零按 §2-§7 生成。
#
# 修复说明(fix round 1,trigger=prepare_failed,kind=spec):
# 首版 spec 违反 §6 反幻觉铁律——写入了 ros-humble-easynav-common / -easynav-core /
# -easynav-simple-common 三个 EasyNav 基座框架包 BuildRequires/Requires,这三级清单
# (ros-projects.list ∪ ros-upstream.list)均查无其名,被 verify_ros_spec_deps.py 判幻觉名
# 打回导致 spec 生成失败。本版按同批 maps-manager(同仓同 commit 同版本)成功模板重写:
# 移除三个幻觉依赖、Source0 改 #/ 强制重定向 + autosetup -n 取 RosPkgName-src_version
# (配合 build-rpm §4 tar --transform)、补 cmake/make BuildRequires 与 %%license LICENSE。
#
# 修复说明(fix round 2,trigger=build_failed,build 113757):
# round 1 的 spec 在 %%build 段注释里写了 "规避 openEuler %%cmake 宏位置参数坑"——
# RPM 宏展开先于 shell 注释解析,%%cmake 多行宏在注释行内被展开,行尾文字
# "宏位置参数坑" 沦为 cmake 位置参数(CMake Error: source directory does not exist),
# 构建在 %%build 起始即死,从未抵达真正的 find_package。同批 maps-manager build 113756
# 踩同坑、113767 修复成功。本版对齐 maps-manager 113767 模板:
#  (1) %%build 段弃用 %%cmake3/%%cmake 宏,直接调 cmake .. + 显式 -D 前缀参数;
#      注释里写 "cmake 宏"(不带 %%)避免宏展开。
#  (2) 补 src_version=0.5.0-1 宏:submit_fix 按 gate_version(0.5.0-1) 重打 tarball
#      (root=easynav-simple-planner-0.5.0-1),Source0 basename 与 autosetup -n 三处同源
#      用 %%{src_version},否则 prep 段 cd 失败(maps-manager build 113766 踩此)。
#  (3) 补 3 条 EasyNav 基座 BuildRequires/Requires:round 1 时三者尚未注册(反幻觉铁律
#      正确省略);controller fixer round 2 已将 easynav-common/-core 注册入
#      ros-projects.list(第 195/196 行)并在 COPR 构建完成,easynav-simple-common 为本批
#      兄弟(ros-projects.list 第 199 行,build 113765 成功)。CMakeLists.txt 对三者均
#      find_package(REQUIRED)+target_link_libraries,非静默丢弃。

# ── §1/§2 命名纪律:ros_distro 取 session.json(禁止硬编码),RosPkgName 取
#    package.xml <name> 经 `_`→`-` 归一化(easynav_simple_planner → easynav-simple-planner)。
#    Name 展开须等于 ros-humble-easynav-simple-planner(verify_ros_spec_deps.py 机械校验)。
%define ros_distro humble
%define RosPkgName easynav-simple-planner
# src_version 保留完整 target_version(0.5.0-1 = Version-Release),对齐
# gen_ros_spec 模板与 submit_fix._ensure_tarball 的 <pkg>-<gate_version> 命名:
# tarball 名 / 解压根目录 / autosetup 的 -n 三处同源(见下文 Source0 与 prep)。
# gate_result.result.version = 0.5.0-1(含 Release),submit_fix 按 <pkg>-<gate_version>
# 重打 tarball(--transform 重命名源码根为该串),故 src_version 须取 0.5.0-1 而非
# spec 的 Version 字段(仅 0.5.0)——二者不符致 prep 段 cd 失败(maps-manager 113766 实踩)。
%define src_version 0.5.0-1

Name:           ros-%{ros_distro}-%{RosPkgName}
Version:        0.5.0
Release:        1%{?dist}
Summary:        Easy Navigation: Simple planner package.

License:        Apache-2.0
URL:            https://github.com/EasyNavigation/easynav_plugins
# 实际检出 commit(ros_fetch checkout humble 分支 HEAD=tag 0.5.0 指向),用于产物追溯。
# Source0 basename(#/ 重定向后)= RosPkgName-src_version = easynav-simple-planner-0.5.0-1,
# 与 submit_fix._ensure_tarball 重打的 tarball 名一致(gate_version=0.5.0-1);
# autosetup -n 同取该名(见 prep 段),三处同源不随包名联动改写。
%global commit 703b73ae55bf6a419bf309b26084ca523b063ddf
Source0:        %{url}/archive/%{commit}.tar.gz#/%{RosPkgName}-%{src_version}.tar.gz

# §2:/opt 前缀下 debug 子包无意义(strip/debugedit 路径非常规),统一关闭
%global debug_package %{nil}
# §2:摘掉 brp-python-bytecompile(/opt 下 python 字节码会写标准 sitelib 路径)
%global __os_install_post %(echo '%{__os_install_post}' | sed -e 's!/usr/lib[^[:space:]]*/brp-python-bytecompile[[:space:]].*$!!g')
# §2:ROS 包不做自动依赖扫描(.so 全在 /opt/ros 下,由 ament 间接依赖模型替代)
%global __provides_exclude_from ^/opt/ros/%{ros_distro}/.*$
%global __requires_exclude_from ^/opt/ros/%{ros_distro}/.*$

# 基础构建工具链(ament_cmake C++ 构建必需,非 ROS 依赖、非幻觉)
BuildRequires:  cmake
BuildRequires:  gcc-c++
BuildRequires:  make
# 构建工具依赖(ament_cmake 形态,§5/§6)
BuildRequires:  ros-%{ros_distro}-ament-cmake
# package.xml <depend> 中命中 ros-projects.list(SIG 源已有)的依赖,照 §6 写 ros-humble-<dep>
BuildRequires:  ros-%{ros_distro}-geometry-msgs
BuildRequires:  ros-%{ros_distro}-nav-msgs
BuildRequires:  ros-%{ros_distro}-pluginlib
BuildRequires:  ros-%{ros_distro}-rclcpp
# EasyNav 基座框架包(独立 EasyNavigation 基座仓
# https://github.com/EasyNavigation/EasyNavigation rolling 分支,v0.5.0)。
# round 1 时三者尚未注册/构建,按 §6 反幻觉铁律正确地未写 BR,构建在
# find_package(easynav_common REQUIRED) 诚实失败(build 113757 %build 段,叠加 cmake
# 注释展开坑,构建未抵达 find_package 即死于 cmake 位置参数)。
# controller fixer round 2 已将 easynav-common/easynav-core 注册入 ros-projects.list
# (第 195/196 行)并在 COPR 构建完成;easynav-simple-common 为本批兄弟(同 COPR project,
# build 113765 成功,ros-projects.list 第 199 行)。CMakeLists.txt 对三者均
# find_package(REQUIRED)+target_link_libraries,非静默丢弃。本轮补三条 BuildRequires 重提。
BuildRequires:  ros-%{ros_distro}-easynav-common
BuildRequires:  ros-%{ros_distro}-easynav-core
BuildRequires:  ros-%{ros_distro}-easynav-simple-common
# <test_depend>(ament_cmake_gtest/ament_lint_auto/ament_lint_common/rclcpp_lifecycle)
# 按 §5 不写 BuildRequires,BUILD_TESTING=OFF 关闭测试。

# §6 运行时 Requires(ROS 特有,/opt 被 __requires_exclude_from 豁免、autodeps 扫不到,
# 少了这些 Requires 构建照样成功但装上后环境不就绪——spec-rules-ros.md §6)
Requires:       ros-%{ros_distro}-ros-workspace
Requires:       ros-%{ros_distro}-ament-cmake
# package.xml <depend> = build+run(REP 149),运行时 Requires 同上映射
Requires:       ros-%{ros_distro}-geometry-msgs
Requires:       ros-%{ros_distro}-nav-msgs
Requires:       ros-%{ros_distro}-pluginlib
Requires:       ros-%{ros_distro}-rclcpp
# EasyNav 基座框架包运行时 Requires(同 BuildRequires 映射,<depend>=build+run)
Requires:       ros-%{ros_distro}-easynav-common
Requires:       ros-%{ros_distro}-easynav-core
Requires:       ros-%{ros_distro}-easynav-simple-common

# §7:单包策略——严禁拆实体子包(路径与主包 %files 整树重叠致安装事务冲突),
#      用虚拟 Provides 别名兼容依赖方
Provides:       %{name}-devel = %{version}-%{release}
Provides:       %{name}-doc = %{version}-%{release}
Provides:       %{name}-runtime = %{version}-%{release}

%description
Easy Navigation: Simple planner package.
easynav_simple_planner provides a default "simple" implementation of the
A* path planner for SimpleMap, part of the EasyNav plugins collection for
ROS 2 %{ros_distro}. Built as an ament_cmake component installed under
/opt/ros/%{ros_distro}.

%prep
# §2:解压根目录 = Source0 basename 去 .tar.gz = RosPkgName-src_version
# (展开后 easynav-simple-planner-0.5.0-1;构建系统 tar --transform 重命名源码根为该名,
# 非上游 GitHub 归档的自然目录)。
# -n 与 Source0 basename、submit_fix 重打 tarball 三处同源,不随包名联动改写。
%autosetup -n %{RosPkgName}-%{src_version}

%build
# §4 ROS 基座环境(chroot 可能未装 setup.sh,用 [ -f ] 守卫——|| true 挡不住严格 sh)
[ -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}

# monorepo 子包:CMakeLists.txt 位于 planners/easynav_simple_planner/
cd planners/easynav_simple_planner
# §5:显式 out-of-source 构建,规避 openEuler cmake 宏的位置参数坑
# (openEuler 的 cmake 多行宏在注释行内仍被 RPM 展开,行尾文字沦为
#  位置参数喂给 cmake 致 "source directory does not exist"——build 113757 踩此坑)。
# 直接调 cmake 并显式传 /opt/ros 前缀,不依赖 openEuler cmake 宏注入默认值。
mkdir -p .obj && cd .obj
cmake .. \
    -DCMAKE_INSTALL_PREFIX="/opt/ros/%{ros_distro}" \
    -DAMENT_PREFIX_PATH="/opt/ros/%{ros_distro}" \
    -DCMAKE_PREFIX_PATH="/opt/ros/%{ros_distro}" \
    -UINCLUDE_INSTALL_DIR -ULIB_INSTALL_DIR -USYSCONF_INSTALL_DIR -USHARE_INSTALL_PREFIX -ULIB_SUFFIX \
    -DSETUPTOOLS_DEB_LAYOUT=OFF \
    -DBUILD_TESTING=OFF -DTESTING=OFF -DCMAKE_SUPPRESS_REGENERATION=ON
%make_build

%install
[ -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}

# install 段起始 cwd 回到解压根,重新进入构建目录
cd planners/easynav_simple_planner/.obj
%make_install

%files
%license LICENSE
# §7:%files 整树拥有(对「装了没打包」类错误免疫;不逐目录精确列)
/opt/ros/%{ros_distro}

%changelog
* Tue Oct 20 2026 ROS SIG - 0.5.0-1
- Initial RPM packaging of easynav_simple_planner for openEuler ROS humble.