gentoo tricks: epatch_user

Jedną z najlepszych (według wielu najgorszych) cech gentoo jest to, że wszystko jest kompilowane ze źródeł. Ma to oczywiście swoje wady i zalety, ale niezaprzeczalną zaletą jest możliwość łatwego dodawania własnych patch’y do programów. Wystarczy stworzyć lokalne repo ebuild’ów i powrzucać do niego zmodyfikowane ebuild’y. Jednak co jeśli np. chcemy żeby nasz patch był aplikowany dla każdej wersji danego pakietu najlepiej jeszcze automatycznie bez każdorazowego grzebania się w ebuild’ach?

Twórcy dystrybucji, zapewne sami lubiąc dłubać, stworzyli bardzo eleganckie (i potencjalnie niebezpieczne) rozwiązanie tego problemu — funkcję epatch_user. Jest to funkcja w metajęzyku w którym pisze się ebuild’y i służy ona właśnie do automatycznego aplikowania patch’y dodanych przez użytkownika. Wystarczy stworzyć odpowiedni katalog w “/etc/portage/patches/” takiej samej strukturze co i portage, czyli np. “/etc/portage/patches/net-firewall/iptables/” i powrzucać do niego patch’e które chcemy, aby były automatycznie zaaplikowane. Stąd właśnie wynika potencjalne niebezpieczeństwo tej funkcji — jeśli niepoprawnie nadamy uprawnienia do katalogów na tej ścieżce to każdy zwykły użytkownik będzie mógł dodać patch który będzie automatycznie aplikowany podczas emerge’owania danego pakietu. emerge oczywiście wyświetla komunikat, że nakłada te patch’e, ale kto by aż tak dokładnie czytał ten zalew komunikatów?

Niestety rzeczywistość nie zawsze jest tak kolorowa. Jakkolwiek ten trick działa dla bardzo dużej ilości pakietów to nadal nie wszystkie ebuild’y mają dodane wywołanie funkcji epatch_user. Na szczęście i ten problem da się obejść. Z pomocą przychodzi tutaj kolejna przyjemna funkcjonalność emerge, czyli możliwość wpięcia własnego skryptu który będzie wywołany w dowolnej fazie działania emerge. W tym przypadku chcemy się wpiąć w fazę post_src_prepare i dodać do niej wywołanie epatch_user. W tym celu trzeba stworzyć plik “/etc/portage/bashrc/” i wrzucić do niego coś takiego:

post_src_prepare() {
if type epatch_user &> /dev/null ; then
epatch_user
eautoreconf
fi
}

Jest to funkcja która mówi, że to co jest dalej ma być wykonane w fazie post_src_prepare. “if” sprawdza czy funkcja epatch_user jest dostępna (aby była dostępna w ebuildzie musi być załączona klasa eutils) i jeśli tak to ją wywołuje, a następnie cały łańcuch narzędzi autotools. Ten drugi krok jest niezbędny jeśli chcemy np. modyfikować skrypty generujące Makefile. Jednak jego dodanie może też tworzyć problemy jeśli w paczce nie ma skryptów dla autotools i jest tylko zwykły Makefile. Wtedy ta funkcja się wysypie bo narzędzia nie będą miały czego przetwarzać. Decyzję czy dodać tą linię czy nie zostawiam Wam.

W ten prosty sposób można szybko ułatwić sobie pracę z patch’owaniem źródeł zamiast za każdym razem pracowicie przerabiać ebuild’y.

Comment are closed.