blob: be3a357fbffa5a0d74be566a31bfecbbfb9e3d7c (
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
|
%define ros_distro humble
%define RosPkgName nebula-hesai-decoders
%define src_version 1.3.1-1
# monorepo main 分支快照(无 tag),记录实际 commit 保证产物可追溯(§2)
%global commit 8be1ed775b02985eadafe39b00e0e4fc944114e2
Name: ros-%{ros_distro}-%{RosPkgName}
Version: 1.3.1
Release: 1%{?dist}
Summary: Nebula Hesai Decoders Library
# package.xml 声明 "Apache 2",规范为 SPDX 标识
License: Apache-2.0
URL: https://github.com/tier4/nebula
Source0: %{RosPkgName}-%{src_version}.tar.gz
# png++ 是 libpng 的 header-only C++ 封装,openEuler 官方源无此包;
# 已安装的 nebula-core-decoders 头文件 downsample_mask.hpp 传递依赖 png++,
# 本包编译需其头文件,随 SRPM 携带源码 vendor(依赖可用性预检无 provider)
Source1: pngpp-0.2.10.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
# ament_cmake 形态构建工具(§6:build_type=ament_cmake,构建工具依赖 ros-humble-ament-cmake)
BuildRequires: ros-%{ros_distro}-ament-cmake
# 提供 autoware_package() 宏(ros-upstream.list,SIG 未移植但 rosdistro 真实存在)
BuildRequires: ros-%{ros_distro}-autoware-cmake
# buildtool_depend ros_environment(ros-projects.list,SIG 已移植)
BuildRequires: ros-%{ros_distro}-ros-environment
# package.xml <depend> —— ROS humble 标准包(ros-projects.list,SIG 已移植)
BuildRequires: ros-%{ros_distro}-rclcpp
# package.xml <depend> —— nebula monorepo 兄弟子包(ros-upstream.list,batch reused,COPR project 同源解析)
BuildRequires: ros-%{ros_distro}-nebula-core-common
BuildRequires: ros-%{ros_distro}-nebula-core-decoders
BuildRequires: ros-%{ros_distro}-nebula-hesai-common
# 系统库(package.xml <depend>boost</depend>,pkg.remap 映射 boost→boost-devel,CMakeLists 链接 Boost::headers 为 header-only)
BuildRequires: boost-devel
# libpng C 库:png++ 头文件链(image.hpp→png.hpp→<png.h>)依赖 png.h,
# nebula-core-decoders 的 ament export 传递 PNG::PNG,chroot 须有 libpng-devel 提供 png.h 与 -lpng
BuildRequires: libpng-devel
# 运行时 Requires(§6 三件套:/opt/ros 被 __requires_exclude_from 豁免,autodeps 扫不到)
Requires: ros-%{ros_distro}-ros-workspace
Requires: ros-%{ros_distro}-ament-cmake
# package.xml <depend> 的运行时部分(ROS 包提供 /opt/ros 下 .so,运行时须显式声明)
Requires: ros-%{ros_distro}-rclcpp
Requires: ros-%{ros_distro}-nebula-core-common
Requires: ros-%{ros_distro}-nebula-core-decoders
Requires: ros-%{ros_distro}-nebula-hesai-common
# 单包策略(§7):ROS 包严禁拆实体子包,主包 %files 整树拥有,虚拟别名兼容依赖方
Provides: %{name}-devel = %{version}-%{release}
Provides: %{name}-doc = %{version}-%{release}
Provides: %{name}-runtime = %{version}-%{release}
%description
Nebula Hesai Decoders Library —— Nebula 多 LiDAR 驱动框架中面向 Hesai
激光雷达的解码库,提供 Hesai Pandar 系列点云数据的解码与处理。基于
ament_cmake 构建(autoware_cmake 封装),产物安装至 /opt/ros/%{ros_distro}
前缀。本包源自 tier4/nebula monorepo(commit 8be1ed77),仅构建其中的
nebula_hesai_decoders colcon 子包;monorepo 其余 colcon 包由各自独立 RPM 提供。
%prep
# -a1:额外解压 Source1(png++ vendor 源码)到 Source0 目录
%autosetup -n %{RosPkgName}-%{src_version} -a1
# 上游 bug 修补:已装 sibling 包 nebula-core-decoders 的头文件 downsample_mask.hpp
# 误用 Eigen::MatrixX<uint8_t>,但 Eigen 并无 MatrixX 模板(仅有 MatrixXf/MatrixXi
# 等具体 typedef),编译报 'MatrixX' does not name a template type。该头文件 header-only,
# sibling 包自身构建未实例化故未暴露;本包 hesai_decoder.hpp:18 包含它,且
# hesai_decoder.hpp:93 用 std::optional<DownsampleMaskFilter> 触发完整类型实例化才报错。
# mockbuild 无权改写 /opt/ros/humble/include 下已装头文件,故建影子 include 目录放
# sed 修补副本,经 CXXFLAGS -I 优先于 -isystem /opt/ros/humble/include 命中本修补版。
mkdir -p %{_builddir}/patch-include/nebula_core_decoders/point_filters
cp src/nebula_core/nebula_core_decoders/include/nebula_core_decoders/point_filters/downsample_mask.hpp \
%{_builddir}/patch-include/nebula_core_decoders/point_filters/
# Eigen::MatrixX<uint8_t> → Eigen::Matrix<uint8_t, Dynamic, Dynamic>(动态矩阵标准写法)
sed -i 's/Eigen::MatrixX<uint8_t>/Eigen::Matrix<uint8_t, Eigen::Dynamic, Eigen::Dynamic>/g' \
%{_builddir}/patch-include/nebula_core_decoders/point_filters/downsample_mask.hpp
%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}
# png++ header-only vendor(openEuler 无 png++ 包):装头文件到构建专用 include 根
# _builddir(build 阶段可写,不向 chroot 真实系统路径 /usr/include 写入,
# 规避 mock 只读保护导致的 "install -d /usr/include/png++: No such file or directory" 失败)。
# 通过 CXXFLAGS -I 注入(cmake3 宏经 CXXFLAGS 环境变量初始化 CMAKE_CXX_FLAGS),
# 供本包源文件及已安装的 nebula_core_decoders 头文件 downsample_mask.hpp:24 的
# #include <png++/...> 解析
install -d %{_builddir}/pngpp-include/png++
install -p -m 0644 png++-0.2.10/*.hpp %{_builddir}/pngpp-include/png++/
# patch-include:downsample_mask.hpp 修补影子目录(见 %prep),-I 优先于
# -isystem /opt/ros/humble/include 命中修补版,规避已装 sibling 头文件的 Eigen::MatrixX bug
export CXXFLAGS="%{optflags} -I%{_builddir}/patch-include -I%{_builddir}/pngpp-include"
# monorepo 子包构建:进入目标 colcon 包目录(§5 ament_cmake 显式 out-of-source,规避 openEuler cmake 宏的默认位置参数)
cd src/nebula_hesai/nebula_hesai_decoders
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}
%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}
# png++ vendor 头文件与 license 装入 buildroot(供下游包 include + 合规)
install -d %{buildroot}%{_includedir}/png++
install -p -m 0644 png++-0.2.10/*.hpp %{buildroot}%{_includedir}/png++/
install -d %{buildroot}%{_licensedir}/%{name}-bundled-pngpp/
install -p -m 0644 png++-0.2.10/COPYING %{buildroot}%{_licensedir}/%{name}-bundled-pngpp/COPYING
cd src/nebula_hesai/nebula_hesai_decoders
cd .obj
make install DESTDIR=%{buildroot}
# 文件清单整树拥有(§7:单包策略,ros_distro 前缀一行收尾,对「装了没打包」类错误免疫)
%files
/opt/ros/%{ros_distro}
# png++ vendor 头文件(header-only,模板代码编译进本包 .so;下游 include 本包头文件复用)
%{_includedir}/png++/
%{_licensedir}/%{name}-bundled-pngpp/
%changelog
* Wed Oct 21 2026 ai-importer <ai-importer@openeuler.org> - 1.3.1-1
- 修复 build 阶段(round 4):downsample_mask.hpp 上游误用 Eigen::MatrixX<uint8_t>
(Eigen 无 MatrixX 模板,仅 MatrixXf/MatrixXi 等具体 typedef),sed 改为
Eigen::Matrix<uint8_t, Dynamic, Dynamic>;sibling 包 nebula-core-decoders 的该
header-only 头文件未实例化故自身构建未暴露,本包 hesai_decoder.hpp 经
std::optional<DownsampleMaskFilter> 实例化才触发;mockbuild 无权改写
/opt/ros/humble/include 已装头文件,故建 patch-include 影子目录放修补副本,
经 CXXFLAGS -I 优先于 -isystem /opt/ros/humble/include 命中
* Wed Oct 21 2026 ai-importer <ai-importer@openeuler.org> - 1.3.1-1
- Initial import (ROS batch)
- 源自 tier4/nebula monorepo,commit 8be1ed775b02985eadafe39b00e0e4fc944114e2
- ament_cmake 形态(autoware_cmake 封装),构建至 /opt/ros/humble 前缀
- 修复构建:vendor png++ 0.2.10 header-only 库(openEuler 无 png++ 包),
解决 downsample_mask.hpp #include <png++/error.hpp> 缺失;补 libpng-devel 提供 png.h
- 修复 build 阶段:png++ 头文件改装到构建专用 include 根(_builddir/pngpp-include),
经 CXXFLAGS -I 注入;原 install -d /usr/include/png++ 在 mock chroot 受只读保护
报 No such file or directory,文件安装统一收敛到 install 阶段写 buildroot
|