Дата и время публикации:
Задача и пути решения
1. Задача
Состоит в том, что у существующего пакета заменить файл с данными, который будет находится в слое, находящегося выше по приоритету относительно размещения файла-рецепта искомого пакета. Например, требуется присвоить адрес IP сетевому интерфейсу, который назначается в конфигурационном файле ${sysconfig}/network/interfaces
Указанный файл определен в пакете init-ifupdown-1.0, который устанавливает необходимые конфигурационный данные с начальными значениями, требуемые скриптами настройки сетевого интерфейса. Схема размещения приведена ниже, в дампе 1.1
Дамп 1.1
$PWD │ ├──/meta/ │ ├──/recipes-core/ │ ├──/init-ifupdown/ │ ├──/init-ifupdown-1.0/ │ │ │ ├──/interfaces │ ├──init-ifupdown-1.0.bb
Указанный файл устанавливается в ${sysconfig}/network/ уже во время сборки пакета init-ifupdown-1.0, согласно правилам прописанных в файле-рецепта init-ifupdown-1.0.bb, как показано в дампе 1.2
Дамп 1.2
...
SRC_URI = "\
...
file://interfaces \
..."
...
do_install () {
install -m 0644 ${WORKDIR}/interfaces ${D}${sysconfdir}/network/interfaces
}
...
Поэтому хотелось бы, чтобы при сборке указанного пакета из базового слоя meta, чтобы замещался конфигурационный файл interfaces из собственного слоя meta-mylayer.
2. Решение
Для чего, в собственном слое meta-mylayer организуем схожую иерархию файлов и директорий, как в базовом слое у пакета meta, как показано в дамп 2.1
Дамп 2.1
$PWD │ ├──/meta-mylayer/ ├──/recipes-core/ │ ├──/init-ifupdown/ │ ├──/init-ifupdown-1.0/ │ │ │ ├──/interfaces │ ├──init-ifupdown-%.bbappend
Единственным отличием является подчиненная директория confiles в директории рецепте recipes-core и в нем же вместо файла init-ifupdown-*.bb находится файл init-ifupdown-%.bbappend, который обеспечивает дополнение или замещения уже имеющихся файлов данных, в т.ч. изменения задаваемых по умолчанию значений конфигурации.
Формат файла дополнения *-%.bbappend представлен в листинге 2.2, реализуемый для данного примера в виде файла init-ifupdown-%.bbappend .
Листинг 2.2
FILESEXTRAPATHS_prepend := "${THISDIR}/confiles:"
SRC_URI += "file://interfaces"
do_install_append(){
if [ -d ${D}${sysconfdir}/network ]; then
install -m 0644 ${WORKDIR}/interfaces ${D}${sysconfdir}/network/interfaces
fi
}
Любой файл-дополнение *-%.bbappend отличает от основного файла-рецепта *.bb тем, что он начинается с переменной FILESEXTRAPATHS_prepend, с помощью которой указывается источник данных через оператор присваивания ":=" и текстового выражения, заключенного в двойных ковычках (").
Текстовое выражения, в свою очередь разделяется на две части с помощью символа ("/"):
- В первой части с использованием переменной ${THISDIR}, в которой будет указываться путь $PWD/meta-mylayer/recipes-core/init_ifupdown, где искать директорию с файлами на замещение и добавления;
- во второй части указывается название самой директории, где храняться сами файлы, в данном случае файл "interfaces".
Затем, как и в файле файла-рецепта *.bb перечисляем источник с использованием добавления к переменной SRC_URI замещаемого файла "file://interfaces".
В заключении добавляем функцию do_install_append(), которая будет вызываться присборке пакетом после функции do_install(). Поэтому, при операциях замещения, проверять доступность ресурсов (например, директорию ${D}${sysconfdir}/network/), куда будет устанавливаться замещаемый файл ${WORKDIR}/interfaces. Последний с начало в рабочею директорию ${WORKDIR}, а уже затем в директорию сборки пакта ${D}
Соответственно, если нам понадобится добавить, например файл interface-eth0.1, который отсутствует в нашем пакете, то необходимо применить следующие правила, как показано в листинге 2.2
Листинг 2.2
FILESEXTRAPATHS_prepend := "${THISDIR}/confiles:"
. . .
FILES_${PN} += "file://interfaces-eth0.1"
do_install_append(){
if [ -d ${D}${sysconfdir}/network ]; then
. . .
install -m 0644 ${WORKDIR}/interfaces-eth0.1 ${D}${sysconfdir}/network/interfaces-eth0.1
fi
}
Которые отличается тем, что появилась переменная FILES_${PN}, позволяющая добавлять файлы и даже целые директории в базовый пакет.
3. Библиография
3.1 Adding extra files to the existing packages
3.2 Yocto : Understanding bbappend file and writing the bbappend bitbake recipe