четверг, 21 марта 2013 г.

Зависимости SlackBuilds

Подустал я разгребать развесистые зависимости в SlackBuilds.

Да, там сделали серьезный шаг в эту сторону, не спорю, в файле имя_пакета.info появилась переменная REQUIRES, в которой перечисляются необходимые пакеты для сборки.
Но!

Ситуация выглядит таким образом:
К примеру, понадобилось мне собрать пакет perl-DateTime-Format-ISO8601/ .

Смотрим perl-DateTime-Format-ISO8601.info , тянем билд:

wget http://slackbuilds.org/slackbuilds/14.0/perl/perl-DateTime-Format-ISO8601.tar.gz

      
tar -xfz perl-DateTime-Format-ISO8601.tar.gz

Тянем исходник:

cd perl-DateTime-Format-ISO8601
. ./*.info
wget $DOWNLOAD

Проверяем зависимости:

echo $REQUIRES

Наблюдаем картину:

perl-DateTime-Format-Builder

Все. Один-единственный пакет.
Отлично!

Тянем билд:

wget http://slackbuilds.org/slackbuilds/14.0/perl/perl-DateTime-Format-Builder.tar.gz

Разворачиваем

tar -xfz perl-DateTime-Format-Builder.tar.gz

Далее по уже знакомому алгоритму:

cd perl-DateTime-Format-Builder
. ./*.info
wget $DOWNLOAD

Смотрим зависимости:


echo $REQUIRES

Видим:

perl-Class-Factory-Util perl-DateTime-Format-Strptime perl-Task-Weaken

Тааак, уже веселее, еще три пакета.

И так далее, и так далее.

Результат: чтоб собрать пакет perl-DateTime-Format-ISO8601  нужно по зависимостям поставить 31 пакет.

Впечатляет?

Хорошо, допустим, необходимость данного пакета многим не совсем понятна.
Попробуйте собрать spamassassin. ;)

Есть пакет sbotools, зависимости подтягивает по мере надобности, но он интерактивный, то есть в данном случае понадобится 33 раза ткнуть "Yes".
У него есть неинтерактивный режим, но в нем зависимости  не отслеживаются ( или отслеживаются но не устанавливаются ).
Так что с автоматизацией неважно.

Решено было эту ситуацию как-то разрулить, с целью повышения автоматизации.
Результатом стал скрипт:

===================================================
#!/bin/sh

# make_seq.sh - Build sequence packages

# Written by SlackBoost <slackboostdev@gmail.com>

SLACKBUILDROOT="/Slackware/SlackBuilds/14.0"


find_req() {

    INFO=$( find $SLACKBUILDROOT -name $1.info )
    . $INFO
    if [ "$REQUIRES" != "" ]; then
        for pkg in $REQUIRES ; do
            echo -n " $pkg"
            find_req $pkg
        done
    else
        echo
    fi
}

get_last() {

echo "$1" | while read STRING ; do
    echo "${STRING##*' '}"
done
}

rm_last() {

echo "$1" | while read STRING ; do
    if [ $( echo $STRING | wc -w ) -gt 1 ]; then
        echo "${STRING%' '*}"
    fi
done
}

PKG=$( basename $(pwd) )
if [ -f ./${PKG}.info ]; then
    . ./${PKG}.info
    if [ "$REQUIRES" = "" ]; then
        echo "$PKG" >> ../0_REQUIRES
    fi
fi

echo "Building sequence of packages for $PKG. Please wait..."
VARLIST=$( find_req $PKG )
> ./BUILD_SEQUENCE
echo "$VARLIST"
while [ $( echo $VARLIST | wc -w ) -gt 0 ]; do
    LASTPKG=$( get_last "$VARLIST" | sort -u )
    echo "$LASTPKG" >> ./BUILD_SEQUENCE
    VARLIST=$( rm_last "$VARLIST" )
done
echo $PKG >> ./BUILD_SEQUENCE

===============================================================

Запускается из билд-каталога пакета, т.е.

cd /Slackware/SlackBuilds/14.0/perl/perl-DateTime-Format-ISO8601/

make_seq.sh


После чего в каталоге появится файл BUILD_SEQUENCE, в котором перечислена последовательность сборки необходимых пакетов.

Если никаких дополнительных пакетов не требуется, в каталоге выше ( /Slackware/SlackBuilds/14.0/perl/ ) появится файл 0_REQUIRES, с именем этого пакета.

Сделано для пакетной обработки многих пакетов.

А теперь можно эти файлики скормить тому же sboinstall, или наваять что свое для автоматической сборки.

Комментариев нет:

Отправить комментарий