• Дистрибутив собранный в Yocto Project

    Berserk

    Мультимедиа центр - платформой для которого является Raspberry PI базируется на версии Kodi 17.6 Версия операционной системы собрана с помощью системы сборки "Yocto Project". читать далее

    Коди в Yocto Project
  • Yocto Project

    Роутер на Raspberry PI

    Сборка маршрутизатора c "нуля" для Raspberry Pi c использованием системы сборки "Yocto Project" читать далее

    Маршрутизатор с нуля
  • Феерический хранитель экрана

    Kodi Universe

    Проект является простым плагином для Kodi. Проект показывает как можно создать очень красивый хранитель экрана целиком опираясь на работу "open source" мирового сообщества. читать далее

    Феерический Хранитель экрана
  • примеры проектов

    Raspberry Pi

    Разное → Raspberry Pi — что можно сделать на основе «малинки»?read more

    Ссылка на статью с Хабрахабра
  • Дистрибутив собранный в Yocto Project

    Berserk

    Мультимедиа центр - платформой для которого является Raspberry Pi базируется на версии Kodi 17.6 Версия операционной системы собрана с помощью системы сборки "Yocto Project". читать далее

Мультимедиа центр Kodi 15.2
и Yocto Project





дата: 09.07.2018

Знакомство с Yocto Project

Показать/Скрыть

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





Знакомство с Yocto Project


Будучи проектом совместного сотрудничества (иногда такие проекты называются "зонтичными"), Yocto Project охватывает различные составляющие процесса разработки. Эти составляющие именуются проектами в рамках общего проекта Yocto Project и включают в себя инструменты для сборки, метаданные инструкций по сборке (называемые рецептами), библиотеки, утилиты и графические интерфейсы.



Poky


Poky – это эталонная система сборки в рамках проекта Yocto Project. Она включает в себя BitBake, OpenEmbedded-Core, пакет поддержки платформы (Board Support Package, BSP), а также прочие пакеты и компоненты, объединенные в единую сборку. Название Poky также относится к эталонному дистрибутиву Linux, который создается этой системой сборки и может быть чрезвычайно минималистичным (core-image-minimal) или же представлять собой полноценную систему Linux с графической оболочкой (core-image-sato)


Систему сборки Poky можно рассматривать как эталонную систему для всего проекта – рабочий пример реального процесса. При загрузке Yocto Project фактически вы получаете экземпляр этих инструментов, утилит, библиотек, вспомогательных средств и метаданных, которые можно использовать для создания системы по умолчанию, как это описывается в нашей статье. Как эталонная система, так и эталонный дистрибутив, который она создает, называются Poky. Вы можете использовать Poky как начальную точку для создания ваших собственных дистрибутивов, которые, конечно же, могут называться как угодно.


Для всех систем сборки требуется наличие инструментария toolchain, состоящего из компилятора, ассемблера, линковщика и прочих двоичных утилит, необходимых для создания исполняемых файлов для той или иной архитектуры. Poky использует набор GNU Compiler Collection (GCC), но вы можете указать и другие наборы компиляторов. В Poky используется механизм кросс-компиляции: использование набора компиляторов одной архитектуры для создания исполняемых файлов другой архитектуры (например, сборка ARM-дистрибутива, выполняемая на компьютере с x86-архитектурой). Разработчики часто используют кросс-компиляцию при разработке встраиваемых систем, поскольку их рабочие компьютеры намного мощнее, чем типичная встраиваемая система.


Набор метаданных


Набор метаданных разделен на слои, каждый из которых обладает дополнительной функциональностью по отношению к нижележащим слоям. Базовый слой называется OpenEmbedded-Core (или oe-core) и содержит общие рецепты, классы и связанные с ними функции, необходимые для любой сборки. Эти сборки впоследствии можно настраивать под собственные нужды, добавляя новые слои поверх слоя oe-core.


OpenEmbedded-Core совместно поддерживается проектами Yocto Project и OpenEmbedded. Слой, отделяющий проект Yocto Project от проекта OpenEmbedded, называется meta-yocto и содержит конфигурацию дистрибутива Poky, а также базовый набор эталонных BSP-пакетов. Сам по себе проект OpenEmbedded является отдельным Open Source-проектом, обладающим собственными схожими рецептами и задачами, но со своей отдельной командой руководителей и областью применения.






Описание мультимедиа центра Kodi

Показать/Скрыть

Kodi — универсальный мультимедиа центр, ранее известный как XBMC (Xbox Media Center).


XBMC (Xbox Media Center) — изначально задуманный и разрабатывающийся как открытый мультимедиа плеер для игровой приставки XBox, позже портированный на GNU / Linux. За более чем десятилетний срок разработки приложение не один раз сменило имя, в августе 2014 года было принято решение дать проекту имя Kodi, сохраняя порядок версий и функционал.


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


Расширения Kodi имеет открытый API, что позволяет сторонним разработчикам создавать множество расширений: плагины, скрипты, темы оформления, Web-интерфейсы и многое другое. Разработчики Kodi поощряют создание и распространение пользовательских расширений, предоставляя возможность их установки непосредственно из Kodi. Последние релизы построены по новой архитектуре Addons Framework’а, включают в себя Addons Manager GUI, клиент децентрализованного распространения расширений, который использует сторонние сервисы, предоставляющие контент для Kodi. «Addons Manager» («Addons Browser») позволяет пользователям напрямую загружать расширения.






Содержание:


	Введение в Yocto Project
	Установка Yocto Project в Ubuntu
	Механизм сборки дистрибутива в Yocto Project
	Краткая инструкция по созданию образа дистрибутива
	Использование OpenEmbedded совместно c Yocto Project
	Пакет поддержки платформы (BSP)
	Управление слоями Yocto c помощью Repo
	    Установка Repo 
	    Манифест для сборки дистрибутива
	    Содержимое Манифеста
	    Описание Манифеста
	    Структура bs-manifest
	    Инициализация переменных Poky
	    Инициализация Repo
	    Синхронизация Repo
	Создание конфигурации Yocto Project
	    Конфигурационный файл build/conf/local.conf
	    Конфигурационный файл build/conf/bblayers.conf 
	Слой для сборки мультимедиа центра
	    Структура верхнего уровня 
	    Конфигурация слоя
	    Состав recipes-berserk
	    Состав recipes-core
	    Состав recipes-devtools
	    Состав recipes-extended
	    Состав recipes-kernel
	    Состав recipes-mediacentre
	    Описание хранителя экрана
	    Консольное shell расширение bs-net
	    Состав recipes-multimedia
	    Состав recipes-support
	Расположение дистрибутива после сборки
	Пример записи образа дистрибутива с помощью команды dd
	Запись дистрибутива на карту памяти "microSDHC" в Ubuntu
	Запись дистрибутива на карту памяти "microSDHC" в Windows
	Загрузка дистрибутива Berserk
	


Введение в Yocto Project


Yocto Project - это совместный Open Source проект для упрощения разработки дистрибутивов для встраиваемых систем. Yocto содержит большое количество шаблонов, метаданных и инструментальных средств сборки, и поддерживает очень большое количество аппаратных платформ.

Poky – это эталонная система сборки в рамках проекта Yocto Project. Название Poky также относится к эталонному дистрибутиву Linux, который создается этой системой сборки и может быть чрезвычайно минималистичным (core-image-minimal).

В данном обзоре мы будем руководствоваться шаблоном core-image-minimal и на его основе создадим рецепт сборки дистрибутива, включающего мультимедиа центр "Kodi" для одноплатного компьютера Raspberry Pi



Установка Yocto Project в Ubuntu


Для сборки дистрибутива с помощью Yocto Project в Ubuntu вам необходимо установить следующие пакеты:

Пакеты устанавливаются с помощью команды apt-get install и команды повышения привилегий - sudo. В системе Ubuntu это широко распространенная практика, когда для выполнения административных действий используется команда sudo (при создании основного пользователя системы, он автоматически прописывается в группу "sudo").

	
	sudo apt-get install -y --no-install-suggests --no-install-recommends \
	gawk wget git-core diffstat unzip texinfo gcc-multilib \
	build-essential chrpath socat cpio python python3 python3-pip python3-pexpect \
	xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev \
	xterm
	
	
Более подробную инструкцию по установки вы можете посмотреть здесь: здесь:

Механизм сборки дистрибутива в Yocto Project


В Yocto Project каждая программная единица описывается с помощью рецепта сборки. Язык описания рецепта напоминает "bash" c возможностью вставок частей кода на языке "python". Основную информацию по синтаксису вы можете почерпнуть из руководства Yocto Project . Набор рецептов сборки в зависимости от назначения можно объединять в отдельные слои сборки.

Слои разделяются на аппаратно зависимые - BSP слои (смотрите ниже, через одну главу),
UI слои (пользовательского интерфейса), специфические Yocto слои, а также слои реализующие определенную функциональность:
например слои из OpenEmbedded => multimedia, python, perl, ruby, networking, systemd, webserver и т.д.



Краткая инструкция по созданию образа дистрибутива


1) Установите зависимости Yocto Project в Ubuntu:
	sudo apt-get install -y --no-install-suggests --no-install-recommends \
	     gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential \
	     chrpath socat cpio python python3 python3-pip python3-pexpect \
	     xz-utils debianutils iputils-ping python3-git python3-jinja2 \
	     libegl1-mesa libsdl1.2-dev xterm
	

2) Скачайте и установите Repo:
	mkdir ~/bin
	curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
	chmod a+x ~/bin/repo
	

3) Загрузите проект с github:
	mkdir torvin
	cd torvin
	repo init -u https://github.com/berserktv/bs-manifest -m raspberry/krogoth/torvin-0.2.1.xml
	repo sync	
	

4) Соберите проект:
	./shell.sh
	bitbake berserk-image
	

5) Время сборки проекта:
	Время сборки образа дистрибутива достаточно длительное
	и может занимать от четырех до N часов в зависимости от производительности
	компьютера, также в процессе сборки из "Интернета" должны быть
	загружены исходные коды всех программ входящих в дистрибутив,
	часто это полные git базы
	
	(т.е. время сборки также зависит от скорости подключения сети "Интернет")
	
	например на машине: Процессор     - Intel(R) Core(TM) i5-3570 CPU @ 3.40GHz
	                    ОЗУ           - 8 Гбайт
	                    Жесткий диск  - внешний USB-3.0  1Tбайт
	
	                    Время сборки  - 4 часа 08 минут
	                    Размер образа - 692 Мбайт
	
	Размер каталога torvin/build после завершения сборки
	(cache сборки, исходный код программ, промежуточные файлы сборки, объектные файлы,
	дополнительные мета данные, файлы пакетов и т.п.)
	                            Занимает примерно 41 ГБайт
	
	Размер каталога torvin/downloads
	(git базы приложений и tar.gz архивы)
	                            Занимают 20 Гбайт
	

6) Запишите образ дистрибутива на карту памяти - "microSDHC"


Использование OpenEmbedded совместно c Yocto Project


И еще, если вы используете Yocto Project, то наверняка вам необходимы слои с дополнительной функциональностью т.е. библиотека с большим набор рецептов на все случае жизни. И такая библиотека есть - это рецепты из OpenEmbedded. OpenEmbedded — инфраструктура для сборки пакетов для встраиваемого Linux.

OpenEmbedded полностью совместим с Yocto Project, так как этот проект был взят за основу для Yocto Project. Возможно поэтому Yocto Project отличается немного лучшей стабильностью, лучшей документацией и немного лучшей поддержкой (но в основе своей это все тотже OpenEmbedded)

OpenEmbedded предлагает решение в классе сред для кросс-компиляции. Он позволяет разработчикам создавать целостные дистрибутивы Linux для встраиваемых систем.

