пару вещей взял здесь
и так:
из ссылки выше автопатчер - в /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 например) не имеет значения.
есть список флагов, которые влиют только на процесс сборки, но не на собираемый софт (можно и своих понаписать).
Комментариев нет :
Отправить комментарий