Как я могу заставить HelloWorld - BitBake Style работать с новой версией Yocto?

В книге «Встроенные системы Linux с проектом Yocto» глава 4 содержит образец под названием " HelloWorld - стиль BitBake ». Я столкнулся с кучей проблем, пытаясь заставить старый пример работать с версией 2.5 "Sumo".

Если вы похожи на меня, первая ошибка, с которой вы столкнулись, следуя инструкциям книги, заключалась в том, что вы скопировали bitbake.conf и получили:

ERROR: ParseError at /tmp/bbhello/conf/bitbake.conf:749: Could not include required file conf/abi_version.conf

И после копирования abi_version.conf вы продолжали находить все больше и больше перекрестно связанных файлов, которые нужно было переместить, а затем и некоторые ошибки относительного пути ... Есть ли лучший способ?


person Darien    schedule 03.07.2018    source источник


Ответы (2)


Вот несколько шагов, которые помогут вам bitbake nano в соответствии с инструкциями из книги.

Если не указано иное, все эти образцы и инструкции основаны на онлайн-копии кода книги- образцы. Хотя онлайн-ресурс удобен для копирования и вставки, он не полностью соответствует печатной копии и содержит как минимум одну дополнительную ошибку.

Первоначальная настройка рабочего пространства

В этом руководстве предполагается, что вы работаете с Yocto версии 2.5 («сумо»), установленной в /tmp/poky, и что среда сборки войдет в /tmp/bbhello. Если у вас еще нет библиотек Poky tools +, проще всего клонировать их с помощью:

$ git clone -b sumo git://git.yoctoproject.org/poky.git /tmp/poky

Затем вы можете инициализировать рабочее пространство с помощью:

$ source /tmp/poky/oe-init-build-env /tmp/bbhello/

Если вы запустите новое окно терминала, вам нужно будет повторить предыдущую команду, чтобы снова настроить среду оболочки, но она не должна заменять какие-либо файлы, созданные в рабочей области с первого раза.

Подключение к настройкам по умолчанию

Скрипт oe-init-build-env должен был только что создать для вас эти файлы:

  • bbhello / conf / local.conf
  • bbhello / conf / templateconf.cfg
  • bbhello / conf / bblayers.conf

Сохраните их, они заменяют собой некоторые инструкции в книге, а это означает, что вам не следует создавать или хранить файлы:

  • bbhello / классы / base.bbclass
  • bbhello / conf / bitbake.conf

Точно так же не перезаписывайте bbhello/conf/bblayers.conf образцом книги. Вместо этого отредактируйте его, чтобы добавить одну строку, указывающую на вашу собственную папку meta-hello, например:

BBLAYERS ?= " \
  ${TOPDIR}/meta-hello \
  /tmp/poky/meta \
  /tmp/poky/meta-poky \
  /tmp/poky/meta-yocto-bsp \
  "    

Создание слоя и рецепта

Теперь создайте следующие файлы из примеров книг:

  • мета-привет / conf / layer.conf
  • мета-привет / редактор рецептов / nano / nano.bb

Мы будем редактировать эти файлы постепенно по мере появления ошибок.

Не могу найти ошибку рецепта

Ошибка:

ERROR: BBFILE_PATTERN_hello not defined

Это вызвано bbhello/meta-hello/conf/layer.conf внутренней несовместимостью книжного веб-сайта. Он использует имя коллекции «hello», но в следующих двух строках используются суффиксы _test. Просто измените их на _hello, чтобы они соответствовали:

# Set layer search pattern and priority
BBFILE_COLLECTIONS += "hello"
BBFILE_PATTERN_hello := "^${LAYERDIR}/"
BBFILE_PRIORITY_hello = "5"

Интересно, что в печатном экземпляре книги этой ошибки нет.

Нет лицензионной ошибки

Ошибка:

ERROR: /tmp/bbhello/meta-hello/recipes-editor/nano/nano.bb: This recipe does not have the LICENSE field set (nano)
ERROR: Failed to parse recipe: /tmp/bbhello/meta-hello/recipes-editor/nano/nano.bb

Можно исправить, добавив параметр лицензии с одним из значений, распознаваемых bitbake. В этом случае добавьте строку на nano.bb из:

