Previous Entry Поделиться Next Entry
Как использовать репы ArchLinux в Slackware
Haydn
serg_markov
Обновлено - теперь можно использовать текущие версии pacman.

   Репозитории ArchLinux огромны и есть прямой смысл иметь возможность создания пакетов слаки используя PKGBUILD, который в арче служит неким аналогом SlackBuild в слаке. Помимо простоты и удобства сборки пакетов прог которых нигде нет в слаке из неисчерпаемых репозиториев ArchLinux (наверное самых больших в мире), сборка пакетов из арча позволяет также просто использовать патчи из арча ко многим прогам, которые без этих патчей просто не собираются.
Предлагаемый далее метод имеет следующие ограничения:

нет разрешения зависимостей, как в арче, их придется устанавливать ручками
нет верификации подписи

   Естественно нет гарантии что любой пакет , собранный таким методом, будет работать, но большинство пакетов будет работать вполне нормально.
   PKGBUILD официальных репозиториев берутся из abs (Arch Build System) или можно клонировать git

git clone git://projects.archlinux.org/svntogit/packages.git

PKGBUILD неофициального репозитория aur берутся здесь - aur.archlinux.org/packages.php (тарбалл).
   Арч использует для создания пакетов из PKGBUILD утилиту makepkg в составе менеджера пакетов pacman. Сам по себе pacman в слаке не только не нужен, но и крайне вреден, с его помощью можно запросто сломать систему, поэтому создаем пакет только с makepkg и утилитой обновления хэшей updpkgsums из пакета pacman. Это скрипты, которые работают везде, где есть bash, поэтому не стоит беспокоиться на этот счет.
Скачиваем отсюда - https://www.archlinux.org/packages/ пакет с pacman и распаковываем его в любую временную папку.
Правим в этой папке usr/bin/makepkg: находим и комментируем (# в начале каждой строки) следующие строчки (их расположение в файле может меняться от версии к версии, но сам код постоянен)

- чтобы makepkg не стирал файлы *.la, необходимые слаке. Должно получится вот так:

# if [[ $(check_option libtool) = "n" ]]; then
# msg2 "$(gettext "Removing "%s" files...")" "libtool"
# find . ! -type d -name "*.la" -exec rm -f -- '{}' \;
# fi

- чтобы makepkg не искал pacman для проверки зависимостей. Должно получится вот так:

# check for PACMAN if we need it
# if (( ! INFAKEROOT && ( ! NODEPS || DEP_BIN || RMDEPS || INSTALL ) )); then
# if [[ -z $PACMAN_PATH ]]; then
# error "$(gettext "Cannot find the %s binary required for dependency operations.")" "$PACMAN"
# ret=1
# fi
#fi

- чтобы не надоедал напоминаниями ищем функцию run_pacman() и комментируем в ней последнюю строчку. Должно получится вот так:

if (( ! ASROOT )) && [[ ! $1 = -@(T|Qq) ]]; then
if type -p sudo >/dev/null; then
cmd=(sudo "${cmd[@]}")
else
cmd=(su root -c "$(printf '%q ' "${cmd[@]}")")
fi
fi
# "${cmd[@]}"
}

Правим в этой папке usr/bin/updpkgsums, заменяем
newsums=$(makepkg -g -p "$buildfile") && rm -f "$buildfile" &&
на
newsums=$(makepkg-arch --asroot -g -p "$buildfile") && rm -f "$buildfile" &&

   Переопределяем флаги компиляции в файле /etc/makepkg.conf
приводя их к следующему виду

#-- Compiler and Linker Flags
# -march (or -mcpu) builds exclusively for an architecture
# -mtune optimizes for an architecture, but builds for whole processor family
CFLAGS="-O3 -march=native -mtune=native -fomit-frame-pointer -pipe \
-mmmx -m3dnow -falign-jumps=1 -falign-labels=1 -fPIC"
CXXFLAGS="-O3 -march=native -mtune=native -fomit-frame-pointer -pipe \
-mmmx -m3dnow -falign-jumps=1 -falign-labels=1 -fPIC"
LDFLAGS="-Wl,-O1 -Wl,--as-needed"
#-- Make Flags: change this for DistCC/SMP systems
MAKEFLAGS="-j1"

