Заметка основана на материалах:
- 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 -ssudo 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