пятница, 11 апреля 2008 г.

Скрипт быстрой сборки пакетов зависимостей

При установке программ из портов freebsd нередко компилируются и ставятся их зависимости. Если для самой программы пакет собирается одной командой

make package
то сборка пакетов зависимостей превращается или в ручной обход требуемых программ или в длительное ожидание конца обработки команды
make package-recursive
Последняя команда начинает тупо компилировать все зависимости и пытаться ставить их в систему, в том числе установленные вместе с программой.

Для решения этой проблемы я сделал следующее:
  1. В файл /etc/make.conf добавить параметр
    WRKDIRPREFIX=/tmp/work
    указывающий системе компилировать программы из портов в папке /tmp/work.

  2. Cохранить скрипт под именем pkg-recursive.sh:
    #!/bin/sh

    if [ -z "$WRKDIRPREFIX" ];
    then {
    # WRKDIRPREFIX берем из make.conf
    wrkdir=`grep -oE 'WRKDIRPREFIX=[^ ]+' /etc/make.conf | sed 's/WRKDIRPREFIX=//'`

    if [ -z "$wrkdir" ];
    then {
    # WRKDIRPREFIX не задан ни в переменной окружения ни в make.conf
    echo No WRKDIRPREFIX variable defined;
    exit;
    } fi;
    }
    else {
    # WRKDIRPREFIX задан в переменной окружения
    wrkdir=$WRKDIRPREFIX;
    } fi;

    # Меняем текущую директорию на директорию сборки и просматриваем его
    cd $wrkdir/usr/ports && ls -d */* | \
    while read pkg;
    do {
    if [ -f $wrkdir/usr/ports/$pkg/work/.install* ] && [ ! -f $wrkdir/usr/ports/$pkg/work/.package* ];
    then {
    # Условие срабатывает если программа установлена в систему и пакет не еще не собран.
    # Команда printf "\t\n" принудительно завершает режим конфигурирования программы
    # (выходит из make config).
    cd /usr/ports/$pkg && (printf "\t\n" | make package);
    } fi;
    } done

  3. Сделать скрипт исполняемым
    chmod +x pkg-recursive.sh

  4. Установить и собрать пакет программы командой
    make package

  5. Выполнить скрипт.

4 комментария:

SENATUM комментирует...

Спасибо за скриптик.

Тема скриптописания очень интересует.

Князь комментирует...

Например? :)

Рамиль комментирует...

Привет, а расскажи как теги pre и code заставить как у тебя выглядеть.

Князь комментирует...

Смотри вот тут :)