Наложение патчей без редактирования ebuild'ов

Опубликовано 8 Сентября, 2014 под тегами BASh, ebuild, Gentoo, patch, portage, BASh, Cheats, Gentoo, patch

Давно хотел сделать заметку об этом лайфхаке, и все забывал. Уже довольно давно в portage есть волшебная функция epatch_user, которая применяет патчи (файлы с расширением patch) из /etc/portage/patches/%category%/%package% , где %package% может быть полным названием (с ревизией или без), либо только именем, опционально с указанием слота (i.e. %package% = %name%[-%version%[-%revision%]][:%slot%]). Проблема в том, что далеко не все ебилды это поддерживают (т.е. не в каждом ебилде на стадии prepare эта функция вызывается). Но можно это исправить, не правя ни одного ебилда.

Portage позволяет производить пользовательские действия в контексте ebuild, загружая файл /etc/portage/bashrc перед каждой стадией сборки. Поэтому в /etc/portage/bashrc мы можем добавить:

case "${EBUILD_PHASE}" in
        prepare) cd "${S}" && epatch_user ;;
esac

Таким образом, на стадии prepare в любом ебилде будет вызываться epatch_user. Документация говорит, что отрабатывает только первый вызов, все последующие игнорируются. Поэтому если в ебилде уже есть вызов epatch_user, ничего страшного не произойдет.

Именно пользуясь этим механизмом я накладываю патчи на ядро из предыдущего поста.

Источники: Gentoo Handbook man eutils.eclass (из app-portage/eclass-manpages)