1
мая
0

Настройка/изменение порта в FreeBSD для установки программы определенной версии/ревизии



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

Рассмотрим подобный случай на примере с поисковым полнотекстовым движком Sphinx. Для него существует два порта: содержащий официальный релиз /usr/ports/textproc/sphinxsearch (на данный момент версия 0.9.9) и /usr/ports/textproc/sphinxsearch-devel (бета-версию 1.10-beta). Исходные тексты, которые нужно будет скачать, доступны в SVN-репозитории с ревизиями на разные моменты исправления ошибок.

В подавляющем своем большинстве разработчиками какого-либо ПО для работы с исходниками (и не только) используется система управления версиями. Это, можно сказать, некая разновидность файлового сервера, но позволяет хранить версию дерева файлов (файлов и каталогов) за разные моменты времени, т. е. когда вносились какие-либо изменения (добавление, удаление, редактирование файлов) и история этих изменений. С таким хранилищем может работать любое количество человек, обладающих правом чтения и/или записи. В общем, системы управления версиями главным образом предназначены для записи и отслеживания изменений информации во времени. Очень распространенной системой управления версиями является Subversion (SVN), которая обладает рядом дополнительных полезных возможностей, по сравнению, к примеру с CVS.

Для удобства и избежания путаницы желательно придерживаться одного способа в установке программного обеспечения. Самым предпочтительным и наиболее часто используемым способом установки ПО является коллекция портов FreeBSD. Система портов имеет свою структуру и если немного разобраться в этом, то можно получить результат, соответствующий потребностям.

Каждый порт построен по одному принципу и главное значение несет файл Makefile в котором описаны настройки и операции, которые должны быть совершены по команде make. В этот make-файл каждого порта включается /usr/ports/Mk/bsd.port.mk, где можно, полистав, почерпнуть много интересной и полезной информации.
Для установки программы сначала нужно поместить архив исходных текстов в каталог DISTDIR (по умолчанию это /usr/ports/distfiles). Редактирование файла Makefile потребуется для указания некоторых параметров сборки данного порта. После его редактирования также следует воспользоваться командой make makesum в директории порта для генерации файла distinfo. Каких-либо модификаций порта больше не потребуется и можно запускать команду make для сборки порта, которая производит последовательность операций/целей:
fetch — проверяет имеется ли архив исходников в DISTDIR и если его там нет, то скачивает по указателю URL MASTER_SITES в Makefile с помощью fetch;
extract — распаковка архива в рабочую директорию (по умолчанию work);
patch — цель применяет все патчи (файлы задаются переменной PATCHFILES в том же Makefile, а также применяются с PATCHDIR (по умолчанию каталог files), если таковые имеются);
configure — конфигурирование порта (обычно запускается скрипт configure);
build — переход в рабочий каталог порта (WRKSRC) и его построение.

Модификация Makefile включает в себя изменение нескольких переменных, но желательно понимать за что отвечает каждая из них.
Изначально копируем существующий порт и правим оригинальный Makefile.

cd /usr/ports/textproc
cp -Rp sphinxsearch-devel sphinxsearch-1.11-r2800
cd sphinxsearch-1.11-r2800 ; vim Makefile 

параметры, которые нужно изменить:
PORTVERSION= 1.11.r2800
#PORTREVISION= 1
#PORTEPOCH= 1
DISTNAME= sphinx-1.11-r2800
MASTER_SITES= ftp://ftp-server/pub/soft/sphinx/

