× К оглавлению На главную Об авторе

Дата и время публикации:

Задача и пути решения


1. Задача

Создать diff-файл при изменении исходного кода проекта, например u-boot, в рабочей директории пакета, путь к которому обычно описывается в S = "${WORKDIR}/git" .

Соответственно, на выходе diff необходимо получить патч-файл 0001-u-boot.patch, который можно будет использовать в собственном мета-слое meta-mylayer, который уже ранее создали. В листинге 1.1 приведен фрагмент дерева слоя mylayer, с которым будем проводить манипуляции.

Листинг 1.1

$LAYERS_DIR
    │ 
    ├──/meta-mylayer
    |	   |
    |	   ├──/.conf
    |	   |      |
           |      └──./layer.conf   
           |
           └──/recipes-bsp
                 |
                 ├──/u-boot
                 |
                 ├──\files
                 |     |
                 |     └──./0001-u-boot.patch
                 |           
                 └──./u-boot.bbappend

${WORKDIR}
    │ 
    └──/git
         |           
         └──> Исходный код проекта u-boot
     

${CHANGEDIR}
    │ 
    ├──> Измененные файлы и директории проекта u-boot
    |
    └──> dondfiff –  нежелательные файлы и поддиректории 

Таким образом, задача состоит в том, чтобы снять "разницу" с директории ${WORKDIR}/git, где находятся исходные файлы, и с директории ${CHANGEDIR}/git, где находятся измененные файлы. В качестве изменяемого файла будет выступать файл исходного кода проекта U-Boot: "env/common.c". В котором была изменена одна-две строчка кода, а в качестве нежелательных файлов и поддиректорий будет выступать файл Changes, содержащий перечень сделанных изменений в U-Boot.

2. Решение

Для генерации собственноручно создаваемого патча широко практикуется команда diff в двух вариациях – diff -up или diff -uprN. В результате применения которой будет сгенерирован в той форме, в котором создает патчи Git.

На Git придется ориентироваться, потому что в переменной-источника SRC_URI исходного кода U-Boot определен адрес Git, как показано в листинге 2.1

Листинг 2.1

...
 13 SRC_URI = "git://git.denx.de/u-boot.git"
...

В таком случае, все изменения необходимо выполнять с использованием патчей, генерируемые diff(1). При этом,

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

Резюмируя вышесказанное, необходимо выполнить команду diff с ключами -uprN, которые позволят сделать более съедобный патч, накладываемый утилитой bitbake до сборки на скаченный с родного сайта исходный код проекта U-Boot.

Для начала создадим символьную ссылку на директорию ${WORKDIR}/git, как показано в дампе 2.2

Дамп 2.2

$ ln -s ${WORKDIR}/git ${PATCHDIR}/u-boot.source

После чего, приведенное дерево должно приобрести практический вид, как показано в листинге 2.3

Листинг 2.3

${PATCHDIR}
   │ 
   ├──/u-boot.source─ ─ ─>Символическая ссылка на исходный код u-boot     
   │
   ├──/u-boot.changes
   │       │
   │       └──/env
   │            │
   │            └./common.c ─ ─ ─> измененный файл исходный код u-boot
   │ 
   └./0001-u-boot_any.version.patch

Таким образом, в результате должен быть создан файл 0001-u-boot.patch после выполнения команды diff, как показано в дампе 2.4

Дамп 2.4

$ сd ${PATCHDIR}/ && \
diff -upr -X  u-boot.changes/Changes \
u-boot.source u-boot.changes >  0001-u-boot_any.version.patch

В результате в патч-файле 0001-u-boot_any.version.patch будут наблюдаться следующие строчки, которые показаны в листинге 2.5

Листинг 2.5

...
  2 diff -upr -X u-boot.changes/Changes u-boot.source/env/common.c u-boot.changes/env/common.c
  3 --- u-boot.source/env/common.c	2020-01-28 14:17:46.562831723 +0300
  4 +++ u-boot.changes/env/common.c	2020-01-28 16:22:24.500745733 +0300
...

