Как рекурсивно установить структуру каталогов в рецепте OpenEmbedded BitBake?

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

В качестве примера, как следующий do_install() можно упростить из этого:

do_install() {
    install -d ${D}/foo
    install -m 0644 ${S}/foo/*.* ${D}/foo

    install -d ${D}/foo/a
    install -m 0644 ${S}/foo/a/*.* ${D}/foo/a

    install -d ${D}/foo/b
    install -m 0644 ${S}/foo/b/*.* ${D}/foo/b

    install -d ${D}/foo/c
    install -m 0644 ${S}/foo/c/*.* ${D}/foo/c

    install -d ${D}/bar
    install -m 0644 ${S}/bar/*.* ${D}/bar

    install -d ${D}/bar/a
    install -m 0644 ${S}/bar/a/*.* ${D}/bar/a

    install -d ${D}/bar/a/bananas
    install -m 0644 ${S}/bar/a/bananas/*.* ${D}/bar/a/bananas
}

К чему-то более похожему на этот псевдокод:

do_install() {
    for each subdir in ${S}/foo/
        install subdir recursively to ${D}/foo/subdir
    end

    for each subdir in ${S}/bar/
        install subdir recursively to ${D}/bar/subdir
    end
}

Каталоги верхнего уровня в наших исходных файлах (foo и bar в приведенном выше примере) редко изменяются, поэтому вызов их в рецепте — это нормально. Это каталоги нижнего уровня, которые часто меняются.

Может случиться так, что cp -r в конечном итоге будет правильным, но я читал, что это не одобряется в рецептах BitBake, поэтому мне интересно, предоставляет ли BitBake какой-то альтернативный механизм или есть какой-то другой разумно стандартизированный способ сделать это.


person user5071535    schedule 04.08.2015    source источник


Ответы (2)


Раньше мы делали это так:

do_install() {
find ${WORKDIR}/ -type f -exec 'install -m 0755 "{}" ${D}/var/www/' \;
}
person Tobias Bystricky    schedule 10.03.2016

Каноническая форма в OE:

cp -R --no-dereference --preserve=mode,links -v SOURCE DESTINATION

см. ответ здесь (хотя они выглядят немного по-разному в коде, вопросы семантически эквивалентны)

person LetoThe2nd    schedule 02.11.2017