blob: 71824e38a0a06be36fed5888ec4a97ed15892ba5 (
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
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
|
# ROS spec:nebula_continental(ament_cmake 形态,monorepo 多包内嵌构建)
# 上游:https://github.com/tier4/nebula(branch main)
# 构建类型:ament_cmake,使用 autoware_cmake 宏 + out-of-source CMake
# 依赖模型:标准 ROS 消息包 + autoware/nebula 内部包 + yaml-cpp 系统库
#
# 多包内嵌构建说明:tier4/nebula 是 monorepo,nebula_continental 编译时
# 链接同仓 sibling 包(nebula_continental_common/decoders/hw_interfaces、
# nebula_core_ros、nebula_core_hw_interfaces)。这些包在 EUR(additional_repos)
# 中使用下划线命名(ros-humble-nebula_continental_common 而非连字符),
# 依赖预检按连字符名查询无 provider;COPR 批量构建的同名包亦全部失败
# (build 113348/113349/113350 均 failed)。改用同源内嵌构建:在 %build 中
# 按依赖拓扑序逐个 cmake && make install DESTDIR,后续包通过 CMAKE_PREFIX_PATH
# 含 buildroot 前缀发现已装 sibling。Provides 声明虚拟别名满足下游。
%define ros_distro humble
%define RosPkgName nebula-continental
# src_version 保留完整 target_version(1.2.0-1):tarball 命名与内部目录名
# 必须与 Source0 文件名 / autosetup -n 一致,version 仅含 1.2.0 会缺 -1
%define src_version 1.2.0-1
Name: ros-%{ros_distro}-%{RosPkgName}
Version: 1.2.0
Release: 3%{?dist}
Summary: Nebula Continental ROS Wrapper
License: Apache-2.0
URL: https://github.com/tier4/nebula
# GitHub branch main 归档;URL 后缀 #/ 强制 rpm 内部文件名,
# 必须用 src_version(1.2.0-1)而非 version(1.2.0):
# _ensure_tarball 按 gate_result.version(1.2.0-1)重打 tarball,
# 内部目录名为 nebula-continental-1.2.0-1,autosetup -n 须与之匹配
Source0: https://github.com/tier4/nebula/archive/refs/heads/main.tar.gz#/nebula-continental-%{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 =====
# 系统构建工具与库
BuildRequires: cmake
BuildRequires: gcc-c++
BuildRequires: boost-devel
BuildRequires: yaml-cpp-devel
# nebula_core_common(外部依赖 ros-humble-nebula-core-common)的 CMake config
# 通过 ament_cmake_export_dependencies 传递依赖 find_package(nlohmann_json),
# 构建环境需安装 nlohmann-json-devel 提供 nlohmann_jsonConfig.cmake
# (pkg.remap: nlohmann-json-dev -> nlohmann-json-devel;sibling 包
# nebula-core-ros build 113357 同因,加 nlohmann-json-devel 后已 build_done)
BuildRequires: nlohmann-json-devel
# 构建基座(ament_cmake 形态强制)
BuildRequires: ros-%{ros_distro}-ament-cmake
# buildtool_depend(package.xml)
BuildRequires: ros-%{ros_distro}-autoware-cmake
BuildRequires: ros-%{ros_distro}-ros-environment
BuildRequires: ros-%{ros_distro}-ros-testing
# depend(package.xml,条件依赖 agnocast_components 默认不启用故省略)
# 内嵌构建的 sibling 包不写 BuildRequires(同源 %build 编译安装):
# nebula_continental_common / nebula_continental_decoders /
# nebula_continental_hw_interfaces / nebula_core_ros /
# nebula_core_hw_interfaces(nebula_continental_hw_interfaces 的传递依赖)
BuildRequires: ros-%{ros_distro}-autoware-sensing-msgs
BuildRequires: ros-%{ros_distro}-continental-msgs
BuildRequires: ros-%{ros_distro}-continental-srvs
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}-nebula-core-common
BuildRequires: ros-%{ros_distro}-nebula-msgs
BuildRequires: ros-%{ros_distro}-radar-msgs
BuildRequires: ros-%{ros_distro}-rclcpp
BuildRequires: ros-%{ros_distro}-rclcpp-components
BuildRequires: ros-%{ros_distro}-rosbag2-storage
BuildRequires: ros-%{ros_distro}-sensor-msgs
BuildRequires: ros-%{ros_distro}-sync-tooling-msgs
BuildRequires: ros-%{ros_distro}-tf2-ros
BuildRequires: ros-%{ros_distro}-visualization-msgs
# ===== Requires(运行时;/opt/ros 被 autodeps 豁免,必须手写)=====
# 强制基座(§6 运行时 Requires 三件套)
Requires: ros-%{ros_distro}-ros-workspace
Requires: ros-%{ros_distro}-ament-cmake
# package.xml <depend> 的运行时部分(exec 依赖)
# 内嵌构建的 sibling 包不写 Requires(文件已在本包 %files 中)
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-core-common
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
Requires: yaml-cpp
Requires: nlohmann-json-devel
# 单包策略:虚拟别名兼容依赖方,禁止拆实体子包(路径重叠致安装事务冲突)
Provides: %{name}-devel = %{version}-%{release}
Provides: %{name}-doc = %{version}-%{release}
Provides: %{name}-runtime = %{version}-%{release}
# 内嵌构建的 sibling 包虚拟别名(满足下游 Requires 与 CI 可安装性检查)
Provides: ros-%{ros_distro}-nebula-continental-common = %{version}-%{release}
Provides: ros-%{ros_distro}-nebula-continental-decoders = %{version}-%{release}
Provides: ros-%{ros_distro}-nebula-continental-hw-interfaces = %{version}-%{release}
Provides: ros-%{ros_distro}-nebula-core-ros = %{version}-%{release}
Provides: ros-%{ros_distro}-nebula-core-hw-interfaces = %{version}-%{release}
%description
Nebula Continental ROS Wrapper — Continental ARS548 / SRR520 雷达 ROS 封装,
提供解码器封装、硬件接口封装与 ROS 节点组件。属于 TIER IV Nebula
多雷达驱动框架的 Continental 分支,构建进 /opt/ros/humble 前缀。
本包内嵌构建同仓 sibling 包(nebula_continental_common/decoders/hw_interfaces、
nebula_core_ros、nebula_core_hw_interfaces),因 EUR 命名约定(下划线)
与 COPR 批量构建均不可用,改由同源 monorepo 编译安装。
%prep
%autosetup -n nebula-continental-%{src_version} -p1
%build
# ROS 基座环境(chroot 已配置 ROS SIG repo;无 ROS 依赖的包 buildroot 里
# 可能没有 setup.sh,必须用 [ -f ] 守卫——直接 source 不存在的文件在
# 严格 sh 下会中止整个 %build 脚本,|| true 挡不住)
[ -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}
# staged install prefix:sibling 包 make install DESTDIR=%{buildroot} 后,
# 后续包通过 CMAKE_PREFIX_PATH / AMENT_PREFIX_PATH 含 %{buildroot}/opt/ros 发现
_STAGED="%{buildroot}/opt/ros/%{ros_distro}"
export AMENT_PREFIX_PATH="${_STAGED}:/opt/ros/%{ros_distro}${AMENT_PREFIX_PATH:+:$AMENT_PREFIX_PATH}"
export PKG_CONFIG_PATH="${_STAGED}/lib/pkgconfig:${PKG_CONFIG_PATH}"
# monorepo 多包内嵌构建:按依赖拓扑序逐个 cmake + build + install
# 拓扑序:common → hw_interfaces → decoders → hw_interfaces(continental) → core_ros → continental
# 1. nebula_continental_common(header-only INTERFACE,依赖 nebula_core_common)
mkdir -p src/nebula_continental/nebula_continental_common/.obj
cd src/nebula_continental/nebula_continental_common/.obj
%cmake3 .. \
-DCMAKE_INSTALL_PREFIX="/opt/ros/%{ros_distro}" \
-DAMENT_PREFIX_PATH="/opt/ros/%{ros_distro};${_STAGED}" \
-DCMAKE_PREFIX_PATH="/opt/ros/%{ros_distro};${_STAGED}" \
-UINCLUDE_INSTALL_DIR -ULIB_INSTALL_DIR -USYSCONF_INSTALL_DIR -USHARE_INSTALL_PREFIX -ULIB_SUFFIX \
-DSETUPTOOLS_DEB_LAYOUT=OFF \
-DBUILD_TESTING=OFF
%cmake_build
make install DESTDIR=%{buildroot}
cd - >/dev/null
# 2. nebula_core_hw_interfaces(header-only INTERFACE,依赖 nebula_core_common)
mkdir -p src/nebula_core/nebula_core_hw_interfaces/.obj
cd src/nebula_core/nebula_core_hw_interfaces/.obj
%cmake3 .. \
-DCMAKE_INSTALL_PREFIX="/opt/ros/%{ros_distro}" \
-DAMENT_PREFIX_PATH="/opt/ros/%{ros_distro};${_STAGED}" \
-DCMAKE_PREFIX_PATH="/opt/ros/%{ros_distro};${_STAGED}" \
-UINCLUDE_INSTALL_DIR -ULIB_INSTALL_DIR -USYSCONF_INSTALL_DIR -USHARE_INSTALL_PREFIX -ULIB_SUFFIX \
-DSETUPTOOLS_DEB_LAYOUT=OFF \
-DBUILD_TESTING=OFF
%cmake_build
make install DESTDIR=%{buildroot}
cd - >/dev/null
# 3. nebula_continental_decoders(SHARED lib,依赖 #1 nebula_continental_common)
mkdir -p src/nebula_continental/nebula_continental_decoders/.obj
cd src/nebula_continental/nebula_continental_decoders/.obj
%cmake3 .. \
-DCMAKE_INSTALL_PREFIX="/opt/ros/%{ros_distro}" \
-DAMENT_PREFIX_PATH="/opt/ros/%{ros_distro};${_STAGED}" \
-DCMAKE_PREFIX_PATH="/opt/ros/%{ros_distro};${_STAGED}" \
-UINCLUDE_INSTALL_DIR -ULIB_INSTALL_DIR -USYSCONF_INSTALL_DIR -USHARE_INSTALL_PREFIX -ULIB_SUFFIX \
-DSETUPTOOLS_DEB_LAYOUT=OFF \
-DBUILD_TESTING=OFF
%cmake_build
make install DESTDIR=%{buildroot}
cd - >/dev/null
# 4. nebula_continental_hw_interfaces(SHARED lib,依赖 #1 + #2)
mkdir -p src/nebula_continental/nebula_continental_hw_interfaces/.obj
cd src/nebula_continental/nebula_continental_hw_interfaces/.obj
%cmake3 .. \
-DCMAKE_INSTALL_PREFIX="/opt/ros/%{ros_distro}" \
-DAMENT_PREFIX_PATH="/opt/ros/%{ros_distro};${_STAGED}" \
-DCMAKE_PREFIX_PATH="/opt/ros/%{ros_distro};${_STAGED}" \
-UINCLUDE_INSTALL_DIR -ULIB_INSTALL_DIR -USYSCONF_INSTALL_DIR -USHARE_INSTALL_PREFIX -ULIB_SUFFIX \
-DSETUPTOOLS_DEB_LAYOUT=OFF \
-DBUILD_TESTING=OFF
%cmake_build
make install DESTDIR=%{buildroot}
cd - >/dev/null
# 5. nebula_core_ros(SHARED lib,依赖 nebula_core_common + rosbag2_storage)
mkdir -p src/nebula_core/nebula_core_ros/.obj
cd src/nebula_core/nebula_core_ros/.obj
%cmake3 .. \
-DCMAKE_INSTALL_PREFIX="/opt/ros/%{ros_distro}" \
-DAMENT_PREFIX_PATH="/opt/ros/%{ros_distro};${_STAGED}" \
-DCMAKE_PREFIX_PATH="/opt/ros/%{ros_distro};${_STAGED}" \
-UINCLUDE_INSTALL_DIR -ULIB_INSTALL_DIR -USYSCONF_INSTALL_DIR -USHARE_INSTALL_PREFIX -ULIB_SUFFIX \
-DSETUPTOOLS_DEB_LAYOUT=OFF \
-DBUILD_TESTING=OFF
%cmake_build
make install DESTDIR=%{buildroot}
cd - >/dev/null
# 6. nebula_continental(主包,依赖 #1 #3 #4 #5 + 外部 ROS 包)
mkdir -p src/nebula_continental/nebula_continental/.obj
cd src/nebula_continental/nebula_continental/.obj
%cmake3 .. \
-DCMAKE_INSTALL_PREFIX="/opt/ros/%{ros_distro}" \
-DAMENT_PREFIX_PATH="/opt/ros/%{ros_distro};${_STAGED}" \
-DCMAKE_PREFIX_PATH="/opt/ros/%{ros_distro};${_STAGED}" \
-UINCLUDE_INSTALL_DIR -ULIB_INSTALL_DIR -USYSCONF_INSTALL_DIR -USHARE_INSTALL_PREFIX -ULIB_SUFFIX \
-DSETUPTOOLS_DEB_LAYOUT=OFF \
-DBUILD_TESTING=OFF
%cmake_build
%install
# 所有 sibling 包在 %build 阶段已 make install DESTDIR=%{buildroot},
# 仅需安装主包(nebula_continental)的最终产物
cd src/nebula_continental/nebula_continental/.obj
make install DESTDIR=%{buildroot}
%files
%license LICENSE
# 整树拥有(SIG 模板标准做法,对"装了没打包"类错误免疫)
/opt/ros/%{ros_distro}
%changelog
* Thu Oct 08 2026 AI Importer <ai-importer@openeuler.org> - 1.2.0-3
- 修复 prep 失败:autosetup -n 用 version(1.2.0)但 tarball 内部目录
为 nebula-continental-1.2.0-1(_ensure_tarball 按 gate_result.version 重打),
cd 找不到目录;补 define src_version 1.2.0-1,Source0/autosetup 统一用 src_version
* Thu Oct 08 2026 AI Importer <ai-importer@openeuler.org> - 1.2.0-2
- 修复 %build 失败:nebula_core_common CMake 传递依赖 find_package(nlohmann_json)
找不到配置文件(nlohmann_jsonConfig.cmake),补 nlohmann-json-devel 到 BuildRequires/Requires
* Thu Oct 08 2026 ROS SIG <ros-sig@openeuler.org> - 1.2.0-1
- 初始引入 ros-humble-nebula-continental 1.2.0
- 内嵌构建同仓 sibling 包(EUR 下划线命名不匹配 + COPR 构建失败)
|