среда, 2 февраля 2011 г.

Portage

т.к. не хватало нескольких вещей в портаже - запилил
пару вещей взял здесь
и так:

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