Заметка основана на материалах:
- https://answers.ros.org/question/173804/generate-deb-from-ros-package/ (кстати, здесь описывается проблема иногда возникающая
make[1]: *** [override_dh_auto_configure] Error 2
) - https://gist.github.com/awesomebytes/196eab972a94dd8fcdd69adfe3bd1152 (исходная инструкция)
- https://github.com/ros-infrastructure/ros_buildfarm/blob/master/doc/custom_rosdistro.rst (статья про использование кастомных зависимостей rosdep в rosbuildfarm)
- https://answers.ros.org/question/230104/using-bloom-to-generate-binaries-for-multiple-packages/ (вопрос про билдинг нескольких пакетов)
- https://answers.ros.org/question/292024/how-to-use-bloom-generate-with-private-dependencies/ (статья про билдинг с кастомными зависимостями)
- https://answers.ros.org/question/280213/generate-deb-from-dependent-res-package-locally/#280235 (исходная статья для предыдущей)
- https://github.com/ros/rosdistro (репа где содержатся все rosdep зависимости)
- http://qaru.site/questions/169600/dpkg-shlibdeps-error-no-dependency-information-found-for (dpkg-shlibdeps: error: no dependency information found - ошибка которая была для mavros)
- https://github.com/mavlink/mavros-release/tree/debian/kinetic/jessie/mavros (релиз репа - собственно код который собирается в deb пакеты и портируется как source)
- https://answers.ros.org/question/241227/problem-building-deb-for-rosconsole-in-kinetic/ (еще одна ошибка при сборке пакета)
Установка зависимостей с помозью rosdep выполняется следующей командой.
cd catkin_ws
rosdep install -y --from-paths src --ignore-src --rosdistro kinetic -r --os=debian:stretch
Работает это так:
- rosdep проходит по всем пакетам находящимся в папке
src
(определяя пакет по файлуpackage.xml
) - затем смотрит в
package.xml
и берет все rosdep ключиdepend_*
- затем для каждого ключа смотрит в своей базе сопоставление для текущего или указанного явно
--rosdistro
и--os
значения - каждое найденное сопоставление устанавливает используя
apt-get install
sudo apt-get install dh-make python-bloom fakeroot dpkg-dev debhelper
Для сборки некоторых пакетов может потребоваться swap
bloom-generate rosdebian --ros-distro kinetic
sudo fakeroot debian/rules binary
Сборка debian пакета состоит из двух этапов:
- Создание папки
debian
содержащей конфигурационные файлы описывающие данный пакет (зависимости, описание, версию) - Генерирование и добавление скопилированных файлов в папку
debian/<PACKAGE_NAME>
и архивация в файл.deb
Для первого этапа используется bloom-generator, эта ROS утилита которая берет информацию из CMakefile.txt
, package.xml
и других о зависимостях, версиях итд и генерирует папку debian
. Одно из ключевых действий, что делает эта утилита - это переводит rosdep key
указанные в package.xml
в apt-get
зависимости используя rosdep
. Поэтому если мы собираем какой-нибудь пакет, то rosdep должен иметь соответствие для всех ключей этого пакета в apt-get ключи.
Проблема возникает, если мы собираем пакет, на новую архитектуру которой нет в https://github.com/ros/rosdistro
, например RPi. Для разрешения таких зависимостей и генерации своего .yaml
файла я написал скрипт rosolve_rosdep_keys.sh
, который берет зависимости для ключей от других операционных систем, например ubuntu:xenial
и копирует их для целевой архитектуры.
Данный файл нужно добавить в индексацию rosdep'а:
echo "yaml file:///home/pi/urpylka-rpi.yaml" | sudo tee /etc/ros/rosdep/sources.list.d/20-default.list
rosdep update
Также можно копировать не в существующий файл, а в отдельный (по аналогии с /etc/apt
), подробнее по сслыке №6.
Содержимое /home/pi/urpylka-rpi.yaml
ROSDEP_KEY:
debian:
stretch: [APT_NAME]
Второй шаг выполняется dh
. По сгенерированному на первом шаге скрипту для сборки пакета debian/rules
.
Для того чтобы собрать и установить пакет нужен fakeroot либо все права с текущего пользователя поменять под рута (потому что атрибуты файлов в пакете сохраняются).
dh-инструкции содержащиеся в файле debian/rules
работают с папкой obj-*
находящейся в корне пакета, а также CMakeFile.txt
и папкой obj-*/cmake
.
Важно: иногда необходимо передать параметры в cmake, для этого нужно добавить аргументы в шаг override_dh_auto_configure
debian/rules
значение -DCATKIN_INSTALL_INTO_PREFIX_ROOT="1" \
(это необходимо для сборки catkin, иначе он ничего не положет в /opt/ros/kinetic (например setup.bash
)).
Пару других утилит для сборки пакета:
dh build -s
sudo dpkg-buildpackage -rfakeroot -d -B
Использовал, чтобы библиотеки находящиеся в папке /opt/ros
появились в системе. Посмотреть, кажется можно с помощью lddconfig
sudo echo "/opt/ros/kinetic/lib" > /etc/ld.so.conf.d/roslib.conf
- Должен совпадать tootlchain: obj-arm-linux-gnueabihf
- Штука для параллели: distcc
- Кеш obj-файлов: ccache