Сборка своего пакета Thinstation 5

  • Печать

Самому писать много букав желания нет, поэтому в статье местами использованы вставки из CRUX Handbook, кстати хоть перевод и старый, но в принципе ничего не изменилось, рекомендую к прочтению, и информация с форума разработчиков Thinstation.

Для начала идём на http://crux.nu/portdb/?a=search и пытаемся найти нужный нам пакет.

Если повезло, то копируем команду загрузки (если команда начинается с httpup, вроде CRUX-овская фича, то закачивать в chroot-среде) и идём в папку ts/ports/static-source, в терминале выполняем команду и получаем папку с файлами для сборки.

Если не повезло и пакет не нашёлся, то делаем свой файл сборки Pkgfile, содержащий информацию о пакете (такую как имя, версия и т.п.) и команды, которые должны быть исполнены для сборки пакета. Ниже пример Pkgfile-а, как он должен выглядеть, для сборки утилиты grep. Добавлены некоторые комментарии.

# Название пакета. 
name=grep 
# Версия пакета. 
version=2.4.2 
# Релиз пакета. 
release=1 
# Исходник(и), используемые для сборки пакета. 
source=(ftp://ftp.ibiblio.org/pub/gnu/$name/$name-$version.tar.gz) 
# Функция build() вызывается pkgmk после того, 
# как указанные исходники распакованы. 
build() { 
# В первую очередь, переходим в каталог с распакованными исходниками. 
cd $name-$version 
# Запускаем configure скрипт с нужными аргументами. 
# В данном случае grep должен быть размещен в /usr/bin и 
# должен быть выключен NLS. 
./configure --prefix=/usr --disable-nls 
# Сборка. 
make 
# Устанавливаем файлы, но не в /usr, а в $PKG/usr с помощью переменной 
# DESTDIR. Переменная $PKG указывает на временный каталог, который 
# позже будет упакован в tar.gz-файл. Замечание: переменную 
# DESTDIR не все Makefile-ы, некоторые используют prefix, 
# другие ROOT, и т.д. Исследуйте Makefile не предмет этой возможности 
# Некоторые Makefile-ы вообще не имеют такой возможности. 
# В этом случае, необходимо их пропатчить. 
make DESTDIR=$PKG install 
# Удаляем ненужные файлы, в данном случае страницы info. 
rm -rf $PKG/usr/info
}

В реальном случае, не нужно вставлять все эти комментарии. Ниже приведен реальный для grep

 
# Maintainer: Per Liden per(a)fukt.bth.se 
name=grep 
version=2.4.2 
release=1 
source=(ftp://ftp.ibiblio.org/pub/gnu/$name/$name-$version.tar.gz) 
build() { 
cd $name-$version 
./configure --prefix=/usr --disable-nls 
make 
make DESTDIR=$PKG install 
rm -rf $PKG/usr/info 
} 

Я настоятельно рекомендую посмотреть, как сделаны Pkgfile-ы в других пакетах. Это хороший способ научиться создавать свои.

Сборка запускается в croot-среде, в папке с Pkgfile, командой pkgmk -d. После того, как pkgmk завершит работу будет собран пакет с именем <name>#<version>-<release>.pkg.tar.gz. Перед тем, как сборка пакета завершится, pkgmk сверит содержимое пакета с файлом .footprint. Если этого файла нет, то он будет создан и тест пропущен. Файл .footprint содержит список всех файлов в пакете. Если произойдет несовпадение сверки, пакет собран не будет и будет выдано сообщение об ошибке. Вы не должны создавать .footprint вручную. Вместо этого, после того, как пакет обновлен, вам нужно обновить содержимое .footprint файла командой pkgmk -uf.

Если пакет собрался без ошибок, то устанавливаем его с помощью pkgmk -i.

Информация выше взята из CRUX Handbook с моими дополнениями, а вот теперь мой опыт по сборке пакета Midnight Commander:

./setup-chroot #входим в среду сборки

cd ts/ports/static-source #переход в папку

rsync -aqz crux.nu::ports/crux-3.0/opt/mc/ mc #скачиваем "сборочные" файлы

cd mc #переход в папку пакета

pkgmk -d #эта команда загрузит исходники и скомпилирует пакет

pkgmk -i #эта команда установит пакет в chroot-окружение

После попытки запуска mc в chroot-окружении вылезла ошибка:

bash: /usr/share/mc/mc-wrapper.sh: No such file or directory

Не беда, находим этот файл в папке /usr/lib/mc и переносим его с остальными в /usr/share/mc.

Теперь всё работает.

На этом компиляция закончена, нужно получить файлы в образ:

mkdir -p /ts/5.1/packages/mc/build #cоздаём папки будущего пакета

cp /ts/5.1/packages/cups/build/install /ts/5.1/packages/mc/build/ #копируем скрипт установки, что бы свой не писать

Меняем в файле /ts/5.1/packages/mc/build/install строку export PACKAGE=cups на export PACKAGE=mc
и убираем export CREATE_EMPTY_DIRS="
var/cache/cups
etc/cups/ssl
etc/cups/ppd
etc/cups/interfaces
"

Добавляем в папку пакета файл dependencies, вписав в него слово base.

Далее добавляем package mc в build.conf.example и запускаем сборку.

После сборки получаем готовый пакет Midnight Commander.

Обсудить на форуме (комментариев 7).