summaryrefslogtreecommitdiff
path: root/easynav-simple-localizer.spec
blob: c7bbd62cbe9ef952506fd0ac3c94fd23cc0d5fcd (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
# 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

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)。
# 实测归档根目录名为 easynav_plugins-0.5.0(tar 内首项已确认),故 autosetup -n 取
# easynav_plugins-<版本>,不随包名联动改写(spec-rules-ros.md §2 Source0 归档解压目录名)。
Source0:    https://github.com/EasyNavigation/easynav_plugins/archive/refs/tags/0.5.0.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>easynav_common</depend>、<depend>easynav_core</depend>、
# <depend>easynav_localizer</depend>、<depend>easynav_sensors</depend>、
# <depend>easynav_simple_common</depend>——这五个是 EasyNavigation 基座框架包(独立
# EasyNavigation 基座仓,非 rosdistro 发布包、非 SIG 源、非本批 6 个 simple 插件兄弟)。
# ros-projects.list 与 ros-upstream.list 两级均查不到(已实证),按 §6 反幻觉铁律
# "查不到就留空让构建失败诊断循环兜底,不得编造"——此处不写 ros-humble-easynav-*
# BuildRequires(写成必被 verify_ros_spec_deps.py 判为幻觉名打回;ros_dep_guard 明确
# "不得注册递归构建清单外的 ROS 包源码")。构建将在 find_package(easynav_common REQUIRED)
# 处诚实失败,由 lead 从基座仓补引并扩展清单后补 BR——此非"静默丢弃以骗过构建":
# 依赖确属 find_package REQUIRED + 链接目标,缺口如实暴露。
# <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
# 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:归档根目录 easynav_plugins-0.5.0 已实测确认(tar 内首项);-n 不随包名联动改写
%autosetup -n easynav_plugins-%{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 宏的位置参数坑
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).