Некоторыми преимуществами OpenEmbedded являются:
  • поддержка разнообразных архитектур процессоров
  • множественные релизы для этих архитектур
  • инструменты для ускорения процесса пересборки после внесения изменений
  • лёгкая кастомизация
  • работает на любом дистрибутиве Linux
  • включено более 1000 пакетов для кросс-компиляции, включая GTK+, Qt, the X Windows system, Mono, Java и почти всё остальное, что может потребоваться

  • Изначально проект содержал и разрабатывал набор рецептов для BitBake, схожих с правилами ebuild для Gentoo.

    Рецепты состоят из URL на исходный код пакета, зависимостей сборки и установки и опций компилирования и установки. Во время процесса сборки они используются для отслеживания зависимостей, кросс-компилирования пакета и его запаковывания, годного для установки на целевое устройство. Также возможно создавать полные образы, состоящие из корневой файловой системы и ядра. На первом шаге при сборке компилируется набор пакетов GNU toolchain, созданных для целевой платформы.



    Пакет поддержки платформы (BSP)


    Пакет поддержки платформы (Board Support Package, BSP) - это отдельный, специализированный слой для конкретной платы, который определяет аппаратные особенности платформы т.е. реализует те специфические вещи, которые отличают одну плату от другой: особенности процессора, прерывания, адресация, особенности загрузчика, особенности видео адаптера (GPU) и т.д.



    Управление слоями Yocto c помощью Repo


    Yocto Project может использовать большое количество слоев от разных поставщиков - разработчиков оборудования, и всем этим необходимо как то управлять. Представьте себе, что у вас есть десяток различных плат, и к каждой плате поставляется отдельный BSP гит репозиторий, и это не считая инфраструктуры самого Yocto проекта, плюс возможная дополнительная функциональность из OpenEmbedded (зачем писать что то с нуля, если хорошенько поискав в OpenEmbedded вы наверняка это найдете).

    В такой ситуации отдельным простым скриптом установки уже не отделаешься. Волей, неволей приходиться искать инструменты, которые умеют это делать хорошо. Даже более чем хорошо. Одним из лучших инструментом такого рода является утилита Google - Repo.

    Repo - это основной инструмент для управления GIT репозиториями при сборки операционной системы "Андроид" с его огромной кодовой базой. Repo позволяет в одном проекте управлять десятком, если не сотней отдельных гит репозиториев, версии которых вы можете аккуратно указать в одном xml файле Манифеста

    и для правильной синхронизации всех версий всех репозиториев вам достаточно выполнить одну команду

    repo sync

    Установка Repo


    c помощью следующего набора команд вы можете установить Repo в ваш домашний каталог ~/bin (команду curl можно установить отдельно: sudo apt-get install curl)

            mkdir ~/bin
    	curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
    	chmod a+x ~/bin/repo 

    Примечание:
    в ОС Ubuntu каталог HOME/bin должен добавляться с стандартный путь запуска автоматически,
    вы можете в этом убедиться проверив файл HOME/.profile
    пример наличие строки:

    PATH="$HOME/bin:$HOME/.local/bin:$PATH"

    и в дальнейшем вам достаточно использовать в консоли команду: repo



    Манифест для сборки дистрибутива - Torvin


    Нашу сборку Kodi надо как то обозвать, назовем ее Torvin
    Под кодовым названием Torvin будет содержаться минималистический Linux дистрибутив со сборкой одной единственной программы. Имеется ввиду одна прикладная пользовательская программа - Kodi, и ничего лишнего (все остальное системный уровень). Для мультимедиа центра этого вполне достаточно.
    История названия Показать/Скрыть

    	
    	Примечание hehehe:
    	Это не тот Torvin, который дуболом, а тот Torvin который дубощит 
    	или скорее этот:
    	
    	Перед ним небольшая долина, укрытая от взглядов. На земле кругом сидят 
    	сорок-пятьдесят человек. У всех мечи или топоры, но копья воткнуты 
    	в землю, щиты лежат. Они сидят в пределах огороженного пространства. 
    	По краям воткнуты копья, между ними протянуты нити. А на нитях яркие 
    	гроздья рябины, теперь, осенью, они уже красные. В центре огороженного
    	пространства горит костер, вокруг него и сидят люди. Рядом с костром 
    	одно копье, острием вверх, наконечник блестит серебром. У костра и копья
    	стоит человек спиной к тайным зрителям, он говорит о чем-то, убеждая,
    	приказывая. В отличие от всех остальных, его одежда не из естественной
    	окраски домотканой материи, она не окрашена в зеленый, синий или коричневый
    	цвет. Одежда ослепительно белая, как белок яйца. На боку у человека молот, 
    	с короткой рукоятью, с двусторонней головкой, – кузнецкий молот.
    	...
    	           "Гарри-Гаррисон, роман: Молот и крест"
    	
    	
    	

    Содержимое Манифеста


    Для управления слоями дистрибутива используется файл torvin-0.2.1.xml

    
    	<?xml version="1.0" encoding="UTF-8"?>
    	<manifest>
    	  <default sync-j="4" revision="krogoth"/>
    	
    	  <remote fetch="https://git.yoctoproject.org/git" name="yocto"/>
    	  <remote fetch="https://github.com/openembedded" name="oe"/>
    	  <remote fetch="https://github.com/berserktv" name="bs"/>
    	
    	  <project remote="bs" revision="master" name="bs-manifest" path="sources/bs-manifest">
    	    <linkfile dest="setup-environment" src="../setup-environment"/>
    	    <linkfile dest="shell.sh" src="../raspberry/shell.sh"/>
    	    <linkfile dest="sources/base" src="../raspberry/krogoth"/>
    	  </project>
    	
    	  <project remote="yocto" revision="krogoth" name="poky" path="sources/poky"/>
    	  <project remote="oe"    revision="krogoth" name="meta-openembedded" path="sources/meta-openembedded"/>
    	  <project remote="yocto" revision="krogoth" name="meta-raspberrypi"  path="sources/meta-raspberrypi"/>
    	  <project remote="bs"    revision="krogoth" name="berserk" path="sources/berserk"/>
    	
    	</manifest>
    	

    Описание Манифеста


    В начале манифеста тегами remote обозначены два основных GIT репозитория и один вспомогательный:
  • https://git.yoctoproject.org/git - Yocto репозиторий, именованный как yocto
  • https://github.com/openembedded - OpenEmbedded репозиторий, именованный как oe
  • https://github.com/berserktv - вспомогательный GIT репозиторий, именованный как bs

  • В следующей части манифеста с помощью сокращенных именований осуществляется работа с проектами расположенными в этих репозиториях, тег project содержит следующие атрибуты:
  • remote - имя удаленного именованного репозитория
  • revision - название ветки или hash версии
  • name - имя проекта в указанном репозитории
  • path - локальный путь проекта в вашей файловой системе

  • 	Пример работы тега
    	<project remote="bs" revision="master" name="bs-manifest" path="sources/bs-manifest">
    	</project>
    	
    	данный xml тег описывает выполнение следующей команды:
    	 
    	git clone https://github.com/berserktv/bs-manifest -b master sources/bs-manifest
    	

    В теле тега project можно указать команды создания символических ссылок на нужную нам инфраструктуру вспомогательных скриптов начальной инициализации и штатного запуска системы сборки Poky

    	Пример указания тегов linkfile
    	<project remote="bs" revision="master" name="bs-manifest" path="sources/bs-manifest"> 
    	  <linkfile dest="setup-environment" src="../setup-environment">
    	  <linkfile dest="shell.sh" src="../raspberry/shell.sh">
    	  <linkfile dest="sources/base" src="../raspberry/krogoth">
    	</project>
    	
    	Создание символической ссылки разворачивается примерно
    	в следующую команду: ln -s src dest
    	т.е.
    	      # создание двух ссылок на файлы
    	      ln -s sources/bs-manifest/setup-environment  setup-environment
    	      ln -s sources/bs-manifest/raspberry/shell.sh shell.sh 
    	      
    	      # создание ссылки на каталог, разворачивается
    	      # примерно в следующий набор команд
    	      cd sources
    	      ln -s bs-manifest/raspberry/krogoth base 
    	

    Структура bs-manifest


    	├── COPYING.MIT
    	├── raspberry
    	│   ├── krogoth
    	│   │   ├── conf
    	│   │   │   ├── bblayers.conf
    	│   │   │   └── local.conf
    	│   │   └── torvin-0.2.1.xml
    	│   └── shell.sh
    	├── README.md
    	└── setup-environment
    	

    Проект bs-manifest используется для гибкого управления конфигурациями, с учетом сборок разных версий дистрибутива. Начнем сборку с первой версии, у нас это Torvin v0.2.1



    Инициализация переменных Poky


    Скрипт начальной инициализации setup-environment был взят из одного проекта Freescale Community. Скрипт отвечает за стартовую инициализацию переменных системы сборки Poky, скрипт создает структуру каталогов, в которой очень хорошо разделяется:

    • build - каталог сборки
    • source - исходный код рецептов сборки
    • download - каталог загрузки кода программ (git базы, tar.gz архивы)

    Содержимое скрипта setup-environment: Показать/Скрыть
     
    	#!/bin/sh
    	# -*- mode: shell-script; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
    	#
    	# Copyright (C) 2012, 2013, 2016 O.S. Systems Software LTDA.
    	# Authored-by:  Otavio Salvador <otavio@ossystems.com.br>
    	#
    	# This program is free software; you can redistribute it and/or modify
    	# it under the terms of the GNU General Public License version 2 as
    	# published by the Free Software Foundation.
    	#
    	# This program is distributed in the hope that it will be useful,
    	# but WITHOUT ANY WARRANTY; without even the implied warranty of
    	# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    	# GNU General Public License for more details.
    	#
    	# You should have received a copy of the GNU General Public License along
    	# with this program; if not, write to the Free Software Foundation, Inc.,
    	# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
    	#
    	# Add options for the script
    	# Copyright (C) 2013 Freescale Semiconductor, Inc.
    	
    	CWD=`pwd`
    	PROGNAME="setup-environment"
    	
    	usage()
    	{
    	    echo -e "\nUsage: source $PROGNAME <build-dir>
    	    <build-dir>: specifies the build directory location (required)
    	
    	If undefined, this script will set \$MACHINE to 'imx6qsabresd'.
    	"
    	
    	    ls sources/poky/*/conf/machine/*.conf > /dev/null 2>&1
    	    if [ $? -eq 0 ]; then
    	        echo -e "
    	Supported machines: `echo; ls sources/poky/*/conf/machine/*.conf \
    	| sed s/\.conf//g | sed -r 's/^.+\///' | xargs -I% echo -e "\t%"`
    	
    	To build for a machine listed above, run this script as:
    	MACHINE=<machine> source $PROGNAME <build-dir>
    	"
    	    fi
    	}
    	
    	clean_up()
    	{
    	   unset EULA LIST_MACHINES VALID_MACHINE
    	   unset CWD TEMPLATES SHORTOPTS LONGOPTS ARGS PROGNAME
    	   unset generated_config updated
    	   unset MACHINE SDKMACHINE DISTRO OEROOT
    	}
    	
    	# get command line options
    	SHORTOPTS="h"
    	LONGOPTS="help"
    	
    	ARGS=$(getopt --options $SHORTOPTS  \
    	  --longoptions $LONGOPTS --name $PROGNAME -- "$@" )
    	# Print the usage menu if invalid options are specified
    	if [ $? != 0 -o $# -lt 1 ]; then
    	   usage && clean_up
    	   return 1
    	fi
    	
    	eval set -- "$ARGS"
    	while true;
    	do
    	    case $1 in
    	        -h|--help)
    	           usage
    	           clean_up
    	           return 0
    	           ;;
    	        --)
    	           shift
    	           break
    	           ;;
    	    esac
    	done
    	
    	if [ "$(whoami)" = "root" ]; then
    	    echo "ERROR: do not use the BSP as root. Exiting..."
    	fi
    	
    	if [ -z "$MACHINE" ]; then
    	    usage && clean_up
    	    return 1
    	fi
    	
    	# Check the machine type specified
    	LIST_MACHINES=`ls -1 $CWD/sources/poky/*/conf/machine $CWD/sources/*/conf/machine`
    	VALID_MACHINE=`echo -e "$LIST_MACHINES" | grep ${MACHINE}.conf$ | wc -l`
    	if [ "x$MACHINE" = "x" ] || [ "$VALID_MACHINE" = "0" ]; then
    	    echo -e "\nThe \$MACHINE you have specified ($MACHINE) is not supported by this build setup"
    	    usage && clean_up
    	    return 1
    	else
    	    if [ ! -e $1/conf/local.conf.sample ]; then
    	        echo "Configuring for ${MACHINE}"
    	    fi
    	fi
    	
    	if [ -z "$SDKMACHINE" ]; then
    	    SDKMACHINE='i686'
    	fi
    	
    	if [ -z "$DISTRO" ]; then
    	    DISTRO='poky'
    	fi
    	
    	OEROOT=$PWD/sources/poky
    	if [ -e $PWD/sources/oe-core ]; then
    	    OEROOT=$PWD/sources/oe-core
    	fi
    	
    	# Ensure all files in sources/base are kept in sync with project root
    	updated=
    	#for f in $CWD/sources/base/*; do
    	#    file="$(basename $f)"
    	#    if [ "$file" = "conf" ] || echo $file | grep -q '~$'; then
    	#        continue
    	#    fi
    	#
    	#    if ! cmp -s "$file" "$f"; then
    	#        updated="true"
    	#        [ -e $file ] && chmod u+w $file
    	#        cp $f $file
    	#    fi
    	#done
    	if [ "$updated" = "true" ]; then
    	    echo "The project root content has been updated. Please run '$PROGNAME' again."
    	    return
    	fi
    	
    	. $OEROOT/oe-init-build-env $CWD/$1 > /dev/null
    	
    	# if conf/local.conf not generated, no need to go further
    	if [ ! -e conf/local.conf ]; then
    	    clean_up && return 1
    	fi
    	
    	# Clean up PATH, because if it includes tokens to current directories somehow,
    	# wrong binaries can be used instead of the expected ones during task execution
    	export PATH="`echo $PATH | sed 's/\(:.\|:\)*:/:/g;s/^.\?://;s/:.\?$//'`"
    	
    	generated_config=
    	if [ ! -e conf/local.conf.sample ]; then
    	    mv conf/local.conf conf/local.conf.sample
    	
    	    # Generate the local.conf based on the Yocto defaults
    	    TEMPLATES=$CWD/sources/base/conf 
    	    grep -v '^#\|^$' conf/local.conf.sample > conf/local.conf
    	    cat >> conf/local.conf <<EOF
    	
    	DL_DIR ?= "\${BSPDIR}/downloads/"
    	EOF
    	    # Change settings according environment
    	    sed -e "s,MACHINE ??=.*,MACHINE ??= '$MACHINE',g" \
    	        -e "s,SDKMACHINE ??=.*,SDKMACHINE ??= '$SDKMACHINE',g" \
    	        -e "s,DISTRO ?=.*,DISTRO ?= '$DISTRO',g" \
    	        -i conf/local.conf
    	
    	    cp $TEMPLATES/* conf/
    	
    	    for s in $HOME/.oe $HOME/.yocto; do
    	        if [ -e $s/site.conf ]; then
    	            echo "Linking $s/site.conf to conf/site.conf"
    	            ln -s $s/site.conf conf
    	        fi
    	    done
    	
    	    generated_config=1
    	fi
    	
    	cat <<EOF
    	
    	Welcome to Freescale Community BSP
    	
    	The Yocto Project has extensive documentation about OE including a
    	reference manual which can be found at:
    	    http://yoctoproject.org/documentation
    	
    	For more information about OpenEmbedded see their website:
    	    http://www.openembedded.org/
    	
    	You can now run 'bitbake <target>'
    	
    	Common targets are:
    	    core-image-minimal
    	    meta-toolchain
    	    meta-toolchain-sdk
    	    adt-installer
    	    meta-ide-support
    	
    	EOF
    	
    	if [ -n "$generated_config" ]; then
    	    cat <<EOF
    	Your build environment has been configured with:
    	
    	    MACHINE=$MACHINE
    	    SDKMACHINE=$SDKMACHINE
    	    DISTRO=$DISTRO
    	EOF
    	else
    	    echo "Your configuration files at $1 have not been touched."
    	fi
    	
    	clean_up
    	


    Содержимое скрипта shell.sh: Показать/Скрыть
     
    	#!/bin/bash
    	
    	MACHINE='raspberrypi3' source ./setup-environment build
    	
    	echo "you may try 'bitbake core-image-minimal'"
    	bash
    	

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

    Инициализация Repo


    Для инициализации repo необходимо выполнить команду:

    
    	mkdir torvin
    	cd torvin
    	repo init -u https://github.com/berserktv/bs-manifest -m raspberry/krogoth/torvin-0.2.1.xml
    	

    где -u https://github.com/berserktv/bs-manifest указывает GIT путь к проекту манифеста

    примечание: можно еще указать -b имя_ветки , если ключ -b не указывать, то подразумевается ветка master (по умолчанию)

    где путь -m raspberry/krogoth/torvin-0.2.1.xml к конфигурационному файлу указывает следующее:

    1. имя аппаратной платформы для которой осуществляется сборка — raspberry
    2. имя основной рабочей ветки Yocto/OpenEmbedded — krogoth
    3. кодовое имя версии — torvin (все версии серии 0.2.x)
    4. и наконец цифровой номер версии которая собирается — 0.2.1


    Синхронизация Repo


    для начальной загрузки или последующей синхронизации достаточно выполнить команду:


    repo sync
    которая заберет все последнии версии GIT проектов указанных в файле манифеста (обычно указываются ветки), если же у вас указан hash коммита в атрибуте revision, то версия для данного git репозитория не измениться.


    Создание конфигурации Yocto Project


    После того, как будет выполнена команда repo sync, можно приступать к созданию основной конфигурации Yocto Project:


    ./shell.sh

    после завершения скрипта, будет создан каталог build/conf:

    c двумя основными файлами:
    • local.conf - управляющие переменные сборки:
      название платформы, тип дистрибутива и пакетов сборки и т.д.
    • bblayers.conf - конфигурация подключенных слоев Yocto Project

    по умолчанию скрипт setup-environment ищет по пути sources/base/conf
    начальную конфигурацию, и если файлы local.conf и bblayers.conf
    существуют, то они копируются в build/conf
    (см. переменную TEMPLATES в setup-environment)

    т.е. файлы берутся из sources/bs-manifest/raspberry/krogoth/conf
    см. создание символической ссылки на base


    Конфигурационный файл build/conf/local.conf

    Показать/Скрыть
    	
    	MACHINE ??= 'raspberrypi3'
    	DISTRO ?= 'poky'
    	PACKAGE_CLASSES ?= "package_deb"
    	EXTRA_IMAGE_FEATURES ?= "debug-tweaks"
    	USER_CLASSES ?= "buildstats image-mklibs image-prelink"
    	PATCHRESOLVE = "noop"
    	BB_DISKMON_DIRS = "\
    	    STOPTASKS,${TMPDIR},1G,100K \
    	    STOPTASKS,${DL_DIR},1G,100K \
    	    STOPTASKS,${SSTATE_DIR},1G,100K \
    	    STOPTASKS,/tmp,100M,100K \
    	    ABORT,${TMPDIR},100M,1K \
    	    ABORT,${DL_DIR},100M,1K \
    	    ABORT,${SSTATE_DIR},100M,1K \
    	    ABORT,/tmp,10M,1K"
    	PACKAGECONFIG_append_pn-qemu-native = " sdl"
    	PACKAGECONFIG_append_pn-nativesdk-qemu = " sdl"
    	CONF_VERSION = "1"
    	
    	DL_DIR ?= "${BSPDIR}/downloads/"
    	
    	# size memory GPU for Raspberry Pi
    	GPU_MEM = "128"
    	GPU_MEM_256 = "112"
    	GPU_MEM_512 = "160"
    	GPU_MEM_1024 = "320"
    	
    	# for libs: "mpeg2dec libmad ffmpeg x264"
    	LICENSE_FLAGS_WHITELIST += "commercial"
    	
    	
    	


    Конфигурационный файл build/conf/bblayers.conf

    Показать/Скрыть
    	
    	# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf
    	# changes incompatibly
    	LCONF_VERSION = "6"
    	POKY_BBLAYERS_CONF_VERSION = "2"
    	
    	BBPATH = "${TOPDIR}"
    	BSPDIR := "${@os.path.abspath(os.path.dirname(d.getVar('FILE', True)) + '/../..')}"
    	BBFILES ?= ""
    	
    	BBLAYERS ?= " \
    	  ${BSPDIR}/sources/poky/meta \
    	  ${BSPDIR}/sources/poky/meta-poky \
    	  ${BSPDIR}/sources/poky/meta-yocto \
    	  ${BSPDIR}/sources/poky/meta-yocto-bsp \
    	  ${BSPDIR}/sources/meta-openembedded/meta-oe \
    	  ${BSPDIR}/sources/meta-openembedded/meta-python \
    	  ${BSPDIR}/sources/meta-openembedded/meta-networking \
    	  ${BSPDIR}/sources/meta-openembedded/meta-multimedia \
    	  ${BSPDIR}/sources/meta-raspberrypi \
    	  ${BSPDIR}/sources/berserk/meta-berserk \
    	  "
    	
    	
    	



    основные переменные файла local.conf - на которые нужно обратить внимание:

    • MACHINE - название платформы под которую осуществляется сборка
    • DISTRO - название категории дистрибутива
    • PACKAGE_CLASSES - формат пакетов для установки ПО
    • LICENSE_FLAGS_WHITELIST - использование дополнительных лицензий



    специфические настройки для семейства плат Raspberry Pi
    • GPU_MEM = "128" - количество видео памяти для видео адаптера GPU (выделяется из ОЗУ)
    • GPU_MEM_256 = "112" - то же самое только для плат с общим размером ОЗУ = 256Мб
    • GPU_MEM_512 = "160" - то же самое только для плат с общим размером ОЗУ = 512Мб
    • GPU_MEM_1024 = "320" - то же самое только для плат с общим размером ОЗУ = 1024Мб

    примечание: например если оставить только переменную GPU_MEM = "128", то для всех плат RPI, RPI2, RPI3 не зависимо от количества реальной оперативной памяти на плате будет всегда выделено для GPU - 128Мб (и общий размер ОЗУ уменьшиться на это значение),

    в случае указания всех переменных,
    директивы GPU_MEM_256, GPU_MEM_512, GPU_MEM_1024 являются более приоритетными

    Для сборки Мультимедиа центра, помимо штатных слоев Yocto см. файл bblayers.conf

    	${BSPDIR}/sources/poky/meta \
    	${BSPDIR}/sources/poky/meta-poky \
    	${BSPDIR}/sources/poky/meta-yocto \
    	${BSPDIR}/sources/poky/meta-yocto-bsp \
    	
    мы подключили четыре слоя с дополнительной функциональностью из OpenEmbedded.
    Мультимедиа Центр Kodi - является сложной программой, которая использует большое количество внешних библиотек и каждую библиотеку нужно собрать с помощью рецепта сборки, поэтому по возможности мы будем использовать все рецепты из OpenEmbedded в категории Multimedia,
    ну а то что не найдем, поищем в похожих проектах на github

    у нас подключен слой Multimedia и слои от которых он зависит
    	${BSPDIR}/sources/meta-openembedded/meta-oe \
    	${BSPDIR}/sources/meta-openembedded/meta-python \
    	${BSPDIR}/sources/meta-openembedded/meta-networking \
    	${BSPDIR}/sources/meta-openembedded/meta-multimedia \
    	
    далее подключен основной BSP слой для платформы Raspberry Pi
    	${BSPDIR}/sources/meta-raspberrypi \
    	
    ну и в самом конце подключен наш слой отвечающий за сборку образа дистрибутива с функциональностью <<Мультимедиа центра>> для платы Raspberry Pi (см. следующую главу)
    	${BSPDIR}/sources/berserk/meta-berserk \
    	



    Слой для сборки мультимедиа центра


    Для того, чтобы создать образ дистрибутива для платы Raspberry Pi
    мы создали отдельный под проект, который назвали Berserk.
    История названия Показать/Скрыть

    Кутреда никогда не приходилось подбадривать, только сдерживать. До сих пор.
    Теперь же он был молчалив, печален, дух скрытой угрозы, который всегда исходил от него, исчез.”

    Гарри Гаррисон, роман: Крест и король

    проект находиться по адресу: https://github/berserktv/berserk

    исходный код проекта можно загрузить с помощью команды:
    
    	git clone https://github.com/berserktv/berserk -b krogoth
    	


    Структура верхнего уровня проекта berserk


    	├── COPYING.MIT
    	├── meta-berserk
    	│   ├── conf
    	│   ├── recipes-berserk
    	│   ├── recipes-core
    	│   ├── recipes-devtools
    	│   ├── recipes-extended
    	│   ├── recipes-kernel
    	│   ├── recipes-mediacentre
    	│   ├── recipes-multimedia
    	│   └── recipes-support
    	└── README.md
    	
    Итак вся функциональность для сборки мультимедиа центра у нас находиться в слое meta-berserk


    Состав слоя:

    • conf - конфигурация слоя
    • recipes-berserk - рецепт сборки образа дистрибутива, рецепты настройки тв, сети и первого запуска
    • recipes-core - базовые рецепты, в частности модификация рецепта стартовой заставки
    • recipes-devtools - рецепты инструментальных средств разработки
    • recipes-extended - дополнительные рецепты
    • recipes-kernel - рецепты сборки ядра
    • recipes-mediacentre - рецепты сборки Kodi
    • recipes-multimedia - мультимедиа рецепты
    • recipes-support - рецепты поддержки различных библиотек


    конфигурация слоя


    включает файл layer.conf

    
    	  # We have a conf and classes directory, add to BBPATH
    	  BBPATH .= ":${LAYERDIR}"
    	  
    	  # We have a packages directory, add to BBFILES
    	  BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
    	              ${LAYERDIR}/recipes-*/*/*.bbappend"
    	  
    	  
    	  # BerSerk
    	  BBFILE_COLLECTIONS += "bs"
    	  BBFILE_PATTERN_bs := "^${LAYERDIR}/"
    	  BBFILE_PRIORITY_bs = "5"
    	  
    	  
    	  DISTRO_FEATURES_append += " wifi x11 openglesv2"
    	  
    	  PREFERRED_VERSION_ffmpeg = "2.6"
    	  SYSVINIT_ENABLED_GETTYS  = "1"
    	  PREFERRED_VERSION_libcec = "3.1.%"
    	  
    	  PREFERRED_VERSION_linux-raspberrypi ?= "4.1.21%"
    	  

    Файл содержит указание версий библиотек ffmpeg, libcec, номер версии linux ядра, а также количество виртуальных консолей (tty)
    и включает особенности дистрибутива - wifi x11 openglesv2
    	PREFERRED_VERSION_ffmpeg = "2.6"
    	PREFERRED_VERSION_libcec = "3.1.%"
    	PREFERRED_VERSION_linux-raspberrypi ?= "4.1.21%"
    	
    	SYSVINIT_ENABLED_GETTYS  = "1"
    	
    	DISTRO_FEATURES_append += " wifi x11 openglesv2"
    	


    состав recipes-berserk


    	├── bs-net
    	│   └── bs-net_0.1.1.bb
    	├── first-run
    	│   ├── files
    	│   │   └── first-run.sh
    	│   └── first-run.bb
    	├── images
    	│   └── berserk-image.bb
    	└── tv
    	    ├── files
    	    │   └── berserk.m3u8
    	    ├── tv-config.bb
    	    └── tv-dir.inc
    	
    где:
    • bs-net_0.1.1.bb
      
      	# Simple network "shell" extension for wlan/ethernet 
      	# Project "Berserk", autor Alexander Demachev, site https://berserk.tv
      	# license -  The MIT License (MIT)
      	
      	DESCRIPTION = "Simple network shell extension for wlan/ethernet"
      	SECTION = "nets"
      	PR = "r1"
      	LICENSE = "MIT"
      	MD5_SUM = "md5=4d92cd373abda3937c2bc47fbc49d690"
      	MIT_SUM = "md5=3da9cfbcb788c80a0384361b4de20420"
      	
      	LIC_FILES_CHKSUM = "file://${COREBASE}/LICENSE;${MD5_SUM} \
      	                    file://${COREBASE}/meta/COPYING.MIT;${MIT_SUM}"
      	
      	
      	SRC_URI = "git://github.com/berserktv/bs-net.git;branch=master"
      	SRCREV = "f1598f827416071f2651034cf2b1a22b1befc378"
      	
      	require recipes-mediacentre/kodi/kodi-dir.inc
      	
      	NET_DIR = "/etc/network"
      	UDEV_DIR = "/etc/udev/rules.d"
      	ETH_CONFIGS = "${KODI_USERDATA}/eths"
      	WLAN_CONFIGS = "${KODI_USERDATA}/wlans"
      	
      	S = "${WORKDIR}/git"
      	
      	PACKAGES = "${PN}"
      	FILES_${PN} = "${NET_DIR} ${UDEV_DIR} ${KODI_HOME_DIR}"
      	
      	RDEPENDS_${PN} += "ntp wpa-supplicant iw gawk"
      	
      	do_install_append() {
      	    install -d ${D}${UDEV_DIR}
      	    install -d ${D}${sysconfdir}/network
      	    install -d ${D}${ETH_CONFIGS}
      	    install -d ${D}${WLAN_CONFIGS}
      	
      	    install -m 0755 ${S}${NET_DIR}/dh-func.sh ${D}${sysconfdir}/network
      	    install -m 0755 ${S}${NET_DIR}/eth-manual ${D}${sysconfdir}/network 
      	    install -m 0755 ${S}${NET_DIR}/tools-wifi.sh ${D}${sysconfdir}/network
      	    install -m 0755 ${S}${NET_DIR}/wlan ${D}${sysconfdir}/network
      	    install -m 0755 ${S}${NET_DIR}/wlan-runner ${D}${sysconfdir}/network
      	    install -m 0644 ${S}${NET_DIR}/eth0 ${D}${ETH_CONFIGS}
      	
      	    install -m 0644 ${S}${UDEV_DIR}/80-wifi-start.rules ${D}${UDEV_DIR} 
      	    install -m 0644 ${S}${UDEV_DIR}/85-automount.rules  ${D}${UDEV_DIR}
      	}
      	
      - рецепт сборки shell расширения для WLAN/Ethernet интерфейсов
    • first-run.bb
      
      	DESCRIPTION = "First run script"
      	SECTION = "configs"
      	PR = "r1"
      	LICENSE = "MIT"
      	MD5_SUM = "md5=4d92cd373abda3937c2bc47fbc49d690"
      	MIT_SUM = "md5=3da9cfbcb788c80a0384361b4de20420"
      	LIC_FILES_CHKSUM = "file://${COREBASE}/LICENSE;${MD5_SUM} \
      	                    file://${COREBASE}/meta/COPYING.MIT;${MIT_SUM}"
      	
      	# секция установки скрипта первого запуска
      	SRC_URI = "file://first-run.sh"
      	
      	inherit update-rc.d
      	
      	S = "${WORKDIR}"
      	
      	
      	INITSCRIPT_NAME = "first-run.sh"
      	# вызов скрипта определяющего первое включение компьютера на уровень исполнения S
      	# вызывается после S03mountall.sh S04udev S05modutils.sh 
      	# S06alignment.sh S06checkroot.sh S07bootlogd
      	INITSCRIPT_PARAMS = "start 07 S ."
      	
      	
      	
      	PACKAGES = "${PN}"
      	FILES_${PN} = "first.bs.run /etc/init.d"
      	
      	do_install_append() {
      	    install -d ${D}${sysconfdir}/init.d
      	    install -m 0755  ${WORKDIR}/first-run.sh ${D}${sysconfdir}/init.d
      	    # FIRST_RUN="/first.bs.run"
      	    touch ${D}/first.bs.run
      	}
      	
      - рецепт первого запуска, дополнительное разбиение дисков
    • first-run.sh
      
      	#!/bin/sh
      	
      	# скрипт предназначен для создания нового раздела диска microSDHC
      	# диск создается при первом включении в неразмеченной области,
      	# autor Alexander Demachev, project: berserk (site: https://berserk.tv)
      	#
      	# исходная разметка диска /dev/sdX при создании образа:
      	# где sdX - обобщенное название карты памяти microSDHC, точное название см. /etc/fstab
      	# первый раздел /dev/sdX1 => fat16 будет содержать ядро, загрузчик и драйверы
      	#                            для поддержки Raspberry Pi (dtb образы)
      	# второй раздел /dev/sdX2 => ext3  будет содержать корневую файловую систему, rootfs
      	#
      	# оставшиеся место не занято,
      	# и здесь будет создан третий раздел /dev/sdX3 для хранения мультимедиа информации
      	# после создания, раздел будет монтироваться в каталог /media/data
      	#
      	# последовательность действий:
      	# в каталоге /etc/rcS.d необходимо создать символическую ссылку S07first-run.sh
      	# ссылка на файл ../init.d/first-run.sh
      	#
      	FIRST_RUN="/first.bs.run"
      	DISK_DEV=/dev/mmcblk0
      	DISK_ROOTFS=/dev/mmcblk0p2
      	DISK_MEDIA=/dev/mmcblk0p3
      	MOUNT_MEDIA=/media/data
      	
      	
      	#######################################################################
      	# section func
      	
      	check_need_create() {
      	    local disk="$1"
      	    # в случае отсутствия раздела, его необходимо создать
      	    if [ -b "$disk" ]; then return 1
      	    else return 0; fi
      	}
      	
      	create_partition_fat32() {
      	    local dev_disk="$1"
      	    local dev2="$2"
      	    local dev3="$3"
      	    local name="DATA"
      	    local END2_MBYTE=`parted -s -m $dev_disk unit MB print \
      	          | grep "^2:" | cut -d":" -f3 \
      	          | tr "MB" " " | sed "s/\.[0-9]*//" `
      	    local START_MBYTE="$END2_MBYTE"
      	    #local START_MBYTE=`expr $END2_MBYTE + 1`
      	    local com_args="-s -a optimal $dev_disk mkpart primary \
      	                    fat32 $START_MBYTE 100% print quit"
      	
      	    parted $com_args
      	    local code=$?
      	    sync
      	    if [ $? -eq 0 ]; then echo "SUCCESS => parted $com_args"
      	    else echo "FAIL => parted $com_args"; return 1; fi
      	
      	    com_args="-F 32 -n $name $dev3"
      	    mkfs.vfat $com_args
      	    code=$?
      	    sync
      	    if [ $code -eq 0 ]; then echo "SUCCESS => mkfs.vfat $com_args"
      	    else echo "FAIL => mkfs.vfat $com_args"; fi
      	    return $code
      	}
      	
      	# отключил изменение размера rootfs (ext3), 
      	# так как операция resize2fs /dev/раздел занимает 6-7минут (размер раздела 3GB)
      	# как нибудь посмотрю время изменения раздела ext4 через ioctl EXT4_IOC_RESIZE_FS
      	#if [ -d "/mnt/.psplash" ]; then 
      	#echo "MSG Resizing the disk space on the first running ..." > $fifo; 
      	#fi
      	#resize_root_partition $DISK_DEV
      	resize_root_partition() {
      	    local dev_disk="$1"
      	    local full_size_byte=`fdisk -l $dev_disk | grep "${dev_disk}:" | cut -d" " -f5`
      	    if [ -z "$full_size_byte" ]; then return 1; fi
      	
      	    local END2_BYTE=`parted -s -m $dev_disk unit B print | grep "^2:" \
      	                     | cut -d":" -f3 | tr -d "B" | sed "s/\.[0-9]*//"`
      	    local size_part=$(($full_size_byte-$END2_BYTE))
      	    if [ $? -ne 0 ] || [ -z "$size_part" ]; then return 2; fi
      	
      	    local ten_persent=$(($size_part/10))
      	    if [ $? -ne 0 ] || [ -z "$ten_persent" ]; then return 3; fi
      	
      	    local NEW_END2_BYTE=$(($END2_BYTE+$ten_persent))
      	    local com_args="-s -a optimal $dev_disk unit B resizepart 2 $NEW_END2_BYTE"
      	    parted $com_args
      	    local code=$?
      	    sync
      	    if [ $code -eq 0 ]; then echo "SUCCESS => parted $com_args"; return 0;
      	    else echo "FAIL => parted $com_args"; return 4; fi
      	}
      	
      	mount_create_partition_fat32() {
      	    local dev="$1"
      	    local media="$2"
      	    local code=1
      	    if mount | grep -q "$media"; then 
      	        echo "$dev already mount on $media, exit"; return 0; 
      	    fi
      	    if [ ! -d "$media" ]; then mkdir $media;  fi
      	
      	    sync
      	    com_args="-n -t vfat -o rw $dev $media"
      	    mount $com_args
      	    if mount | grep -q "$media"; then code=0;
      	    else mount $com_args; code=$?; fi
      	
      	    if [ $code -eq 0 ]; then echo "SUCCESS => mount $com_args"
      	    else echo "FAIL => mount $com_args"; fi
      	    return $code
      	}
      	
      	add_disk_in_fstab() {
      	    local disk="$1"
      	    local point="$2"
      	    # example
      	    #/dev/mmcblk0p     /media/card     auto       defaults,sync,noauto  0  0
      	    echo "$disk        $point          auto       defaults 1  1" >> /etc/fstab
      	    sync
      	}
      	
      	#######################################################################
      	# section start
      	# в корне раздела находиться файл по которому определяется первое включение устройcтва
      	fifo="/mnt/.psplash/psplash_fifo"
      	if [ ! -f "$FIRST_RUN" ]; then
      	    if [ -d "/mnt/.psplash" ]; then
      	        echo "MSG  ver 0.2.1 TORVIN     \"Along Came a Hammersmith\"" > $fifo
      	    fi
      	    exit 0
      	fi
      	
      	
      	# файл используется для вывода окна настройки сети во время первого запуска Kodi
      	touch "/tmp/$FIRST_RUN"
      	
      	if check_need_create $DISK_MEDIA; then
      	    if create_partition_fat32 $DISK_DEV $DISK_ROOTFS $DISK_MEDIA; then
      	      if [ -d "/mnt/.psplash" ]; then 
      	          echo "MSG Creating a new partition on the first running ..." > $fifo; 
      	      fi
      	      if mount_create_partition_fat32 $DISK_MEDIA $MOUNT_MEDIA; then 
      	          add_disk_in_fstab $DISK_MEDIA $MOUNT_MEDIA;
      	      else echo "ERROR_2, not mount_create_partition_fat32 $DISK_MEDIA $MOUNT_MEDIA"; fi
      	    else
      	      echo "ERROR_1, not create_partition_fat32 $DISK_DEV $DISK_ROOTFS $DISK_MEDIA"
      	    fi
      	fi
      	
      	rm -f "$FIRST_RUN"
      	exit 0
      	
      - shell скрипт первого запуска (запускается на уровне исполнения S)
    • berserk-image.bb
      
      	# Project: "Berserk" - build Kodi for the Raspberry Pi platform
      	# autor: Alexander Demachev, site: https://berserk.tv
      	# license -  The MIT License (MIT)
      	
      	DESCRIPTION = "Berserk - the image for the Raspberry PI"
      	LICENSE = "MIT"
      	MD5_SUM = "md5=4d92cd373abda3937c2bc47fbc49d690"
      	MIT_SUM = "md5=3da9cfbcb788c80a0384361b4de20420"
      	LIC_FILES_CHKSUM = "file://${COREBASE}/LICENSE;${MD5_SUM} \
      	                    file://${COREBASE}/meta/COPYING.MIT;${MIT_SUM}"
      	
      	IMAGE_FEATURES += "ssh-server-dropbear splash"
      	
      	# немного увеличиваю размер rootfs в кило байтах (100000kB=~100Mb)
      	IMAGE_ROOTFS_EXTRA_SPACE_append += "+ 100000"
      	
      	
      	# BS - BerSerk, version 0.2.1 - "Torvin"
      	# Base this image on core-image-minimal
      	include recipes-core/images/core-image-minimal.bb
      	
      	# Set default password for 'root' user
      	inherit extrausers
      	ROOTUSERNAME = "root"
      	ROOTPASSWORD = "berserk"
      	EXTRA_USERS_PARAMS = "usermod -P ${ROOTPASSWORD} ${ROOTUSERNAME};"
      	
      	
      	# стартовая заставка, которая выводиться во время загрузки
      	SPLASH = "psplash-berserk"
      	
      	BS_DEBUG_TOOLS = "ldd strace ltrace"
      	
      	BS_GLIBC = "glibc-thread-db \
      	            glibc-gconv-utf-16 \
      	            glibc-gconv-utf-32 \
      	            glibc-gconv-koi8-r \
      	            glibc-gconv-cp1251 \
      	            glibc-gconv-ibm866 \
      	            glibc-binary-localedata-en-us \
      	            glibc-binary-localedata-ru-ru \
      	            glibc-binary-localedata-ru-ru.koi8-r \
      	            glibc-charmap-cp1251 \
      	            glibc-charmap-koi8-r \
      	            glibc-charmap-utf-8 \
      	            "
      	
      	BS_BASE = "kernel-modules \
      	           lsb \
      	           pciutils \
      	           parted \
      	           tzdata \
      	           dosfstools \
      	           ntp \
      	           ntpdate \
      	           e2fsprogs-resize2fs \
      	           "
      	
      	BS_WLAN = "kernel-module-rt2800usb \
      	           kernel-module-rt2800lib \
      	           kernel-module-rt2x00lib \
      	           kernel-module-rt2x00usb \
      	           kernel-module-cfg80211 \
      	           kernel-module-nls-utf8 \
      	           kernel-module-ath9k-common \
      	           kernel-module-ath9k-hw \
      	           kernel-module-ath9k-htc \
      	           kernel-module-ctr \
      	           kernel-module-ccm \
      	           kernel-module-arc4 \
      	           "
      	
      	BS_WIFI_SUPPORT = " \
      	        iw \
      	        dhcp-client \
      	        wireless-tools \
      	        wpa-supplicant \
      	        linux-firmware \
      	        "
      	
      	BS_SOFT = "mc \
      	           kodi \
      	           kodi-runner \           
      	           kodi-settings \
      	           kodi-language-ru \
      	           kodi-pvr-iptvsimple \
      	           bs-net \
      	           tv-config \
      	           first-run \
      	           script-berserk-network \
      	           screensaver-kodi-universe \
      	           "
      	
      	
      	
      	# Include modules in rootfs
      	IMAGE_INSTALL += " \
      	    ${BS_BASE} \
      	    ${BS_WLAN} \
      	    ${BS_WIFI_SUPPORT} \
      	    ${BS_GLIBC} \
      	    ${BS_SOFT} \
      	    ${BS_DEBUG_TOOLS} \
      	    "
      	
      	ROOTFS_POSTPROCESS_COMMAND += "fix_ntpdate; "
      	
      	# FIXME: быстрая заплатка (перенести в версию bs-net)
      	fix_ntpdate() {
      	    sed -i "s|/usr/bin/ntpdate|/usr/sbin/ntpdate|g" \
      	            ${IMAGE_ROOTFS}/etc/network/dh-func.sh
      	}
      	
      - рецепт сборки образа дистрибутива
    • tv-config.bb
      
      	DESCRIPTION = "TV config for Berserk Image"
      	SECTION = "configs"
      	PR = "r1"
      	LICENSE = "MIT"
      	MD5_SUM = "md5=4d92cd373abda3937c2bc47fbc49d690"
      	MIT_SUM = "md5=3da9cfbcb788c80a0384361b4de20420"
      	LIC_FILES_CHKSUM = "file://${COREBASE}/LICENSE;${MD5_SUM} \
      	                    file://${COREBASE}/meta/COPYING.MIT;${MIT_SUM}"
      	
      	require tv-dir.inc
      	
      	S = "${WORKDIR}"
      	
      	SRC_URI += " \
      	    file://${TV_CONFIG} \
      	    "
      	
      	PACKAGES = "${PN}"
      	
      	FILES_${PN} +=  "${TV_CONFIG_DIR} \
      	                "
      	
      	do_install() {
      	    install -d "${D}${TV_CONFIG_DIR}"
      	    install -m 0644 "${S}/${TV_CONFIG}" "${D}${TV_CONFIG_DIR}/${TV_CONFIG}"
      	}
      	
      - рецепт настройки конфигурации ТВ каналов по протоколу IPTV (формат m3u8)
    • berserk.m3u8
      
      	#EXTM3U
      	#EXTINF:0 group-title="Новости",ABC News English
      	http://abclive.abcnews.com/i/abc_live4@136330/master.m3u8?b=500,300,700,900,1200
      	#EXTINF:0 audio-track="ru" group-title="Новости",EuroNews Russian
      	rtsp://ewns-hls-b-stream.hexaglobe.net/rtpeuronewslive/ru_vidan750_rtp.sdp
      	#EXTINF:0 group-title="NASA ISS HD Earth Viewing",NASA ISS HD Earth Viewing
      	http://iphone-streaming.ustream.tv/uhls/17074538/streams/live/iphone/playlist.m3u8
      	#EXTINF:0 group-title="Новости",France 24 English
      	http://static.france24.com/live/F24_EN_LO_HLS/live_ios.m3u8
      	#EXTINF:0 group-title="Новости",Deutsche Welle German
      	http://www.metafilegenerator.de/DWelle/tv/ios/master.m3u8
      	#EXTINF:0 group-title="Новости",Tagesschau24
      	http://tagesschau-lh.akamaihd.net/i/tagesschau_1@119231/master.m3u8
      	#EXTINF:0 group-title="Новости",France 24 French
      	http://static.france24.com/live/F24_FR_LO_HLS/live_ios.m3u8
      	#EXTINF:0 group-title="Новости",EuroNews Arabic
      	rtsp://ewns-hls-b-stream.hexaglobe.net/rtpeuronewslive/ar_vidan750_rtp.sdp
      	#EXTINF:0 group-title="Новости",EuroNews English
      	rtsp://ewns-hls-b-stream.hexaglobe.net/rtpeuronewslive/en_vidan750_rtp.sdp
      	#EXTINF:0 group-title="Новости",EuroNews French
      	rtsp://ewns-hls-b-stream.hexaglobe.net/rtpeuronewslive/fr_vidan750_rtp.sdp
      	#EXTINF:0 group-title="Новости",EuroNews German
      	rtsp://ewns-hls-b-stream.hexaglobe.net/rtpeuronewslive/de_vidan750_rtp.sdp
      	#EXTINF:0 group-title="Новости",EuroNews Italian
      	rtsp://ewns-hls-b-stream.hexaglobe.net/rtpeuronewslive/it_vidan750_rtp.sdp
      	#EXTINF:0 group-title="Новости",EuroNews Portuguese
      	rtsp://ewns-hls-b-stream.hexaglobe.net/rtpeuronewslive/pt_vidan750_rtp.sdp
      	#EXTINF:0 group-title="Новости",EuroNews Spanish
      	rtsp://ewns-hls-b-stream.hexaglobe.net/rtpeuronewslive/es_vidan750_rtp.sdp
      	#EXTINF:0 group-title="Новости",EuroNews Turkish
      	rtsp://ewns-hls-b-stream.hexaglobe.net/rtpeuronewslive/tr_vidan750_rtp.sdp
      	#EXTINF:0 group-title="Новости",Deutsche Welle North America
      	http://www.metafilegenerator.de/DWelle/tv-northamerica/ios/master.m3u8
      	#EXTINF:0 group-title="Новости",Deutsche Welle Arabia
      	http://www.metafilegenerator.de/DWelle/tv-arabia/ios/master.m3u8
      	#EXTINF:0 group-title="Новости",Deutsche Welle Asia
      	http://www.metafilegenerator.de/DWelle/tv-asia/ios/master.m3u8
      	#EXTINF:0 group-title="Новости",Deutsche Welle Latinoamerica
      	http://www.metafilegenerator.de/DWelle/tv-latinoamerica/ios/master.m3u8
      	
      - конфигурация общедоступных телевизионных каналов


    состав recipes-core


    	└── psplash
    	    ├── files
    	    │   └── psplash-berserk-img.h
    	    └── psplash_git.bbappend
    	
    где:
    • psplash-berserk-img.h - изображение стартовой заставки
    • заголовочный файл получен с помощью утилиты gdk-pixbuf-csource
    • psplash_git.bbappend
      
      	FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
      	SRC_URI += "file://psplash-berserk-img.h"
      	
      	SPLASH_IMAGES = "file://psplash-berserk-img.h;outsuffix=berserk"
      	
      - расширение рецепта сборки стартовой заставки


    Для того, чтобы поменять изображение штатной стартовой заставки psplash на произвольную картинку необходимо выполнить следующее:

    1. FILESEXTRAPATHS_prepend - добавить каталог для ресурсов
    2. SRC_URI - добавить заголовочный файл с произвольной картинкой
    3. SPLASH_IMAGES изменить управляющую переменную пакета
      • где указать какой заголовочный файл в пакет с каким суффиксом будет интегрирован:
      • т.е. базовое название пакета psplash-outsuffix у нас "psplash-berserk"


    и далее в рецепте образа "berserk-image.bb" необходимо добавить
    в качестве особенностей дистрибутива - стартовую заставку splash

    IMAGE_FEATURES += "splash"

    и переменную с указанием конкретного названия пакета стартовой заставки

    SPLASH = "psplash-berserk"



    состав recipes-devtools


    	└── cmake
    	    └── cmake-native_3.4.3.bbappend
    	
    где:
    • cmake-native_3.4.3.bbappend
      
      	# при сборке проекта использующего функцию cmake ExternalProject_add
      	# получил сообщение об ошибке:
      	#       unsupported protocol" log: libcurl was built with SSL disabled, https
      	CMAKE_EXTRACONF +=" \
      	    -DCMAKE_USE_OPENSSL=ON \
      	"
      	
      - расширение рецепта сборки cmake


    Рецепты инструментальных средств разработки содержат один файл с расширением рецепта cmake, для native сборки пакета, т.е. для версии которая собирается под архитектурой host машины сборки и участвует в дальнейшем в качестве инструмента сборки других пакетов

    Наличие этого файла устраняет ошибку сборки

    unsupported protocol" log: libcurl was built with SSL disabled, https

    которая проявилась во время сборки kodi plugin(a) c помощью cmake и одним из правил cmake было правило загрузки исходного кода plugin(а) по протолу https посредством вызова libcurl



    состав recipes-extended


    	├── libcec
    	│   ├── files
    	│   │   └── python-install-location.patch
    	│   └── libcec_git.bb
    	└── p8platform
    	    └── p8platform_git.bb
    	
    где:
    • libcec_git.bb
      
      	SUMMARY = "USB CEC Adaptor communication Library"
      	HOMEPAGE = "http://libcec.pulse-eight.com/"
      	
      	LICENSE = "GPLv2+"
      	LIC_FILES_CHKSUM = "file://COPYING;md5=e61fd86f9c947b430126181da2c6c715"
      	
      	INHIBIT_PACKAGE_DEBUG_SPLIT = "1"
      	INHIBIT_PACKAGE_STRIP = "1"
      	
      	DEPENDS = "p8platform udev lockdev ncurses swig-native python3"
      	
      	DEPENDS += "\
      	    ${@bb.utils.contains('DISTRO_FEATURES', 'x11', 'libx11 libxrandr', '', d)}"
      	
      	DEPENDS_append_rpi = "\
      	    ${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', '', ' userland', d)}"
      	
      	PV = "3.1.0+gitr${SRCPV}"
      	
      	SRCREV = "bb09230246469b36c3a87b911aec32df31538d43"
      	SRC_URI = "git://github.com/Pulse-Eight/libcec.git \
      	           file://python-install-location.patch"
      	
      	S = "${WORKDIR}/git"
      	
      	inherit cmake pkgconfig
      	
      	# Create the wrapper for python3
      	PACKAGES += "python3-${BPN}"
      	FILES_python3-${BPN} = "${libdir}/python3*"
      	
      	
      	# cec-client and xbmc need the .so present to work :(
      	FILES_${PN} += "${libdir}/*.so"
      	INSANE_SKIP_${PN} = "dev-so"
      	# Adapter shows up as a CDC-ACM device
      	RRECOMMENDS_${PN} = "kernel-module-cdc-acm"
      	
      - рецепт сборки библиотеки libcec, для удалённого управления электронными устройствами
    • p8platform_git.bb
      
      	SUMMARY = "Platform support library used by libCEC and binary add-ons for Kodi"
      	HOMEPAGE = "http://libcec.pulse-eight.com/"
      	
      	LICENSE = "GPLv2+"
      	LIC_FILES_CHKSUM = "file://src/os.h;md5=752555fa94e82005d45fd201fee5bd33"
      	
      	PV = "2.1.0"
      	
      	SRC_URI = "git://github.com/Pulse-Eight/platform.git"
      	SRCREV = "d7bceb64541cb046421cbcd4c98d91e9bf24822f"
      	
      	S = "${WORKDIR}/git"
      	
      	inherit cmake pkgconfig
      	
      	EXTRA_OECMAKE += "-DCMAKE_INSTALL_LIBDIR=${libdir} -DCMAKE_INSTALL_LIBDIR_NOARCH=${libdir}"
      	
      	FILES_${PN}-dev += "${libdir}/p8-platform"
      	
      - рецепт сборки библиотеки поддержки платформы p8 для Kodi, является зависимостью для рецепта libcec_git.bb версии 3.1.0


    Протокол управления электронными устройствами CEC предназначен для того, чтобы вы с помощью вашего обычного пульта от "Телевизора" могли управлять мультимедиа центром Kodi. Протокол должен поддерживаться вашим телевизором, т.е. телевизор получив сигнал от пульта, должен его ретранслировать по управляющим линиям HDMI кабеля и мультимедиа центр Kodi с помощью библиотеки libcec интерпретирует этот сигнал, определяет его наличие и выполняет соответствующие действия, например перемещение позиции выделенного списка на экране при нажатие кнопки ВНИЗ на пульте.

    Обычно управляющими кнопками являются кнопки джойстика т.е. кнопка ВВЕРХ, ВНИЗ, ВПРАВО, ВЛЕВО, центральная кнопка OK (кнопка выбора), и кнопка НАЗАД или ВОВЗРАТ (часто помечается как полукруглая стрелка, указывающая направление cправо налево)

    В ветке Krogoth в слое OpenEmbedded уже присутствует рецепт сборки libcec.bb версии 2.1.4,

    sources/meta-openembedded/meta-oe/recipes-extended/libcec/libcec_git.bb

    но с нашей версией Kodi 15.2 он не совместим, поэтому был взят рецепт libcec версии 3.1.0 и его зависимость, библиотека p8platform



    состав recipes-kernel


    	└── linux
    	    ├── files
    	    │   ├── db.txt.patch
    	    │   └── rbpi.cfg
    	    └── linux-raspberrypi_4.1.bbappend
    	
    где:
    • db.txt.patch - патч с базой Regulatory Domain (используется для WiFi)
    • rbpi.cfg
      
      	# use statically compiled regulatory rules database
      	CONFIG_CFG80211_INTERNAL_REGDB=y
      	# поддержка Wifi сетевого Asus USB-N53 chipset Ralink RT3572
      	CONFIG_RT2800USB=m
      	# поддержка wifi адаптера на чипсете Atheros D-Link DWA-126 802.11n (AR9271), 
      	# NetGear WNDA3200, NetGear WNA1100, TP-Link TL-WN722N (AR9271), 
      	# TL-WN322G v3, TL-WN422G и т.д. см. cateee.net
      	CONFIG_ATH9K_HW=m
      	CONFIG_ATH9K_HTC=m
      	# настройка Wifi драйверов для работы wpa_supplicant
      	CONFIG_WIRELESS=y
      	CONFIG_WEXT_CORE=y
      	CONFIG_WEXT_PROC=y
      	CONFIG_CRYPTO_AES=y
      	# поддержка семейства протоколов IPSec, без этих модулей Wifi авторизация 
      	# при подключении wpa_supplicant не работает
      	CONFIG_CRYPTO_CCM=m
      	CONFIG_CRYPTO_CTR=m
      	CONFIG_CRYPTO_ARC4=m
      	#########################
      	# оценка производительности
      	CONFIG_HAVE_PERF_EVENTS=y
      	CONFIG_PERF_EVENTS=y
      	CONFIG_HAVE_LATENCYTOP_SUPPORT=y
      	CONFIG_LATENCYTOP=y
      	# This option adds support for ASIX AX88xxx 
      	# based USB 2.0 10/100 Ethernet adapters.
      	CONFIG_USB_NET_AX8817X=m
      	
      - фрагмент конфигурации Linux ядра
    • linux-raspberrypi_4.1.bbappend
      
      	# дополнительный параметры конфигурации описываются в rpbi.cfg
      	FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
      	
      	SRC_URI += "file://db.txt.patch;patch=1 \
      	            file://rbpi.cfg \
      	            "
      	
      	# в BSP слое meta-raspberrypi не работают фрагменты конфигураций
      	# https://github.com/agherzan/meta-raspberrypi/issues/14
      	# поэтому делаю напрямую
      	# в методе do_kernel_configme конфигурация ядра 
      	# копируется из базы архитектур arch/ в рабочий каталог
      	do_kernel_configme_append() {
      	    cat ${WORKDIR}/rbpi.cfg >> ${WORKDIR}/defconfig
      	}
      	
      	# CMDLINE for raspberrypi
      	# default CMDLINE = "dwc_otg.lpm_enable=0 console=serial0,115200
      	# root=/dev/mmcblk0p2 rootfstype=ext4 rootwait"
      	CMDLINE = "quiet dwc_otg.lpm_enable=0 console=serial0,115200 \
      	           root=/dev/mmcblk0p2 rootfstype=ext4 rootwait"
      	
      - расширение рецепта сборки ядра 4.1 для Raspberry Pi


    Wi-Fi устройства работают на определенных частотах и для них существует такое понятие как управляющий домен (regulatory domain) – именно в этом параметре указана страна, в котором, как предполагается, работает данное устройство.

    В ядре Linux имеется сопутствующая база данных, в которой для каждой страны прописаны разрешённые частоты и разрешённая для них мощность.

    В самом простом случае эту базу можно включить непосредственно в ядро статически, указав параметр:
    CONFIG_CFG80211_INTERNAL_REGDB=y
    что собственно мы и сделали, подключив патч c этой базой db.txt.patch

    И еще:
    в Yocto существует такое понятие как фрагменты конфигураций ядра. Обычно фрагмент конфигурации, файл с расширением cfg, содержит только те параметры ядра, которые вам явно необходимы для определенных целей. И этот фрагмент конфигурации добавляется к параметрам по умолчанию, которые уже присутствуют в рецепте при сборке ядра.


    примечание: правда для некоторых BSP слоев, фрагменты конфигураций не всегда работают,
    см. ссылку => https://github.com/agherzan/meta-raspberrypi/issues/14

    и нам пришлось добавить дополнительный код, для того, чтобы фрагмент конфигурации все же заработал.
    	do_kernel_configme_append() {
    	    cat ${WORKDIR}/rbpi.cfg >> ${WORKDIR}/defconfig
    	}
    	

    В дополнении рецепта bbappend, также можно изменить параметры, которые передаются ядру во время запуска: т.е. переопределить переменную CMDLINE см. файл linux-raspberrypi_4.1.bbappend



    состав recipes-mediacentre


    	├── kodi
    	│   ├── jsonschemabuilder-native.bb
    	│   ├── kodi
    	│   │   ├── kodi-isengard-rpb-backports.patch
    	│   │   ├── network-menu.patch
    	│   │   ├── run
    	│   │   │   ├── kodi.init
    	│   │   │   └── restarter.sh
    	│   │   └── settings
    	│   │       ├── advancedsettings.xml
    	│   │       ├── guisettings.xml
    	│   │       └── settings-pvr-iptvsimple.xml
    	│   ├── kodi-dir.inc
    	│   ├── kodi_git.bb
    	│   ├── kodi-runner.bb
    	│   ├── kodi-settings.bb
    	│   └── kodi-version.inc
    	└── kodi-plugins
    	    ├── files
    	    │   └── resource.language.ru_ru.tar.gz
    	    ├── kodi-language-ru_1.0.5.bb
    	    ├── kodi-pvr-iptvsimple.bb
    	    ├── screensaver-kodi-universe_0.1.1.bb
    	    └── script-berserk-network_0.2.3.bb
    	
    где:
    1. kodi/
      • jsonschemabuilder-native.bb
        
        	  SUMMARY = "Native depends JsonSchemaBuilder for Kodi multimedia center"
        	  LICENSE = "GPL-2.0"
        	  MD5_SUM = "md5=801f80980d171dd6425610833a22dbe6"
        	  LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses\
        	                      /GPL-2.0;${MD5_SUM}"
        	    
        	  require kodi-version.inc
        	  inherit autotools gettext native
        	  
        	  S = "${WORKDIR}/git"
        	  JSON_SCHEMA_DIR = "${S}/tools/depends/native/JsonSchemaBuilder"
        	  
        	  
        	  do_configure() {
        	      make -C ${JSON_SCHEMA_DIR}
        	  }
        	  
        	  do_compile() {
        	      cd ${JSON_SCHEMA_DIR}/native 
        	      make all
        	  }
        	  
        	  do_install() {
        	      cd ${JSON_SCHEMA_DIR}/native
        	      make install
        	      
        	      install -d ${D}${STAGING_DIR_NATIVE}${prefix_native}/bin
        	      install -m 0755 ${JSON_SCHEMA_DIR}/bin/* \
        	                 ${D}${STAGING_DIR_NATIVE}${prefix_native}/bin
        	  }
        	  
        - нативный рецепт для поддержки JSON
      • kodi-isengard-rpb-backports.patch - patch обратного портирования
      • network-menu.patch
        
        	  diff -Naur a/addons/skin.confluence/720p/IncludesHomeMenuItems.xml \
        	             b/addons/skin.confluence/720p/IncludesHomeMenuItems.xml
        	  --- a/addons/skin.confluence/720p/IncludesHomeMenuItems.xml \
        	      2017-04-13 19:15:24.795168483 +0300
        	  +++ b/addons/skin.confluence/720p/IncludesHomeMenuItems.xml \
        	      2017-04-13 19:14:17.439009435 +0300
        	  @@ -185,6 +185,11 @@
        	   		35
        	   		HomeSubEnd.png
        	   		
        	  +		
        	  +		    ButtonHomeSubCommonValues
        	  +		    
        	  +		    RunAddon(script.berserk.network,butnetwork)
        	  +		
        	   		
        	   			ButtonHomeSubCommonValues
        	   			
        	  
        - патч для добавления в меню Kodi вызова сетевого менеджера
      • kodi.init
        
        	  #!/bin/sh
        	  ### BEGIN INIT INFO
        	  # Provides:          bs
        	  # Default-Start:     2 3 4 5
        	  # Default-Stop:      0 1 6
        	  # Required-Start:    
        	  # Required-Stop:     
        	  # Short-Description: Kodi multimedia center
        	  ### END INIT INFO
        	  
        	  # Do NOT "set -e"
        	  
        	  # PATH should only include /usr/* if it runs after the mountnfs.sh script
        	  PATH=/sbin:/usr/sbin:/bin:/usr/bin
        	  DESC="Kodi runner script"
        	  NAME=kodi
        	  KODIROOT=/usr
        	  DAEMON=$KODIROOT/bin/$NAME
        	  DAEMON_ARGS="--standalone"
        	  PIDFILE=/var/run/$NAME/$NAME
        	  SCRIPTNAME=/etc/init.d/$NAME
        	  HOME=/home/root
        	  
        	  # Exit if the package is not installed
        	  [ -x "$DAEMON" ] || exit 0
        	  
        	  # Read configuration variable file if it is present
        	  [ -r /etc/default/$NAME ] && . /etc/default/$NAME
        	  
        	  
        	  
        	  case "$1" in
        	    start)
        	        reset > /dev/tty1
        	        echo  > /dev/tty1
        	        echo "ver 0.2.1 Torvin" > /dev/tty1
        	        setterm --background black --foreground black --cursor off > /dev/tty1
        	        /etc/init.d/restarter.sh $DAEMON $DAEMON_ARGS > /dev/null 2>&1 &
        	        ;;
        	    stop)
        	        ;;
        	    restart|force-reload)
        	        ;;
        	    *)
        	        echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
        	        exit 1
        	        ;;
        	  esac
        	  
        - скрипт начального запуска Kodi (sysvinit)
      • restarter.sh
        
        	  #!/bin/sh
        	  
        	  # Very Simple Restarter
        	  SIGSEGV=139
        	  SIGINT=130
        	  
        	  # меню Kodi:
        	  # Выход
        	  # Выключить систему
        	  # Выключение по таймеру
        	  # перезагрузка
        	  KODI_EXIT=0
        	  KODI_POWEROFF=64
        	  KODI_TIMER=0
        	  KODI_REBOOT=66
        	  
        	  
        	  while /bin/true; do
        	    $1 $2 $3 $4 $5
        	    rc=$?
        	    if [ $rc = $SIGSEGV ]; then
        	      echo "Segmentation fault :)"
        	    else
        	      echo "Return code $rc"
        	    fi
        	    sleep 1
        	  
        	    if [ $rc -eq $KODI_EXIT ]; then poweroff;
        	    elif [ $rc -eq $KODI_POWEROFF ]; then poweroff;
        	    elif [ $rc -eq $KODI_TIMER ]; then poweroff;
        	    elif [ $rc -eq $KODI_REBOOT ]; then reboot;
        	    fi
        	  
        	    if [ $rc = $SIGINT ]; then
        	      echo "Quitting"
        	      break
        	    fi
        	  done
        	  
        - скрипт для перезапуска Kodi, в случае ошибок и падений
      • advancedsettings.xml
        
        	  
        	  	
        	  		1
        	  		139460608
        	  		20
        	  	
        	  
        	  
        - дополнительные настройки Kodi, для увеличения производительности
      • guisettings.xml - основной конфигурационный файл Kodi
      • settings-pvr-iptvsimple.xml
        
        	  <settings>
        	      <setting id="epgCache" value="true" />
        	      <setting id="epgPath" value="" />
        	      <setting id="epgPathType" value="1" />
        	      <setting id="epgTSOverride" value="false" />
        	      <setting id="epgTimeShift" value="0" />
        	      <setting id="epgUrl" value="" />
        	      <setting id="logoBaseUrl" value="" />
        	      <setting id="logoFromEpg" value="0" />
        	      <setting id="logoPath" value="" />
        	      <setting id="logoPathType" value="1" />
        	      <setting id="m3uCache" value="true" />
        	      <setting id="m3uPath" value="" />
        	      <setting id="m3uPathType" value="0" />
        	      <setting id="m3uUrl" value="" />
        	      <setting id="sep1" value="" />
        	      <setting id="sep2" value="" />
        	      <setting id="sep3" value="" />
        	      <setting id="startNum" value="1" />
        	  </settings>
        	  
        - конфигурационный файл плагина pvr-iptvsimple (просмотр IPTV)
      • kodi-dir.inc
        
        	  KODI_HOME_DIR = "/home/root/.kodi"
        	  KODI_USERDATA = "${KODI_HOME_DIR}/userdata"
        	  KODI_ADDON_DIR = "${KODI_HOME_DIR}/addons"
        	  
        - общие пути расположения Kodi и его плагинов
      • kodi_git.bb
        
        	  SUMMARY = "KODI Media Center"
        	  
        	  LICENSE = "GPLv2"
        	  MD5_SUM = "md5=930e2a5f63425d8dd72dbd7391c43c46"
        	  LIC_FILES_CHKSUM = "file://LICENSE.GPL;${MD5_SUM}"
        	  
        	  # официальная позиция коdi, испльзование только ffmpeg
        	  RCONFLICTS_${PN} = "libav"
        	  # используется userland
        	  RCONFLICTS_${PN} = "mesa"
        	  
        	  require kodi-version.inc
        	  
        	  
        	  DEPENDS = "libusb1 libcec libplist expat yajl gperf-native libxmu \
        	             fribidi mpeg2dec samba fontconfig curl python libass libmodplug \
        	             libmicrohttpd wavpack libmms cmake-native \
        	             virtual/egl mysql5 sqlite3 libmms faad2 \
        	             libcdio libpcre boost lzo enca \
        	             avahi libsamplerate0 libxinerama libxtst bzip2 \
        	             jasper zip-native zlib libtinyxml libmad \
        	             libbluray libnfs swig-native libvorbis tiff \
        	             libxslt taglib libssh rtmpdump shairplay ffmpeg \
        	             libsquish x264 libtheora git-replacement-native \
        	             jsonschemabuilder-native \
        	             "
        	  
        	  # убрал зависимости
        	  # virtual/libsdl \
        	  # libsdl-image libsdl-mixer
        	  
        	  
        	  RDEPENDS_${PN} += "python-json"
        	  
        	  inherit autotools-brokensep gettext python-dir
        	  
        	  
        	  S = "${WORKDIR}/git"
        	  
        	  # breaks compilation
        	  CCACHE = ""
        	  
        	  CACHED_CONFIGUREVARS += " \
        	      ac_cv_path_PYTHON="${STAGING_BINDIR_NATIVE}/python-native/python" \
        	  "
        	  
        	  # предусматриваю параметр "openglesv2" в layer.conf
        	  PACKAGECONFIG ??= "${@base_contains('DISTRO_FEATURES', \
        	                      'openglesv2', 'openglesv2', '', d)} "
        	  PACKAGECONFIG[openglesv2] = "--enable-gles,,userland"
        	  
        	  
        	  #PACKAGECONFIG ??= "${@base_contains('DISTRO_FEATURES', 
        	  #                    'opengl', 'opengl', 'openglesv2', d)}"
        	  #PACKAGECONFIG[opengl] = "--enable-gl,--enable-gles,glew"
        	  #PACKAGECONFIG[openglesv2] = "--enable-gles,,"
        	  
        	  # FIXME: 
        	  #   убрать явное указание --disable-gl и --disable-gl, проверить что бы зависили
        	  #   от DISTRO_FEATURES => "openglesv2"
        	  
        	  EXTRA_OECONF = " \
        	    --disable-static \
        	    --enable-shared \
        	    gl_cv_func_gettimeofday_clobber=no \
        	    ac_cv_lib_bluetooth_hci_devid=no \
        	    --disable-debug \
        	    --disable-optimizations \
        	    --disable-gl \
        	    --enable-gles \
        	    --enable-openmax \
        	    --disable-vdpau \
        	    --disable-vaapi \
        	    --disable-vtbdecoder \
        	    --disable-tegra \
        	    --disable-profiling \
        	    --enable-joystick=no \
        	    --enable-libcec \
        	    --enable-udev \
        	    --disable-libusb \
        	    --disable-goom \
        	    --disable-rsxs \
        	    --disable-projectm \
        	    --disable-waveform \
        	    --disable-spectrum \
        	    --disable-fishbmc \
        	    --disable-x11 \
        	    --disable-ccache \
        	    --enable-alsa \
        	    --disable-pulse \
        	    --enable-rtmp \
        	    --enable-samba \
        	    --enable-nfs \
        	    --disable-libcap \
        	    --enable-dvdcss \
        	    --disable-mid \
        	    --enable-avahi \
        	    --enable-upnp \
        	    --enable-mysql \
        	    --enable-ssh \
        	    --enable-airplay \
        	    --enable-airtunes \
        	    --enable-non-free \
        	    --disable-asap-codec \
        	    --enable-webserver \
        	    --enable-optical-drive \
        	    --enable-libbluray \
        	    --disable-texturepacker \
        	    --with-ffmpeg=shared \
        	    --with-platform=raspberry-pi \
        	    --enable-player=omxplayer \
        	  "
        	  
        	  # так же убрал --enable-texturepacker
        	  #
        	  
        	  
        	  FULL_OPTIMIZATION_armv7a = "-fexpensive-optimizations \
        	                              -fomit-frame-pointer -O4 -ffast-math"
        	  BUILD_OPTIMIZATION = "${FULL_OPTIMIZATION}"
        	  
        	  ###EXTRA_OECONF_append_armv7a = " --cpu=cortex-a8 "
        	  
        	  # for python modules
        	  export HOST_SYS
        	  export BUILD_SYS
        	  export STAGING_LIBDIR
        	  export STAGING_INCDIR
        	  export PYTHON_DIR
        	  
        	  do_configure() {
        	      sh bootstrap
        	      oe_runconf
        	  }
        	  
        	  
        	  do_compile_prepend() {
        	      for i in $(find . -name "Makefile") ; do
        	          sed -i -e 's:I/usr/include:I${STAGING_INCDIR}:g' $i
        	      done
        	  
        	      for i in $(find . -name "*.mak*" -o    -name "Makefile") ; do
        	          sed -i -e 's:I/usr/include:I${STAGING_INCDIR}:g' \
        	                 -e 's:-rpath \$(libdir):-rpath ${libdir}:g' $i
        	      done
        	  }
        	  
        	  INSANE_SKIP_${PN} = "rpaths"
        	  
        	  # on ARM architectures xbmc will use GLES which will 
        	  # make the regular wrapper fail, so start it directly
        	  ###do_install_append_arm() {
        	  ###    sed -i -e 's:Exec=xbmc:Exec=${libdir}/xbmc/xbmc.bin:g' \
        	  ###               ${D}${datadir}/applications/xbmc.desktop
        	  ###}
        	  
        	  do_install_append() {
        	      # исправляю путь в cmake файле 
        	      # ${STAGING_DIR_TARGET}/usr/lib/kodi/kodi-config.cmake
        	      # иначе при сборке addons не будет найден 
        	      # addon-helpers (как сделать более правильно ???)
        	      sed -i "s| /usr/lib/kodi| ${STAGING_DIR_TARGET}/usr/lib/kodi|g" \
        	              ${D}/usr/lib/kodi/kodi-config.cmake
        	      sed -i "s| /usr/include/kodi| ${STAGING_DIR_TARGET}/usr/include/kodi|g" \
        	              ${D}/usr/lib/kodi/kodi-config.cmake
        	  }
        	  
        	  
        	  PACKAGES = " \
        	          ${PN}-dbg \
        	          ${PN}-dev \
        	          ${PN}-doc \
        	          ${PN} \
        	          "
        	  
        	  PROVIDES = "${PACKAGES}"
        	  
        	  FILES_${PN}-doc = "${docdir}"
        	  FILES_${PN}-dev = "${includedir}"
        	  
        	  FILES_${PN}-dbg  = "${libdir}/kodi/.debug \
        	                      ${libdir}/kodi/*/.debug \ 
        	                      ${libdir}/kodi/*/*/.debug \
        	                      ${libdir}/kodi/*/*/*/.debug \
        	                      ${libdir}/kodi/addons/library.xbmc.addon/.debug \
        	                      ${prefix}/src/debug \
        	                      "
        	  
        	  FILES_${PN} = "${bindir} \
        	                 ${libdir}/kodi \
        	                 ${libdir}/xbmc \
        	                 ${datadir}/xbmc \
        	                 ${datadir}/icons \
        	                 ${datadir}/xsessions \
        	                 ${datadir}/applications \
        	                 ${datadir}/kodi/media \
        	                 ${datadir}/kodi/system \
        	                 ${datadir}/kodi/addons \
        	                 ${datadir}/kodi/userdata \
        	                 "
        	  
        	  RRECOMMENDS_${PN}_append = " libcec \
        	                               python \
        	                               python-lang \
        	                               python-re \
        	                               python-netclient \
        	                               libcurl \
        	                               xdpyinfo "
        	  
        	  RRECOMMENDS_${PN}_append_libc-glibc = " glibc-charmap-ibm850 glibc-gconv-ibm850"
        	  
        - рецепт сборки мультимедиа центра Kodi
      • kodi-runner.bb
        
        	  DESCRIPTION = "runner for KODI Media Center"
        	  SECTION = "configs"
        	  PR = "r1"
        	  LICENSE = "MIT"
        	  MD5_SUM = "md5=4d92cd373abda3937c2bc47fbc49d690"
        	  MIT_SUM = "md5=3da9cfbcb788c80a0384361b4de20420"
        	  LIC_FILES_CHKSUM = "file://${COREBASE}/LICENSE;${MD5_SUM} \
        	                      file://${COREBASE}/meta/COPYING.MIT;${MIT_SUM}"
        	  
        	  FILESEXTRAPATHS_prepend := "${THISDIR}/kodi:"
        	  
        	  # секция установки скрипта запуска
        	  SRC_URI = "file://run/kodi.init file://run/restarter.sh"
        	  
        	  inherit update-rc.d
        	  
        	  S = "${WORKDIR}/run"
        	  
        	  
        	  INITSCRIPT_NAME = "kodi"
        	  INITSCRIPT_PARAMS = "start 01 2 3 4 5 . stop 90 0 1 6 ."
        	  
        	  
        	  PACKAGES = "${PN}"
        	  FILES_${PN} = "/etc/init.d"
        	  
        	  do_install_append() {
        	      # скрипт запуска
        	      install -d ${D}/etc/init.d
        	      install -m 0755 ${S}/kodi.init ${D}/etc/init.d/kodi
        	      install -m 0755 ${S}/restarter.sh ${D}/etc/init.d/restarter.sh
        	  }
        	  
        - рецепт запуска Kodi на определенном уровне исполнения
      • kodi-settings.bb
        
        	  DESCRIPTION = "settings for KODI Media Center"
        	  SECTION = "configs"
        	  PR = "r1"
        	  LICENSE = "MIT"
        	  MD5_SUM = "md5=4d92cd373abda3937c2bc47fbc49d690"
        	  MIT_SUM = "md5=3da9cfbcb788c80a0384361b4de20420"
        	  LIC_FILES_CHKSUM = "file://${COREBASE}/LICENSE;${MD5_SUM} \
        	                      file://${COREBASE}/meta/COPYING.MIT;${MIT_SUM}"
        	  
        	  FILESEXTRAPATHS_prepend := "${THISDIR}/kodi:"
        	                      
        	  S = "${WORKDIR}"
        	  
        	  require kodi-dir.inc
        	  require recipes-berserk/tv/tv-dir.inc
        	  
        	  PVR_IPTVSIMPLE_SETTINGS = "${KODI_USERDATA}/addon_data/pvr.iptvsimple"
        	  
        	  
        	  SRC_URI += " \
        	      file://settings/guisettings.xml \
        	      file://settings/settings-pvr-iptvsimple.xml \
        	      file://settings/advancedsettings.xml \
        	      "
        	  
        	  
        	  
        	  PACKAGES = "${PN}"
        	  
        	  FILES_${PN} +=  "${KODI_USERDATA} \
        	                  "
        	  
        	  FIND_M3U_PATH = "m3uPath. value=."
        	  REPLACE_M3U_PATH = "${TV_CONFIG_DIR}/${TV_CONFIG}"
        	                  
        	  do_install() {
        	      # Kodi guisettings
        	      install -d "${D}${KODI_USERDATA}"
        	      install -m 0644 "${S}/settings/guisettings.xml" "${D}${KODI_USERDATA}"
        	      install -m 0644 "${S}/settings/advancedsettings.xml" "${D}${KODI_USERDATA}"
        	      
        	      # addon pvr.iptvsimple settings
        	      install -d "${D}${PVR_IPTVSIMPLE_SETTINGS}"
        	      
        	      # change path show tv-config.bb
        	      sed -i "s|${FIND_M3U_PATH}|&${REPLACE_M3U_PATH}|" \
        	             "${S}/settings/settings-pvr-iptvsimple.xml" 
        	      install -m 0644 "${S}/settings/settings-pvr-iptvsimple.xml" \
        	                      "${D}${PVR_IPTVSIMPLE_SETTINGS}/settings.xml"
        	  }
        	  
        - рецепт размещения конфигурационных файлов Kodi
      • kodi-version.inc
        
        	  # ветка Isengard
        	  SRCREV = "02e7013889e08d608363f2909ebeccdb9ea3b7c9"
        	  FILESEXTRAPATHS_prepend := "${THISDIR}/kodi:"
        	  
        	  PV = "15.0+gitr${SRCPV}"
        	  PR = "r0"
        	              
        	  SRC_URI = "git://github.com/xbmc/xbmc.git;branch=Isengard \
        	             file://kodi-isengard-rpb-backports.patch \
        	             file://network-menu.patch \
        	            "
        	  
        - общий файл с информацией о собираемой версии Kodi
    2. kodi-plugins/
      • resource.language.ru_ru.tar.gz - архив с данными, для перевода меню Kodi на русский язык
      • kodi-language-ru_1.0.5.bb
        
        	  DESCRIPTION = "resource.language.ru_ru for KODI Media Center"
        	  # как альтернативный вариант можно взять русскую локализацию
        	  # из официального репозитория "https://github.com/xbmc/translations.git"
        	  # но проект весит 1.2 Гб вместе с базой git, что не очень быстро загружается
        	  # поэтому локализацию пока добавил в качестве архива
        	  
        	  SECTION = "configs"
        	  PR = "r0"
        	  
        	  LICENSE = "GPL-2.0"
        	  MD5_SUM = "md5=801f80980d171dd6425610833a22dbe6"
        	  LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses\
        	                      /GPL-2.0;${MD5_SUM}"
        	  
        	  require ../kodi/kodi-dir.inc
        	  LANG_PACKAGE = "resource.language.ru_ru"
        	  
        	  SRC_URI = "file://${LANG_PACKAGE}.tar.gz"
        	  
        	  S = "${WORKDIR}"
        	  
        	  PACKAGES = "${PN}"
        	  
        	  FILES_${PN} +=  "${KODI_ADDON_DIR}"
        	  
        	  
        	  do_install() {
        	      # Kodi addons
        	      install -d "${D}${KODI_ADDON_DIR}/${LANG_PACKAGE}"
        	      install -d "${D}${KODI_ADDON_DIR}/${LANG_PACKAGE}/resources"
        	  
        	      install -m 0644 ${S}/${LANG_PACKAGE}/icon.png \
        	                      ${D}${KODI_ADDON_DIR}/${LANG_PACKAGE} 
        	      install -m 0644 ${S}/${LANG_PACKAGE}/addon.xml \
        	                      ${D}${KODI_ADDON_DIR}/${LANG_PACKAGE}
        	      install -m 0755 ${S}/${LANG_PACKAGE}/resources/* \
        	                      ${D}${KODI_ADDON_DIR}/${LANG_PACKAGE}/resources
        	      chown root:root -R ${D}
        	  }
        	  
        - рецепт добавления русской локализации (перевод меню Kodi)
      • kodi-pvr-iptvsimple.bb
        
        	  SUMMARY = "pvr.iptvsimple addons for KODI Media Center"
        	  
        	  ADDONS_NAME = "pvr.iptvsimple"
        	  LICENSE = "GPL-2.0"
        	  MD5_SUM = "md5=801f80980d171dd6425610833a22dbe6"
        	  LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses\
        	                      /GPL-2.0;${MD5_SUM}"
        	  
        	  require ../kodi/kodi-dir.inc
        	  require ../kodi/kodi-version.inc
        	  
        	  
        	  FULL_OPTIMIZATION_armv7a = "-fexpensive-optimizations \
        	                              -fomit-frame-pointer -O4 -ffast-math"
        	  BUILD_OPTIMIZATION = "${FULL_OPTIMIZATION}"                  
        	  
        	  inherit cmake gettext
        	  
        	  S = "${WORKDIR}/git"
        	  
        	  
        	  DEPENDS = "gettext bcm2835-bootfiles kodi"
        	  RDEPENDS_${PN} = "userland"
        	  
        	  PACKAGES = "${PN}-dbg ${PN}"
        	  PROVIDES = "${PACKAGES}"
        	  
        	  FILES_${PN} = "/lib /share ${KODI_ADDON_DIR}"
        	  FILES_${PN}-dbg = "/lib/kodi/addons/${ADDONS_NAME}/.debug"
        	  
        	  INSANE_SKIP_${PN} = "dev-so"
        	  
        	  PARALLEL_MAKE = ""
        	  
        	  # явно указываю firmware для Raspberry PI см. recipes-bsp/common/firmware.inc
        	  # bitbake -s | grep "bcm2835-bootfiles" | cut -d":" -f2
        	  VERSION_BCM2835 = "20160622-r3"
        	  GIT_DIR_BCM2835 = "bcm2835-bootfiles/${VERSION_BCM2835}/git"
        	  WORK_DIR_BCM2835 = "${BASE_WORKDIR}/${MACHINE}-${DISTRO}-${TARGET_OS}"
        	  
        	  EXTRA_OECONF = " \
        	      --with-platform=raspberry-pi \
        	      --host=${HOST_SYS} \
        	      --build=${BUILD_SYS} \
        	      --prefix=${STAGING_DIR_TARGET}/usr/lib/kodi \
        	      --with-toolchain=${STAGING_DIR_TARGET} \
        	      --with-firmware=${WORK_DIR_BCM2835}/${GIT_DIR_BCM2835} \
        	      "
        	  
        	  KODI_GEN_TOOLCHAIN = "${WORKDIR}/git/tools/depends/target/Toolchain.cmake"
        	  
        	  # генерация Toolchain.cmake, сами зависимости не собираю,
        	  # для сборки kodi они беруться из yocto project см. kodi_git.bb => DEPENDS
        	  do_configure_prepend() {
        	      cd ${WORKDIR}/git/tools/depends
        	      sh bootstrap
        	      sh configure ${EXTRA_OECONF}
        	  }
        	  
        	  
        	  # явно указываю корневой системный каталог, 
        	  # иначе cmake тесты компилятора не проходят
        	  CXXFLAGS += "--sysroot=${STAGING_DIR_TARGET}"
        	  CFLAGS += "--sysroot=${STAGING_DIR_TARGET}"
        	  # можно тоже самое сделать вот так
        	  # echo "SET( CMAKE_SYSROOT ${STAGING_DIR_TARGET})" >> ${KODI_GEN_TOOLCHAIN}
        	  
        	  
        	  do_configure() {
        	      echo "SET( OVERRIDE_PATHS 1)" >> ${KODI_GEN_TOOLCHAIN}
        	      
        	      cd ${B}
        	      cmake -DADDONS_TO_BUILD=${ADDONS_NAME} \
        	      -DCMAKE_BUILD_TYPE=Release \
        	      -DCMAKE_TOOLCHAIN_FILE=${KODI_GEN_TOOLCHAIN} \
        	      -DBUILD_DIR=${B} \
        	      -DCMAKE_INSTALL_PREFIX=${D} \
        	      -DPACKAGE_ZIP=1 \
        	      ${S}/project/cmake/addons
        	  }
        	  
        	  
        	  
        	  do_compile_append() {
        	      install -d ${D}/${KODI_ADDON_DIR}
        	      cp -vfR ${D}/pvr.iptvsimple ${D}/${KODI_ADDON_DIR}
        	      rm -fr ${D}/pvr.iptvsimple
        	  }
        	  
        	  # отключаю метод, так как после сборки 
        	  # файлы уже располагаются в CMAKE_INSTALL_PREFIX=${D}
        	  do_install[noexec] = "1"
        	  
        - рецепт сборки Kodi плагина pvr-iptvsimple
      • screensaver-kodi-universe_0.1.1.bb
        
        	  # Very simple Screensaver for Kodi mediacenter
        	  # autor Alexander Demachev (https://berserk.tv)
        	  
        	  DESCRIPTION = "Screensaver Kodi Universe"
        	  SECTION = "configs"
        	  PR = "r1"
        	  
        	  LICENSE = "GPL-2.0"
        	  MD5_SUM = "md5=801f80980d171dd6425610833a22dbe6"
        	  LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses\
        	                      /GPL-2.0;${MD5_SUM}"
        	  
        	  GIT_REPO_DIR = "github.com/berserktv"
        	  
        	  require ../kodi/kodi-dir.inc
        	  KODI_ADDON_NAME = "screensaver.kodi.universe"
        	  KODI_ADDON_PATH = "${KODI_ADDON_DIR}/${KODI_ADDON_NAME}"
        	  KODI_MEDIA_PATH = "${KODI_ADDON_PATH}/resources/skins/default\
        	                     /media/kodi-universe.mkv"
        	  KODI_ADDON_VIDEO = "https://${GIT_REPO_DIR}/bs-res/raw/master/kodi-plugins\
        	                            /${KODI_ADDON_NAME}/isengard/kodi-universe.mkv"
        	  
        	  SRC_URI = "${KODI_ADDON_VIDEO};protocol=https;name=kodi-video \
        	             git://${GIT_REPO_DIR}/${KODI_ADDON_NAME}.git;\
        	             branch=master;name=kodi-addon"
        	  
        	  SRCREV_kodi-addon = "d32bcb5101f179c1b2a1db833936832519468ea1"
        	  SRC_URI[kodi-video.md5sum] = "98f941a6ad29fe7ad4735e8a0eedd4dc"
        	  SHA_SUM = "45e6a93eee87b8506d351d13214ffbfe005526b6a146a2d0086e88050aa44785"
        	  SRC_URI[kodi-video.sha256sum] = "${SHA_SUM}"
        	  
        	  
        	  S = "${WORKDIR}/git"
        	  PACKAGES = "${PN}"
        	  FILES_${PN} = "${KODI_HOME_DIR}"
        	  
        	  do_install_append() {
        	      install -d ${D}/${KODI_ADDON_PATH}
        	      rm -fr ${S}/.git
        	      cp -vfR ${S}/* ${D}/${KODI_ADDON_PATH}
        	      install -m 0644 ${WORKDIR}/kodi-universe.mkv ${D}/${KODI_MEDIA_PATH}
        	  }
        	  
        - рецепт сборки плагина screensaver-kodi-universe
      • script-berserk-network_0.2.3.bb
        
        	  # Plugin for Kodi mediacenter
        	  # "Network Manager" is a network management software 
        	  # for Ethernet and Wifi network connections
        	  # Project "Berserk" - build Kodi for the Raspberry Pi platform
        	  # autor Alexander Demachev, site https://berserk.tv
        	  # license -  The MIT License (MIT)
        	  
        	  DESCRIPTION = "Network Manager is a network management \
        	                 software for Ethernet and Wifi network connections"
        	  SECTION = "configs"
        	  PR = "r1"
        	  LICENSE = "MIT"
        	  
        	  MD5_SUM = "md5=4d92cd373abda3937c2bc47fbc49d690"
        	  MIT_SUM = "md5=3da9cfbcb788c80a0384361b4de20420"
        	  LIC_FILES_CHKSUM = "file://${COREBASE}/LICENSE;${MD5_SUM} \
        	                      file://${COREBASE}/meta/COPYING.MIT;${MIT_SUM}"
        	  
        	  
        	  SRC_URI = "git://github.com/berserktv/script.berserk.network.git;branch=master"
        	  SRCREV = "a68597d06254f0923ee567a72399102ca6d7edde"
        	  
        	  require ../kodi/kodi-dir.inc
        	  KODI_ADDON_NAME = "script.berserk.network"
        	  KODI_ADDON_PATH = "${KODI_ADDON_DIR}/${KODI_ADDON_NAME}"
        	  
        	  
        	  S = "${WORKDIR}/git"
        	  
        	  PACKAGES = "${PN}"
        	  FILES_${PN} = "${KODI_HOME_DIR}"
        	  
        	  RDEPENDS_${PN} += "python-subprocess python-fcntl"
        	  
        	  do_install_append() {
        	      install -d ${D}/${KODI_ADDON_PATH}
        	      install -m 0644 ${S}/addon.xml     ${D}/${KODI_ADDON_PATH}
        	      install -m 0644 ${S}/changelog.txt ${D}/${KODI_ADDON_PATH}
        	      install -m 0644 ${S}/default.py    ${D}/${KODI_ADDON_PATH}
        	      install -m 0644 ${S}/icon.png      ${D}/${KODI_ADDON_PATH}
        	      install -m 0644 ${S}/service.py    ${D}/${KODI_ADDON_PATH}
        	  
        	      cp -vfR ${S}/resources ${D}/${KODI_ADDON_PATH}
        	  }
        	  
        - рецепт сборки плагина script-berserk-network


    Формат JSON предназначен для представления структурированных объектов в текстовом виде.
    JSON - Schema позволяет автоматизировать процесс проверки документов JSON. Компонент JsonSchemaBuilder необходим для работы со схемами JSON на этапе сборки Kodi. Инструмент собирается нативно т.е. под архитектурой host машины сборки и в дальнейшем участвует в сборке других компонентов.


    Патч обратного портирования это важные изменения кода, применяемые к официальной стабильной версии Kodi (15.2), данный патч был взят из всем известного проекта - OpenELEC

    Обычно патчи обратного портирования содержат новую функциональность и исправление уже известных ошибок (у нас патч взят для платформы Raspberry Pi).

    В Kodi за отображение пунктов меню отвечают конфигурационные xml файлы. Для добавление еще одного под пункта в основное меню "СИСТЕМА", достаточно подкорректировать файл:

    kodi/addons/skin.confluence/720p/IncludesHomeMenuItems.xml

    и у нас появиться под меню "Сеть", событие нажатия на кнопку меню которого описывается как:

    	<onclick>RunAddon(script.berserk.network,butnetwork)</onclick>
    	
    что приведет к передачи управления плагину script.berserk.network, первым аргументом которого будет строка "butnetwork" и плагин обработает этот вызов в соответствии со своей логикой работы (откроется окно настроек плагина opensettings).
    	if arg.startswith('butnetwork'):
    	    __addon__.openSettings()
    	

    Скрипт начального запуска kodi.init (sysvinit) у нас немного не стандартный, так как по сути программа Kodi для сборки Torvin является единственным пользовательским приложением, и для ее перезапуска используется shell скрипт restarter.sh. Это сделано для того, чтобы не тащить в дистрибутив достаточно сложный и большой компонент запуска приложений systemD.


    В мультимедиа центре Kodi для увеличения производительности во время просмотра видео можно указать максимальные настройки буферизации:

    buffermode=1
    - буферизировать запросы для всех файловых систем (включая локальную)

    readbufferfactor
    - регулирует скорость загрузки на основе среднего битрейта видео. Так, например, если вы воспроизводите видео со средней скоростью передачи данных 5 Мбит/с и устанавливаете коэффициент чтения буфера на 2.0, это ограничит скорость загрузки (и, следовательно, скорость заполнения кеша) примерно 10 Мбит/с, таким образом:

    readbufferfactor=20
    снимает ограничение на скорость загрузки

    cachemembuffersize =139460608
    - размер буфера составляет 133 МБайт, при этом используется 133*3 оперативной памяти
    т.е. около 400 Мбайт оперативной памяти


    Для просмотра телевидения через интернет по протоколу "IPTV", у нас используется
    Kodi плагин - "pvr-iptvsimple", настройки плагина содержаться в файле settings-pvr-iptvsimple.xml

    например настройка с тегом m3uPath будет содержать путь к файлу
    /home/root/tvconfig/berserk.m3u8 - с конфигурацией телевизионных каналов по умолчанию
    см. рецепт kodi-settings.bb

    Версия первого варианта рецепта сборки Kodi - kodi_git.bb, у нас выглядит немного грязноватой и в дальнейшем мы ее доведем до нормального вида (но для самой первой сборки это приемлемо).


    Наша конфигурация Kodi состоит из трех файлов и рецепт kodi-settings.bb, скопирует их по следующим путям:

    • guisettings.xml => "/home/root/.kodi/userdata/guisettings.xml"
    • advancedsettings.xml => "/home/root/.kodi/userdata/advancedsettings.xml"
    • settings-pvr-iptvsimple.xml => "/home/root/.kodi/userdata/addon_data/pvr.iptvsimple/settings.xml"


    Описание хранителя экрана


    screensaver.kodi.universe вы можете посмотреть здесь



    Консольное shell расширение bs-net


    Kodi плагин script.berserk.network - является GUI надстройкой над shell расширением WLAN/Ethernet сетевых интерфейсов, исходный код расширения располагается здесь

    Также исходный код вы можете посмотреть с помощью команды:
    git clone https://github.com/berserktv/bs-net

    	##############################################################
    	# пример возможного использования в /etc/network/interfaces:
    	##############################################################
    	auto eth0
    	     iface eth0 inet manual
    	     up /etc/network/eth-manual $IFACE up
    	     down /etc/network/eth-manual $IFACE down
    	
    	auto wlan0
    	     iface wlan0 inet manual
    	     up /etc/network/wlan $IFACE up
    	     down /etc/network/wlan $IFACE down
    	



    Создание файла идентификатора для WiFi точки доступа, можно осуществить с помощью следующего скрипта (скрипт выполняется от имени администратора). Имя файла идентификатора должно быть таким же, как и название вашего "SSID" т.е. совпадает с именем вашей точки доступа.

    	#!/bin/sh
    	
    	ssid="идентификатор_вашей_точки_доступа"
    	pass="пароль_вашей_точки_доступа"
    	
    	# Примечание: так как расширение используется для Kodi, то и пути хранения настроек 
    	#             WLAN/Ethernet привязаны к конфигурации Kodi
    	#
    	W_DIR="/home/root/.kodi/userdata/wlans"
    	
    	mkdir -p ${W_DIR}
    	wpa_passphrase "$ssid" "$pass" > "${W_DIR}/$ssid"
    	chmod 600 "${W_DIR}/$ssid"
    	

    После создания файла идентификатора, вы можете вручную подключиться к вашей точке доступа с помощью следующей команды: (где wlan0 название WiFi интерфейса, в системе)

    	sudo /etc/network/wlan wlan0 up
    	
    или отключиться
    sudo /etc/network/wlan wlan0 down
    ПРИМЕЧАНИЕ:
    	пример выше может быть использован, если у вас запущена только консольная версия расширения bs-net 
    	т.е. как таковой GUI режим отсутствует



    Для автоматического подключения к WiFi точки доступа при старте системы
    используется udev правило: /etc/udev/rules.d/80-wifi-start.rules

    	SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", KERNEL=="wlan*", \
    	                  RUN+="/etc/network/wlan-runner $env{INTERFACE} up"
    	SUBSYSTEM=="net", ACTION=="remove", DRIVERS=="?*", KERNEL=="wlan*", \
    	                  RUN+="/etc/network/wlan-runner $env{INTERFACE} down"
    	


    Для настройки сетевого Ethernet интерфейса, именованного как eth0 достаточно создать файл:
    /home/root/.kodi/userdata/eths/eth0
    следующего содержания:

    	ETH_IP=dhcp
    	ETH_NETMASK=""
    	ETH_GATEWAY=""
    	ETH_DNS1=""
    	ETH_DNS2=""
    	

    в примере выше сетевой интерфейс настраивается с помощью "DHCP" протокола или же можно явно указать IP адрес, сетевую маску, адрес шлюза, адрес первого DNS сервера и адрес второго DNS сервера


    состав recipes-multimedia


    	├── ffmpeg
    	│   ├── ffmpeg_2.6.bb
    	│   ├── ffmpeg.inc
    	│   └── files
    	│       └── 0001-mpeg4video-Signal-unsupported-GMC-with-more-than-one.patch
    	├── libsquish
    	│   └── libsquish.bb
    	└── shairplay
    	    └── shairplay_git.bb
    	
    где:
    • ffmpeg_2.6.bb
      
      	require ffmpeg.inc
      	
      	LIC_FILES_CHKSUM = "file://COPYING.GPLv2;md5=b234ee4d69f5fce4486a80fdaf4a4263 \
      	                    file://COPYING.GPLv3;md5=d32239bcb673463ab874e80d47fae504 \
      	                    file://COPYING.LGPLv2.1;md5=bd7a443320af8c812e4c18d1b79df004 \
      	                    file://COPYING.LGPLv3;md5=e6a600fd5e1d9cbde2d983680233ad02"
      	
      	SRC_URI = "git://source.ffmpeg.org/ffmpeg.git;branch=${SRCBRANCH} \
      	           file://0001-mpeg4video-Signal-unsupported-GMC-with-more-than-one.patch \
      	          "
      	
      	SRCBRANCH = "release/2.6"
      	SRCREV = "${AUTOREV}"
      	S = "${WORKDIR}/git"
      	
      	
      	DEFAULT_PREFERENCE = "-1"
      	
      - рецепт сборки библиотеки ffmpeg (аудио, видео кодеки)
    • ffmpeg.inc
      
      	SUMMARY = "A complete, cross-platform solution to record, \
      	           convert and stream audio and video"
      	HOMEPAGE = "http://ffmpeg.org/"
      	SECTION = "libs"
      	LICENSE = "GPLv2+"
      	LICENSE_FLAGS = "commercial"
      	
      	ARM_INSTRUCTION_SET = "arm"
      	
      	DEPENDS = "zlib libogg libvorbis libtheora yasm-native"
      	RCONFLICTS_ffmpeg = "libav"
      	
      	INC_PR = "r8"
      	
      	inherit autotools pkgconfig
      	
      	FULL_OPTIMIZATION_armv7a = "-fexpensive-optimizations -fomit-frame-pointer \
      	                            -O4 -ffast-math"
      	BUILD_OPTIMIZATION = "${FULL_OPTIMIZATION}"
      	
      	EXTRA_FFCONF_armv7a = "--cpu=cortex-a8"
      	EXTRA_FFCONF ?= ""
      	
      	PACKAGECONFIG ??= "bzip2 x264 \
      	                   ${@base_contains('DISTRO_FEATURES', 'x11', 'x11', '', d)}"
      	PACKAGECONFIG[jack] = "--enable-indev=jack,--disable-indev=jack,jack"
      	PACKAGECONFIG[bzip2] = "--enable-bzlib,--disable-bzlib,bzip2"
      	PACKAGECONFIG[schroedinger] = "--enable-libschroedinger,\
      	                               --disable-libschroedinger,schroedinger"
      	PACKAGECONFIG[gsm] = "--enable-libgsm,--disable-libgsm,libgsm"
      	PACKAGECONFIG[x264] = "--enable-libx264,--disable-libx264,x264"
      	PACKAGECONFIG[vpx] = "--enable-libvpx,--disable-libvpx,libvpx"
      	PACKAGECONFIG[mp3lame] = "--enable-libmp3lame,--disable-libmp3lame,lame"
      	PACKAGECONFIG[faac] = "--enable-libfaac,--disable-libfaac,faac"
      	PACKAGECONFIG[x11] = "--enable-x11grab,--disable-x11grab,virtual/libx11 \
      	                      libxfixes libxext xproto virtual/libsdl"
      	
      	EXTRA_OECONF = " \
      	    --disable-stripping \
      	    --disable-debug \
      	    --enable-shared \
      	    --enable-pthreads \
      	    --enable-gpl \
      	    --enable-avfilter \
      	    \
      	    --cross-prefix=${TARGET_PREFIX} \
      	    --prefix=${prefix} \
      	    \
      	    --enable-ffserver \
      	    --enable-ffplay \
      	    --ld="${CCLD}" \
      	    --enable-libtheora  \
      	    --enable-libvorbis \
      	    --arch=${TARGET_ARCH} \
      	    --target-os="linux" \
      	    --enable-cross-compile \
      	    --extra-cflags="${TARGET_CFLAGS} ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}" \
      	    --extra-ldflags="${TARGET_LDFLAGS}" \
      	    --sysroot="${STAGING_DIR_TARGET}" \
      	    --enable-hardcoded-tables \
      	    ${EXTRA_FFCONF} \
      	    --libdir=${libdir} \
      	    --shlibdir=${libdir} \
      	"
      	
      	# remove the "--build=x86_64-linux" option automatically passed to configure
      	do_configure() {
      	    ${S}/configure ${EXTRA_OECONF}
      	}
      	
      	
      	FFMPEG_LIBS = "libavcodec libavdevice libavformat \
      	               libavutil libpostproc libswscale libavfilter libswresample"
      	
      	FILES_${PN} = "${bindir} ${datadir}/ffprobe.xsd"
      	FILES_${PN}-dev = "${includedir}/${PN}"
      	FILES_${PN}-dev = "${includedir}"
      	
      	LEAD_SONAME = "libavcodec.so"
      	
      	PACKAGES += "ffmpeg-x264-presets \
      	             libavcodec  libavcodec-dev  libavcodec-dbg \
      	             libavdevice libavdevice-dev libavdevice-dbg \
      	             libavformat libavformat-dev libavformat-dbg \
      	             libavutil   libavutil-dev   libavutil-dbg \
      	             libpostproc libpostproc-dev libpostproc-dbg \
      	             libswscale  libswscale-dev  libswscale-dbg \
      	             libavfilter libavfilter-dev libavfilter-dbg \
      	             libavcore   libavcore-dev   libavcore-dbg \
      	             libswresample libswresample-dev libswresample-dbg \
      	             ffmpeg-examples \
      	            "
      	
      	FILES_ffmpeg-x264-presets = "${datadir}/*.ffpreset"
      	
      	FILES_${PN}-dev = "${includedir}"
      	FILES_libavcodec = "${libdir}/libavcodec*.so.*"
      	FILES_libavcodec-dev = "${libdir}/libavcodec*.so ${libdir}/pkgconfig/libavcodec.pc \
      	                        ${libdir}/libavcodec*.a"
      	FILES_libavcodec-dbg += "${libdir}/.debug/libavcodec*"
      	
      	FILES_libavdevice = "${libdir}/libavdevice*.so.*"
      	FILES_libavdevice-dev = "${libdir}/libavdevice*.so ${libdir}/pkgconfig/libavdevice.pc \
      	                         ${libdir}/libavdevice*.a"
      	FILES_libavdevice-dbg += "${libdir}/.debug/libavdevice*"
      	
      	FILES_libavformat = "${libdir}/libavformat*.so.*"
      	FILES_libavformat-dev = "${libdir}/libavformat*.so ${libdir}/pkgconfig/libavformat.pc \
      	                         ${libdir}/libavformat*.a"
      	FILES_libavformat-dbg += "${libdir}/.debug/libavformat*"
      	
      	FILES_libavutil = "${libdir}/libavutil*.so.*"
      	FILES_libavutil-dev = "${libdir}/libavutil*.so ${libdir}/pkgconfig/libavutil.pc \
      	                       ${libdir}/libavutil*.a"
      	FILES_libavutil-dbg += "${libdir}/.debug/libavutil*"
      	
      	FILES_libpostproc = "${libdir}/libpostproc*.so.*"
      	FILES_libpostproc-dev = "${libdir}/libpostproc*.so \
      	                         ${libdir}/pkgconfig/libpostproc.pc \
      	                         ${libdir}/libpostproc*.a ${includedir}/postproc"
      	FILES_libpostproc-dbg += "${libdir}/.debug/libpostproc*"
      	
      	FILES_libswscale = "${libdir}/libswscale*.so.*"
      	FILES_libswscale-dev = "${libdir}/libswscale*.so ${libdir}/pkgconfig/libswscale.pc \
      	                        ${libdir}/libswscale*.a"
      	FILES_libswscale-dbg += "${libdir}/.debug/libswscale*"
      	
      	FILES_libavfilter = "${libdir}/libavfilter*.so.*"
      	FILES_libavfilter-dev = "${libdir}/libavfilter*.so ${libdir}/pkgconfig/libavfilter.pc \
      	                         ${libdir}/libavfilter*.a"
      	FILES_libavfilter-dbg += "${libdir}/.debug/libavfilter*"
      	
      	FILES_libavcore = "${libdir}/libavcore*.so.*"
      	FILES_libavcore-dev = "${libdir}/libavcore*.so ${libdir}/pkgconfig/libavcore.pc \
      	                       ${libdir}/libavcore*.a"
      	FILES_libavcore-dbg += "${libdir}/.debug/libavcore*"
      	
      	
      	FILES_libswresample = "${libdir}/libswresample*.so.*"
      	FILES_libswresample-dev = "${libdir}/libswresample*.so \
      	                           ${libdir}/pkgconfig/libswresample.pc \
      	                           ${libdir}/libswresample*.a"
      	FILES_libswresample-dbg += "${libdir}/.debug/libswresample*"
      	
      	
      	FILES_ffmpeg-examples = "${datadir}/examples/*"
      	
      - включаемый файл для рецепта ffmpeg
    • 0001-mpeg4video-Signal-unsupported-GMC-with-more-than-one.patch - патч для ffmpeg
    • libsquish.bb
      
      	DESCRIPTION = "libCEC allows you in combination with the right hardware \
      	               to control your device with your TV remote control. \
      	               Utilising your existing HDMI cabling"
      	LICENSE = "GPLv2+"
      	LIC_FILES_CHKSUM = "file://README;md5=2a51a796ca47e91336a4d198147ba58f"
      	
      	PR = "r0"
      	inherit autotools pkgconfig
      	
      	SRC_URI = "git://github.com/OpenELEC/libsquish.git"
      	SRCREV = "52e7d93c5947f72380521116c05d97c528863ba8"
      	
      	S = "${WORKDIR}/git"
      	
      	do_configure_append() {
      	    # Removed INSTALL_DIR from config because it conflicts with bitbake
      	    sed -i "s|INSTALL_DIR ?= @PREFIX@|#&|" "${S}/config"
      	}
      	
      	do_install() {
      	   cd ${S}
      	   install -d ${D}/usr/lib/pkgconfig
      	   install -d ${D}/usr/include
      	   export INSTALL_DIR=${D}/usr
      	   make install
      	}
      	
      - рецепт сборки библиотеки libsquish
    • shairplay_git.bb
      
      	DESCRIPTION = "Free portable AirPlay server implementation"
      	
      	LICENSE = "GPLv2"
      	LIC_FILES_CHKSUM = "file://LICENSE;md5=7fff59c88f17faa814f26f26b06a7100"
      	
      	PR = "r0"
      	inherit autotools pkgconfig
      	
      	SRC_URI = "git://github.com/juhovh/shairplay.git"
      	SRCREV="64d59e3087f829006d091fa0d114efb50972a2bf"
      	S = "${WORKDIR}/git"
      	
      	
      	FILES_${PN} += "${libdir}/*.so"
      	
      - рецепт сборки библиотеки shairplay


    FFmpeg - OpenSource библиотека для кодирования / декодирования
    огромного количества видео и аудио форматов

    libsquish - это библиотека для сжатия текстур DXT с потерями.

    AirPlay — наименование технологии и протокола, разработанных Apple, при использовании которых обеспечивается беспроводная потоковая передача медиаданных (аудио, видео, изображений) между устройствами. Поддержка AirPlay реализована на основе сервера Shairplay



    состав recipes-support


    	├── libbluray
    	│   ├── libaacs_git.bb
    	│   ├── libbluray_1.0.0.bb
    	│   ├── libbluray.inc
    	│   ├── libdca_0.0.5.bb
    	│   └── libdvdcss_1.3.0.bb
    	├── libgcrypt
    	│   └── libgcrypt_1.6.5.bbappend
    	├── libnfs
    	│   └── libnfs.bb
    	└── libtinyxml
    	    ├── files
    	    │   └── tinyxml.pc
    	    └── libtinyxml_2.6.2.bbappend
    	
    где:
    • libaacs_git.bb
      
      	SUMMARY = "Open implementation of the AACS specification"
      	SECTION = "libs/multimedia"
      	LICENSE = "LGPLv2.1+"
      	LIC_FILES_CHKSUM = "file://COPYING;md5=4b54a1fd55a448865a0b32d41598759d"
      	
      	
      	SRCREV = "0fffa67066f16e22967e06c92fb63c79b5a9a5fe"
      	PV = "0.8.1"
      	
      	SRC_URI = "git://git.videolan.org/${PN}.git;protocol=git \
      	           "
      	S = "${WORKDIR}/git"
      	
      	inherit autotools-brokensep lib_package pkgconfig
      	
      	DEPENDS += "libgcrypt"
      	
      - рецепт сборки библиотеки libaacs
    • libbluray_1.0.0.bb
      
      	require libbluray.inc
      	
      	DEPENDS += "libaacs libdca libdvdcss"
      	RDEPENDS_${PN} += "libaacs libdca libdvdcss"
      	
      	SRCREV="491c7e8501d7e7ea853700a2f35a18f11ad40a5b"
      	LIC_FILES_CHKSUM="file://COPYING;md5=435ed639f84d4585d93824e7da3d85da"
      	PR = "${INC_PR}.2"
      	
      	do_package_qa() {
      	}
      	
      - рецепт сборки библиотеки libbluray
    • libbluray.inc
      
      	DESCRIPTION = "libbluray for oe."
      	SECTION = "misc"
      	HOMEPAGE = "http://videolan.org"
      	DEPENDS = ""
      	LICENSE = "GPLv2"
      	INC_PR = "r5"
      	S="${WORKDIR}/git"
      	SRC_URI = "git://git.videolan.org/libbluray.git;branch=master;protocol=git \
      			"
      	inherit autotools-brokensep
      	
      	FILES_${PN} = "/"
      	
      - включаемый файл для сборки libbluray
    • libdca_0.0.5.bb
      
      	SUMMARY = "decoding library for DTS Coherent Acoustics streams"
      	SECTION = "libs/multimedia"
      	LICENSE = "GPLv2+"
      	LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe"
      	
      	SRC_URI = "http://download.videolan.org/pub/videolan/libdca/${PV}/libdca-${PV}.tar.bz2"
      	
      	SRC_URI[md5sum] = "dab6b2795c66a82a6fcd4f8343343021"
      	SRC_URI[sha256sum] = "dba022e022109a5bacbe122d50917769ff27b64a7bba104bd38ced8de8510642"
      	
      	
      	S = "${WORKDIR}/${PN}-${PV}"
      	
      	inherit autotools lib_package pkgconfig
      	
      	do_configure_prepend() {
      	        QUILT_PATCHES="debian/patches quilt push -a"
      	        # single precision is enough and speeds up libdca by about 10-15%
      	        sed -i -e "s/double/sample_t/g" ${S}/libdca/*.c ${S}/libdca/*.h
      	}
      	
      - рецепт сборки библиотеки libdca
    • libdvdcss_1.3.0.bb
      
      	DESCRIPTION = "libdvdcss is a simple library designed for accessing DVDs \
      	               like a block device without having to bother about the decryption."
      	LICENSE = "GPLv2"
      	LIC_FILES_CHKSUM = "file://COPYING;md5=94d55d512a9ba36caa9b7df079bae19f"
      	
      	SRC_URI = "http://download.videolan.org/pub/libdvdcss/${PV}/libdvdcss-${PV}.tar.bz2"
      	
      	inherit autotools
      	
      	EXTRA_OECONF = " --disable-doc "
      	
      	SRC_URI[md5sum] = "7f0fdb3ff91d638f5e45ed7536f7eb67"
      	SRC_URI[sha256sum] = "7c414acd520c4e4dd7267952f72d738ff50321a7869af4d75c65aefad44f1395"
      	
      - рецепт сборки библиотеки libdvdcss
    • libgcrypt_1.6.5.bbappend
      
      	# change binconfig-disabled on enabled
      	inherit autotools texinfo binconfig pkgconfig
      	
      - расширение рецепта сборки библиотеки libgcrypt
    • libnfs.bb
      
      	SUMMARY = "LIBNFS is a client library for accessing NFS shares over a network."
      	SECTION = "network"
      	LICENSE = "GPLv2"
      	LIC_FILES_CHKSUM = "file://COPYING;md5=a8375400e512ca525d061f32fb28b83a"
      	
      	inherit autotools
      	
      	PR = "r1"
      	
      	SRCREV="libnfs-1.9.2"
      	
      	SRC_URI = "git://github.com/sahlberg/libnfs;protocol=git;branch=master;tag=${SRCREV} \
      	"
      	S = "${WORKDIR}/git"
      	
      - рецепт сборки библиотеки libnfs
    • tinyxml.pc
      
      	prefix=/usr
      	exec_prefix=${prefix}
      	libdir=${exec_prefix}/lib
      	includedir=${prefix}/include
      	
      	Name: libtinyxml
      	Description: A simple, small, minimal, C++ XML parser
      	URL: http://sourceforge.net/projects/tinyxml/
      	Version: 2.6.2
      	Libs: -L${libdir} -ltinyxml
      	Cflags: -I${includedir}
      	
      - файл конфигурации pkconfig для tinyxml
    • libtinyxml_2.6.2.bbappend
      
      	# дополнительный параметр настройки tinyxml через pkgconfig
      	FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
      	
      	SRC_URI += "file://tinyxml.pc"
      	
      	do_install_append() {
      	    install -d ${D}${libdir}/pkgconfig
      	    install -m 0644 ${WORKDIR}/tinyxml.pc ${D}${libdir}/pkgconfig/tinyxml.pc
      	}
      	
      - расширение рецепта сборки библиотеки libtinyxml

    Еще совсем недавно в медиа пространстве активно использовался формат оптических дисков Blu Ray.
    В настоящее время эти технологии немного устарели и почти не используются. Kodi большая и многофункциональная программа, в которой также есть поддержка проигрывания и Blu Ray дисков.

    AACS это способ шифрования контента в большинстве лицензионных Blu Ray дисков, с использованием закрытых ключей. Изначально производители лицензионного контента пытались сделать так, чтобы защита дисков встраивалась в приводы Blu Ray на аппаратном уровне. По замыслу создателей технологии, они должны быть доступны только создателям аппаратных и программных проигрывателей, а также создателям таких дисков.

    libaacs — библиотека предназначена для реализации возможности ограниченного копирования оптических дисков. Библиотека поддерживает стандарт "Advanced Access Content System" (AACS - cистема расширенного доступа к содержимому).

    libbluray — библиотека для интеграции в приложения функций по проигрыванию дисков в формате Blu-Ray. Поддерживает такие возможности, как навигацию, парсинг списка воспроизведения и работу с меню.

    libdca — библиотека обеспечивает низкоуровневый интерфейс для декодирования аудиокадров, закодированных с использованием когерентной акустики DTS. Когерентная акустика DTS используется для кодирования звуковых дорожек на DVD дисках, libdca также обеспечивает понижающее микширование и динамическое сжатие диапазона для различных конфигураций вывода.

    libdvdcss — библиотека системы защиты цифрового медиаконтента (Content Scramble System), используется для видео дешифровки при доступе к DVD Video содержимому.

    libgcrypt — библиотека предоставляет высокоуровневый интерфейс к большому количеству алгоритмов криптографии т.е. библиотека предназначена для шифрования / дешифрования данных.

    libnfs - библиотека для поддержки протокола NFS (Network File System). NFS — протокол сетевого доступа к файловым системам. Основан на протоколе вызова удалённых процедур (ONC RPC). Протокол позволяет подключать (монтировать) удалённые файловые системы через сеть.

    libtinyxml - очень маленькая, компактная библиотека для быстрого разбора XML документов.




    Расположение дистрибутива
    после сборки


    Собранный образ после сборки будет располагаться по пути
    torvin/build/tmp/deploy/images/raspberrypi3


    На последний успешно собранный образ всегда будет указывать символическая ссылка:
    berserk-image-raspberrypi3.rpi-sdimg

    т.е. torvin/build/tmp/deploy/images/raspberrypi3/berserk-image-raspberrypi3.rpi-sdimg,
    cам файл будет содержать достаточно длинное имя c датой создания и временем в UTC
    например такое:
    berserk-image-raspberrypi3-20170519214432.rootfs.rpi-sdimg


    Пример записи образа дистрибутива
    с помощью команды dd


    более подробно, команда описывается с следующей главе:

    ПРЕДУПРЕЖДЕНИЕ:
    все предыдущие данные на карте памяти "microSDHC"
    после выполнения операции записи будут удалены.
    	sudo bash
    	cd torvin/build/tmp/deploy/images/raspberrypi3
    	dd if=berserk-image-raspberrypi3.rpi-sdimg of=/dev/sdX bs=1M
    	sync
    	




    Запись дистрибутива на карту памяти
    "microSDHC" в Ubuntu


    Для записи дистрибутива на карту памяти используется команда dd. Запуск команды dd выполняется от имени администратора, при этом необходимо указать входной файл if=имя_файла, далее устройство подключения карты памяти "microSDHC" of=имя_устройства, например /dev/sdX, где X может быть a,b,c и т.д. в зависимости от предыдущих подключенных дисковых разделов, и указать количество байт, которые будут записаны за раз bs=1M (например 1Мбайт)


    Проще всего название устройства подключения карты памяти определить по выводу команды blkid
    наберите команду sudo blkid до подключения карты памяти - "microSDHC"

    и далее
    наберите команду sudo blkid после подключения карты памяти - "microSDHC"
    и тот новый раздел который появился в выводе последней команды и будет искомым


    Отмонтируйте разделы карты памяти - "microSDHC" например так, если разделов несколько

    	umount /dev/sdX1
    	umount /dev/sdX2
    	


    В команде dd указывается имя диска целиком т.е. без номера раздела так как в образе содержатся таблицы двух разделов:

    • первый раздел - загрузочный диск формата fat16
    • второй раздел ext4 - корневая файловая система ОС Linux


    Для записи дистрибутива в архиве на карту памяти необходимо вначале выполнить команду
    gzip -dc имя_файла_архива
        где ключ d означает распаковать архив
        а ключ с означает результат распаковки направить в выходной поток


    Перейдите в каталог содержащий архив дистрибутива (файл с расширением zip) и наберите команду:


    ВНИМАНИЕ: все предыдущие данные на карте памяти "microSDHC"
    после выполнения операции записи будут удалены.

    	sudo bash
    	gzip -dc berserk-raspberrypi3-torvin-v0.2.1.rpi-sdimg.zip | dd of=/dev/sdX bs=1M
    	sync
    	

    Запись дистрибутива на карту памяти
    "microSDHC" в "Windows"



    Установите приложение Win32 Disk Imager под Windows


    с сайта https://sourceforge.net/projects/win32diskimager


    распакуйте zip дистрибутив в любую удобную для вас папку, например c:/projects
    далее запустите приложение Win32 Disk Imager


    Выберите Image File, c учетом того, что расширение нужно указать "*.*"
    (иначе файл с дистрибутивом "berserk-raspberrypi3-torvin-v0.2.1.rpi-sdimg" вы не увидите)



    Примечание: название файла на картинке может отличаться (в зависимости от версии)

    Вставьте карту памяти microSDHC на которую вы хотите записать образ, выберите устройство записи: Device
    удостоверьтесь что вы выбрали именно карту памяти microSDHC на которую планируете записать образ


    Нажмите кнопку записи: Write
    после этого вы получите предупреждение что все данные на карте памяти будут перезаписаны
    и далее нажмите на кнопку подтверждения, начнется процесс записи, после окончания которого вы можете извлечь карту памяти, вставить ее в ваше устройство Raspberry Pi и загрузить его.



    Загрузка дистрибутива Berserk


    Вы можете загрузить следующие версии образа дистрибутива:

    Changelog Показать/Скрыть
    		
    	v0.2.6 - 08/07/2018
    	- firmware 20180619
    	- support for WiFi module CYW43455 (Raspberry Pi 3B Plus)
    	
    	v0.2.5 - 30/06/2018
    	- Linux Kernel 4.9.80
    	- Kodi 17.6 (Krypton)
    	- FFmpeg 3.1.11
    	- bcm2835-bootfiles 20180313-r3
    	- python package for addons Plex and Weather:
    	  (python-xml python-misc python-db)
    	- Kodi addons pvr.iptvsimple 2.4.14
    	- Network Manager v0.2.5
    	- ntfs-3g v2017.3.23
    	Build
    	  - Poky 2.4.1 (Rocko)
    	
    	v0.2.4 - 28/04/2018
    	- add addons Kodi 
    	  (plugin.video.youtube, script.module.requests)
    	- python package  
    	  (ctypes lang re io netserver netclient html difflib zlib shell)
    	  (sqlite3 urllib3 compression datetime crypt threading math email misc)
    	- add mount ext4 (udev rules)
    	- ntfs-3g-ntfsprogs v2013.1.13
    	- bs-net v0.1.3
    	
    	v0.2.3 - 25/07/2017
    	- Network Manager v0.2.4
    	- Screensaver v0.1.2
    	- bs-net v0.1.2
    	
    	v0.2.2 - 23/06/2017
    	- Separation of the assembly 
    	  in Kodi recipe, for boards:
    	  Raspberry Pi and Raspberry Pi 2
    	
    	v0.2.1 - 17/05/2017
    	- Linux Kernel 4.1.21
    	- Kodi 15.2
    	- bcm2835-bootfiles 20160622-r3
    	- Network Manager v0.2.3
    	- Screensaver v0.1.1
    	- Dosfstools 3.0.28
    	- FFmpeg 2.6
    	Build
    	  - Poky 2.1.3 (Krogoth)
    	  - version 0.2.x - codename "Torvin"
    		
    		


    	версия       - v0.2.6 Torvin
    	описание     - Мультимедиа центр Kodi 17.6 на Raspberry Pi (собран в Yocto Project)
    	aрхитектура  - ARM
    	платы        - Raspberry Pi 3 Model "B+" (B Plus)
    	             - Raspberry Pi 3 Model "B"
    	             - Raspberry Pi 2 Model "B"
    	дата         - от 09.07.2018
    	MD5          - 16b3b2c2952f7ccf1a5c99b9d9e3fcaa
    	               (контрольная сумма MD5 zip архива)
    	               размер архива 316.8 Мбайт
    	
    	имя файла    - berserk-raspberrypi3-torvin-v0.2.6.rpi-sdimg.zip
    	


    	версия       - v0.2.5 Torvin
    	описание     - Мультимедиа центр Kodi 17.6 на Raspberry Pi
    	aрхитектура  - ARM
    	платы        - Raspberry Pi 3 Model "B"
    	             - Raspberry Pi 2 Model "B"
    	дата         - от 01.07.2018
    	MD5          - 99c25e60674e2b3c8f6f56d58e433dff
    	               (контрольная сумма MD5 zip архива)
    	               размер архива 274.8 Мбайт
    	
    	имя файла    - berserk-raspberrypi3-torvin-v0.2.5.rpi-sdimg.zip
    	


    	версия       - v0.2.4 Torvin
    	описание     - мультимедиа центр Kodi 15.2 на Raspberry Pi
    	aрхитектура  - ARM
    	платы        - Raspberry Pi 3 Model "B"
    	             - Raspberry Pi 2 Model "B"
    	дата         - от 28.04.2018
    	MD5          - 0f39bd2b9c6ae2c29e4f9c0128185791  
    	               (контрольная сумма MD5 zip архива)
    	               размер архива 229.3 Мбайт
    	
    	имя файла    - berserk-raspberrypi3-torvin-v0.2.4.rpi-sdimg.zip
    	


    	версия       - v0.2.3 Torvin
    	описание     - мультимедиа центр Kodi 15.2 на Raspberry Pi
    	aрхитектура  - ARM
    	платы        - Raspberry Pi 3 Model "B"
    	             - Raspberry Pi 2 Model "B"
    	дата         - от 25.07.2017
    	MD5          - 5075aea63586034f5cf6072c5a23bcfa
    	               (контрольная сумма MD5 zip архива)
    	               размер архива 225.0 Мбайт
    	
    	имя файла    - berserk-raspberrypi3-torvin-v0.2.3.rpi-sdimg.zip
    	


    	версия       - v0.2.1 Torvin
    	описание     - мультимедиа центр Kodi 15.2 на Raspberry Pi
    	aрхитектура  - Raspberry Pi 3 Model "B"
    	             - Raspberry Pi 2 Model "B"
    	дата         - от 19.05.2017
    	MD5          - b03d0ff3456a3c2fd4a3a24cf120753a
    	               (контрольная сумма MD5 zip архива)
    	               размер архива 225.0 Мбайт
    	
    	имя файла    - berserk-raspberrypi3-torvin-v0.2.1.rpi-sdimg.zip
    	






    Еще сборки



    Сборка Мультимедиа центра Kodi в связке с Chromium



    Описание дистрибутива вы можете посмотреть в статье

    	версия       - v0.3.2.1
    	кодовое имя  - Brand
    	описание     - Сборка Kodi 17.6 в связке с Chromium 67.0.3396.99
    	               для платы Raspberry Pi 3B Plus (RPI 3B+)
    	               ( изменение по сравнению с v0.3.2: 
    	                 исправлен запуск Kodi плагинов "Yahoo! Weather" и "Plex" )
    	плата        - Raspberry Pi 3 Model "B" Plus
    	               Raspberry Pi 3 Model "B"
    	               Raspberry Pi 2 Model "B" 
    	дата         - от 20.06.2019
    	MD5          - fdf56a8ff606592e4032aa26c6595d89
    	               (контрольная сумма MD5 zip архива)
    	               размер архива 376.7 Мбайт
    	
    	имя файла    - berserk-raspberrypi3-brand-v0.3.2.1.rpi-sdimg.zip
    	
    	версия       - v0.3.2
    	кодовое имя  - Brand
    	описание     - Сборка Kodi 17.6 в связке с Chromium 67.0.3396.99
    	               для самой новой платы Raspberry Pi 3B Plus (RPI 3B+)
    	плата        - Raspberry Pi 3 Model "B" Plus
    	               Raspberry Pi 3 Model "B"
    	               Raspberry Pi 2 Model "B" 
    	дата         - от 03.08.2018
    	MD5          - b177257c921c5b1875b9966c1593f76f
    	               (контрольная сумма MD5 zip архива)
    	               размер архива 376.3 Мбайт
    	
    	имя файла    - berserk-raspberrypi3-brand-v0.3.2.rpi-sdimg.zip
    	
    	версия       - v0.3.1
    	кодовое имя  - Brand
    	описание     - Сборка Kodi 17.6 в связке с Chromium 63.0.3239.132
    	плата        - Raspberry Pi 3 Model "B" и Raspberry Pi 2 Model "B" 
    	дата         - от 17.06.2018
    	MD5          - 7902adccc33a3cd95943b23486253433
    	               (контрольная сумма MD5 zip архива)
    	               размер архива 370.7 Мбайт
    	
    	имя файла    - berserk-raspberrypi3-brand-v0.3.1.rpi-sdimg.zip