четверг, 21 марта 2013 г.

/etc/portage/env

Этот пост о /etc/portage/env как более разжёванное продолжение части про bashrc в "Portage: хочется странного".
По наводке funeralismatic.

И так: в сабжевой директории рассмотрим bashrc per package.
bashrc - это обычный скрипт на bash-е.
Такие файлы могут иметь следующее расположение и имена:
/etc/portage/env/${CATEGORY}/${PN}
/etc/portage/env/${CATEGORY}/${PN}:${SLOT}
/etc/portage/env/${CATEGORY}/${P}
/etc/portage/env/${CATEGORY}/${PF}
В нём можно задавать и перезадавать переменные и функции для любого отдельно взятого пакета, как ваши собственные, так и из ебилда - т.е. если в ебилде задана функция src_configure в одном виде, а в bashrc пакета другая, то будет использоваться ваша реализация, например:
[ root@desktop ] megabaks # cat /etc/portage/env/media-video/gnome-mplayer
src_configure() {
 # FIXME: The only reason why --without-gpm-new-method is passed is lack of testing.
 econf \
#  --enable-gtk3 \
  $(use_enable gnome nautilus) \
  --disable-gseal \
  --without-gconf \
  --with-gio \
  $(use_with dbus) \
  $(use_with alsa) \
  $(use_with pulseaudio) \
  $(use_with libnotify) \
  $(use_with ipod libgpod) \
  $(use_with musicbrainz libmusicbrainz3) \
  --without-gpm-new-method \
  --without-gpm-old-method
}
[ root@desktop ] megabaks #
Этим я выключил сборку с gtk3, которая была в основном дереве, просто переопределив функцию src_configure.
Функции
pkg_pretend
pkg_nofetch
pkg_setup
src_unpack
src_prepare
src_configure
src_compile
src_test
src_install
pkg_preinst
pkg_postinst
pkg_prerm
pkg_postrm
pkg_config
pkg_info
Некоторые функции выполняются в песочнице (sandbox):
src_unpack
src_compile
src_test
src_install
Это значит, что на этих этапах обработки ебилда мы можем делать что угодно с сорсами пакета, но из других мест можем только читать, ибо нефиг что-либо изменять в системе на этих этапах.
Функции-этапы умеют префиксы pre и post, которые не используются в ебилдах, но дают пользователю свободу действий перед/после, соответственно, выполнения некоторой функции из екласса/ебилда.
Например, я заменяю перед сборкой chromium-а некоторое кол-во png файлов через функцию в /etc/portage/env/www-client/chromium , т.к. терпеть не могу косые табы
pre_src_compile () 
{ 
    cp -R /home/megabaks/some_trash/chromium/* .
}
т.е. перед запуском компиляции я заменяю всё что мне нужно.
В данном примере под "." подразумевается корень исходников пакета, если точнее "/var/tmp/portage/www-client/chromium-версия/work/${S}", где S обычно "${PN}-${PV}", но иногда может принимать и другие значения если это описано в ебилде.
Впрочем это не имеет отношения к нам - пусть портаж раскуривает это.
Достаточно просто запомнить, что по-умолчанию все действия происходят в корне исходников.
Доки о переменных.
Впрочем, они, как обычно, не полные - не учтены те же git/svn/etc...
Переменные
Некоторые переменные так же можно задавать в bashrc per package.
Например {C,CXX,LD,FF,FC}FLAGS:
desktop megabaks # cat /etc/portage/env/media-video/ffmpeg 
CFLAGS="-O2 -march=core2 -ftree-vectorize  -msse4.1"
desktop megabaks #
Вроде всё, что применимо в сабже...