пару вещей взял здесь
и так:
из ссылки выше автопатчер - в /etc/portage/bashrc добавил
#PATCHES pre_src_configure() { src_autopatcher } src_autopatcher() { PATCH_DIR="/var/portage/patches" PATCH_OPTS="-g0 -E --no-backup-if-mismatch" local count=0 if [ -d "${PATCH_DIR}/${CATEGORY}/${PN}" ]; then for PATCH in $(find "${PATCH_DIR}/${CATEGORY}/${PN}" "${PATCH_DIR}/${CATEGORY}/${PN}/${PV}/" -maxdepth 1 -type f -name "*.patch"|sort) do einfo "Patching ${PATCH/*\//} ..." while [[ ${count} -lt 5 ]]; do if (patch -p${count} ${PATCH_OPTS} --dry-run -f < "${PATCH}") >/dev/null; then patch -p${count} ${PATCH_OPTS} < "${PATCH}" >/dev/null break fi (( count++ )) done if [[ ${count} -ge 5 ]] ; then eerror "Failed Patch: ${PATCH/*\//} !" die "Failed Patch: ${PATCH/*\//} !" fi done fi }нужен для автоматического наложения желаемых патчей без правки ебилдов
можно положить патч как в /var/portage/patches/категория/пакет, так и в /var/portage/patches/категория/пакет/версия
использую для этого
так же из ссылки выше финт ушами - иногда патчи не годятся и колдовать приходится руками
например: у меня своя морда для хромиума - просто набор картинок - через патч не очень хорошо.
потому сделал следующее - в /etc/portage/env/www-client/chromium написал
pre_src_compile() { cp -R /home/megabaks//chromium/* . }т.е. файлы моей темы переписывают аналогичные из стандартной темы, перед тем как хромиум начнёт компилироваться.
далее
например dev-util/nvidia-cuda-sdk не хочет собираться с gcc >4.4, а у меня давно 4.5
чтобы не переключать gcc при каждой обновке/пересборке мира написал следующее в /etc/portage/bashrc
#COMPILERS if [ -f ${ROOT}/etc/portage/package.compilers ]; then while read target ver; do if [ "${target}" = "${CATEGORY}/${PN}" ]; then export ROOTPATH="/usr/$MACHTYPE/gcc-bin/$ver:$ROOTPATH" export PATH="/usr/$MACHTYPE/gcc-bin/$ver:${PATH}" export LIBRARY_PATH="$(gcc-config -L):${LIBRARY_PATH}" fi done < ${ROOT}/etc/portage/package.compilers fiи в /etc/portage/package.compilers написал
dev-util/nvidia-cuda-sdk 4.4.5теперь сборка проходит нормально без лишних телодвижений с моей стороны. есть ещё одна вещь, но мало кому нужная (разве что экспериментаторам) это аналог --newuse только для CFLAGS/CXXFLAGS/LDFLAGS (так сказать: --newxflags)
#!/bin/bash DIR="/var/db/pkg" FILE="environment.bz2" IGNORE_DIRS="/etc/portage/env.d /etc/portage/env" IGNOR_CATEGORY="virtual/ sys-kernel/ media-fonts/" IGNOR_FLAGS="pipe Wall Wno-all" BINPKG="-bin-" IGNOR_PKG="grub cpio" TYPE="CFLAGS" IGNOR_DIRS_PKG=$(for i in "$(find ${IGNORE_DIRS} -type f)";do grep -l "^$TYPE=" $i | rev | cut -d"/" -f1,2 | rev;done) echo -e "\n\033[0;0;1;33mPackages with unique flags:\033[0m" echo -e "\033[0;0;1;32m$IGNOR_DIRS_PKG\033[0m" | tr " " "\n" echo -e "\n\033[0;0;1;33mIgnore categories:\033[0m" echo -e "\033[0;0;1;32m$IGNOR_CATEGORY\033[0m" | tr " " "\n" echo -e "\n\033[0;0;1;33mIgnore packages:\033[0m" echo -e "\033[0;0;1;32m$IGNOR_PKG\033[0m" | tr " " "\n" echo -e "\nPlease wait...\n" CONF=$(emerge --info | grep $TYPE | cut -d'"' -f2) for x in "$(find $DIR -name $FILE -type f -print 2>/dev/null)"; do export PKG=$(echo "$x" | cut -d '/' -f5,6); done for i in $PKG;do TEST1="$(bzgrep "declare -x $TYPE=" $DIR/$i/$FILE | cut -d'"' -f2 | tr " " "\n" |sort | grep -v "$(echo $IGNOR_FLAGS| tr " " "\n")" | sort)" TEST2="$(echo "$CONF" | tr " " "\n" | sort| grep -v "$(echo $IGNOR_FLAGS| tr " " "\n")" | sort)" if [ "$TEST1" != "$TEST2" ];then export xREBUILD="$xREBUILD $i" fi done export zREBUILD=$(echo ${xREBUILD} | tr " " "\n" | grep -v "$(echo $IGNOR_CATEGORY $IGNOR_DIRS_PKG $BINPKG $IGNOR_PKG | tr " " "\n")") for z in $zREBUILD;do TEST3="$(bzgrep "declare -x $TYPE=" $DIR/$z/$FILE | cut -d'"' -f2 | tr " " "\n" |sort | grep -v "$(echo $IGNOR_FLAGS| tr " " "\n")" | sort)" TEST4="$(bzgrep "declare -- $TYPE_BASE=" $DIR/$z/$FILE | cut -d'"' -f2 | tr " " "\n" |sort | grep -v "$(echo $IGNOR_FLAGS| tr " " "\n")" | sort)" if [ "$TEST3" != "$TEST4" ];then for flag_o_matic in $z;do TEST5="$(bzgrep "flag-o-matic" $DIR/$flag_o_matic/$FILE)" if [ -z "$TEST5" ];then export REBUILD="$REBUILD =$flag_o_matic" fi done fi done if [ "$REBUILD" == "" ];then echo -e "\n\033[0;0;1;32m[done] clean :)\033[0m\n" else emerge -1av $REBUILD fiэтот скрипт проверяет с какими флагами был установлен пакет, и какие установлены в текущем окружении если они различаются, то пакет становится претендентом на пересборку, если он не отсеется на других фильтрах:
- отсеиваются пакеты с флагами заданными через /etc/portage/env* (можно добавить и свои)
- отбрасываются пакеты некоторых категорий - например виртуалы, шрифты..(так же можно вписать свои)
- так же есть список пакетов, которые по той или иной причине пересобирать не хочется или это просто бесполезно (например флаги режутся не в ебилде, а в сорсах)
- так же выбрасывает бинарные пакеты - их пересобирать вообще никакого смысла, в данном контексте, нет
- отфильтровываются пакеты в ебилдах которых режутся флаги (используется flag-o-matic.eclass)
- TYPE определяет какие флаги проверять
при сравнении флагов их последовательность в конфигах (make.conf например) не имеет значения.
есть список флагов, которые влиют только на процесс сборки, но не на собираемый софт (можно и своих понаписать).
Комментариев нет :
Отправить комментарий