Smart не может установить пакет, предоставляющий общий объектный файл

Проблема

Я пытаюсь создать рецепт Bitbake, который установит Oracle JRE 8 на мою целевую ОС.

Я пытался использовать метаданные из meta-oracle-java. , но возникли некоторые трудности из-за того, что один из файлов .inc, предоставляемых для общих JRE, имеет URI, специфичный для JRE-7.

Я изменил некоторые метаданные из meta-oracle-java и создал свой собственный рецепт для этой установки.

Тесты

Самостоятельная сборка рецепта JRE

При создании рецепта самостоятельно:

bitbake oracle-jse-jre

Сборка завершается без ошибок. Я добавил зависимость от libav в рецепт oracle-jse-jre, так что я могу сделать следующее из TMPDIR:

$ find . -name libavformat*so 
./work/core2-64-poky-linux/libav/9.18-r0/sysroot-destdir/usr/lib/libavformat.so.54.20.4
./work/core2-64-poky-linux/libav/9.18-r0/sysroot-destdir/usr/lib/libavformat.so
./work/core2-64-poky-linux/libav/9.18-r0/sysroot-destdir/usr/lib/libavformat.so.54
./sysroots/genericx86-64/usr/lib/libavformat.so.54.20.4
./sysroots/genericx86-64/usr/lib/libavformat.so
./sysroots/genericx86-64/usr/lib/libavformat.so.54

Успех зависимости во время выполнения

Если я добавлю пакет по умолчанию из рецепта oracle-jse-jre в RDEPENDS_${PN} другого рецепта xenoros_0.1.bb, я смогу запустить bitbake xenoros и собрать без ошибок.

Сбой основного образа

Если я добавлю xenoros к переменной IMAGE_INSTALL core-image-xenoros, сборка завершится ошибкой со следующей ошибкой:

ERROR: Unable to install packages. Command '/home/presslertj/yocto-OS/poky-jethro-build/build/tmp/sysroots/x86_64-linux/usr/bin/smart --log-level=warning --data-dir=/home/presslertj/yocto-OS/poky-jethro-build/build/tmp/work/genericx86_64-poky-linux/core-image-my-server/1.0-r0/rootfs/var/lib/smart install -y message-generation@core2_64 catkin@core2_64 python-distutils@core2_64 ldd@core2_64 xenoros@core2_64 rosgraph@core2_64 gedit@core2_64 actionlib@core2_64 python-compression@core2_64 dhcp-server@core2_64 libpthread-stubs@core2_64 tf2@core2_64 python-email@core2_64 catkin-dev@core2_64 git@core2_64 rosbash@core2_64 python-json@core2_64 python-wstool@core2_64 connman@core2_64 ros-config@core2_64 packagegroup-core-boot@genericx86_64 libsdl-1.2-0@core2_64 rosjava@core2_64 quagga@core2_64 nginx@core2_64 rospy@core2_64 apt@core2_64 libc6@core2_64 netcat@core2_64 shadow@core2_64 bash@core2_64 roscpp@core2_64 roslaunch@core2_64 run-postinsts@all python-rosinstall@core2_64 elfutils@core2_64 openssl@core2_64 font-alias@all gradle@core2_64 python-catkin-pkg@core2_64 catkin-runtime@core2_64 catkin-runtime-dev@core2_64 pciutils@core2_64 base-passwd@core2_64' returned 1:
Loading cache...
Updating cache...               ######################################## [100%]

Computing transaction...error: Can't install oracle-jse-jre-1.8.0-u77r0@core2_64: no package provides libavformat.so.53(LIBAVFORMAT_53)(64bit)

ERROR: Function failed: do_rootfs
ERROR: Logfile of failure stored in: /home/presslertj/yocto-OS/poky-jethro-build/build/tmip/work/genericx86_64-poky-linux/core-image-my-server/1.0-r0/temp/log.do_rootfs.22073
ERROR: Task 7 (/home/presslertj/yocto-OS/poky-jethro-build/meta-myLayer/recipes-core/images/core-image-my-server.bb, do_rootfs) failed with exit code '1'

Заглянув внутрь TMPDIR, я могу найти это:

/sysroots/genericx86-64/usr/lib/libavformat.so.54

Вроде несоответствие версий, где смарт ожидает 53 версию, а предоставляется 54.

Откат версии libav

Просто чтобы проверить, что происходит, я сделал рецепт, который извлекает версию 0.8.17 из libav (которая использует версию 53). При использовании этого вместо 9.18 у меня прямо противоположная проблема, которую смарт ожидает, но не может найти версию 54.

Вопросы

  1. Как smart определяет номер версии этих общих объектных файлов?
  2. Что насчет задачи do_rootfs(), которая приводит к сбою сборки в это конкретное время?
  3. Есть ли простое решение моей конкретной проблемы?

person karobar    schedule 18.04.2016    source источник


Ответы (2)


1) Это не умно, а скорее rpmbuild, то есть добавление зависимостей, полученных из поля ELF DT_NEEDED (см. elfutils -a).

2) Задача do_rootfs() не выполняется из-за неразрешенных зависимостей.

3) Поскольку вы используете Poky/Yocto и rpm5, есть простой способ замаскировать проблему (заменив любые зависимости, которые вызывают у вас изжогу)

echo "unresoved_dependency" > /etc/rpm/sysinfo/Providename

Это просто пластырь; вам все еще нужно выяснить проблемы с упаковкой, а не маскировать основную проблему тем, как вы собираете пакеты rpm.

person Jeff Johnson    schedule 21.04.2016

Для тех, кто все еще сталкивается с этой ошибкой: как указано в файле README репозитория meta-oracle-java

There are some known install problems for JRE packages due to dependencies reported by RPM package manager. 
Switching to DEB or IPK packaging temporarily fixes this. 
ie: 
PACKAGE_CLASSES = "package_deb"  
or   
PACKAGE_CLASSES = "package_ipk"
in your 'local.conf' file
person mattdibi    schedule 03.04.2017