#yocto #bitbake #yocto-recipe
Вопрос:
Я работаю над переходом с Debian на Yocto. В результате многие проприетарные пакеты, для которых я пишу рецепты, зависят от библиотек Debian, которые, по-видимому, недоступны непосредственно в Yocto. Это может быть вопрос новичка, но я пытаюсь понять, как это сделать.
Ниже у меня есть один из моих рецептов для проекта Makefile C, который был сгенерирован с помощью recipetool create
:
# Recipe created by recipetool
# This is the basis of a recipe and may need further editing in order to be fully functional.
# (Feel free to remove these comments when editing.)
# WARNING: the following LICENSE and LIC_FILES_CHKSUM values are best guesses - it is
# your responsibility to verify that the values are complete and correct.
#
# The following license files were not able to be identified and are
# represented as "Unknown" below, you will need to check them yourself:
# debian/copyright
LICENSE = "Unknown"
LIC_FILES_CHKSUM = "file://debian/copyright;md5=some-hash"
SRC_URI = "git://git@my-project.git;protocol=ssh"
# Modify these as desired
PV = "1.0 git${SRCPV}"
SRCREV = "<...>"
S = "${WORKDIR}/git"
DEPENDS = "systemd"
# NOTE: this is a Makefile-only piece of software, so we cannot generate much of the
# recipe automatically - you will need to examine the Makefile yourself and ensure
# that the appropriate arguments are passed in.
do_compile () {
oe_runmake my-project
}
Как вы можете видеть, я указал зависимость от systemd
. Однако зависимость, которая, как я действительно думаю, мне нужна, — это пакет Debian libsystemd
.
Всякий раз, когда я кусаю этот рецепт, я получаю следующее:
NOTE: Executing Tasks
ERROR: <recipe-name> do_compile: oe_runmake failed
ERROR: <recipe-name> do_compile: Execution of '/home/mitch/bin/yocto/project-name/build/tmp/work/armv7vet2hf-neon-poky-linux-gnueabi/recipe-name/1.0 gitAUTOINC ...-r0/temp/run.do_compile.13271' failed with exit code 1:
make[1]: Entering directory '/home/mitch/bin/yocto/project-name/build/tmp/work/armv7vet2hf-neon-poky-linux-gnueabi/recipe-name/1.0 gitAUTOINC ...-r0/git/src/core'
CC file-name.c
../file-name.c:6:10: fatal error: systemd/sd-daemon.h: No such file or directory
6 | #include <systemd/sd-daemon.h>
| ^~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[1]: *** [Makefile:93: build/file-name.o] Error 1
make[1]: Leaving directory '/home/mitch/bin/yocto/project-name/build/tmp/work/armv7vet2hf-neon-poky-linux-gnueabi/recipe-name/1.0 gitAUTOINC ...-r0/git/src/core'
make: *** [Makefile:72: some-recipe] Error 2
WARNING: exit code 1 from a shell command.
ERROR: Logfile of failure stored in: /home/mitch/bin/yocto/project-name/build/tmp/work/armv7vet2hf-neon-poky-linux-gnueabi/recipe-name/1.0 gitAUTOINC ...-r0/temp/log.do_compile.13271
Log data follows:
| DEBUG: Executing shell function do_compile
| NOTE: make -j 24 my-project
| make[1]: Entering directory '/home/mitch/bin/yocto/project-name/build/tmp/work/armv7vet2hf-neon-poky-linux-gnueabi/recipe-name/1.0 gitAUTOINC ...-r0/git/src/core'
| CC my-file.c
| ../my-file.c:6:10: fatal error: systemd/sd-daemon.h: No such file or directory
| 6 | #include <systemd/sd-daemon.h>
| | ^~~~~~~~~~~~~~~~~~~~~
| compilation terminated.
| make[1]: *** [Makefile:93: build/my-file.o] Error 1
| make[1]: Leaving directory '/home/mitch/bin/yocto/project-name/build/tmp/work/armv7vet2hf-neon-poky-linux-gnueabi/recipe-name/1.0 gitAUTOINC ...-r0/git/src/core'
| make: *** [Makefile:72: my-project] Error 2
| ERROR: oe_runmake failed
| WARNING: exit code 1 from a shell command.
| ERROR: Execution of '/home/mitch/bin/yocto/project-name/build/tmp/work/armv7vet2hf-neon-poky-linux-gnueabi/recipe-name/1.0 gitAUTOINC ...-r0/temp/run.do_compile.13271' failed with exit code 1:
| make[1]: Entering directory '/home/mitch/bin/yocto/project-name/build/tmp/work/armv7vet2hf-neon-poky-linux-gnueabi/recipe-name/1.0 gitAUTOINC ...-r0/git/src/core'
| CC my-file.c
| ../my-file.c:6:10: fatal error: systemd/sd-daemon.h: No such file or directory
| 6 | #include <systemd/sd-daemon.h>
| | ^~~~~~~~~~~~~~~~~~~~~
| compilation terminated.
| make[1]: *** [Makefile:93: build/my-file.o] Error 1
| make[1]: Leaving directory '/home/mitch/bin/yocto/project-name/build/tmp/work/armv7vet2hf-neon-poky-linux-gnueabi/recipe-name/1.0 gitAUTOINC ...-r0/git/src/core'
| make: *** [Makefile:72: my-recipe] Error 2
| WARNING: exit code 1 from a shell command.
|
ERROR: Task (/home/mitch/bin/yocto/project-name/layers/meta-project/recipes-main/my-recipe/my-recipe_git.bb:do_compile) failed with exit code '1'
NOTE: Tasks Summary: Attempted 2166 tasks of which 2163 didn't need to be rerun and 1 failed.
Подводя итог, можно сказать, что для моего проекта требуются библиотеки, предоставляемые компанией systemd
. Чего мне здесь не хватает, что позволило бы мне запустить этот проект? Есть ли способ его построить?
Комментарии:
1.
Depends:
объявляет зависимость от времени выполнения для построенного пакета.Build-Depends:
указывает пакеты, которые должны быть установлены во время сборки. Я не знаком с Yocto, но, возможно, это может подтолкнуть в правильном направлении?2. @tripleee Не могли бы вы уточнить, что вы имеете в виду? DEPENDS объявляет зависимость от времени сборки, RDEPENDS объявляет зависимость от времени выполнения. Что вы предлагаете мне использовать в этом случае? Я пробовал и то, и другое, но, насколько я понимаю, это зависимости от времени сборки, верно?
3. Звучит правильно; я имел в виду поля управления Debian. Итак, есть ли причина, по которой вы не объявляете зависимость от
libsystemd-dev
или от чего-либо, что называется пакетом с полямиsystemd
заголовка в Yocto?4. Ну, честно говоря, я думал, что systemd обеспечит это, но, похоже, это не так.
libsystemd-dev
это не тот рецепт, который доступен для Yocto5.
systemd-dev
предоставляет эти файлы, но они будут правильно загружены, какDEPENDS
и в основном пакетеsystemd
. Возможно ли, чтоMakefile
используемая вами программа каким-то образом нарушает компиляцию? Я имею в виду, что флаги компиляции (особенно расположение корневой системы) потеряны? Рецепт sysroot (когда есть не толькоsystemd-dev
файлы) передается в переменной OpenEmbedded${CC}
.
Ответ №1:
Ладно, думаю, я слишком много об этом думал. Yocto использует вашу систему для компиляции проекта. Итак, все, что мне нужно было сделать, это предоставить файлы заголовков systemd на моей хост-машине. Поскольку я использую Ubuntu, установка libsystemd-dev
на моем хосте устранила проблему. Я думаю, что DEPENDS
для работы в системе Yocto по-прежнему потребуется системный идентификатор.