summaryrefslogtreecommitdiff
path: root/easynav-simple-localizer.spec
blob: 8589d696e47154bb9b1d451b8a74b5af708e358b (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
# ROS spec:easynav_simple_localizer(EasyNav Plugins 仓内的单定位器子包)
# 依据:/app/.claude/skills/build-rpm/spec-rules-ros.md
# 元数据来源:pkgs/easynav-simple-localizer/ros_pkg_manifest.json +
#              sources/easynav-simple-localizer/localizers/easynav_simple_localizer/package.xml
# 无 reference 基线、无 package_fix 修正资产、无同语言 lessons(ros.json 未生成),从零按 §2-§7 生成。

# ── §1/§2 命名纪律:ros_distro 取自 manifest(humble,禁止硬编码),RosPkgName 取
#    package.xml <name> 经 `_`→`-` 归一化(easynav_simple_localizer → easynav-simple-localizer)。
#    Name 展开须等于 ros-humble-easynav-simple-localizer(verify_ros_spec_deps.py 机械校验)。
%define ros_distro humble
%define RosPkgName easynav-simple-localizer
# 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)。
%define src_version 0.5.0-1

Name:       ros-%{ros_distro}-%{RosPkgName}
Version:    0.5.0
Release:    1%{?dist}
Summary:    Easy Navigation: Simple Localizer package
License:    Apache-2.0
URL:        https://github.com/EasyNavigation/easynav_plugins
# Source0 用 tag 0.5.0 归档(target_version=0.5.0-1,git describe=0.5.0,HEAD 恰命中 tag)。
# 构建系统不下载 GitHub 归档,而是对 sources/<pkg>/ 的 git clone 执行
#   tar --transform s|^./sources/<pkg>|<top>|
# 其中 <top> = Source0 落地文件名去 .tar.gz 后缀。故 Source0 的 basename 即解压根目录名。
# 修复重提走 submit_fix._ensure_tarball,它固定按 <pkg>-<gate_version> 命名 tarball
# (gate_version = gate_result.result.version = 0.5.0-1),与上面 src_version 定义同源。
# 因此用 #/<basename> 强制重定向 Source0 落地文件名为 RosPkgName-src_version.tar.gz 形式
# (= easynav-simple-localizer-0.5.0-1.tar.gz),使 rpmbuild -bs 取的源文件名与
# submit_fix 重打的 tarball 名一致;autosetup 的 -n 同取该名(见下文 prep 段)。
# 初版误用裸 tag URL(basename=0.5.0.tar.gz)却写 -n easynav_plugins-0.5.0,
# 二者不符致 prep 段 cd 失败(build 113753)——本版修正。
Source0:    https://github.com/EasyNavigation/easynav_plugins/archive/refs/tags/0.5.0.tar.gz#/%{RosPkgName}-%{src_version}.tar.gz

# §2:/opt 前缀下 debug 子包无意义(strip/debugedit 路径非常规),SIG 模板统一关闭
%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 构建工具(package.xml <buildtool_depend>,§5/§6)
BuildRequires: ros-%{ros_distro}-ament-cmake
# package.xml <depend> —— ROS 标准包(ros-projects.list 逐项实证存在,照 §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
BuildRequires: ros-%{ros_distro}-tf2
BuildRequires: ros-%{ros_distro}-tf2-geometry-msgs
BuildRequires: ros-%{ros_distro}-tf2-ros
# 系统依赖(pkg.remap: eigen -> eigen3-devel;CMakeLists find_package(Eigen3 REQUIRED NO_MODULE))
BuildRequires: eigen3-devel

# package.xml <depend> —— EasyNavigation 基座框架包(独立 EasyNavigation 基座仓,
# https://github.com/EasyNavigation/EasyNavigation/tree/rolling)。ros-projects.list
# 已登记(easynav-common / easynav-core / easynav-localizer / easynav-sensors),
# 同源基座仓整体构建已在 COPR 项目 ROS-humble-2 中全部成功(build 113479/
# 113482/113498/113483),COPR result repo 可提供——照写 BuildRequires。
BuildRequires: ros-%{ros_distro}-easynav-common
BuildRequires: ros-%{ros_distro}-easynav-core
BuildRequires: ros-%{ros_distro}-easynav-localizer
BuildRequires: ros-%{ros_distro}-easynav-sensors
# package.xml <depend>easynav_simple_common</depend> —— easynav_plugins 仓内
# 兄弟子包(与本包同批引入,pkgs/easynav-simple-common)。ros-projects.list
# 已登记;其构建依赖仅需基座包 easynav-common(已构建可用)。easynav-simple-common
# 已构建成功(build 113765),COPR result repo 可提供 ros-humble-easynav-simple-common
# RPM。retry-dep 阻塞已解除,本轮重提(spec 全部 5 个 BR 此前已补全)。
BuildRequires: ros-%{ros_distro}-easynav-simple-common
# <test_depend>(ament_cmake_gtest/ament_lint_auto/ament_lint_common/rclcpp_lifecycle/std_srvs)
# 按 §5 不写 BuildRequires,BUILD_TESTING=OFF 关闭测试。

# §6 运行时 Requires(ROS 特有,/opt 被 __requires_exclude_from 豁免、autodeps 扫不到,
# 少了这些 Requires 构建照样成功但装上后环境不就绪——必须手写)
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
Requires: ros-%{ros_distro}-tf2
Requires: ros-%{ros_distro}-tf2-geometry-msgs
Requires: ros-%{ros_distro}-tf2-ros
# EasyNavigation 基座 + 兄弟子包(package.xml <depend> = build+run,REP 149)
Requires: ros-%{ros_distro}-easynav-common
Requires: ros-%{ros_distro}-easynav-core
Requires: ros-%{ros_distro}-easynav-localizer
Requires: ros-%{ros_distro}-easynav-sensors
Requires: ros-%{ros_distro}-easynav-simple-common
# CMakeLists ament_export_dependencies(Eigen3) 向下游传播 eigen 依赖
Requires: eigen3-devel

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

%description
Easy Navigation: Simple Localizer package. Provides an AMCL-based simple localizer
plugin for the Easy Navigation framework, built as an ament_cmake ROS 2 component
installed under /opt/ros/%{ros_distro}.

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

%build
# §4 ROS 基座环境(chroot 已配 ROS SIG repo;setup.sh 用 [ -f ] 守卫,严格 sh 下不中止,
# || true 挡不住严格 sh 下的 source 不存在文件)
[ -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:本 spec 只构建 localizers/easynav_simple_localizer 子包(同批兄弟各有独立 RPM)
cd localizers/easynav_simple_localizer
# §5:显式 out-of-source 构建,规避 openEuler %%cmake 宏的位置参数坑
# (注:注释里裸写该宏名会被 RPM 宏展开器当真调用,其后文字沦为 cmake 位置参数=源码目录,build 113759 实踩;故此处用 %% 转义,勿改回单 %)
mkdir -p .obj && cd .obj
%cmake3 \
    -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 localizers/easynav_simple_localizer/.obj
%make_install

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

%changelog
* Tue Oct 20 2026 AI Importer <ai-importer@opencode.local> - 0.5.0-1
- Initial RPM packaging of easynav_simple_localizer for openEuler ROS humble.
- Generated from EasyNavigation/easynav_plugins tag 0.5.0 (ament_cmake, /opt/ros/humble).