Флаги могут какие угодно по хотению собственной левой пятки :-)
Создаем пакет pacman-slackware, запускаем от рута во временной папке с pacman скриптик:

#!/bin/sh
mkdir -p /tmp/pacman-slackware/etc /tmp/pacman-slackware/usr/bin \
/tmp/pacman-slackware/usr/share /tmp/pacman-slackware/usr/man \
/tmp/pacman-slackware/sbin
cp -a etc/makepkg.conf /tmp/pacman-slackware/etc
cp -a usr/bin/makepkg /tmp/pacman-slackware/sbin/makepkg-arch
cp -a usr/bin/updpkgsums /tmp/pacman-slackware/usr/bin/updpkgsums
cp -ar usr/share/man /tmp/pacman-slackware/usr
cp -ar usr/share/bash-completion /tmp/pacman-slackware/usr/share
cp -ar usr/share/locale /tmp/pacman-slackware/usr/share
cp -ar usr/share/pacman /tmp/pacman-slackware/usr/share
cp -ar usr/share/zsh /tmp/pacman-slackware/usr/share
CWD=$(pwd)
cd /tmp/pacman-slackware
chown -R root:root .
find . \
\( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \
-exec chmod 755 {} \; -o \
\( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \
-exec chmod 644 {} \;
/sbin/makepkg -l y -c n $CWD/pacman-slackware.txz
cd $CWD

получаем в папке с распакованным pacman пакет pacman-slackware.txz и устанавливаем его.

   Скачиваем пакет pacman-mirrorlist - https://www.archlinux.org/packages/core/any/pacman-mirrorlist и распаковываем его в соответствии с его структурой (распаковываем папку pacman.d в /etc). Раскомментируем в /etc/ pacman.d/mirrorlist какой нибудь сервер репозиториев, у самого стоит Server = http://mirrors.liquidweb.com/archlinux/$repo/os/$arch.
   Для создания и использования abs необходим сам пакет abs. Создаем его следующим образом: копируем PKGBUILD для abs c www.archlinux.org/packages/extra/i686/abs (projects.archlinux.org/svntogit/packages.git/tree/trunk?h=packages/abs ). Создаем из PKGBUILD пакет слаки следующим скриптом, исполняемым от root во временной папке abs с PKGBUILD (в дальнейшем этот же скрипт будет использоваться для создания пакетов слаки и из других PKGBUILD).

#!/bin/bash
# Текущая директория
CWD=$(pwd)
#
# Замена qmake-qt4 в арче на qmake в слаке
sed -i 's|qmake-qt4 |qmake |g' PKGBUILD
#
# Название и версия пакета (из PKGBUILD)
namepkg=$(sed -n '/^pkgname=/p' $CWD/PKGBUILD | sed 's/pkgname=//') > /dev/null
version=$(sed -n '/^pkgver=/p' $CWD/PKGBUILD | sed 's/pkgver=//') > /dev/null
#
# Создание пакета ArchLinux
/sbin/makepkg-arch --asroot || exit 1

# Создание пакета Slackware
rm -rf pkg-slack
mkdir -p pkg-slack/install
find *tar.xz | while read i; do tar --xz -xf $i -C pkg-slack; done
sed -n -e '/post_install() {[[:space:]]*$/,/^[[:space:]]*}[[:space:]]*$/p' .INSTALL | sed -e '1d;$d' -e 's/[[:space:]]*//' > pkg-slack/install/doinst.sh
cd pkg-slack
rm -rf .INSTALL > /dev/null
rm -rf .PKGINFO > /dev/null
rm -rf .MTREE > /dev/null
mv usr/share/man usr/man
mv usr/share/doc usr/doc
/sbin/makepkg -l y -c n $CWD/$namepkg-$version-archlinux.txz
cd $CWD

sed -n -e '/post_install() и далее в одной строке. Если этот скрипт по каким то причинам не создал пакет слаки, то переходим в директорию pkg в этой папке, удаляем в ней файлы .MTREE, .PKGINFO, .INSTALL и запускаем в этой папке от рута

/sbin/makepkg -l y -c n /tmp/packages-temp.txz

   Далее переименовываем созданный в /tmp пакет packages-temp.txz. Полученный таким образом пакет будет работоспособен в большинстве случаев, возможно иногда надо будет ручками выполнить процедуры в .INSTALL.

   В файле /etc/abs.conf можно переопределить место сохранения дерева abs в строке

[ "$ABSROOT" = "" ] && ABSROOT="/ваш_путь_к_дереву_abs/"

Создаем дерево официальных репозиториев — abs в терминале. Обновляется дерево abs такой же командой — abs.
    Далее просто переходим в папку с нужным PKGBUILD, копируем папку куда-нибудь, или в ваше место сборки пакетов или, например, в /tmp и запускаем в ней указанный выше скрипт, на выходе получаем пакет слаки. Если у пакета есть какие то зависимости, то они указаны и в вебморде и в секциях depends, makedepends, optdepends PKGBUILD. Depends жесткие зависимости, которые обязательно должны быть, makedepends нужны только для создания пакета и после его создания могут быть удалены, optdepends для каких то дополни­тельных и необязательных возможностей.
    Арч декларирует наличие самых новых версий прог, но это далеко не всегда так, особенно в aur. Поэтому если хочется самые последние версии прог, надо зайти на сайт проги, и если есть новая версия, скачать ее сорцы в папку со PKGBUILD и в нем поправить pkgver, править md5sums (sha256sums) для архива сорцов можно утилиткой updpkgsums из пакета pacman-slackware
    Поиск PKGBUILD выполняется через вебморды, для официальных репозиториев здесь — www.archlinux.org/packages, для aur здесь — aur.archlinux.org/packages. Поиск возможен как по названию пакета, так и по описанию (типа «pdf»)
    Иногда, довольно редко, нужны тривиальные правки PKGBUILD, типа замены qmake-qt4 на qmake.
    Сказанного вполне достаточно для работы с abs и aur, но если возникли какие то вопросы они скорее всего разобраны в вики арча, wiki.archlinux.org.
    Но надо помнить что создание пакетов из чужого дистра изначально может быть некорректным (хотя в большинстве случаев такое создание вполне удачно), поэтому в первую очередь надо думать головой (впрочем это всегда полезно :-)
    В любом случае надо помнить, что в арче принято более мелкое разбиение пакетов, чем в слаке, поэтому если вы увидели в арче какую то зависимость для нужного вам пакета, не надо спешить ее собирать и ставить, вполне возможно, что необходимая либа или прога в слаке уже стоит в составе какого­то более крупного пакета, если вы ее соберете из арча и установите, то тем самым замените уже имеющуюся. Таким образом очень легко получить
неработоспособную систему. Поэтому перед сборкой и установкой пакетов из арча всегда надо проверять, нет ли уже вас необходимого. Проверить это проще всего поиском по содержимому файлов в /var/log/packages/ любой утилитой поиска типа regexxer.
   Например в арче отдельный пакет webkit, тем более что он взят не из самого qt4, а из порта webkit­qt5 на qt4. Совершенно необязательно и даже вредно заменять им уже имеющийся в слаке webkit в составе qt4, подавляющее большинство прог будет прекрасно на нем работать.
    Не надо собирать из арча системные пакеты, уже имеющиеся в слаке на DVD или в других местах, поломать систему таким образом очень легко. Лучше всего использовать abs и aur для сборки пользовательских пакетов и их зависимостей, которых в слаке нигде нет.
Метки: ,

(Анонимно)

2013-05-06 23:49 (UTC)

Здравствуйте! Всё делаю по инструкции, но у меня вылезает ошибка:
==> ERROR: Cannot find the pacman binary required for dependency operations.
я и гуглил, и не очень мне это помогло ни чего не нашёл.
Прошу вас мне помочь!

Сейчас проверил, не собирается с новым makepkg, в новый встроили обязательную проверку на наличии пакмана, в старом makepkg если пакмана не было, то проверка пропускалась.
Вот makepkg от 2012 года, с которым все работает
http://pastebin.com/E3GcrfbP

Обновлено, и дополнены некоторые моменты , которые пропустил.

Спасибо

(Анонимно)

2013-05-07 11:04 (UTC)

Спасибо огромное, за помощь и за ссылку, а то уже всю голову сломал.

Это мой косяк :) , не проверил в новых версиях пакмана. В тексте уже исправлено

Теперь можно использовать текущие версии pacman

Вы читаете serg_markov