Работа с системой Yocto

Ох, ну и мудотенная хренотень этот Yocto Project. Ради получения ядра размером в пару мегабайт и фс, генерится больше 50гбт какого-то говна на протяжении целых суток. По мне, так это трэш какой-то. И очень печально конечно, если на этот говно-проект будут ориентироваться разработчики встраиваемых систем.

Контрол Ц + контрол В с сайта ibm.com "The Yocto Project™ – это Open Source-проект, целью которого является упрощение разработки специальных дистрибутивов Linux для встраиваемых систем и обеспечение их переносимости между различными платформами."

В общем, будущее за говнокодом, поэтому здесь основные первые шаги при знакомстве с yocto.

Процесс сборки описан довольно подробно в документации.

После установки/распаковки дистрибутива имеем примерно вот такую папочку со следующим содержимым:

$ ls -l
итого 240
drwxr-xr-x   6 dima dima   4096 дек.  16 09:16 bitbake
drwxr-xr-x  13 dima dima   4096 дек.  16 09:16 documentation
-rw-r--r--   1 dima dima  14664 дек.  16 09:16 fsl-setup-poky
-rw-r--r--   1 dima dima    545 дек.  16 09:16 LICENSE
drwxr-xr-x  21 dima dima   4096 дек.  16 09:16 meta
drwxr-xr-x  17 dima dima   4096 дек.  16 09:21 meta-fsl-networking
drwxr-xr-x  13 dima dima   4096 дек.  16 09:16 meta-fsl-ppc
drwxr-xr-x   7 dima dima   4096 дек.  16 09:21 meta-fsl-ppc-toolchain
drwxr-xr-x   4 dima dima   4096 дек.  16 09:16 meta-hob
drwxr-xr-x  16 dima dima   4096 дек.  16 09:16 meta-oe
drwxr-xr-x   6 dima dima   4096 дек.  14 17:01 meta-skeleton
drwxr-xr-x  11 dima dima   4096 дек.  16 09:21 meta-virtualization
drwxr-xr-x   6 dima dima   4096 дек.  14 17:01 meta-yocto
drwxr-xr-x   8 dima dima   4096 дек.  14 17:01 meta-yocto-bsp
-rwxr-xr-x   1 dima dima   1592 дек.  16 09:16 oe-init-build-env
-rw-r--r--   1 dima dima   2038 дек.  16 09:16 README
-rw-r--r--   1 dima dima  17436 дек.  16 09:16 README.hardware
drwxr-xr-x   9 dima dima   4096 дек.  16 09:16 scripts
drwxr-xr-x  11 dima dima 131072 марта  3 16:07 sources
drwxrwxr-x 260 dima dima   4096 дек.  18 04:41 sstate-cache

Далее нужно доустановить недостающие пакеты с помощью скрипта

$ . /scripts/host-prepare.sh

Следующий шаг - это конфигурирование yocto для сборки под конкретную цель.
Выполняется, для примера, вот так:

source ./fsl-setup-poky -m p5040rdb -j14 -t14

После выполнении этой команды создастся рабочая папочка, в моём случае это: build_p5040rdb_release

Теперь нужно перейти в неё и можно приступать к самой сборке. По-джидайски это, наверное, через использование bitbake. Для примера так:

$ bitbake fsl-image-minimal

с использованием графики - это запуск некой программки hob

$ hob

В hob можно выбрать цель, образ для сборки, настроить количество одновременных потоков для ускорения сборки и пр.

После завершения сборки Yocto Project готовые образы можно найти в
build_p5040ds_release/tmp/deploy/images

Кросс-компилятор находится где-то тут (искать по маске "-linux-gcc"):
/build_p5040ds_release/tmp/sysroots

Иногда при запуске hob или bitbake можно увидеть вот такое сообщение:

ERROR: Only one copy of bitbake should be run against a build directory

Это значит, что уже запущен bitbake:

ps -ef|grep bitbake

собранные пакеты располагаются в
/build_p5040ds_release/tmp/work/

Если требуется удалить какой-то пакет, то нужно использовать bitbake как-то вот так:

bitbake -c clean virtual/kernel
bitbake -c cleansstate pulseaudio
bitbake -c cleansstate u-boot

Для настройки ядра linux в Yocto Project:

bitbake -c menuconfig virtual/kernel 

Для сборки ядра linux в Yocto Project:

$ bitbake -c compile -f virtual/kernel
$ bitbake virtual/kernel

Настройка ядра для конкретной системы в Yocto Project:

MACHINE=p5040ds bitbake -c menuconfig virtual/kernel

Сборка ядра под конкретную систему в Yocto Project:

$ MACHINE=p5040ds-64b bitbake -c compile -f virtual/kernel
$ MACHINE=p5040ds-64b bitbake virtual/kernel

В случае, если появляется вот такая надпись:

ERROR:  OE-core's config sanity checker detected a potential misconfiguration.
    Either fix the cause of this error or at your own risk disable the checker (see sanity.conf).
    Following is the list of potential problems / advisories:

    Toolchain tunings invalid:
Multilib 'lib64' (ppc64e5500) is also the default tuning.

ERROR: Execution of event handler 'check_sanity_eventhandler' failed

то комментируем все строки в файле meta/conf/sanity.conf как-то так (не знаю, что это значит, но помогает):

#BB_MIN_VERSION = "1.17.1"

#SANITY_ABIFILE = "${TMPDIR}/abi_version"

#SANITY_VERSION ?= "1"
#LOCALCONF_VERSION  ?= "1"
#LAYER_CONF_VERSION ?= "5"
#SITE_CONF_VERSION  ?= "1"

#INHERIT += "sanity"

Как добавить новый пакет в цель сборки core-image-minimal:

1. Создать рецепт сборки, а лучше качнуть его из инета, поскольку он наверняка уже есть там. Затем скопировать его вот сюда как вариант: poky/meta/recipes-devtools

2. В файле poky/build/conf/local.conf добавить следующую строчку:

CORE_IMAGE_EXTRA_INSTALL = "efibootmgr"

либо вот так:

IMAGE_INSTALL_append = " lua5.1 efibootmgr"

где efibootmgr - название нового пакета и одноименное название рецепта сборки в poky/meta/recipes-devtools

3. запустить процесс сборки через hob и убедиться, что пакет добавлен при сборке цели core-image-minimal.

Сборка отдельных утилит в системе yocto выполняется согласно доступному списку команд для каждой утилиты. Список команд можно посмотреть так, например, для утилиты efibootmgr:

$ bitbake -c listtasks efibootmgr

Чтобы удалить утилиту с исходниками из tmp/work/corei7-64-poky-linux/efibootmgr, нужно выполнить:

bitbake -c cleansstate efibootmgr

Чтобы собрать утилиту, нужно выполнить:

bitbake -c compile efibootmgr

Опция "-v" добавит подробный вывод информации о процессе сборки:

bitbake -v -c compile efibootmgr