22 февр. 2010 г.

makeworld или пересобирём всё под archlinux

Дано: ноутбук с процессором Celeron 430M, установлен ArchLinux i686.
Надо: пересобрать все (или почти все) пакеты под указанный процессор.
Имеется ещё другой настольный комп с процессором Core2Quad, с помощью которого будем всё пересобирать.
Для начала нужно вытащить с ноутбука список всех установленных пакетов, для можно использовать подобный скрипт:
pacman -Q | awk '{ print $1 }' | sort > /tmp/pacman-installed.tmp
pacman -Qm | awk '{ print $1 }' | sort | comm -3 /tmp/pacman-installed.tmp - > /tmp/pacman-to-reinstall.tmp

Где в итоге в файле /tmp/pacman-to-reinstall.tmp получаем сортированный список всех установленных пакетов
Рекомендую выборочно почистить данный список от пакетов, пересобирать которые смысла (времени) нет, типа openjdk2 или openoffice-base.
Далее копируем полученный файл на машину, которая будет пересобирать пакеты (хотя можно и пересобирать на том же ноуте, но это неоптимально по времени).
Для удобства создал 2 папки build и maded, в последней дополнительно папку prescott, в которой будут находиться пересобранные пакеты.
Также нужно скопировать файл /etc/makepkg.conf в ~/maded/makepg-prescott.conf и подправить флаги следующим образом:
CFLAGS="-march=prescott -O2 -pipe -fomit-frame-pointer"
CXXFLAGS="${CFLAGS}"

Потом просто запускам скрипт следующего содержания:
cd ~/build/
for pkg in $(cat /tmp/pacman-to-reinstall.tmp); do

mkdir $pkg
cd $pkg
echo y | yaourt -G --noconfirm $pkg
makepkg -scf --noconfirm --config ~/maded/makepkg-prescott.conf
if mv *.pkg.tar.gz ~/maded/prescott/; then
echo $pkg >> ~/build/done-prescott.txt
else
echo $pkg >> ~/build/error-prescott.txt
fi
cd ..
rm $pkg -r
done

В итоге в папке maded/prescott будут находиться полученные пакеты, файл ~/build/done-prescott.txt будет содержать список пересобранных пакетов, а файл ~/build/error-prescott.txt список пакетов, которые пересобрать не получилось.
Если процесс прервётся по какой-либо причине, вам будет известно, какие пакеты обработаны, поэтому просто можно запустить процесс вновь, удалив обработанные пакеты из файла /tmp/pacman-to-reinstall.tmp
Далее просто нужно перенести полученные пакеты на ноутбук (в моём случае) и установить командой sudo pacman -U *.pkg.tar.gz
Подобным образом можно пересобрать пакеты под необходимую вам архитектуру, изменив соответствующие флаги и параметры.
К примеру, можно так сразу собрать пакеты, оптимизировав под несколько разных процессоров, сэкономив на трафике и скорости, в данном примере под prescott и athlon-xp:
cd ~/build/
for pkg in $(cat /tmp/pacman-to-reinstall.tmp); do
mkdir $pkg
cd $pkg
echo y | yaourt -G --noconfirm $pkg
makepkg -scf --noconfirm --config ~/maded/makepkg-prescott.conf
if mv *.pkg.tar.gz ~/maded/prescott/; then
echo $pkg >> ~/build/done-prescott.txt
else
echo $pkg >> ~/build/error-prescott.txt
fi
makepkg -scf --noconfirm --config ~/maded/makepkg-athlon-xp.conf
if mv *.pkg.tar.gz ~/maded/athlon-xp/; then
echo $pkg >> ~/build/done-athlon-xp.txt
else
echo $pkg >> ~/build/error-athlon-xp.txt
fi
cd ..
rm $pkg -r
done

Небольшие рекомендации при пересборке пакетов, можно в файле /etc/sudorers добавить строки:
user ALL=NOPASSWD: /usr/bin/pacman
user ALL=NOPASSWD: /usr/bin/pacdiffviewer
user ALL=NOPASSWD: /usr/bin/abs

где вместо user укажите свой логин, это нужно для запуска указанных программ без ввода пароля.
Также заранее запустите abs, и используйте вместо yaourt его форк yaourt-abs, для чего скачайте файлы отсюда и запустите команду makepkg -sci