Конечно же, никто не запрещает по надобности или эстетическому желанию менять и что-либо еще из того, что перечислено в /usr/ports/Mk/bsd.port.mk. Несколько переменных, для более глубокого понимания того, что написано в Makefile какого-либо порта:
PORTNAME — основная часть имени порта;
PORTVERSION — номер версии;
PORTREVISION — монотонно увеличивающееся число, которое обнуляется при каждом увеличении значения переменной PORTVERSION (то есть каждый раз, когда создателями выпускается новый официальный релиз), и добавляется к имени пакета, если оно не равно нулю;
PORTEPOCH — эта переменная используется при выходе версии программы, номер которой меньше предыдущей версии;
PKGNAMEPREFIX и PKGNAMESUFFIX — необязательные переменные, объединяются со значениями PORTNAME и PORTVERSION для формирования PKGNAME в форме ${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION};
CATEGORIES — категория и указатель в дереве портов, где находится порт;
DISTNAME — имя порта так, как называется данное ПО (по умолчанию совпадает с ${PORTNAME}-${PORTVERSION}). Нужен для скачивания архива исходных кодов и распаковки в work/${DISTNAME};
DISTFILES — задаются файлы, которые нужно загрузить (по умолчанию будет ${DISTNAME}${EXTRACT_SUFX});
MASTER_SITES FTP/HTTP-URL, которая указывает на оригинальный архив, который будет скачен с помощью fetch, если он не будет найден в системе;
EXTRACT_SUFX — по умолчанию устанавливается .tar.gz;
PATCHFILES — дополнительные патчи, которые доступны по FTP или HTTP в PATCH_SITES;
MAINTAINER — контакт разработчика порта;

В Makefile можно посмотреть зависимости данного порта, которые задаются следующими параметрами:
LIB_DEPENDS — указывает, от каких совместно используемых библиотек зависит порт;
RUN_DEPENDS — перечисляются выполнимые файлы или файлы, от которых зависит работа порта;
BUILD_DEPENDS — выполнимые или обычные файлы, которые требуются порту для его построения;
FETCH_DEPENDS — перечисляются выполняемые файлы или просто файлы, которые требуются порту для сгрузки;
EXTRACT_DEPENDS — указываются программы или файлы, которые требуются для распаковки порта;
PATCH_DEPENDS — указывает на программы или файлы, которые нужны порту для применения патчей;
DEPENDS — которая не подпадает ни под одну из вышеперечисленных категорий;
USE_* — для указания сразу несколькоих зависимостей (обычно, которые часто используются);

Для извлечения файлов проекта из репозитория в subversion используется команда:

svn checkout http://example.repository/name  #(или сокращенно, svn co) 

в нашем случае:

svn checkout http://sphinxsearch.googlecode.com/svn/trunk@r2800 sphinx-1.11-r2800

где r2800 — номер ревизии.
Если получаем ошибку «svn: Unrecognized URL scheme for», то это значит, что /usr/ports/devel/subversion должен быть собран с поддержкой NEON (WebDAV/Delta-V repo access module). Создаем архив скаченных исходных текстов и размещаем его на файловом сервере, откуда будет загружен с помощью цели fetch, либо сразу кладем в /usr/ports/distfiles (каталог DISTDIR):

tar czvf sphinx-1.11-r2800.tar.gz sphinx-1.11-r2800 

Удалим оригинальный distinfo и запустим make makesum, которая скачает архив и создаст файл distinfo по отношению к нему:

rm distinfo
make makesum
===>  Vulnerability check disabled, database not found
===>  License GPLv2 accepted by the user
===>  Found saved configuration for sphinxsearch-devel-1.10b,1
=>sphinx-1.11-r2800.tar.gz doesn't seem to exist in/usr/ports/distfiles/.
=> Attempting to fetch
ftp://ftp-server/pub/soft/sphinx/sphinx-1.11-r2800.tar.gz
sphinx-1.11-r2800.tar.gz             100% of 3418 kB  224 kBps 00m00s 

Дальше можно скомпилировать программу и установить ее с помощью:

make install clean

Тут все должно пройти без проблем. Возможно, имеет смысл проверить правильно ли установлено время на сервере, так как можно получить ошибку при сборке «checking whether build environment is sane… configure: error: newly created file is older than distributed files!».

Смотрим, что получили в итоге стараний:

pkg_info -Ix sphinx
sphinxsearch-devel-1.11.r2800 Sphinx Full-Text Search Engine
searchd -h | head -n1
Sphinx 1.11-dev (r2800)
Понравилась статья?
Подписаться на RSS feed
Оставить комментарий