summaryrefslogtreecommitdiff
path: root/aruco-markers.spec
blob: 88910338c1488996d63cc8f7b6d0091941daea11 (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
%define ros_distro humble
%define RosPkgName aruco-markers
%define src_version 0.0.3-1

Name:           ros-%{ros_distro}-%{RosPkgName}
Version:        0.0.3
Release:        2%{?dist}
Summary:        A ros2 node for detecting aruco markers in camera images
License:        MIT
URL:            https://github.com/namo-robotics/aruco_markers/tree/humble
Source0:        %{RosPkgName}-%{src_version}.tar.gz

%global debug_package %{nil}
%global __os_install_post %(echo '%{__os_install_post}' | sed -e 's!/usr/lib[^[:space:]]*/brp-python-bytecompile[[:space:]].*$!!g')
%global __provides_exclude_from ^/opt/ros/%{ros_distro}/.*$
%global __requires_exclude_from ^/opt/ros/%{ros_distro}/.*$

BuildRequires:  cmake
BuildRequires:  gcc-c++
BuildRequires:  ros-%{ros_distro}-ament-cmake
BuildRequires:  ros-%{ros_distro}-cv-bridge
BuildRequires:  ros-%{ros_distro}-geometry-msgs
BuildRequires:  ros-%{ros_distro}-image-transport
BuildRequires:  ros-%{ros_distro}-sensor-msgs
BuildRequires:  ros-%{ros_distro}-tf2-geometry-msgs
BuildRequires:  ros-%{ros_distro}-tf2-ros
BuildRequires:  ros-%{ros_distro}-aruco-markers-msgs
BuildRequires:  opencv

Requires:       ros-%{ros_distro}-ros-workspace
Requires:       ros-%{ros_distro}-ament-cmake
Requires:       ros-%{ros_distro}-cv-bridge
Requires:       ros-%{ros_distro}-geometry-msgs
Requires:       ros-%{ros_distro}-image-transport
Requires:       ros-%{ros_distro}-sensor-msgs
Requires:       ros-%{ros_distro}-tf2-geometry-msgs
Requires:       ros-%{ros_distro}-tf2-ros
Requires:       ros-%{ros_distro}-aruco-markers-msgs
Requires:       opencv

Provides:       %{name}-devel = %{version}-%{release}
Provides:       %{name}-doc = %{version}-%{release}
Provides:       %{name}-runtime = %{version}-%{release}

%description
A ros2 node for detecting aruco markers in camera images

%prep
%autosetup -n %{RosPkgName}-%{src_version}
# openEuler opencv 4.5.2 lacks the aruco contrib module; bundle from opencv_contrib 4.5.2
sed -i 's/find_package(OpenCV REQUIRED COMPONENTS core imgproc aruco)/find_package(OpenCV REQUIRED COMPONENTS core imgproc)/' aruco_markers/CMakeLists.txt

%build
[ -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}

# Build bundled opencv_contrib aruco module as static library
# openEuler opencv 4.5.2 does not include aruco contrib (headers or library)
ARUCO_DIR=%{_builddir}/%{RosPkgName}-%{src_version}/opencv_contrib_aruco
ARUCO_BUILD=%{_builddir}/aruco_build
ARUCO_INC=%{_builddir}/aruco_include
mkdir -p "$ARUCO_BUILD" "$ARUCO_INC/opencv2/aruco"
cd "$ARUCO_BUILD"
g++ -c -O2 -g -fPIC -std=c++14 \
    -I/usr/include/opencv4 \
    -I"$ARUCO_DIR/include" \
    -I"$ARUCO_DIR/src" \
    "$ARUCO_DIR/src/aruco.cpp" \
    "$ARUCO_DIR/src/dictionary.cpp" \
    "$ARUCO_DIR/src/charuco.cpp" \
    "$ARUCO_DIR/src/apriltag_quad_thresh.cpp" \
    "$ARUCO_DIR/src/zmaxheap.cpp"
ar rcs libaruco_contrib.a *.o
rm -f *.o
cp "$ARUCO_DIR/include/opencv2/aruco.hpp" "$ARUCO_INC/opencv2/"
cp "$ARUCO_DIR/include/opencv2/aruco/"*.hpp "$ARUCO_INC/opencv2/aruco/"

# Patch CMakeLists.txt to use bundled aruco headers and static library
export ARUCO_INC ARUCO_DIR ARUCO_BUILD
cd %{_builddir}/%{RosPkgName}-%{src_version}/aruco_markers
python3 << 'PYEOF'
import os
inc = os.environ["ARUCO_INC"]
src_dir = os.environ["ARUCO_DIR"] + "/src"
lib = os.environ["ARUCO_BUILD"] + "/libaruco_contrib.a"
with open("CMakeLists.txt") as f:
    c = f.read()
c = c.replace(
    "target_link_libraries(aruco_markers_lib ${OpenCV_LIBRARIES})",
    "target_link_libraries(aruco_markers_lib ${OpenCV_LIBRARIES} " + lib + ")\n"
    "target_include_directories(aruco_markers_lib PUBLIC " + inc + " " + src_dir + ")"
)
c = c.replace(
    "target_link_libraries(aruco_markers aruco_markers_lib ${OpenCV_LIBRARIES})",
    "target_link_libraries(aruco_markers aruco_markers_lib ${OpenCV_LIBRARIES} " + lib + ")\n"
    "target_include_directories(aruco_markers PUBLIC " + inc + " " + src_dir + ")"
)
with open("CMakeLists.txt", "w") as f:
    f.write(c)
PYEOF

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}
cd aruco_markers
cd .obj
make install DESTDIR=%{buildroot}

%files
/opt/ros/%{ros_distro}

%changelog
* Mon Oct 12 2026 ai-importer <ai-importer@openeuler.org> - 0.0.3-2
- Bundle opencv_contrib 4.5.2 aruco module (openEuler opencv lacks it)

* Mon Oct 12 2026 ai-importer <ai-importer@openeuler.org> - 0.0.3-1
- Initial import (ROS batch)