Require/include: Переиспользование содержимого рецептов

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

Директивы require и/или include могут использоваться для включения содержимого одного файла в другой. Всегда стоит задуматься о вынесении общей функциональности в include файл при добавлении новых версий рецепта.

Замечание

Директивы require и include выполняют одну и ту же функцию - включение содержимого файла в рецепт. Разница заключается лишь в том, что require сгенерирует ошибку если включаемый файл не будет обнаружен, а include - нет. По этой причине не рекомендуется использовать include в новых рецептах.

Например рецепт clamav выглядит следующим образом:

require clamav.inc

PR = "r0"

Обратите внимание, что вся функциональность рецепта скрыта в одном clamav.inc файле, и только номер релиза определяется в рецепте. Каждый из clamav рецептов включает один и тот же clamav.inc чтобы избежать дублирования функциональности. При появлении новых версий такая техника позволяет просто скопировать рецепт, установить номер релиза в 0 и внести необходимые изменения (если они вообще есть).

Следующий пример из iproute2 показывает рецепт, добавляющий дополнительные патчи, не указанные во включаемом файле. Эти патчи нужны только для нового релиза и, добавляя их в этот рецепт, мы сохраняем применимость общего кода как для старых, так и для новых рецептов::

PR = "r1"

SRC_URI += "file://iproute2-2.6.15_no_strip.diff;patch=1;pnum=0 \
            file://new-flex-fix.patch;patch=1"

require iproute2.inc

DATE = "060323"

Еще один пример из рецепта cherokee показывает схожий метод включения дополнительных патчей только для текущей версии. Однако он показывает еще одну возможность - определение задачи configure для этой версии, заменяющее стандартное из общего include файла:

PR = "r7"

SRC_URI_append = "file://configure.patch;patch=1 \
                  file://Makefile.in.patch;patch=1 \
                  file://Makefile.cget.patch;patch=1 \
                  file://util.patch;patch=1"

require cherokee.inc

do_configure() {
        gnu-configize
        oe_runconf
        sed -i 's:-L\$:-L${STAGING_LIBDIR} -L\$:' ${S}/*libtool
}