summaryrefslogtreecommitdiff
path: root/nebula-continental.spec
blob: 5e8ebbde725999d4b8f6f0a21d24792fcb0ba442 (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
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
# spec for ros-humble-nebula-continental
# 源自 tier4/nebula monorepo(commit 8be1ed77),仅构建其中的 nebula_continental colcon 子包
# 严格遵循 /app/.claude/skills/build-rpm/spec-rules-ros.md

%define ros_distro humble
%define RosPkgName nebula-continental
# monorepo main 分支快照(无 tag),记录实际 commit 保证产物可追溯(§2)
%define src_version 1.3.1-1
%global commit 8be1ed775b02985eadafe39b00e0e4fc944114e2

Name:           ros-%{ros_distro}-%{RosPkgName}
Version:        1.3.1
Release:        1%{?dist}
Summary:        Nebula Continental ROS Wrapper
# package.xml 声明 "Apache 2",规范为 SPDX 标识
License:        Apache-2.0
URL:            https://github.com/tier4/nebula
# Source0 用本地重打包 tarball(与同级兄弟包 nebula-hesai-decoders 等一致),
# 由 submit 流程从 sources/nebula-continental/ 以 src_version 命名重打生成,
# 解压根目录为 RosPkgName-src_version。勿用 GitHub archive 原 URL:其文件名
# 按 commit 命名但内容已被重打包为版本目录,文件名与目录名错配致 prep 失败
Source0:        %{RosPkgName}-%{src_version}.tar.gz

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

BuildRequires:  cmake
BuildRequires:  gcc-c++
BuildRequires:  make

# 构建工具(package.xml <buildtool_depend>)
# ament_cmake 形态构建工具
BuildRequires:  ros-%{ros_distro}-ament-cmake
# 提供 autoware_package() 宏(ros-upstream.list,SIG 未移植但 rosdistro 真实存在)
BuildRequires:  ros-%{ros_distro}-autoware-cmake
BuildRequires:  ros-%{ros_distro}-ros-environment
BuildRequires:  ros-%{ros_distro}-ros-testing

# package.xml <depend> —— ROS humble 标准包(ros-projects.list,SIG 已移植)
BuildRequires:  ros-%{ros_distro}-diagnostic-msgs
BuildRequires:  ros-%{ros_distro}-diagnostic-updater
BuildRequires:  ros-%{ros_distro}-geometry-msgs
BuildRequires:  ros-%{ros_distro}-message-filters
BuildRequires:  ros-%{ros_distro}-radar-msgs
BuildRequires:  ros-%{ros_distro}-rclcpp
BuildRequires:  ros-%{ros_distro}-rclcpp-components
BuildRequires:  ros-%{ros_distro}-sensor-msgs
BuildRequires:  ros-%{ros_distro}-tf2-ros
BuildRequires:  ros-%{ros_distro}-visualization-msgs

# package.xml <depend> —— autoware / tier4 外部包(ros-upstream.list,rosdistro 真实存在)
BuildRequires:  ros-%{ros_distro}-autoware-sensing-msgs
BuildRequires:  ros-%{ros_distro}-sync-tooling-msgs

# package.xml <depend> —— nebula monorepo 兄弟子包(batch reused,COPR project / additional_repos 同源解析)
# nebula_core_ros 提供 nebula_agnocast_wrapper_register_node cmake 宏
# 注:nebula_continental_hw_interfaces 不再 BuildRequire reuse 兄弟包——该包
# (ROS-humble-3 build 112448) 的 Requires 错误用了下划线 ros-humble-nebula_msgs,
# 拉入 eulermaker 旧版 1.1.1-4,与 COPR 连字符 1.2.0-1 文件冲突(build 113809
# Transaction test error)。改为从 monorepo 源码同包构建,见构建阶段。
BuildRequires:  ros-%{ros_distro}-continental-msgs
BuildRequires:  ros-%{ros_distro}-continental-srvs
BuildRequires:  ros-%{ros_distro}-nebula-continental-common
BuildRequires:  ros-%{ros_distro}-nebula-continental-decoders
BuildRequires:  ros-%{ros_distro}-nebula-core-common
BuildRequires:  ros-%{ros_distro}-nebula-core-hw-interfaces
BuildRequires:  ros-%{ros_distro}-nebula-core-ros
BuildRequires:  ros-%{ros_distro}-nebula-msgs

# 系统库(package.xml <depend>yaml-cpp</depend>,openEuler 名 yaml-cpp-devel,dnf 实证存在)
BuildRequires:  yaml-cpp-devel

# 注:agnocast_components 为条件依赖(package.xml condition="$ENABLE_AGNOCAST == 1",
# CMakeLists 同样以 if("$ENV{ENABLE_AGNOCAST}") 守卫),默认未启用故不写 BuildRequires。

# 运行时 Requires(ROS 特有三件套,§6:/opt/ros 被 __requires_exclude_from 豁免,autodeps 扫不到)
Requires:       ros-%{ros_distro}-ros-workspace
Requires:       ros-%{ros_distro}-ament-cmake

# package.xml <depend> 的运行时部分
Requires:       ros-%{ros_distro}-autoware-sensing-msgs
Requires:       ros-%{ros_distro}-continental-msgs
Requires:       ros-%{ros_distro}-continental-srvs
Requires:       ros-%{ros_distro}-diagnostic-msgs
Requires:       ros-%{ros_distro}-diagnostic-updater
Requires:       ros-%{ros_distro}-geometry-msgs
Requires:       ros-%{ros_distro}-message-filters
Requires:       ros-%{ros_distro}-nebula-continental-common
Requires:       ros-%{ros_distro}-nebula-continental-decoders
Requires:       ros-%{ros_distro}-nebula-core-common
Requires:       ros-%{ros_distro}-nebula-core-ros
Requires:       ros-%{ros_distro}-nebula-msgs
Requires:       ros-%{ros_distro}-radar-msgs
Requires:       ros-%{ros_distro}-rclcpp
Requires:       ros-%{ros_distro}-rclcpp-components
Requires:       ros-%{ros_distro}-sensor-msgs
Requires:       ros-%{ros_distro}-sync-tooling-msgs
Requires:       ros-%{ros_distro}-tf2-ros
Requires:       ros-%{ros_distro}-visualization-msgs

# 单包策略(§7):ROS 包严禁拆实体子包,用虚拟别名兼容依赖方
Provides:       %{name}-devel = %{version}-%{release}
Provides:       %{name}-doc = %{version}-%{release}
Provides:       %{name}-runtime = %{version}-%{release}
# hw_interfaces 从源码同包构建(见构建阶段),虚拟别名满足依赖方解析
Provides:       ros-%{ros_distro}-nebula-continental-hw-interfaces = %{version}-%{release}

%description
Nebula Continental ROS Wrapper —— Nebula 多雷达驱动框架中面向 Continental
ARS548 / SRR520 雷达的 ROS 2 封装节点,提供雷达数据解码、硬件接口与 ROS 组件
化封装(rclcpp_components)。基于 ament_cmake 构建,产物安装至
/opt/ros/%{ros_distro} 前缀。

本包源自 tier4/nebula monorepo(commit 8be1ed77),仅构建其中的
nebula_continental colcon 子包;monorepo 其余 colcon 包由各自独立 RPM 提供。

%prep
# 解压根目录为 RosPkgName-src_version(与 Source0 本地重打包 tarball 一致),
# -n 同名匹配。build 113815/113816 实踩:-n 取 commit(纯 SHA 或 nebula-commit)
# 均失败——GitHub archive 原 URL 文件名按 commit 命名、内容却被重打包为版本目录,
# 文件名与目录名错配;改用本地重打包 tarball 后 -n 取版本目录名
# 注:RPM 4.18 会对注释内的命令宏字面量做展开——注释与 changelog 中一律用纯
# 文字描述,不得出现裸 autosetup/setup/patch 等命令宏字面量(build 113816 即踩此坑)
%autosetup -n %{RosPkgName}-%{src_version}

%build
# ROS 基座环境(§4:setup.sh 可能不存在,用 [ -f ] 守卫)
[ -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}

# hw_interfaces 暂存目录:build 113817 直接 make install(无 DESTDIR)写 /opt/ros
# 系统路径 Permission denied。改用 DESTDIR 暂存——ament_cmake 的 Targets.cmake 用
# get_filename_component 基于自身位置解析导入路径(非硬编码 CMAKE_INSTALL_PREFIX),
# DESTDIR 暂存后路径仍自洽,find_package 能正确指向暂存区文件
export HW_STAGING=%{_builddir}/hw_staging
mkdir -p "$HW_STAGING"

# 1. 先构建 nebula_continental_hw_interfaces(从源码同包构建,避开 reuse 兄弟包
#    ros-humble-nebula_msgs 下划线命名冲突——该兄弟包 Requires 用了
#    ros-humble-nebula_msgs 下划线名,拉入 eulermaker 旧版 1.1.1-4,与 COPR
#    连字符 1.2.0-1 文件冲突)
cd src/nebula_continental/nebula_continental_hw_interfaces
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 %{?_smp_mflags}
# 安装到暂存区(DESTDIR),不直接写 /opt/ros 系统路径(build 113817 Permission denied)
make install DESTDIR="$HW_STAGING"

# 2. 重新 source ROS 环境,将暂存区前缀纳入搜索路径
source /opt/ros/%{ros_distro}/setup.sh || true
# find_package 走 CMAKE_PREFIX_PATH,ament 资源索引走 AMENT_PREFIX_PATH;
# cmake -D 中分号是列表分隔符,env 中冒号是 Unix 路径分隔符
export AMENT_PREFIX_PATH="$HW_STAGING/opt/ros/%{ros_distro}${AMENT_PREFIX_PATH:+:$AMENT_PREFIX_PATH}"
export CMAKE_PREFIX_PATH="$HW_STAGING/opt/ros/%{ros_distro}${CMAKE_PREFIX_PATH:+:$CMAKE_PREFIX_PATH}"

# 3. 构建 nebula_continental(依赖上一步暂存安装的 hw_interfaces)
cd ../../nebula_continental
mkdir -p .obj
cd .obj
%cmake3 \
  -DCMAKE_INSTALL_PREFIX="/opt/ros/%{ros_distro}" \
  -DAMENT_PREFIX_PATH="$HW_STAGING/opt/ros/%{ros_distro};/opt/ros/%{ros_distro}" \
  -DCMAKE_PREFIX_PATH="$HW_STAGING/opt/ros/%{ros_distro};/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 %{?_smp_mflags}

%install
# 安装 hw_interfaces 到 buildroot
cd src/nebula_continental/nebula_continental_hw_interfaces/.obj
make install DESTDIR=%{buildroot}
# 安装 nebula_continental 到 buildroot
cd ../../nebula_continental/.obj
make install DESTDIR=%{buildroot}

# 文件清单整树拥有(§7:单包策略,ros_distro 前缀一行收尾,对「装了没打包」类错误免疫)
%files
/opt/ros/%{ros_distro}

%changelog
* Wed Oct 21 2026 AI Importer <ai-importer@openeuler.org> - 1.3.1-1
- 修复 build 113817 build 阶段 make install Permission denied:build 113816
  为让后续 nebula_continental 的 find_package 能发现 hw_interfaces,在 build
  阶段直接 make install(无 DESTDIR)写 /opt/ros/humble/lib 系统路径,mock
  构建用户无写权限致 Permission denied。改用 DESTDIR 暂存:hw_interfaces 先装到
  build 目录下暂存区,再将暂存区前缀加入 CMAKE_PREFIX_PATH / AMENT_PREFIX_PATH
  让主构建 find_package 能发现;ament_cmake 的 Targets.cmake 用
  get_filename_component 基于自身位置解析导入路径(非硬编码安装前缀),DESTDIR
  暂存后路径仍自洽。install 阶段两个子包各自 make install DESTDIR=buildroot
  装入最终路径,不受暂存区影响
- 修复 build 113816 prep 阶段 cd 失败(双根因):
  (1) 上一轮在 prep 段注释里写了 autosetup 等命令宏字面量,RPM 4.18 即便在注释内
  也会展开 autosetup 宏,生成 cd 纯commit+中文括号的 setup 块先于真正命令执行而失败;
  注释与 changelog 中一律改用纯文字描述,不得出现裸命令宏字面量
  (2) 更深层根因:Source0 原用 GitHub archive URL(文件名按 commit 命名),但 build
  环境中该文件已被重打包、解压根目录实为版本目录 RosPkgName-src_version,文件名与
  目录名错配——故 -n 无论取纯 commit 还是 nebula-commit 均失败。改对齐同级兄弟包
  约定:Source0 与 -n 均用 RosPkgName-src_version(本地重打包 tarball,由 submit 流程
  以 src_version 命名重打生成,解压根目录与之同名)
- 修复 build 113815 prep 阶段 cd 失败(本轮纠正诊断):上一轮误判 archive 解压根
  目录为 nebula-<full-sha>,实则重打包 tarball 根目录为版本目录;-n 取 commit 必败
- 修复 build 113809 事务冲突:reuse 兄弟包 ros-humble-nebula-continental-hw-interfaces
  (ROS-humble-3 build 112448) 的 Requires 错用下划线 ros-humble-nebula_msgs,
  拉入 eulermaker 旧版 1.1.1-4 与 COPR 连字符 1.2.0-1 文件冲突
- 改为从 monorepo 源码同包构建 nebula_continental_hw_interfaces,移除对该兄弟
  包的 BuildRequires/Requires,加 Provides 虚拟别名满足依赖方
- 新增 BuildRequires: ros-humble-nebula-core-hw-interfaces(hw_interfaces 的
  ament 依赖,该包 Requires 干净无下划线命名问题)
- 初始引入 ros-humble-nebula-continental(nebula_continental colcon 子包)
- 源自 tier4/nebula monorepo,commit 8be1ed775b02985eadafe39b00e0e4fc944114e2
- ament_cmake 形态,构建至 /opt/ros/humble 前缀