summaryrefslogtreecommitdiff
path: root/ros-humble-mavros-extras.spec
blob: ccad1149d113b943933d4dc358d9c4759b83ba19 (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
# topdir: ros-humble-mavros-extras-2.16.0 (via --transform)
%define ros_distro humble
%define RosPkgName mavros-extras

Name:       ros-%{ros_distro}-%{RosPkgName}
Version:    2.16.0
Release:    4%{?dist}
Summary:    Extra nodes and plugins for MAVROS

License:    GPLv3 and LGPLv3 and BSD
URL:        https://github.com/mavlink/mavros
Source0:    https://github.com/mavlink/mavros/archive/refs/tags/%{version}.tar.gz#/%{name}-%{version}.tar.gz

# Patch: mavros_msgs 2.14.0 (ROS SIG repo) lacks HilGPS.id/yaw fields added in 2.16.0
Patch0:     hil-gps-id-yaw-compat.patch

# debug subpackage not meaningful (/opt prefix, nonstandard strip paths)
%global debug_package %{nil}
# /opt python bytecode compilation writes standard sitelib paths — strip brp-python-bytecompile
%global __os_install_post %(echo '%{__os_install_post}' | sed -e 's!/usr/lib[^[:space:]]*/brp-python-bytecompile[[:space:]].*$!!g')
# ROS packages: .so under /opt/ros — autodeps disabled, ament indirect-dependency model instead
%global __provides_exclude_from ^/opt/ros/%{ros_distro}/.*$
%global __requires_exclude_from ^/opt/ros/%{ros_distro}/.*$

BuildRequires: make
BuildRequires: cmake
BuildRequires: gcc-c++
BuildRequires: python3-devel
BuildRequires: python3-setuptools

# --- ROS buildtool dependencies (ament_cmake) ---
BuildRequires: ros-%{ros_distro}-ament-cmake
BuildRequires: ros-%{ros_distro}-ament-cmake-python
BuildRequires: ros-%{ros_distro}-eigen3-cmake-module

# --- ROS package dependencies ---
BuildRequires: ros-%{ros_distro}-angles
BuildRequires: ros-%{ros_distro}-diagnostic-msgs
BuildRequires: ros-%{ros_distro}-diagnostic-updater
BuildRequires: ros-%{ros_distro}-eigen-stl-containers
BuildRequires: ros-%{ros_distro}-geographic-msgs
BuildRequires: ros-%{ros_distro}-geometry-msgs
BuildRequires: ros-%{ros_distro}-libmavconn
BuildRequires: ros-%{ros_distro}-mavlink
BuildRequires: ros-%{ros_distro}-mavros
BuildRequires: ros-%{ros_distro}-mavros-msgs
BuildRequires: ros-%{ros_distro}-message-filters
BuildRequires: ros-%{ros_distro}-nav-msgs
BuildRequires: ros-%{ros_distro}-pluginlib
BuildRequires: ros-%{ros_distro}-rclcpp
BuildRequires: ros-%{ros_distro}-rclcpp-components
BuildRequires: ros-%{ros_distro}-rcpputils
BuildRequires: ros-%{ros_distro}-rosidl-default-runtime
BuildRequires: ros-%{ros_distro}-sensor-msgs
BuildRequires: ros-%{ros_distro}-std-msgs
BuildRequires: ros-%{ros_distro}-std-srvs
BuildRequires: ros-%{ros_distro}-tf2-eigen
BuildRequires: ros-%{ros_distro}-tf2-ros
BuildRequires: ros-%{ros_distro}-trajectory-msgs
BuildRequires: ros-%{ros_distro}-urdf
BuildRequires: ros-%{ros_distro}-visualization-msgs
BuildRequires: ros-%{ros_distro}-yaml-cpp-vendor

# --- System (non-ROS) build dependencies ---
BuildRequires: eigen3-devel
BuildRequires: yaml-cpp-devel
# geographiclib-devel pulls in official geographiclib (provides /usr/bin/GeoConvert
# etc. + FindGeographicLib.cmake + headers); do NOT add separate geographiclib-tools —
# the in-session built geographiclib-tools-2.7.0 ships the same /usr/bin/* and causes
# a file-conflict transaction-test failure.
BuildRequires: geographiclib-devel
BuildRequires: python3-click

# --- Runtime requires (ROS-specific, autodeps disabled) ---
Requires: ros-%{ros_distro}-ros-workspace
Requires: ros-%{ros_distro}-ament-cmake
Requires: ros-%{ros_distro}-rclcpp
Requires: ros-%{ros_distro}-rclcpp-components
Requires: ros-%{ros_distro}-mavros
Requires: ros-%{ros_distro}-libmavconn
Requires: ros-%{ros_distro}-mavros-msgs
Requires: ros-%{ros_distro}-mavlink
Requires: ros-%{ros_distro}-pluginlib
Requires: ros-%{ros_distro}-tf2-ros
Requires: ros-%{ros_distro}-tf2-eigen
Requires: ros-%{ros_distro}-diagnostic-updater
Requires: ros-%{ros_distro}-message-filters
Requires: ros-%{ros_distro}-rcpputils
Requires: ros-%{ros_distro}-urdf
Requires: ros-%{ros_distro}-yaml-cpp-vendor
Requires: ros-%{ros_distro}-rclpy
Requires: ros-%{ros_distro}-rosidl-default-runtime
Requires: ros-%{ros_distro}-diagnostic-msgs
Requires: ros-%{ros_distro}-geographic-msgs
Requires: ros-%{ros_distro}-geometry-msgs
Requires: ros-%{ros_distro}-nav-msgs
Requires: ros-%{ros_distro}-sensor-msgs
Requires: ros-%{ros_distro}-std-msgs
Requires: ros-%{ros_distro}-std-srvs
Requires: ros-%{ros_distro}-trajectory-msgs
Requires: ros-%{ros_distro}-visualization-msgs
Requires: ros-%{ros_distro}-angles
Requires: ros-%{ros_distro}-eigen-stl-containers
Requires: ros-%{ros_distro}-eigen3-cmake-module
Requires: python3-click

# Virtual provides for compatibility
Provides: %{name}-devel = %{version}-%{release}
Provides: %{name}-doc = %{version}-%{release}
Provides: %{name}-runtime = %{version}-%{release}

%description
Extra nodes and plugins for MAVROS (MAVLink to ROS bridge).
This package provides additional MAVLink plugins (ADS-B, GPS RTK, camera,
distance sensor, obstacle distance, terrain, vision pose, etc.) and the
terrain tile server.

%prep
%autosetup -n %{name}-%{version}

%build
# The source tarball contains the whole mavros repo (multi-package layout).
# We build only the mavros_extras sub-package.
cd mavros_extras

# ROS bootstrap environment (chroot has ROS SIG repo; guard against missing setup.sh)
[ -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}

# Explicit out-of-source build (openEuler %%cmake macro positional-arg pitfall)
mkdir -p .obj && cd .obj
cmake .. \
  -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 \
  -DCMAKE_CXX_STANDARD=20
%make_build

%install
cd mavros_extras/.obj
%make_install DESTDIR=%{buildroot}

%files
/opt/ros/%{ros_distro}

%changelog
* Mon Oct 12 2026 AI Importer <ai-importer@openeuler.org> - 2.16.0-4
- Add Patch0 (hil-gps-id-yaw-compat.patch): comment out gps.id/gps.yaw
  assignments in hil.cpp that reference HilGPS fields added in mavros 2.16.0.
  The ROS SIG repo ships mavros_msgs 2.14.0 which lacks these fields, causing
  "has no member named 'id'/'yaw'" compile errors at hil.cpp:243-244.
  The MAVLink HIL_GPS message still has id/yaw (defaults to 0).

* Mon Oct 12 2026 AI Importer <ai-importer@openeuler.org> - 2.16.0-3
- Escape %%cmake token in a %%build comment: rpm expands %%macros even
  inside comments, so the openEuler %%cmake macro's multi-line body (which
  includes %%set_build_flags + a (...) subshell) leaked out of the comment
  and was executed as build commands, causing "syntax error near
  unexpected token )'" at line 61 of the build script. Replaced with
  %%cmake (literal %%cmake) so the comment stays a comment.

* Mon Oct 12 2026 AI Importer <ai-importer@openeuler.org> - 2.16.0-2
- Drop BuildRequires: geographiclib-tools: it duplicates /usr/bin/* tools
  already provided by official geographiclib (pulled by geographiclib-devel),
  causing a dnf transaction-test file conflict.

* Mon Oct 12 2026 AI Importer <ai-importer@openeuler.org> - 2.16.0-1
- Initial package for openEuler (ROS 2 humble)
- Built from upstream mavros repo, mavros_extras sub-package