И, которые в случае наложение только что созданного файла патча системы автоматической сборки дистрибутива Yocto/poky, приведут к конфликту из-за имен директорий u-boot.source и u-boot.changes, отсутствуюшие напрочь в директории ${WORKDIR} .

Поэтому рекомендую после выполнение изменений в файле env/common.c, создать файл патча 0001-u-boot.patch, как показано в дампе 2.6

Дамп 2.6

$ cd u-boot.source/git \
$ LANG="en_EN.UTF-8" git diff  env/common.c  > 0001-u-boot_any.version.patch

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

Листинг 2.7

  1 diff --git a/env/common.c b/env/common.c 
  2 index 324502ed82..5cfeb15b59 100644
  3 --- a/env/common.c
  4 +++ b/env/common.c
... 

Далее, в подразделе recipes-bsp слоя meta-mylayer в директории u-boot создаем директорию files, как показано в дампе 2.8

Листинг 2.8

$ mkdir -p ${LAYERS_DIR}/meta-mylayer/recipes-bsp/u-boot/files

Создание директории files показано в дампе 2.8 для случая, когда слой meta-mylayer не создан.

Примечание. Производим создание файла конфигурации слоя meta-mylayer, как показано в дампе 2.8/1 Дамп 2.8/1
$ mkdir -p ${LAYERS_DIR}/meta-mylayer/conf/
В ней создаем файл meta-mylayer/conf/layers.conf и наполняем, как показано в дамп 2.8/2 Дамп 2.8/2
$  nano 
# This conf/layer.conf created from standard boilerplate file 
# that placed on link https://www.yoctoproject.org/docs/1.8/bsp-guide/bsp-guide.html   
#
# We have a conf and classes directory, add to BBPATH
#
# Copyright (c) 2018 Andrej Y. Rzhavskov (a.k.a. rjaan)  

BBPATH .= ":${LAYERDIR}"

# We have a recipes directory, add to BBFILES
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
             ${LAYERDIR}/recipes-*/*/*.bbappend"

BBFILE_COLLECTIONS += "meta-mylayer"

BBFILE_PATTERN_meta-mylayer  = "^${LAYERDIR}/"

BBFILE_PRIORITY_meta-mylayer = "10"

LAYERVERSION_meta-mylayer = "1"
LAYERDEPENDS_meta-mylayer = "arm"
Обращаю внимание на переменные BBFILES и LAYERDEPENDS_meta-mylayer : в первой обязательно должно быть прописано правило поиска файлов с расширением .bbappend, а во второй – слой, где находится локализованная сборка u-boot, например для слоя meta-arm, в соответствующем подразделе которого, именуемого так же recipes-bsp, находятся файлы патчи основного слоя meta автоматической системы сборки дистрибутива Yocto/poky.

Теперь, в ранее созданную директорию ${LAYERS_DIR}/meta-mylayer/recipes-bsp/u-boot/files в дампе 2.8,копируем также ранее созданный файл патча 0001-u-boot.patch в дампе 2.7, как показано в дампе 2.9

Дамп 2.9

$ cp ${PATCHDIR}/u-boot.source/0001-u-boot.patch ${LAYERS_DIR}/meta-mylayer/recipes-bsp/u-boot/files 

После чего, остается в директории {LAYERS_DIR}/meta-mylayer/recipes-bsp/u-boot/ создать файл с расширением .bbappend , как показано в дампе 2.10

Дамп 2.10

$ nano ${LAYERS_DIR}/meta-mylayer/recipes-bsp/u-boot/u-boot_%.bbappend
FILESEXTRAPATHS_prepend := "${THISDIR}:"
SRC_URI += "file://files/0001-u-boot_any.version.patch"

И, пересобрать пакет u-boot с использованием следующей последовательности команд, как показано в дампе 2.11

Дамп 2.11

$ LANG="en_EN.UTF-8" bitbake -ccleansstate u-boot
...
$  LANG="en_EN.UTF-8" bitbake u-boot

\(\infty\)

3. Библиография

3.1 Submitting patches: the essential guide to getting your code into the kernel

3.2 Diff --git unknown option

3.3 Yocto dev-manual. Using a git workflow

3.4 Yocto project. Reference manual