1+ #! /bin/bash
2+
3+ # Build Debian packages for greenwave_monitor
4+ #
5+ # This script builds .deb packages for greenwave_monitor_interfaces, greenwave_monitor, and r2s_gw
6+ #
7+ # Usage: ./scripts/build_debian_packages.sh [ROS_DISTRO] [UBUNTU_DISTRO]
8+ # Examples:
9+ # ./scripts/build_debian_packages.sh # Uses defaults (humble/jammy)
10+ # ./scripts/build_debian_packages.sh humble jammy # ROS Humble on Ubuntu 22.04
11+ # ./scripts/build_debian_packages.sh jazzy noble # ROS Jazzy on Ubuntu 24.04
12+ #
13+ # Docker Usage (Recommended):
14+ # docker run -it --rm -v $(pwd):/workspace -w /workspace \
15+ # ros:humble-ros-base-jammy ./scripts/build_debian_packages.sh humble jammy
16+ #
17+ # Supported combinations:
18+ # humble/jammy, iron/jammy, jazzy/noble, kilted/noble, rolling/noble
19+ #
20+ # Output: Debian packages will be created in debian_packages/[ROS_DISTRO]/
21+ # Install: sudo apt install ./debian_packages/[ROS_DISTRO]/*.deb
22+
23+ set -eo pipefail
24+
25+ # Default values
26+ DEFAULT_ROS_DISTRO=" humble"
27+ DEFAULT_UBUNTU_DISTRO=" jammy"
28+
29+ # Parse arguments
30+ ROS_DISTRO=" ${1:- $DEFAULT_ROS_DISTRO } "
31+ UBUNTU_DISTRO=" ${2:- $DEFAULT_UBUNTU_DISTRO } "
32+
33+ # Validate ROS distro
34+ case " $ROS_DISTRO " in
35+ humble|iron|jazzy|kilted|rolling)
36+ ;;
37+ * )
38+ echo " Error: Unsupported ROS distro: $ROS_DISTRO "
39+ echo " Supported distros: humble, iron, jazzy, kilted, rolling"
40+ exit 1
41+ ;;
42+ esac
43+
44+ # Validate Ubuntu distro
45+ case " $UBUNTU_DISTRO " in
46+ jammy|noble)
47+ ;;
48+ * )
49+ echo " Error: Unsupported Ubuntu distro: $UBUNTU_DISTRO "
50+ echo " Supported distros: jammy, noble"
51+ exit 1
52+ ;;
53+ esac
54+
55+ echo " Building Debian packages for ROS $ROS_DISTRO on Ubuntu $UBUNTU_DISTRO "
56+
57+ # Check if running in ROS container or local system
58+ if [ ! -f " /opt/ros/$ROS_DISTRO /setup.bash" ]; then
59+ echo " Error: ROS $ROS_DISTRO not found at /opt/ros/$ROS_DISTRO /setup.bash"
60+ echo " Please run this script in a ROS $ROS_DISTRO container or install ROS $ROS_DISTRO locally"
61+ echo " "
62+ echo " To run in Docker:"
63+ echo " docker run -it --rm -v \$ (pwd):/workspace -w /workspace ros:$ROS_DISTRO -ros-base-$UBUNTU_DISTRO ./scripts/build_debian_packages.sh $ROS_DISTRO $UBUNTU_DISTRO "
64+ exit 1
65+ fi
66+
67+ # Source ROS environment
68+ source /opt/ros/$ROS_DISTRO /setup.bash
69+
70+ # Install dependencies
71+ echo " Installing build dependencies..."
72+ apt-get update -qq
73+
74+ # Check if we need --break-system-packages for pip
75+ USE_BREAK_SYSTEM_PACKAGES=" "
76+ if [[ " $ROS_DISTRO " == " jazzy" || " $ROS_DISTRO " == " kilted" || " $ROS_DISTRO " == " rolling" ]]; then
77+ USE_BREAK_SYSTEM_PACKAGES=" --break-system-packages"
78+ fi
79+
80+ # Install system dependencies
81+ apt-get install -y build-essential python3-pip python3-bloom python3-rosdep git lsb-release devscripts debhelper fakeroot
82+
83+ # Install Python dependencies
84+ if [ -f " requirements.txt" ]; then
85+ if [ -n " $USE_BREAK_SYSTEM_PACKAGES " ]; then
86+ pip3 install $USE_BREAK_SYSTEM_PACKAGES -I pygments -r requirements.txt
87+ python3 -m pip install -U $USE_BREAK_SYSTEM_PACKAGES bloom
88+ else
89+ pip3 install -r requirements.txt
90+ python3 -m pip install -U bloom
91+ fi
92+ fi
93+
94+ # Build workspace first
95+ echo " Building workspace..."
96+ colcon build --packages-up-to r2s_gw
97+ source install/setup.bash
98+
99+ # Setup rosdep mappings
100+ echo " Setting up rosdep mappings..."
101+ mkdir -p ~ /.ros/rosdep
102+ cat > ~/.ros/rosdep/local.yaml << EOF
103+ greenwave_monitor_interfaces:
104+ ubuntu:
105+ jammy: [ros-$ROS_DISTRO -greenwave-monitor-interfaces]
106+ noble: [ros-$ROS_DISTRO -greenwave-monitor-interfaces]
107+ greenwave_monitor:
108+ ubuntu:
109+ jammy: [ros-$ROS_DISTRO -greenwave-monitor]
110+ noble: [ros-$ROS_DISTRO -greenwave-monitor]
111+ EOF
112+
113+ # Setup rosdep
114+ mkdir -p /etc/ros/rosdep/sources.list.d || sudo mkdir -p /etc/ros/rosdep/sources.list.d
115+ echo " yaml file://$HOME /.ros/rosdep/local.yaml" | sudo tee /etc/ros/rosdep/sources.list.d/99-local.list
116+ rosdep init 2> /dev/null || sudo rosdep init 2> /dev/null || true
117+ rosdep update --include-eol-distros
118+
119+ # Create output directory
120+ DEBIAN_DIR=" debian_packages/$ROS_DISTRO "
121+ mkdir -p " $DEBIAN_DIR "
122+
123+ # Function to build a Debian package
124+ build_debian_package () {
125+ local package_name=$1
126+ local package_dir=$2
127+
128+ echo " =================================="
129+ echo " Generating Debian package for $package_name ..."
130+ echo " =================================="
131+
132+ cd " $package_dir "
133+
134+ # Generate debian files and build package
135+ bloom-generate rosdebian --ros-distro " $ROS_DISTRO "
136+ apt-get build-dep . -y || sudo apt-get build-dep . -y
137+ fakeroot debian/rules binary
138+
139+ # Move package to output directory
140+ cp ../ros-$ROS_DISTRO -${package_name// _/ -} _* .deb " ../$DEBIAN_DIR /"
141+
142+ cd ..
143+
144+ echo " Successfully built $package_name "
145+ }
146+
147+ # Function to install a package locally
148+ install_package () {
149+ local package_pattern=$1
150+ echo " Installing $package_pattern ..."
151+ apt-get update || sudo apt-get update
152+ apt-get install -y ./$DEBIAN_DIR /$package_pattern || sudo apt-get install -y ./$DEBIAN_DIR /$package_pattern
153+ }
154+
155+ # Build packages in dependency order
156+ echo " Starting Debian package generation..."
157+
158+ # 1. Build greenwave_monitor_interfaces
159+ if [ -d " greenwave_monitor_interfaces" ]; then
160+ build_debian_package " greenwave_monitor_interfaces" " greenwave_monitor_interfaces"
161+ install_package " ros-$ROS_DISTRO -greenwave-monitor-interfaces_*.deb"
162+ else
163+ echo " Warning: greenwave_monitor_interfaces directory not found, skipping"
164+ fi
165+
166+ # 2. Build greenwave_monitor
167+ if [ -d " greenwave_monitor" ]; then
168+ build_debian_package " greenwave_monitor" " greenwave_monitor"
169+ install_package " ros-$ROS_DISTRO -greenwave-monitor_*.deb"
170+ else
171+ echo " Warning: greenwave_monitor directory not found, skipping"
172+ fi
173+
174+ # 3. Build r2s_gw
175+ if [ -d " r2s_gw" ]; then
176+ build_debian_package " r2s_gw" " r2s_gw"
177+ else
178+ echo " Warning: r2s_gw directory not found, skipping"
179+ fi
180+
181+ echo " =================================="
182+ echo " Debian package generation complete!"
183+ echo " =================================="
184+ echo " Generated packages in $DEBIAN_DIR :"
185+ ls -la " $DEBIAN_DIR /"
186+
187+ echo " "
188+ echo " To install the packages on another system:"
189+ echo " sudo apt install ./$DEBIAN_DIR /*.deb"
190+
191+ echo " "
192+ echo " To create a local APT repository:"
193+ echo " sudo apt install dpkg-dev"
194+ echo " cd $DEBIAN_DIR "
195+ echo " dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz"
196+ echo " # Then add 'deb [trusted=yes] file:///path/to/$DEBIAN_DIR ./' to /etc/apt/sources.list"
0 commit comments