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

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

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


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, с помощью которой указывается источник данных через оператор присваивания ":=" и текстового выражения, заключенного в двойных ковычках (").

Текстовое выражения, в свою очередь разделяется на две части с помощью символа ("/"):

Затем, как и в файле файла-рецепта *.bb перечисляем источник с использованием добавления к переменной SRC_URI замещаемого файла "file://interfaces".

В заключении добавляем функцию do_install_append(), которая будет вызываться присборке пакетом после функции do_install(). Поэтому, при операциях замещения, проверять доступность ресурсов (например, директорию ${D}${sysconfdir}/network/), куда будет устанавливаться замещаемый файл ${WORKDIR}/interfaces. Последний с начало в рабочею директорию ${WORKDIR}, а уже затем в директорию сборки пакта ${D}

Примечание. По применению функции do_install_append() нужно сделать замечание, что несмотря на её неявное использование в некоторых случаях, лучше производит непосредственное объявление, как это показано в листинге 2.2

Соответственно, если нам понадобится добавить, например файл 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

do_install(). Поэтому, при операциях замещения, проверять доступность ресурсов (например, директорию ${D}${sysconfdir}/network/), куда будет устанавливаться замещаемый файл ${WORKDIR}/interfaces. Последний с начало в рабочею директорию ${WORKDIR}, а уже затем в директорию сборки пакта ${D}

Примечание. По применению функции do_install_append() нужно сделать замечание, что несмотря на её неявное использование в некоторых случаях, лучше производит непосредственное объявление, как это показано в листинге 2.2

Соответственно, если нам понадобится добавить, например файл 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