Skip to content

Instantly share code, notes, and snippets.

@k-okada
Last active January 26, 2025 05:37
Show Gist options
  • Save k-okada/8a102e8cfa7ff464e6bdcee6ca1086cc to your computer and use it in GitHub Desktop.
Save k-okada/8a102e8cfa7ff464e6bdcee6ca1086cc to your computer and use it in GitHub Desktop.
docker run --rm -v $(pwd):/ws -ti ubuntu:22.04 /bin/bash -exec '
export REPOSITORY=file:///ws/apt_repo
export REPOSITORY=http://packages.ros.org.jsk.imi.i.u-tokyo.ac.jp/ros-one-arm64
echo "deb [trusted=yes] $REPOSITORY ./" | tee /etc/apt/sources.list.d/apt_repo.list
apt update
DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC apt install -y python3-rosdep2
echo "yaml $REPOSITORY/local.yaml debian" | tee /etc/ros/rosdep/sources.list.d/1-apt_repo.list
rosdep update
apt install -y ros-one-pr2eus
bash -i
'
#!/bin/bash
set -e
test $(id -u) -eq 0 && (echo "do not run with root user"; exit 1)
test -e $(pwd)/src && (echo "please run 'rm -fr src', before you start"; exit 1)
set -x
# setup
which git || sudo apt install -y git
which curl || sudo apt install -y curl
test -e /sbin/tzconfig || DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC sudo -E apt-get -y install tzdata
which yq || (curl -LJO https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64; sudo mv yq_linux_amd64 /usr/local/bin/yq; sudo chmod a+x /usr/local/bin/yq)
REPOS='setup_files ros_environment cmake_modules catkin_virtualenv genmsg geneus ros_environment rospack roscpp_core genpy roslisp message_runtime gencpp gennodejs genlisp message_generation rosconsole std_msgs ros_comm pluginlib ros_comm_msgs ros bond_core nodelet_core actionlib convex_decomposition angles geometry2 geometry dynamic_reconfigure common_tutorials ros_tutorials jsk_roseus laser_geometry openslam_gmapping slam_gmapping laser_filters vision_opencv jsk_common jsk_common_msgs jsk_3rdparty rosconsole_bridge resource_retriever robot_pose_ekf robot_state_publisher class_loader kdl_parser urdf eigen_stl_containers random_numbers geometric_shapes collada_urdf jsk_model_tools rosbag_migration_rule realtime_tools image_common image_pipeline image_transport_plugins ros_control control_toolbox pr2_simulator pr2_navigation pr2_ethercat_drivers pr2_controllers pr2_apps xacro diagnostics pr2_common pr2_common_actions pr2_mechanism pr2_mechanism_msgs control_msgs navigation navigation_msgs common_msgs audio_common app_manager mongodb_store executive_smach libuvc_ros filters gazebo_ros_pkgs roslint moveit_msgs ivcon rqt_reconfigure jsk_pr2eus'
QUERY=$(
echo -n '{ "repositories": {';
sep=""
for repo in $REPOS; do
echo -n "$sep \"$repo\": .repositories.\"$repo\""
sep=","
done
echo -n "} }"
)
echo $QUERY
rm -f worker-jobs.repos
yq "$QUERY" $(pwd)/ros-o-builder/sources.repos | tee worker-jobs.repos
# clone repositories
test -e ros-o-builder || git clone --depth 1 https://github.com/k-okada/ros-o-builder -b build-for-jammy
test -e ros-deb-builder-action || git clone https://github.com/k-okada/ros-deb-builder-action -b fix_for_jsk
# fix
mkdir -p $(pwd)/.cache/ccache/
sudo rm -f /etc/ros/rosdep/sources.list.d/01-local.list /etc/ros/rosdep/sources.list.d/02-remote.list
rm -f /tmp/prepare.sh /tmp/build.sh
sed "s@/home/runner@$(pwd)@g" ros-deb-builder-action/prepare.sh | sed 's/amd64/arm64/g' > /tmp/prepare.sh
sed "s@/home/runner@$(pwd)@g" ros-deb-builder-action/build.sh > /tmp/build.sh
test -e /tmp/retry_1.0.5-3build1~ubuntu0.24.04.1_arm64.deb || (curl -L https://launchpad.net/ubuntu/+archive/primary/+files/retry_1.0.5-3build1~ubuntu0.24.04.1_arm64.deb -o /tmp/retry_1.0.5-3build1~ubuntu0.24.04.1_arm64.deb; sudo dpkg -i /tmp/retry_1.0.5-3build1~ubuntu0.24.04.1_arm64.deb)
# fix for arm64, use apt-cacher-ng
#sed -i "s@--components=main,universe@--components=main,universe --architecture=arm64 --keyring=/etc/apt/trusted.gpg.d/@g" /tmp/prepare.sh
echo "apt-cacher-ng apt-cacher-ng/tunnelenable boolean true" | sudo debconf-set-selections
DEBIAN_FRONTEND=noninteractive sudo apt install -y apt-cacher-ng
sudo /etc/init.d/apt-cacher-ng restart
sed -i "s@--components=main,universe@--components=main,universe --architecture=arm64 --aptopt='Acquire::http { Proxy \"http://127.0.0.1:3142\"; }'@g" /tmp/prepare.sh
#debug
sed -i "s@mkdir -p /sbuild-nonexistent/.ros/log/@set -x; mkdir -p /build; mkdir -p /sbuild-nonexistent/.ros/log/@g" /tmp/build.sh
# add key
#sudo apt install -y gpg
#gpg --keyserver keyserver.ubuntu.com --recv-keys 871920D1991BC93C || echo "OK"
#gpg --export --armor 871920D1991BC93C | sudo apt-key add - && sudo apt-get update
# runscript
rm -f ppa-k-okada-keyring.gpg
echo -n "" | \
DEB_DISTRO=jammy \
SBUILD_CONF="\$extra_packages = ['$(pwd)/apt_repo_dependencies']; \$enable_network = 1; \$build_profiles = 'nocheck'; \$build_environment = { 'CCACHE_DIR' => '/tmp/ccache' };" \
REPOS_FILE=$(pwd)/worker-jobs.repos \
sh /tmp/prepare.sh
#fix
##sed -i "s@'/build/ccache'@'/tmp'@g" ~/.sbuildrc
##mkdir /tmp/ccache; chmod a+rw /tmp/ccache
./depends.py ./src
DEB_DISTRO=jammy \
ROS_DISTRO=one \
ROSDEP_SOURCE=$(pwd)/ros-o-builder/rosdep.yaml \
sh /tmp/build.sh
cd apt_repo
apt-ftparchive packages . > Packages
apt-ftparchive release . > Release
docker run --rm --privileged --net=host -v $(pwd):/ws -ti ubuntu:24.04 /bin/bash
#!/bin/bash
set -x
set -e
echo "postfix postfix/main_mailer_type string 'No configuration'" | debconf-set-selections
apt update && DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC apt install -y sudo adduser whois emacs
useradd -m -p $(mkpasswd user) -s /bin/bash user
adduser user sudo
#!/usr/bin/env python3
import sys, os
import subprocess
from pathlib import Path
import catkin_pkg.packages
import rosdep2
from rosdep2.main import _get_default_RosdepLookup, get_sources_cache_dir, configure_installer_context, create_default_installer_context, get_default_installer
def get_depends(target_pkg, pkgs):
print("get_depends for ", target_pkg)
pkg_list = list(filter(lambda x: x[1].name==target_pkg, pkgs))
if len(pkg_list) == 0:
print("skip \t\t\t\t\t\t\t", target_pkg)
return []
elif len(pkg_list) > 1:
print("more than one package", pkg_list)
sys.exit(1)
pkg_list = pkg_list[0]
#depends = [pkg.name for pkg in pkg_list[1]['build_depends']+pkg_list[1]['buildtool_depends']+pkg_list[1]['exec_depends']+pkg_list[1]['test_depends'] if pkg.name in [pkg[1].name for pkg in pkgs]]
#depends = [pkg.name for pkg in pkg_list[1]['build_depends']+pkg_list[1]['buildtool_depends']+pkg_list[1]['exec_depends'] if pkg.condition is None or pkg.condition == '$ROS_PYTHON_VERSION == 3']
depends = [pkg.name for pkg in pkg_list[1]['build_depends']+pkg_list[1]['buildtool_depends']+pkg_list[1]['exec_depends']+pkg_list[1]['test_depends'] if pkg.condition is None or pkg.condition == '$ROS_PYTHON_VERSION == 3']
# skip system packages
system_packages = []
for depend in depends:
# if depend in view.rosdep_defs.keys():
# print(view.lookup(depend).data)
if depend in view.rosdep_defs.keys() and 'ubuntu' in view.lookup(depend).data.keys():
system_packages.append(depend)
# print(">> skip system keys\t\t", depend)
depends = [depend for depend in depends if depend not in system_packages]
return depends
if __name__ == '__main__':
ws = sys.argv[1] if len(sys.argv) > 1 else "."
if ws.endswith('/'):
ws = ws[:len(ws)-1]
ws = Path(ws)
pkgs = [(path, catpkg) for (path, catpkg) in catkin_pkg.packages.find_packages(ws).items()]
print([pkg[1].name for pkg in pkgs])
print("'{}' have {} packages".format(ws, len(list(pkgs))))
class Options(object):
pass
options=Options()
Options.ros_distro ='debian'
Options.os_override ='ubuntu:jammy'
Options.sources_cache_dir = get_sources_cache_dir()
Options.verbose = False
Options.dependency_types = {'build', 'buildtool', 'build_export', 'buildtool_export', 'exec', 'test', 'doc'}
Options.as_root = {}
os.environ['ROS_DISTRO'] = options.ros_distro
os.environ['ROS_VERSION'] = '1'
os.environ['ROS_PYTHON_VERSION'] = '3'
lookup = _get_default_RosdepLookup(options)
view = lookup.get_rosdep_view('*default*', verbose=options.verbose)
target_pkgs = ["pr2eus"]
build_pkgs = []
#target_pkgs = ["message_generation"]
while target_pkgs != []:
target_pkg = target_pkgs.pop()
if target_pkg in build_pkgs:
continue
target_pkgs = list(set(target_pkgs + (get_depends(target_pkg, pkgs))))
# add target_pkg to buidl_pkgs
build_pkgs.append(target_pkg)
# remove target_pkg from pkgs
pkgs = [pkg for pkg in pkgs if pkg[1].name != target_pkg]
#print("target_pkgs", len(target_pkgs))
print("building packages -> ", len(build_pkgs))
print("unused packages -> ", len(pkgs))
for pkg in pkgs:
#print(pkg[0])
open(ws.name+"/"+pkg[0]+"/CATKIN_IGNORE",'a').close()
pass
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment