Дата и время публикации:
Задача и пути решения
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). При этом,
- настоятельно рекомендуется позаботится о том, чтобы файл был сгенрирован в "diff-унифицированном" формате, который применяется опцией -u,
- для облегчения чтения сделанных изменений в C-функциях пользоваться опцией -p,
- так же рекомендуется, если файлы отсутствуют подменять их пустыми с использованием опции -N,
- а опция -r включает поддержку обхода поддиректорий.
В случае присутствие в дереве нежелательных файлов и директорий необходимо дополнительная опция -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 не создан.
$ 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