Запрос разъяснений по наследованию Yocto

Недавно я предпринял набег на создание встраиваемых систем на основе Linux, что сильно отличается от моих обычных встраиваемых систем, где у меня есть полный контроль над всем.

В рамках этого я изучаю систему сборки Yocto/bitbake/OpenEmbedded.

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

Насколько я понимаю на сегодняшний день, файл рецепта .bb использует require, чтобы просто включить другой файл, подобно #include "myheader.h" C, который обычно выглядит локально.

Файл .bbappend в «верхнем» слое будет автоматически включать в себя базовый файл, а затем вносить в него изменения, что-то вроде присущего require.

Напротив, ключевое слово inherit ищет файл класса .bbclass во многом таким же образом, как и файлы .bb, и наследует от них все детали (вроде #include <stdio.h>, которое опять обычно ищет в системная область(a)).

Итак, первая часть моего вопроса: правильно ли я понимаю? Или я слишком упрощаю?

Затем вторая часть моего вопроса включает использование BBEXTENDS в свете моего текущего понимания. Если у нас уже есть возможность расширить рецепт с помощью require, в чем смысл перечисления указанных рецептов в переменной BBEXTENDS?


(a) Да, я знаю, что они оба полностью зависят от реализации с точки зрения того, откуда берутся заголовки, я просто говорю об их общем использовать.


person paxdiablo    schedule 18.05.2016    source источник


Ответы (1)


Кривая обучения Yocto отличается от других строительных систем, поэтому я понимаю ваше замешательство. Но поверьте мне, это того стоит. Ваши вопросы связаны с BitBake, поэтому я рекомендую Руководство пользователя BitBake. Просто убедитесь, что вы читаете ту же версию, что и ваша сомнительная версия.

  1. require и include.

require похож на include и его можно сравнить с #include из C и C++, как вы написали. Хотя, как правило, оба они должны использоваться для добавления некоторых расширений к рецепту (*.bb), которые являются общими для некоторого количества рецептов (просто - могут быть использованы повторно). Например: определения путей, пользовательские задачи, используемые парой рецептов. Общая цель состоит в том, чтобы сделать рецепт чище и выделить некоторые константы для повторного использования.

Очень важная вещь -› разница между include и require (из мануала BitBake):

Директива include не выдает ошибку, если файл не найден. Следовательно, если ожидается, что файл, который вы включаете, существует, рекомендуется использовать require вместо include. Это гарантирует, что если файл не может быть найден, возникнет ошибка.

В результате: когда вы включаете файл в *.bb и он не найден, BitBake не выдаст ошибку при разборе этого рецепта. Если вы будете использовать require, ошибка возникнет. Вы должны использовать require, когда указанный файл должен существовать, потому что он содержит важные переменные/задачи, которые являются обязательными для обработки.

  1. *.bbappend механизм.

В случае с *.bbappend - это очень мощно. Типичное использование — это когда вы добавляете некоторые пользовательские модификации к рецепту из другого уровня (расположенного над уровнем, где находится исходный рецепт) с помощью *.bbappend, потому что (например): вы не являетесь сопровождающим оригинальный рецепт или модификации используются только в вашем проекте (тогда он должен находиться в вашем метаслое). Но вы также можете bbappend рецепт на том же слое. BitBake анализирует все слои, а затем «создает» вывод и выполняет его. Подробнее в главе Выполнение от BitBake man.

  1. inherit.

Механизм inherit можно использовать для наследования *.bbclass, где определены общие задачи для какой-то конкретной цели, поэтому вам не нужно писать их самостоятельно, например: вы используете inherit cmake или inherit autotools в своем рецепте, когда ему нужно обеспечить вывод для источников, которые создаются соответственно CMake (и у вас определен CMakeLists.txt) или автоинструментами (Makefile.am и т. д.). Определения классов, предоставляемые OpenEmbedded, находятся в /meta/classes/, если вы используете выпуск Yocto с poky. Вы можете проверить их, и вы увидите, что, например, autotools.bbclass определил (среди прочего) задачу: autotools_do_configure(), поэтому вам не нужно писать ее с нуля. Однако вы можете переопределить ее в своем рецепте (просто предоставив собственное определение этой функции). Если рецепт нельзя изменить, то вы можете просто создать файл *.bbappend и написать свою собственную функцию do_configure(), которая переопределит функцию из *.bbclass. Так же, как в языках OO, таких как C++ или Java.

person iksajotien    schedule 18.05.2016