LICENSE="GPLv3"

Ошибка синтаксического анализа рецепта

ERROR: ExpansionError during parsing /tmp/bbhello/meta-hello/recipes-editor/nano/nano.bb
[...]
bb.data_smart.ExpansionError: Failure expanding variable PV_MAJOR, expression was ${@bb.data.getVar('PV',d,1).split('.')[0]} which triggered exception AttributeError: module 'bb.data' has no attribute 'getVar'

Это исправлено обновлением специальных команд Python, используемых в рецепте, поскольку @bb.data устарел и теперь удален. Вместо этого замените его на @d, например:

PV_MAJOR = "${@d.getVar('PV',d,1).split('.')[0]}"
PV_MINOR = "${@d.getVar('PV',d,1).split('.')[1]}"

Ошибка контрольной суммы лицензии

ERROR: nano-2.2.6-r0 do_populate_lic: QA Issue: nano: Recipe file fetches files and does not have license file information (LIC_FILES_CHKSUM) [license-checksum]

Это можно исправить, добавив в рецепт директиву, сообщающую ему, какой файл с лицензионной информацией нужно захватить и какую контрольную сумму мы ожидаем от него.

Мы можем проследить, как рецепт генерирует SRC_URI, и немного изменить его, чтобы он указывал на файл COPYING в том же веб-каталоге. Добавьте эту строку в nano.bb:

LIC_FILES_CHKSUM = "${SITE}/v${PV_MAJOR}.${PV_MINOR}/COPYING;md5=f27defe1e96c2e1ecd4e0c9be8967949"

Контрольная сумма MD5 в этом случае была получена в результате ручной загрузки и проверки соответствующего файла.

Сделанный!

Теперь bitbake nano должен работать, и когда он будет завершен, вы увидите, что он построен nano:

/tmp/bbhello $ find ./tmp/deploy/ -name "*nano*.rpm*"
./tmp/deploy/rpm/i586/nano-dbg-2.2.6-r0.i586.rpm
./tmp/deploy/rpm/i586/nano-dev-2.2.6-r0.i586.rpm
person Darien    schedule 03.07.2018
comment
Вау, я не знаю, работает ли это, но я должен дать вам положительный голос. - person YesThatIsMyName; 03.07.2018

Недавно я работал над этим практическим проектом Hello World. Насколько мне известно, я думаю, что исходный код книги содержит некоторые ошибки. Ниже приведен список предлагаемых исправлений:

Наследование собственного класса

Фактически, когда вы строите с помощью bitbake, который вы получили от poky, он строится только для цели, если вы не укажете в своем рецепте, что вы строите для хост-машины (родной). Вы можете сделать последнее, добавив эту строку в конец рецепта:

inherit native

Добавление информации о лицензии

Стоит отметить, что переменная LICENSE важна для установки в любом рецепте, иначе bitbake выдаст ошибку. В нашем случае мы пытаемся собрать версию 2.2.6 редактора nano, его текущая лицензия - GPLv3, поэтому его следует упомянуть следующим образом:

LICENSE = "GPLv3"

Использование вызовов os.system. Как сказано в книге, вы не можете разыменовать метаданные непосредственно из функции Python. Это означает, что доступ к метаданным через словарь d является обязательным. Ниже, есть предложение для функции python do_unpack, вы можете использовать ее концепцию для кодирования следующих задач (do_configure, do_compile):

python do_unpack() {
    workdir = d.getVar("WORKDIR", True)
    dl_dir  = d.getVar("DL_DIR", True)
    p       = d.getVar("P", True)
    tarball_name = os.path.join(dl_dir, p+".tar.gz")

    bb.plain("Unpacking tarball")
    os.system("tar -x -C " + workdir + " -f " + tarball_name)
    bb.plain("tarball unpacked successfully")
}

Запуск редактора nano

После успешного создания пакета nano editor вы можете найти исполняемый файл nano в следующем каталоге, если вы используете Ubuntu (arch x86_64):

./tmp/work/x86_64-linux/nano/2.2.6-r0/src/nano

Если у вас есть какие-либо комментарии или вопросы, не сомневайтесь!

person Amjad    schedule 12.05.2020