Подустал я разгребать развесистые зависимости в SlackBuilds.
Да, там сделали серьезный шаг в эту сторону, не спорю, в файле имя_пакета.info появилась переменная REQUIRES, в которой перечисляются необходимые пакеты для сборки.
Но!
Ситуация выглядит таким образом:
К примеру, понадобилось мне собрать пакет perl-DateTime-Format-ISO8601/ .
Смотрим perl-DateTime-Format-ISO8601.info , тянем билд:
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
Запускается из билд-каталога пакета, т.е.
cd /Slackware/SlackBuilds/14.0/perl/perl-DateTime-Format-ISO8601/
make_seq.sh
После чего в каталоге появится файл BUILD_SEQUENCE, в котором перечислена последовательность сборки необходимых пакетов.
Если никаких дополнительных пакетов не требуется, в каталоге выше ( /Slackware/SlackBuilds/14.0/perl/ ) появится файл 0_REQUIRES, с именем этого пакета.
Сделано для пакетной обработки многих пакетов.
А теперь можно эти файлики скормить тому же sboinstall, или наваять что свое для автоматической сборки.
Да, там сделали серьезный шаг в эту сторону, не спорю, в файле имя_пакета.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
===============================================================
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, или наваять что свое для автоматической сборки.