diff --git a/ru_RU.KOI8-R/books/porters-handbook/Makefile b/ru_RU.KOI8-R/books/porters-handbook/Makefile
index d912ddbb27..60599acd93 100644
--- a/ru_RU.KOI8-R/books/porters-handbook/Makefile
+++ b/ru_RU.KOI8-R/books/porters-handbook/Makefile
@@ -1,30 +1,34 @@
#
# $FreeBSD$
-# $FreeBSDru: frdp/doc/ru_RU.KOI8-R/books/porters-handbook/Makefile,v 1.3 2000/11/15 17:21:30 phantom Exp $
+# $FreeBSDru: frdp/doc/ru_RU.KOI8-R/books/porters-handbook/Makefile,v 1.5 2001/07/19 08:42:12 phantom Exp $
+# Original reivision: 1.1
#
# Build the FreeBSD Porter's Handbook.
#
MAINTAINER=andy@FreeBSD.org.ua
DOC?= book
FORMATS?= html-split
INSTALL_COMPRESSED?= gz
INSTALL_ONLY_COMPRESSED?=
#
# SRCS lists the individual SGML files that make up the document. Changes
# to any of these files will force a rebuild
#
# SGML content
SRCS= book.sgml
+# Entities
+SRCS+= ../../../en_US.ISO8859-1/books/handbook/authors.ent
+
# Use the local DSSSL file
DSLHTML?= ${.CURDIR}/freebsd.dsl
DSLPRINT?= ${.CURDIR}/freebsd.dsl
DOC_PREFIX?= ${.CURDIR}/../../..
.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/ru_RU.KOI8-R/books/porters-handbook/book.sgml b/ru_RU.KOI8-R/books/porters-handbook/book.sgml
index 01ed902b61..faf446eb1a 100644
--- a/ru_RU.KOI8-R/books/porters-handbook/book.sgml
+++ b/ru_RU.KOI8-R/books/porters-handbook/book.sgml
@@ -1,4669 +1,4749 @@
%man;
%bookinfo;
%authors;
%mailing-lists;
]>
Руководство FreeBSD по созданию портовThe FreeBSD Russian Documentation ProjectАпрель 20002000
The FreeBSD Documentation Project
&bookinfo.legalnotice;
Как самому сделать портИтак, теперь вас интересует, как создать собственный порт или
обновить существующий? Великолепно!Ниже находятся некоторые указания по созданию нового порта для
FreeBSD. Если вы хотите обновить существующий порт, вы должны
прочесть их, а затем .Если этот документ недостаточно подробен, вы должны обратиться к
файлу /usr/ports/Mk/bsd.port.mk, который
включается в make-файл каждого порта. Он хорошо прокомментирован, и
даже если вы не занимаетесь хаканьем make-файлов каждодневно, из него
вы сможете узнать много нового. Кроме того, конкретные вопросы можно
задать, послав письмо на адрес &a.ports;.Только часть переменных
(VAR), которые могут
быть переопределены, описаны в этом документе. Большинство (если не
все) описаны в начале файла bsd.port.mk.
В этом файле используется нестандартная настройка шага табуляции.
Emacs и Vim
должны распознать это при загрузке файла. Как vi,
так и ex могут быть настроены на использование
правильного значения выдачей команды :set tabstop=4
после загрузки файла.Быстрое портированиеВ этом разделе будет описано, как сделать порт на скорую руку.
Во многих случаях этого бывает недостаточно, но мы посмотрим.Во-первых, скачайте оригинальный tar-файл и поместите его в каталог
DISTDIR, который по умолчанию есть не что иное, как
/usr/ports/distfiles.Здесь предполагается, что программное обеспечение компилируется
без проблем как есть, то есть для работы приложения на вашей системе
FreeBSD не потребовалось абсолютно никаких изменений. Если
требовалось что-то изменить, то вам придется обратиться также и к
следующему разделу.Создание файла MakefileМинимальный Makefile будет выглядеть
примерно так:
# New ports collection makefile for: oneko
# Date created: 5 December 1994
# Whom: asami
#
# $FreeBSD$
#
PORTNAME= oneko
PORTVERSION= 1.1b
CATEGORIES= games
MASTER_SITES= ftp://ftp.cs.columbia.edu/archives/X11R5/contrib/
MAINTAINER= asami@FreeBSD.org
MAN1= oneko.1
MANCOMPRESSED= yes
USE_IMAKE= yes
.include <bsd.port.mk>
Посмотрим, сможете ли вы его понять. Не обращайте внимание на
содержимое строчки $FreeBSD$, она
будет заполнена автоматически системой CVS, когда порт будет
импортирован в наше дерево портов. Вы можете найти более подробный
пример в разделе пример
Makefile.Создание информационных файловИмеется три информационных файла, которые требуются для любого
порта, вне зависимости от того, является ли он пакаджем или нет. Это
pkg-comment, pkg-descr и
pkg-plist, и их префикс pkg-
отличает их от других файлов.pkg-commentЭто однострочное описание порта.
Пожалуйста, не включайте сюда название
пакаджа (или номер версии программного обеспечения).
Комментарий должен начинаться с заглавной буквы и не
заканчиваться точкой. Вот пример:
A cat chasing a mouse all over the screen
pkg-descrЭто более подробное краткое описание порта. От одного до
нескольких абзацев, кратко описывающих, что представляет собой
порт, будет достаточно.Это не руководство и не подробнейшее
описание того, как использовать или компилировать порт!
Пожалуйста, будьте внимательны при копировании текста
из README или страниц
справочника; слишком часто они не являются кратким
описанием порта или имеют неудобный формат (например, страницы
справочника выровнены пробелами). Если портируемое приложение
имеет официальную страничку Интернет, укажите ее здесь.
Предварите один из сайтов словом
WWW: для того, чтобы вспомогательные утилиты
работали правильно.Рекомендуется, чтобы вы указали свое имя в конце этого файла,
как здесь:
This is a port of oneko, in which a cat chases a poor mouse all over
the screen.
:
(etc.)
WWW: http://www.oneko.org/
- Satoshi
asami@cs.berkeley.edu
pkg-plistЗдесь перечисляются все файлы, устанавливаемые портом. Его
также называют “списком для упаковки”, потому что
пакадж генерируется упаковкой файлов, которые здесь указаны.
Имена путей указываются относительно установочного префикса
(обычно /usr/local или
/usr/X11R6). Если вы используете переменные
MANn (а вы должны
это делать), то указывать страницы справочника здесь не
нужно.Вот маленький пример:
bin/oneko
lib/X11/app-defaults/Oneko
lib/X11/oneko/cat1.xpm
lib/X11/oneko/cat2.xpm
lib/X11/oneko/mouse.xpm
@dirrm lib/X11/oneko
Обратитесь к странице Справочника по команде
&man.pkg.create.1; с подробным описанием формата списка
упаковки.В списке вы должны указать все файлы, но не каталоги.
Кроме того, если порт создает каталоги сам на этапе установки,
нужно добавить директивы @dirrm в подходящие
места для удаления их при удалении порта.Рекомендуется, чтобы имена файлов в этом списке были
отсортированы в алфавитном порядке. Это позволит значительно
облегчить сверку изменений при обновлении порта.Создание списка упаковки вручную может оказаться весьма
трудоёмкой задачей. Если порт устанавливает большое количество
файлов, раздел об автоматическом построении списка
упаковки может помочь сэкономить время.Создание файла с контрольной суммойПросто введите команду make makesum.
Правила утилиты make автоматически сгенерируют файл
distinfo.Тестирование портаВы должны удостовериться, что правила построения порта выполняют
именно то, что вы хотите, включая создание пакаджа для порта. Вот
те важные вещи, которые вы должны проверить.pkg-plist не содержит ничего сверх того,
что устанавливается вашим портомpkg-plist содержит абсолютно все, что
устанавливается вашим портомВаш порт может быть переустановлен множество раз с помощью
указания цели reinstallВаш порт подчищает
за собой после своего удаленияРекомендуемый порядок проверкиmake installmake packagemake deinstallpkg_add package-namemake deinstallmake reinstallmake packageПроверьте, что ни на шаге package, ни на
шаге deinstall не выдается никаких
предупреждений. После выполнения шага 3 проверьте, что все новые
каталоги были успешно удалены. Также попробуйте запустить
программное обеспечение после выполнения шага 4, чтобы убедиться, что
оно работает правильно при установке из пакаджа.Проверка вашего порта утилитой
portlintБудьте добры, пользуйтесь утилитой portlint
для проверки того, что ваш порт соответствует нашим рекомендациям.
Программа portlint является частью Коллекции
Портов. В частности, вы можете захотеть проверить, правильно ли
сформирован файл Makefile и
соответствующим ли образом наименован пакадж.Посылка портаПервым делом удостоверьтесь, что вы прочитали раздел о
том, что можно и нельзя делать.Теперь, когда вы счастливы от своего первого порта, единственное,
что осталось сделать, это включить его в основное дерево портов
FreeBSD и осчастливить этим всех остальных. Нам не нужен ни ваш
каталог work, ни пакадж
pkgname.tgz, так что удалите их прямо сейчас.
Затем просто включите вывод команды
shar `find port_dir` в сообщение об ошибке и пошлите
его с помощью программы &man.send-pr.1; (обратитесь к разделу Сообщения об ошибках
и общие замечания для получения подробной информации о программе
&man.send-pr.1;. Если размер неупакованного порта превышает 20 КБ, то
сожмите его в tar-файл и воспользуйтесь утилитой &man.uuencode.1; перед
тем, как включить его в сообщение (можно посылать такие файлы, даже если
сообщение не превышают 20КБ, но это не рекомендуется). Не забудьте
указать в сообщении категорию ports и класс
change-request (Не указывайте, что сообщение
имеет статус confidential!). Добавьте также
краткое описание программы, порт которой вы создали, в раздел
Description отправляемого PR и сам порт в виде архива
shar или архива tar, обработанного утилитой uuencode, поместив его в
раздел Fix. Последнее облегчит труд коммиттеров,
которые используют скрипты для выполнения своей работы, связанной с
портами.Повторим еще раз, что не нужно включать ни оригинальный
файл с дистрибутивом, ни каталог work,
ни пакадж, построенный вами командой
make package.
- В прошлом мы просили вас закачивать новые порты на ftp-сервер
+ В прошлом мы просили вас закачивать новые порты на FTP-сервер
(ftp.FreeBSD.org). Больше этого делать
не нужно, так как на каталог incoming/
нет доступа в режиме чтения, из-за большого количества пиратского
программного обеспечения, оказавшегося в нем.Мы посмотрим на ваш порт, при необходимости вернём его обратно, а
затем включим порт в наше дерево. Ваше имя также появится в списке
“Людей, внесших свой вклад” в Руководстве и других
файлах. Это ли не круто?!? :-)Вы можете значительно облегчить нам работу, если будете
давать хорошее описание в поле описания проблемы при посылке. Мы
предпочитаем нечто вроде
“New port: <краткое описание порта>” в случае
нового порта и
“Update port: <category>/<port> <краткое
описание обновлений>” в случае обновления порта.
Если вы будете придерживаться этой схемы, то шансы, что кто-нибудь
вскоре взглянет на ваш PR, весьма высоки.Медленное портированиеИтак, все оказалось не так уж и просто, и порт потребовал
некоторых модификаций для того, чтобы заставить его работать. В этом
разделе мы расскажем, шаг за шагом, как его модифицировать, чтобы он
работал с нашей системой портов.Как всё это работаетВо-первых, когда пользователь дает в своем каталоге с портом
команду make, происходит целая череда событий.
Во время чтения этого текста может оказаться полезным иметь файл
bsd.port.mk открытым в другом окне, что сильно
поможет в их понимании.Но не волнуйтесь сильно, если вы не до конца понимаете, что
делается в bsd.port.mk, не так уж много людей
его понимает... :->Запускается цель fetch. Цель
fetch отвечает за то, что архив исходных
текстов имеется в наличии локально в каталоге
DISTDIR. Если цель
fetch не может найти требуемые файлы в
каталоге DISTDIR, то он будет искаться по
указателю URL MASTER_SITES, который
- устанавливается в Makefile, а также на нашем основном ftp-сервере
+ устанавливается в Makefile, а также на нашем основном FTP-сервере
по адресу
ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/, куда
мы по возможности помещаем дистрибутивные файлы для архива.
Затем она попытается сгрузить указанный файл с помощью
FETCH, полагая, что запрашивающая машина имеет
прямое подключение к Интернет. Если файл скачается удачно, то
он будет помещен в каталог DISTDIR для
последующего использования и обработки.Выполняется цель extract. Она ищет
дистрибутивный файл порта (как правило, tar-архив gzip) в
каталоге DISTDIR и распаковывает его во
временный каталог, задаваемый переменной
WRKDIR (по умолчанию
work).Выполняется цель patch. Во-первых,
применяются все патчи, заданные переменной
PATCHFILES. Во-вторых, если какие-либо файлы с
патчами, носящие имена
patch-*, имеются в
подкаталоге PATCHDIR (по умолчанию это каталог
files), то они применяются в этот момент в
алфавитном порядке.Запускается цель configure. Здесь
может выполняться любая из многих различных вещей.Если существует скрипт
scripts/configure, то он запускается.
Если задана переменная HAS_CONFIGURE
или GNU_CONFIGURE, то запускается скрипт
WRKSRC/configure.
Если задана переменная USE_IMAKE,
то запускается команда XMKMF (по умолчанию
это xmkmf -a).Выполняется цель build. Она
отвечает за переход в собственный рабочий каталог порта
(WRKSRC) и его построение. Если задана
переменная USE_GMAKE, будет использоваться
GNU-версия утилиты make, в противном случае
будет использована системная утилита
make.Выше перечислены стандартные действия. Кроме того, вы сами
можете определить цели
pre-что-то или
post-что-то,
или создать скрипты с такими именами в подкаталоге
scripts, и они будут запущены до или после
выполнения действий по умолчанию.Например, если у вас есть цель
post-extract, определенная в вашем файле
Makefile и файл pre-build в подкаталоге
scripts, то после выполнения обычных действий по
распаковке, будет вызвана цель post-extract
а скрипт pre-build будет выполнен перед
запуском стандартных правил построения. Рекомендуется использовать
цели из Makefile, если действия достаточно
просты, потому что в дальнейшем будет проще определить, какие
нестандартные действия требует порт.Действия по умолчанию выполняются целями
do-что-то из
bsd.port.mk. Например, команды для
распаковки порта находятся в цели
do-extract. Если вам не хватает цели по
умолчанию, вы можете ее исправить, переопределив цель
do-something
в вашем файле Makefile.“Основные” цели (к примеру,
extract,
configure, и тд.) не делают ничего больше,
чем проверяют успешность завершения всех предыдущих шагов и
вызывают настоящие цели или скрипты, и их не нужно менять. Если
вам нужно изменить распаковку, исправляйте
do-extract, но никогда не трогайте
extract!Теперь вы представляете, что происходит, когда пользователь
набирает команду make, теперь давайте пройдемся
через рекомендуемые для создания настоящего порта шаги.Получение исходного кодаПолучите оригинальные исходные тексты (обычно) в виде
упакованного tar-архива
(foo.tar.gz или
foo.tar.Z)
и скопируйте его в каталог DISTDIR. Всегда
используйте исходные тексты основной ветки
разработки везде, где это возможно.
- Если вы не можете найти ftp/http сайт с хорошим подключением к
+ Если вы не можете найти FTP/http сайт с хорошим подключением к
сети, или находите только сайты, которые имеют раздражающе
нестандартные форматы, то можете захотеть поместить копию на надежный
- сервер ftp или http, который вам доступен (например, ваша домашняя
+ сервер FTP или http, который вам доступен (например, ваша домашняя
страница). Проверьте, что вы установили переменную
MASTER_SITES в значение, которое соответствует
вашему решению.Если вы не можете найти доступного и надёжного места для
помещения дистрибутивного файла, то мы сами сможем разместить его на
сервере ftp.FreeBSD.org. Дистрибутивный файл должен
быть помещён в каталог ~/public_distfiles/
одного из пользователей машины freefall. Попросите
того, кто коммиттил ваш порт, сделать это. Этот человек также задаст
переменной MASTER_SITES значение
MASTER_SITE_LOCAL, а в переменной
MASTER_SITE_SUBDIR укажет своё имя пользователя
с машины freefall.Если дистрибутивные файлы вашего порта постоянно меняются по
непонятным причинам, остается поместить дистрибутив на вашу домашнюю
веб-страницу и указать ее первой в списке
MASTER_SITES. Это позволит избежать получения
ошибок checksum mismatch у пользователей, а
- также уменьшит нагрузку на людей, сопровождающих наш ftp-сервер.
+ также уменьшит нагрузку на людей, сопровождающих наш FTP-сервер.
Также, если у порта имеется только один основной сервер, то
рекомендуется поместить архивную копию на свой сайт и указать его в
списке MASTER_SITES вторым.Если вашему порту требуются дополнительные `патчи', доступные
в Интернет, скачайте также и их, поместив в каталог
DISTDIR. Не волнуйтесь, если они находятся не
на том же сайте, откуда взят дистрибутивный архив, мы умеем
обрабатывать такие ситуации (смотрите описание PATCHFILES ниже).Модификация портаРаспакуйте копию дистрибутивного файла в отдельный каталог и
внесите изменения, которые необходимы для того, чтобы порт
компилировался нормально в текущей версии FreeBSD.
Тщательно отслеживайте все, что вы делаете,
этот процесс вам предстоит автоматизировать. Все, включая удаление,
добавление или модификацию в файлах должны будут выполняться
автоматически с помощью скриптов или файлов патчей, когда вы
завершите работу над портом.Если вашему порту во время компиляции, установки и настройки
требуется довольно много взаимодействовать с пользователем, то
посмотрите на один из классических скриптов
Configure Лэрри Уолла (Larry Wall) и
сделайте сами что-либо подобное. Предназначение новой коллекции
портов - это сделать каждое приложение в стиле
“plug-and-play” настолько, насколько это вообще возможно
для конечного пользователя при минимальном использовании дискового
пространства.Если явно не указано обратное, то патчи, скрипты и другие
файлы, которые вы создали и предоставили для Коллекции Портов
FreeBSD, неявно подпадают под стандартные условия лицензии
BSD.Создание патчейФайлы, которые добавлялись или изменялись в процессе создания
порта, могут быть выявлены вызовом программы diff с рекурсией, а
результат работы этой программы может быть в дальнейшем передан
программе patch. Каждый набор патчей, который вы собираетесь
применить, должен быть собран в файл с именем
patch-*, где
* означает порядок, в которой будут
применяться патчи — это делается в
алфавитном порядке, то есть сначала
aa, затем ab и так далее. Если
хотите, вы можете использовать имена файлов, указывающие на имена
файлов, к которым применяются патчи, такие, как
patch-Imakefile или
patch-src-config.h. Эти файлы должны находиться в
каталоге PATCHDIR,
откуда они будут взяты автоматически. Все патчи должны быть сделаны
относительно каталога WRKSRC (как правило,
это каталог, в который распаковывается исходный архив и где будет
выполняться построение). Для упрощения внесения изменений и
обновлений вы должны избегать наличия более чем одного патча для
одного и того же файла (например, патчей
patch-aa и patch-ab, оба
меняющих файл
WRKSRC/foobar.c).КонфигурированиеПоместите все дополнительные команды, требуемые для настройки,
в ваш скрипт configure и сохраните его в
подкаталоге scripts. Как отмечено выше, вы
можете сделать это целями в файле Makefile
и/или скриптами с именами pre-configure или
post-configure.Обработка пользовательского вводаЕсли для построения, конфигурации или установки вашего порта
требуется некоторый ввод со стороны пользователя, то задайте
переменную IS_INTERACTIVE в вашем файле Makefile.
В случае “ночного построения” это позволит пропустить
ваш порт, если пользователь в своем окружении задал переменную
BATCH (и если пользователь установил переменную
INTERACTIVE, то будут строиться
только порты, которые требуют взаимодействия
с пользователем.При наличии разумных ответов на задаваемые вопросы, подходящих по
умолчанию, также рекомендуется проверять переменную
PACKAGE_BUILDING и выключать интерактивный скрипт,
если он есть. Это позволит нам строить пакаджи для помещения на
- компакт-диски и ftp-серверы.
+ компакт-диски и FTP-серверы.
Настройка файла MakefileНастройка файла Makefile достаточно проста, и мы снова
предполагаем, что перед тем, как начать, вы посмотрите на существующие
примеры. К тому же в этом руководстве имеется примерный Makefile, так что взгляните
на него и, пожалуйста, следуйте порядку переменных и разделов в этом
образце, чтобы облегчить чтение вашего порта другими людьми.Итак, расположим решаемые задачи в порядке их возникновения при
создании вашего нового файла Makefile:Оригинальные исходный кодНаходится ли он в каталоге DISTDIR в виде
стандартного упакованного архиватором gzip tar-архива с именем типа
foozolix-1.2.tar.gz? Если это так,
можно перейти к следующему шагу. Если нет, то вы должны попытаться
переопределить некоторые из переменных
DISTNAME, EXTRACT_CMD,
EXTRACT_BEFORE_ARGS,
EXTRACT_AFTER_ARGS,
EXTRACT_SUFX или DISTFILES в
зависимости от того, насколько необычен формат дистрибутивного файла.
(Самый распространённый случай - это
EXTRACT_SUFX=.tar.Z, когда tar-файл упакован
обычной утилитой compress, а не архиватором
gzip.)В худшем случае вы можете просто определить свою собственную цель
do-extract для переопределения действий по
умолчанию, хотя к этому нужно будет прибегать в очень редких случаях,
если вообще придётся.PORTNAME и
PORTVERSIONВ переменной PORTNAME вы должны указать
основную часть имени вашего порта, а в переменной
PORTVERSION - номер версии.PORTREVISION и
PORTEPOCHPORTREVISIONПеременная PORTREVISION представляет собой
монотонно увеличивающееся число, которое обнуляется при каждом
увеличении значения переменной PORTVERSION (то есть
каждый раз, когда создателями выпускается новый официальный релиз),
и добавляется к имени пакаджа, если оно не равно нулю. Значение
PORTREVISION увеличивается каждый раз, когда
в порте FreeBSD делаются изменения, которые достаточно сильно
затрагивают содержимое или структуру соответствующего пакаджа.Примеры случаев, когда значение PORTREVISION должно быть
увеличено:Добавление патчей для исправления пробелов в безопасности,
ошибок, или добавления новой функциональности в порт
FreeBSD.Изменения в файле построения порта для включения и выключения
параметров, определяемых при компиляции пакаджа.Изменения в списке упаковки или в поведении пакаджа во время
его установки (например, изменение скрипта, генерирующего
начальные данные для пакаджа, такие, как ssh-ключи для
хоста).Увеличение версии динамической библиотеки, от которой зависит
порт (в этом случае тот, кто попытается установить старый пакадж
после установки более новой версии библиотеки, не сможет этого
сделать, потому что при этом будет делаться поиск старой
библиотеки libfoo.x, а не libfoo.(x+1)).Большие функциональные изменения в дистрибутивном файле порта,
происходящие без объявлений, и приводящие к большим изменениям, то
есть изменения в дистрибутиве требуют корректировки файла
distinfo без соответствующего изменения
PORTVERSION, когда как команда
diff -ru между новой и старой версиями
показывает нетривиальные изменения в коде.Примеры изменений, которые не требуют увеличения переменной
PORTREVISION:Изменения стиля в скелете порта без функциональных изменений
в пакадже.Изменения в переменной MASTER_SITES или
другие функциональные изменения порта, которые не затрагивают
получающегося пакаджа.Тривиальные патчи к дистрибутивному файлу, такие, как
исправления опечаток, которые не так уж важны, что пользователи
пакаджа должны озаботиться обновлением.Исправления, касающиеся этапа построения, которые делают
возможным построение пакаджа, если ранее это было невозможно
сделать (пока изменения не приводят к изменению работы на любых
других платформах, на которых порт ранее строился). Так как
PORTREVISION отражает содержимое пакаджа, то
если ранее пакадж не строился, то нет нужды увеличивать
PORTREVISION для отметки изменения.Правило, которому нужно приблизительно следовать, заключается в
том, что нужно спрашивать себя, является ли вносимое в порт изменение
таким, что кто-либо и где-либо от него выиграет (в виде
усовершенствования, исправления или благодаря тому, что новый пакадж
будет реально работать). Если это так, то переменная
PORTREVISION должна быть увеличена, чтобы
автоматизированные инструменты (например,
pkg_version) смогли обнаружить факт появления
нового пакаджа.PORTEPOCHВремя от времени разработчик программного обеспечения или
создатель порта FreeBSD делают что-то не так и выпускают версию
программы, номер которой меньше предыдущей версии. Примером этого
является порт, название которого меняется с foo-20000801 на foo-1.0
(изначально это не считалось бы более новой версией, так как
20000801 численно больше, чем 1).В ситуациях, подобных этой, должно быть увеличено значение
PORTEPOCH. Если значение
PORTEPOCH не равно нулю, то оно добавляется к имени
пакаджа, как описано в разделе выше. Значение
PORTEPOCH никогда не уменьшается и не сбрасывается
в ноль, потому что это приведет к ошибке сравнения с пакаджем с
меньшим номером эпохи (то есть то, что пакадж устарел. обнаружено не
будет): номер новой версии (например, 1.0,1 в
примере выше) останется меньше, чем номер предыдущей версии
(2000801), однако суффикс ,1 интерпретируется
различными автоматизированными утилитами особым образом, и окажется
больше, чем предполагаемый суффикс ",0" более раннего пакаджа).Предполагается, что в большинстве портов переменная
PORTEPOCH использоваться не будет, но при
корректном использовании PORTVERSION может
появиться необходимость её иметь, если в будущих релизах программное
обеспечение должно изменить структуру номера версии. Однако
создателям портов нужно быть внимательными, когда разработчик
выпускает релиз без официального номера версии - эдакие
"промежуточные" релизы. Имеется соблазн пометить релиз датой его
выхода, что может вызвать проблемы, как и в примере выше, когда
будет выпущен новый "официальный" релиз.Например, если промежуточный релиз помечен датой 20000917, а
предыдущая версия программного обеспечения имела номер 1.2, то
промежуточному релизу должно быть поставлено в соответствие значение
PORTVERSION, равное 1.2.20000917 или что-то
похожее, но не 20000917, так как последующий релиз, скажем, 1.3,
должен иметь численно большее значение.Пример использования переменных PORTREVISION и
PORTEPOCHВыполнен коммит порта gtkmumble, версии 0.10, в коллекцию
портов.
PORTNAME= gtkmumble
PORTVERSION= 0.10
Значение PKGNAME станет равным
gtkmumble-0.10.Обнаружен пробел в безопасности, что потребовало создания
локального патча для FreeBSD. Соответственно было увеличено значение
переменной PORTREVISION.
PORTNAME= gtkmumble
PORTVERSIOn= 0.10
PORTREVISION= 1
PKGNAME принимает значение
gtkmumble-0.10_1Разработчиком выпущена новая версия с номером 0.2 (оказалось, что
под номером 0.10 автор имел в виду
0.1.0, а не то, что будет выпущено после
версии 0.9 - извините, теперь уже поздно). Так как новый
младший номер версии 2 по значению меньше, чем
номер предыдущей версии 10, то должно быть
увеличено значение PORTEPOCH для того, чтобы
заставить распознавать вновь создаваемый пакадж как "более новый".
Так как это новый релиз программы, то PORTREVISION
обнуляется (или удаляется из make-файла).
PORTNAME= gtkmumble
PORTVERSION= 0.2
PORTEPOCH= 1
PKGNAME принимает значение
gtkmumble-0.2,1Следующий релиз имеет номер версии 0.3. Так как значение
переменной PORTEPOCH никогда не уменьшается, что
переменные, определяющие версии, теперь выглядят так:
PORTNAME= gtkmumble
PORTVERSION= 0.3
PORTEPOCH= 1
PKGNAME принимает значение
gtkmumble-0.3,1Если значение PORTEPOCH этим
обновлением было бы сброшено в 0, то кто-нибудь,
имеющий установленный пакадж gtkmumble-0.10_1, не смог бы распознать
пакадж gtkmumble-0.3 как более новый, так как 3
было бы меньше, чем 10.Переменные PKGNAMEPREFIX
и PKGNAMESUFFIXДве необязательные переменные, PKGNAMEPREFIX и
PKGNAMESUFFIX, объединяются со значениями
PORTNAME и
PORTVERSION для формирования
PKGNAME в форме
${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}.
Добейтесь того, чтобы это соответствовало нашим рекомендациям по правильному выбору названий
для пакаджей. В частности, в переменной
PORTVERSION не разрешается использование дефиса
(-). Кроме того, если в имени пакаджа
присутствует часть language- или
compiled.specifics, то используйте
переменные PKGNAMEPREFIX и
PKGNAMESUFFIX, соответственно. Не делайте их
частью значения переменной PORTNAME.DISTNAMEВ переменной DISTNAME указывается имя порта так,
как назвали его создатели программного обеспечения. Значение
DISTNAME по умолчанию совпадает с
${PORTNAME}-${PORTVERSION}, так что переопределите
её значение в случае
необходимости. DISTNAME используется только в двух
местах. Во-первых, список дистрибутивных файлов
(DISTFILES) по умолчанию состоит из
${DISTNAME}${EXTRACT_SUFX}. И
во-вторых, предполагается, что дистрибутивный файл будет распакован в
подкаталог с именем WRKSRC, значение которого по
умолчанию есть не что иное, как
work/${DISTNAME}.Значения переменных PKGNAMEPREFIX
и PKGNAMESUFFIX не влияют на значение
DISTNAME. Заметьте также, что значение
WRKSRC равно
work/${PORTNAME}-${PORTVERSION},
и в случае, когда оригинальный архив называется по имени, отличном от
${PORTNAME}-${PORTVERSION}${EXTRACT_SUFX},
скорее всего, вы должны оставить DISTNAME
как есть— лучше переопределить DISTFILES,
чем задавать значения как
DISTNAME, так и WRKSRC
(и, возможно, ещё и EXTRACT_SUFX).CATEGORIESВ процессе создания пакаджа он помещается в каталог
/usr/ports/packages/All, а в одном или более
подкаталогов из /usr/ports/packages
создаются на него ссылки. Имена этих подкаталогов определяются
переменной CATEGORIES. Такая схема нужна для
облегчения жизни пользователя, когда он сталкивается с массой
- пакаджей на ftp-сервере или компакт-диске. Пожалуйста, посмотрите на
+ пакаджей на FTP-сервере или компакт-диске. Пожалуйста, посмотрите на
список существующих категорий и выберите те из них,
которые более всего подходят к вашему порту.Этот список также определяет, куда в дереве портов будет помещен
порт. Если вы укажете здесь более одной категории, то
предполагается, что файлы порта будут помещены в подкаталог с именем
первой категории. Посмотрите раздел о категориях для получения
подробной информации о том, как правильно выбрать категории.Если ваш порт действительно относится к чему-то, что абсолютно
не имеет отношения ни к одной из существующих категорий, вы можете
даже создать новую категорию. В этом случае, пожалуйста, пошлите
письмо с вашим предложением на адрес &a.ports;.MASTER_SITESСодержит часть с каталогом ftp/http-URL, которая указывает на
оригинальный архив на сервере MASTER_SITES. Не
забудьте лидирующий слэш (/)!Макрос команды make будет пытаться
воспользоваться этой переменной для получения дистрибутивного файла
с помощью программы FETCH, если он не будет найден
в системе.Рекомендуется помещать в список много сайтов, предпочтительно с
разных континентов. Это поможет при наличии проблем с мировой сетью,
и мы даже планируем добавить поддержку автоматического определения
ближайшего сайта и сгрузки файлов оттуда!Если оригинальный архив находится на одном из таких популярных
серверов, как X-contrib, GNU или Perl CPAN, то указывайте эти сайты в
простой форме при помощи
MASTER_SITE_*
(к примеру, MASTER_SITE_XCONTRIB или
MASTER_SITE_PERL_GNU). Просто укажите в переменной
MASTER_SITES одно из этих значений, а в
переменной MASTER_SITE_SUBDIR задайте путь к архиву.
Вот пример:
MASTER_SITES= ${MASTER_SITE_XCONTRIB}
MASTER_SITE_SUBDIR= applications
Эти переменные пределены в файле
/usr/ports/Mk/bsd.sites.mk. Всё время добавляются
новые сайты, так что обращайтесь к последней версии этого файла перед
тем, как послать нам свой порт.Пользователь может также задать значения переменных
MASTER_SITE_* в файле
/etc/make.conf для того, чтобы переопределить
выбранные нами варианты, и использовать вместо них свои любимые
зеркала этих популярных архивов.PATCHFILESЕсли вашему порту требуются некоторых дополнительные патчи,
- которые доступны по ftp или http, задайте имена этих файлов в
+ которые доступны по FTP или http, задайте имена этих файлов в
переменной PATCHFILES, а в переменной
PATCH_SITES укажите URL того каталога, в котором
они содержатся (формат такой же, как
для MASTER_SITES).Если патч не относится к самому верху дерева исходных текстов
(то есть WRKSRC), потому что он содержит некоторые
дополнительные пути, установите соответственно значение переменной
PATCH_DIST_STRIP. В частности, если все имена
путей в патче имеют дополнительный путь
foozolix-1.0/ перед именем файла, то задайте
PATCH_DIST_STRIP=-p1.Не волнуйтесь, если патчи упакованы; они будут распакованы
автоматически, если имена файлов оканчиваются на
.gz или .Z.Если патч распространяется вместе с какими-то другими файлами,
такими, как документация, в виде tar-архива gzip, вы не можете просто
использовать PATCHFILES. Если это ваш случай,
добавьте имя и местоположение архива с патчем к
DISTFILES и MASTER_SITES.
Затем воспользуйтесь переменной EXTRA_PATCHES для
указания этих файлов, и bsd.port.mk автоматически
применит эти патчи. В частности, не копируйте
файлы с патчами в каталог PATCHDIR—этот
каталог может быть недоступным для записи.Отметьте, что архив будет распакован вне исходного кода, как
обычно, и к тому же его не нужно явно распаковывать, если
это обычный архив gzip или compress. Если вы сделаете последнее,
приложите дополнительные усилия для того, чтобы не перезаписать
что-либо, уже существующее в этом каталоге. Также не забудьте
добавить команду для удаления скопированного патча в цели
pre-clean.MAINTAINERУкажите здесь ваш адрес электронной почты. Пожалуйста.
:-)Подробное описание того, за что отвечает лицо, поддерживающее
порт, даётся в главе MAINTAINER в
Makefiles.ЗависимостиМногие порты зависят от других портов. Имеется пять переменных,
которые вы можете использовать для обеспечения того, что все
требуемое находится на машине пользователя. Имеется также несколько
предопределенных переменных, отражающих зависимости для общих
случаев, плюс еще несколько для управления поведением
зависимостей.LIB_DEPENDSЭта переменная указывает, от каких совместно используемых
библиотек зависит порт. Это список пар
lib:dir:target
где lib - это имя библиотеки,
dir - это каталог, в котором можно ее
найти в случае, если ее нет на машине, и
target - это цель, которую нужно вызвать
в этом каталоге. Например, LIB_DEPENDS=
jpeg.9:${PORTSDIR}/graphics/jpeg:install
проверит наличие библиотеки jpeg со старшим номером версии 9 и
перейдет в подкаталог graphics/jpeg вашего
дерева портов для ее построения и установки, если библиотека
отсутствует. Часть target может быть
опущена, если она равна DEPENDS_TARGET
(по умолчанию install).Часть lib - это аргумент, который
передается команде ldconfig -r | grep -wF. В
этой переменной не должно быть регулярных выражений.Зависимость проверяется дважды, один раз внутри цели
extract, а затем из цели
install. Кроме того, имя зависимости
помещается в пакадж, так что pkg_add будет
автоматически его устанавливать, если его нет на пользовательской
системе.RUN_DEPENDSВ этой переменной перечисляются выполнимые файлы или файлы, от
которых зависит работа порта. Это список пар вида
path:dir:target
где path - это имя программы или файла,
а dir - каталог, в котором можно найти
порт в случае, если его нет в системе, и
target - это цель, которую нужно вызвать
в этом каталоге. Если path начинается
со слэша (/), он воспринимается как файл и его
существование проверяется командой test -e; в
противном случае предполагается, что это выполнимый файл и
для определения того, имеется ли программа в пути поиска
пользователя, используется команда
which -s.Например,
RUN_DEPENDS= ${PREFIX}/etc/innd:${PORTSDIR}/news/inn \
wish8.0:${PORTSDIR}/x11-toolkits/tk80
проверит, существует ли файл или каталог
/usr/local/etc/innd и построит и установит его
из подкаталога news/inn дерева портов, если он
не будет найден. Он также проверит, имеется ли выполнимый файл с
именем wish8.0 в вашем пути поиска, перейдет в
подкаталог x11-toolkits/tk80 вашего дерева
портов для его построения и установки, если он не будет
найден.В приведенном примере innd является
выполнимым файлом; если выполнимый файл находится в необычном для
пользовательского маршрута поиска файлов месте, вы должны указать
полный путь к файлу.Зависимость проверяется внутри цели
install. Кроме того, имя зависимости
помещается в пакадж, так что программа pkg_add
будет автоматически его устанавливать, если он не будет найден
в пользовательской системе. Часть
target может быть опущена, если она
совпадает с DEPENDS_TARGET.BUILD_DEPENDSВ этой переменной перечисляются выполнимые или обычные файлы,
которые требуются порту для его построения. Как и
RUN_DEPENDS, это список пар
path:dir:target
Например, BUILD_DEPENDS=
unzip:${PORTSDIR}/archivers/unzip будет проверять
наличие выполнимого фала с именем unzip и
перейдет в подкаталог archivers/unzip вашего
дерева портов для его построения и установки, если последний не
будет найден.Под “построением” здесь понимается все от
распаковки до компиляции. Зависимость проверяется из цели
extract. Часть
target может быть опущена, если она
совпадает с DEPENDS_TARGET.FETCH_DEPENDSВ этой переменной перечисляются выполняемые файлы или просто
файлы, которые требуются порту для сгрузки. Как и предыдущие две
переменные, это список пар
path:dir:target
Например, FETCH_DEPENDS=
ncftp2:${PORTSDIR}/net/ncftp2 будет проверять
наличие выполняемого файла с именем ncftp2 и
перейдет в каталог net/ncftp2 вашего дерева
портов для его построения и установки, если тот не будет
найден.Зависимость проверяется при выполнении цели
fetch. Часть
target может быть опущена, если она
совпадает с DEPENDS_TARGET.DEPENDSЕсли имеется зависимость, которая не подпадает ни под одну из
вышеперечисленных четырех категорий, или ваш порт требует наличия
исходных текстов другого порта в распакованном виде кроме того,
что этот порт должен быть установлен, то воспользуйтесь этой
переменной. Это список пар
dir:target,
потому что, в отличие от предыдущих случаев, ничего не
проверяется. Часть target может
быть опущена, если она совпадает с
DEPENDS_TARGET.Переменные зависимостей общего видаОпределите переменную USE_XLIB=yes, если ваш
порт для установки требует X Window System (что подразумевается при
использовании переменной USE_IMAKE). Определите
переменную USE_GMAKE=yes, если ваш порт требует
вместо стандартной для BSD утилиты make ее
GNU-аналог. Задайте USE_AUTOCONF=yes, если
порту для работы требуется GNU autoconf. Определите переменную
USE_QT=yes, если ваш порт использует самую
последнюю версию пакета qt. Укажите
USE_PERL5=yes в случае, если вашему порту
требуется версия 5 языка perl. (Последнее особенно важно, так как
некоторые версии FreeBSD имеют perl5 в составе системы, когда как
другие - нет.)Замечания касательно зависимостейКак уже отмечено выше, целью, которая вызывается по умолчанию
в случае, когда это требует зависимость, является
DEPENDS_TARGET. Она по умолчанию есть
install. Это пользовательская переменная; она
нигде не определена в файле Makefile порта.
Если вашему порту требуется особый метод обработки зависимости,
воспользуйтесь частью :target переменной
*_DEPENDS вместо того, чтобы переопределять
DEPENDS_TARGET.Когда вы набираете команду make clean,
эта операция также выполняется и над зависимостями этого порта.
Если вы не хотите, чтобы это случилось, определите переменную
NOCLEANDEPENDS в вашем окружении.Чтобы безусловно зависеть от другого порта, укажите переменную
${NONEXISTENT} в качестве первого поля
переменной BUILD_DEPENDS или
RUN_DEPENDS. Пользуйтесь этим, только когда вам
нужно иметь исходный код другого порта. Вы можете сэкономить время
на компиляции, указав также и цель. Например,
BUILD_DEPENDS= ${NONEXISTENT}:${PORTSDIR}/graphics/jpeg:extract
всегда будет переходить в каталог с портом JPEG и распаковывать
его.Не нужно использовать DEPENDS, если есть
другой способ получить требуемый результат. Это может привести к
тому, что какой-то другой порт всегда будет строиться (и по
умолчанию устанавливаться). и такая зависимость отразится и на
- пакадже. Если это именно то, что вам нужно, то я рекомендую вам
- описывать это через BUILD_DEPENDS и
+ пакадже. Если это именно то, что вам нужно, то вам, наверное,
+ следует описывать это через BUILD_DEPENDS и
RUN_DEPENDS—по крайней мере смысл
будет более понятен.
+
+ Опциональные зависимости
+
+ Некоторые большие приложения могут быть построены в различных
+ конфигурациях, с дополнительной функциональностью, зависящей от наличия
+ в системе определенных библиотек или приложений. Так как не всем
+ пользователям требуются эти библиотеки или приложения, то в системе
+ портов предусмотрен механизм, позволяющий автору порта принимать решение
+ о конфигурации, которая будет строиться. Полная поддержка этого
+ механизма облегчает использование порта и дает два или более порта ценой
+ создания одного.
+
+ Самым простым из этих механизмом является использование
+ WITHOUT_X11. Если порт может быть построен как с
+ поддержкой X, так и без оной, то обычно он должен строиться с поддержкой
+ X. Если определена переменная WITHOUT_X11, то должна
+ строиться версия, не поддерживающая X.
+
+ Различные части пакета GNOME имеют такие зависимости, хотя их
+ гораздо труднее использовать. В Makefile можно
+ использовать переменные WANT_* и
+ HAVE_*. Если приложение может быть построено как с
+ зависимостями, так и без зависимостей, перечисленных ниже, то в
+ Makefile должна быть задана переменная
+ WANT_PKG и версия, которая использует пакет
+ PKG, будет строиться, если определена переменная
+ HAVE_PKG.
+
+ На данный момент так работают переменные WANT_*,
+ WANT_GLIB, WANT_GTK,
+ WANT_ESOUND, WANT_IMLIB
+ и WANT_GNOME.
+
+
Механизм построенияЕсли ваш пакадж использует GNU-версию утилиты
make, задайте USE_GMAKE=yes.
Если ваш пакадж использует configure, задайте
HAS_CONFIGURE=yes. Если ваш пакадж использует
GNU-версию configure, задайте
GNU_CONFIGURE=yes (это также подразумевает
HAS_CONFIGURE). Если вы хотите передать
дополнительные параметры в configure (список
параметров представляет собой
--prefix=${PREFIX} для GNU
configure и пустую строку для не-GNU
configure), укажите эти дополнительные параметры в
CONFIGURE_ARGS. Если ваш пакадж использует
GNU-версию autoconf, задайте
USE_AUTOCONF=yes. Это подразумевает
GNU_CONFIGURE, и приведет к вызову
autoconf до запуска
configure.Если ваш пакадж является приложением для X, которое создает
файлы Makefile из соответствующих файлов
Imakefile при помощи утилиты
imake, то задайте USE_IMAKE=yes.
Это приведет к автоматическому запуску команды
xmkmf -a на этапе конфигурирования. Если
использование флага является для вашего порта
проблематичным, задайте XMKMF=xmkmf. Если порт
использует команду imake, но не воспринимает цель
install.man, то должна быть задана
переменная NO_INSTALL_MANPAGES=yes. Кроме того,
автор программы должен быть пристрелен. :->Если в файле Makefile из дистрибутива вашего
порта в качестве главной цели для построения указано нечто, отличное
от all, то задайте соответствующим образом
переменную ALL_TARGET. То же самое касается
целей install и
INSTALL_TARGET.Особые соглашенияИмеется ещё несколько вещей, которые вы должны иметь в виду при
создании порта. Этот раздел описывает наиболее часто встречающиеся из
них.Динамические библиотекиЕсли ваш порт устанавливает одну или несколько динамических
библиотек, определите переменную INSTALLS_SHLIB,
которая приведёт к запуску из bsd.port.mk команды
${LDCONFIG} -m относительно каталога, в который
устанавливается новая библиотека (как правило, это
PREFIX/lib), во время выполнения
цели post-install для её регистрации в кэше
динамических библиотек. Эта переменная, если она определена, также
приведёт к добавлению соответствующей пары команд
@exec /sbin/ldconfig -m и
@unexec /sbin/ldconfig -R в ваш файл
pkg-plist, так что пользователь, устанавливающий
пакадж, сможет сразу же использовать динамическую библиотеку, а удаление
пакаджа не приведёт к тому, что система будет предполагать, что
библиотека всё ещё имеется в наличии.Если нужно, вы можете переопределить каталог, в который по умолчанию
устанавливается библиотека, задав переменную
LDCONFIG_DIRS, в которой должны быть перечислены
каталоги, в которые устанавливаются динамические библиотеки. Например,
если ваш порт устанавливает динамические библиотеки в каталоги
PREFIX/lib/foo и
PREFIX/lib/bar, то вы можете в
файле Makefile указать следующее:
INSTALLS_SHLIB= yes
LDCONFIG_DIRS= %%PREFIX%%/lib/foo %%PREFIX%%/lib/bar
Заметьте, что значение переменной LDCONFIG_DIRS
передаётся через &man.sed.1;, как и всё остальное в
pkg-plist, так что подстановка значения
PLIST_SUB также происходит здесь. Рекомендуется
использовать %%PREFIX%% для PREFIX,
%%LOCALBASE%% для LOCALBASE и
%%X11BASE%% для X11BASE.MASTERDIRЕсли вашему порту требуется построение довольно различающихся
версий пакаджей через переменную (задающую, например, разрешение,
или размер бумаги), которая принимает различные значения, создайте для
каждого пакаджа отдельный подкаталог, чтобы пользователям было легче
определить, каким пакаджем воспользоваться, но попробуйте использовать
совместно между портами как можно больше файлов. В типичном случае вам
потребуются только очень короткие файлы Makefile
во всех каталогах, кроме одного, если вы будете использовать переменные
с умом. В отдельных файлах Makefiles вы можете
использовать переменную MASTERDIR для указания
каталога, в котором находятся все остальные файлы. Также используйте
переменную как часть PKGNAMESUFFIX, чтобы
пакаджи имели разные имена.Продемонстрируем это на примере. Вот часть файла
japanese/xdvi300/Makefile:
PORTNAME= xdvi
PORTVERSION= 17
PKGNAMEPREFIX= ja-
PKGNAMESUFFIX= ${RESOLUTION}
:
# default
RESOLUTION?= 300
.if ${RESOLUTION} != 118 && ${RESOLUTION} != 240 && \
${RESOLUTION} != 300 && ${RESOLUTION} != 400
@${ECHO} "Error: invalid value for RESOLUTION: \"${RESOLUTION}\""
@${ECHO} "Possible values are: 118, 240, 300 (default) and 400."
@${FALSE}
.endif
Каталог japanese/xdvi300 содержит также все
обычные патчи, файлы для пакаджа и так далее. Если вы введете здесь
команду make, она возьмет в качестве разрешения
значение по умолчанию (300) и построит порт обычным образом.Для другого разрешения приведем полныйxdvi118/Makefile:
RESOLUTION= 118
MASTERDIR= ${.CURDIR}/../xdvi300
.include ${MASTERDIR}/Makefile
(xdvi240/Makefile и
xdvi400/Makefile похожи). Задание
MASTERDIR говорит bsd.port.mk,
что обычный набор подкаталогов типа FILESDIR и
SCRIPTDIR находится в каталоге
xdvi300. Строчка
RESOLUTION=118 переопределят строку
RESOLUTION=300 в файле
xdvi300/Makefile и порт будет построен с
разрешением 118.Версии динамических библиотекПервым делом прочтите, пожалуйста, наши правила нумерации версий
динамических библиотек для понимания того, что делать с версиями
совместно используемых библиотек вообще. Не полагайтесь слепо на то,
что авторы
программного обеспечения знают, что творят; многие это не понимают.
Очень важно с точностью следовать всем этим правилам, так как мы
получаем достаточно уникальную ситуацию, когда пытаемся иметь несколько
наборов потенциально несовместимых программных пакетов. Невнимательное
включение портов вызывало большие проблемы относительно совместно
используемых библиотек в прошлом (вы когда либо задумывались, почему
порт jpeg-6b имеет библиотеку версии 9?). Если
не уверены, пошлите сообщение по адресу &a.ports;. В большинстве
случаев ваша работа заканчивается определением правильного номера
динамической библиотеки и созданием соответствующих патчей для
реализации этого.Страницы СправочникаПеременные MAN[1-9LN] автоматически добавят любые
страницы Справочника к файлу pkg-plist (это
означает, что вам не нужно указывать страницы
Справочника в файле pkg-plist—обратитесь к
главе о генерации файла PLIST для
получения более подробной информации). Это также позволяет на этапе
установки автоматически упаковывать и распаковывать страницы
Справочника в зависимости от значения переменной
NOMANCOMPRESS в файле
/etc/make.conf.Если ваш порт пытается задать несколько имен для страниц
Справочника при помощи символических или жестких ссылок, то вы должны
использовать переменную MLINKS, чтобы указать на
это. Ссылка, установленная вашим портом, будет уничтожена и создана
заново сценарием bsd.port.mk для проверки того,
что она указывает на правильный файл. Любые страницы Справочника,
перечисленные в переменной MLINKS, не должны фигурировать в файле
pkg-plist.Для указания того, что страницы Справочника нужно сжимать во
время установки, используйте переменную
MANCOMPRESSED. Эта переменная может принимать три
значения - yes, no и
maybe. yes означает, что
страницы Справочника устанавливаются уже сжатыми, no
означает, что они не сжимаются и maybe означает, что
программное обеспечение принимает во внимание значение переменной
NOMANCOMPRESS, так что сценарию
bsd.port.mk ничего дополнительно делать не
нужно.Значение переменной MANCOMPRESSED автоматически
устанавливается в yes, если переменная
USE_IMAKE задана, а
NO_INSTALL_MANPAGES нет, и в значение
no в противном случае. Вам не нужно задавать ее
явно, если значение по умолчанию подходит вашему порту.Если ваш порт определяет корнем для файлов Справочника каталог,
отличный от PREFIX, вы можете использовать
переменную MANPREFIX, чтобы задать его явно. Кроме
того, если страницы только некоторых разделов помещаются в
нестандартное место, например, в случае портов модулей языка Perl, вы
можете установить пути страниц Справочника индивидуально, при помощи
MANsectPREFIX (где
sect принимает значения
1-9, L или
N).Если страницы Справочника помещаются в подкаталоги, соответствующие
некоторому языку, то задайте название языка языка в переменной
MANLANG. Значение этой переменной по умолчанию
равно "" (то есть только английский язык).Вот пример, в котором приводятся все случаи.
MAN1= foo.1
MAN3= bar.3
MAN4= baz.4
MLINKS= foo.1 alt-name.8
MANLANG= "" ja
MAN3PREFIX= ${PREFIX}/share/foobar
MANCOMPRESSED= yes
Здесь указано, что этот порт устанавливает 6 файлов:
${PREFIX}/man/man1/foo.1.gz
${PREFIX}/man/ja/man1/foo.1.gz
${PREFIX}/share/foobar/man/man3/bar.3.gz
${PREFIX}/share/foobar/man/ja/man3/bar.3.gz
${PREFIX}/man/man4/baz.4.gz
${PREFIX}/man/ja/man4/baz.4.gz
Кроме того, файл
${PREFIX}/man/man8/alt-name.8.gz может быть, а
может и не быть установлен вашим портом. В любом случае будет создана
символическая ссылка для объединения страниц Справочника foo(1) и
alt-name(8).Порты, которым требуется MotifСуществует много приложений, которым для компиляции требуется
библиотека Motif (которую можно приобрести у нескольких поставщиков,
хотя есть и бесплатный клон в
x11-toolkits/lesstif, о котором говорится, что с
ним работает множество приложений). Так как это распространенный пакет
и его лицензионное соглашение обычно позволяет распространение
статически скомпонованных бинарных файлов, мы обратили особое внимание
на работу с портами, которым требуется Motif, так чтобы мы могли
легко создавать бинарные файлы, скомпонованные как динамически (для
тех, кто строит приложение из порта), так и статически (для тех, кто
будет распространять приложения в виде пакаджей).REQUIRES_MOTIFЕсли вашему порту требуется Motif, задайте эту переменную в
файле Makefile. Это не позволит людям, у которых нет собственной
копии Motif, даже попытаться построить порт.MOTIFLIBЭта переменная будет установлена сценарием
bsd.port.mk в соответствующее значение,
соответствующее библиотеке Motif. Пожалуйста, измените исходные
тексты для использования этой переменной там, где упоминается
библиотека Motif, в Makefile или
Imakefile.Могут быть два случая:Ели порт обращается к библиотеке Motif как
-lXm в своих файлах
Makefile или Imakefile,
просто подставьте вместо этих обращений
${MOTIFLIB}.Если порт использует XmClientLibs в своем
файле Imakefile, измените это обращение на
${MOTIFLIB} ${XTOOLLIB}
${XLIB}.Заметьте, что переменная MOTIFLIB (как
правило) раскрывается в -L/usr/X11R6/lib -lXm или
/usr/X11R6/lib/libXm.a, так что нет нужды впереди
добавлять -L или -l.Шрифты для X11Если ваш порт устанавливает шрифты для системы X Window, поместите
их в каталог
X11BASE/lib/X11/fonts/local.
Этот каталог впервые появился в XFree86 release 3.3.3. Если он не
существует, то, будьте добры, создайте его и выведите сообщение,
обращающее внимание пользователя на необходимость обновить XFree86 до
версии 3.3.3 или более новой, или по крайней мере добавить этот каталог
к маршруту поиска шрифтов в файле
/etc/XF86Config.Файлы в формате infoНовая версия texinfo (включенная в 2.2.2-RELEASE и выше), содержит
утилиту с именем install-info для установки и
удаления компонент в файле dir. Если ваш порт
устанавливает какие-либо документы в формате info, то, пожалуйста,
следуйте этим инструкциям, чтобы ваш порт/пакадж корректно обновлял
пользовательский файл
PREFIX/info/dir. (Приносим
извинения за размер этого раздела, но это необходимо для объединения
всех файлов info вместе. Если это делается правильно, то будет
создан прекрасный список, так что прислушайтесь
к моим советам!Во-первых, вот что вы (как создатель порта) должны знать
&prompt.user; install-info --help
install-info [OPTION]... [INFO-FILE [DIR-FILE]]
Install INFO-FILE in the Info directory file DIR-FILE.
Options:
--delete Delete existing entries in INFO-FILE;
don't insert any new entries.
:
--entry=TEXT Insert TEXT as an Info directory entry.
:
--section=SEC Put this file's entries in section SEC of the directory. :
Эта программа на будет на самом деле
устанавливать info-файлы; она просто добавляет
или удаляет элементы списка в файле dir.Далее приводится процедура, состоящая из семи шагов, для
преобразования портов к использованию install-info.
- В качестве примера я буду использовать
+ В качестве примера будет использоваться
editors/emacs.Посмотрите в исходные тексты документов в формате texinfo и
измените их, вставив директивы @dircategory и
@direntry в файлы, в которых они отсутствуют.
Вот часть моего патча:
--- ./man/vip.texi.org Fri Jun 16 15:31:11 1995
+++ ./man/vip.texi Tue May 20 01:28:33 1997
@@ -2,6 +2,10 @@
@setfilename ../info/vip
@settitle VIP
+@dircategory The Emacs editor and associated tools
+@direntry
+* VIP: (vip). A VI-emulation for Emacs.
+@end direntry
@iftex
@finalout
:
Формат должен быть для вас самоочевидным. Многие авторы
оставляют среди исходных текстов файл dir,
содержащий все компоненты, которые вам нужны, так что проверьте
еще раз перед тем, как пытаться писать свои собственные. Также
обязательно взгляните на порты, связанные с вашим и приведите в
соответствие имена разделов и формат компонент (мы рекомендуем,
чтобы все текстовые строки начинались с 4й позиции
табуляции).Заметьте, что вы можете указать только одну компоненту info
для файла из-за ошибки в работе утилиты
install-info --delete, которая удаляет только
первую компоненту, даже если вы укажете несколько компонент в
разделе @direntry.Вы можете передать компоненты dir утилите
install-info в качестве аргументов
( и ), вместо
- того, чтобы изменять исходный текст файлов texinfo, Я не думаю,
- что это подходит для портов, потому что вам нужно будет
+ того, чтобы изменять исходный текст файлов texinfo, Наверное,
+ это не подходит для портов, потому что вам нужно будет
продублировать информацию в трех местах
(Makefile и
@exec/@unexec в файле
pkg-plist; смотрите ниже). Однако, если файлы
info имеют японскую (или другую многобайтовую кодировку), вам нужно
будет передать дополнительные аргументы команде
install-info, потому что
makeinfo не может работать с такими файлами
texinfo. (Посмотрите файлы Makefile и
pkg-plist в каталоге
japanese/skk на предмет того, как это
сделать).Вернитесь обратно в каталог с портом, выполните команду
make clean; make и проверьте, что файлы info
были вновь сгенерированы из исходного текста texinfo. Так как
исходные тексты texinfo являются более новыми файлами, чем файлы
в формате info, то они должны быть перестроены, когда вы выполняете
команду make; однако многие файлы
- Makefile не включают правильные зависимости
- для генерации файлов info. В случае emacs, я
- изменил главный файл Makefile.in, чтобы
- происходил спуск в подкаталог man для
+ Makefile не включают правильные зависимости для
+ генерации файлов info. В случае emacs пришлось
+ изменить главный файл Makefile.in, чтобы
+ происходил переход в подкаталог man для
перегенерации файлов info.
--- ./Makefile.in.org Mon Aug 19 21:12:19 1996
+++ ./Makefile.in Tue Apr 15 00:15:28 1997
@@ -184,7 +184,7 @@
# Subdirectories to make recursively. `lisp' is not included
# because the compiled lisp files are part of the distribution
# and you cannot remake them without installing Emacs first.
-SUBDIR = lib-src src
+SUBDIR = lib-src src man
# The makefiles of the directories in $SUBDIR.
SUBDIR_MAKEFILES = lib-src/Makefile man/Makefile src/Makefile oldXMenu/Makefile
lwlib/Makefile
--- ./man/Makefile.in.org Thu Jun 27 15:27:19 1996
+++ ./man/Makefile.in Tue Apr 15 00:29:52 1997
@@ -66,6 +66,7 @@
${srcdir}/gnu1.texi \
${srcdir}/glossary.texi
+all: info
info: $(INFO_TARGETS)
dvi: $(DVI_TARGETS)
Второй блок изменений был необходим из-за того, что цель по
умолчанию в подкаталоге man называется
info, когда как главный файл
Makefile вызывает цель
- all. Я также удалил установку
+ all. Была также удалена установка
информационного файла info, потому что в
каталоге /usr/share/info уже имеется файл с
таким же именем (этот патч здесь не показан).Если в файле Makefile есть процедура
установки файла dir, то удалите эту процедуру.
Вашему порту делать этого не надо. Кроме того, удалите все
команды, которые будут пытаться творить что-то с файлом
dir.
--- ./Makefile.in.org Mon Aug 19 21:12:19 1996
+++ ./Makefile.in Mon Apr 14 23:38:07 1997
@@ -368,14 +368,8 @@
if [ `(cd ${srcdir}/info && /bin/pwd)` != `(cd ${infodir} && /bin/pwd)` ]; \
then \
(cd ${infodir}; \
- if [ -f dir ]; then \
- if [ ! -f dir.old ]; then mv -f dir dir.old; \
- else mv -f dir dir.bak; fi; \
- fi; \
cd ${srcdir}/info ; \
- (cd $${thisdir}; ${INSTALL_DATA} ${srcdir}/info/dir ${infodir}/dir);
\
- (cd $${thisdir}; chmod a+r ${infodir}/dir); \
for f in ccmode* cl* dired-x* ediff* emacs* forms* gnus* info* message* mh-e* sc* vip*; do \
(cd $${thisdir}; \
${INSTALL_DATA} ${srcdir}/info/$$f ${infodir}/$$f; \
chmod a+r ${infodir}/$$f); \
(Этот шаг необходим, если только вы модифицируете уже
существующий порт.) Взгляните на файл
pkg-plist и удалите все, что пытается изменить
файл info/dir. Это может быть также в файле
pkg-install или в каком-то другом файле, так
что ищите тщательно.
Index: pkg-plist
===================================================================
RCS file: /usr/cvs/ports/editors/emacs/pkg-plist,v
retrieving revision 1.15
diff -u -r1.15 pkg-plist
--- pkg-plist 1997/03/04 08:04:00 1.15
+++ pkg-plist 1997/04/15 06:32:12
@@ -15,9 +15,6 @@
man/man1/emacs.1.gz
man/man1/etags.1.gz
man/man1/ctags.1.gz
-@unexec cp %D/info/dir %D/info/dir.bak
-info/dir
-@unexec cp %D/info/dir.bak %D/info/dir
info/cl
info/cl-1
info/cl-2
Добавьте цель post-install в файл
Makefile для вызова
install-info с именами установленных
файлов info в качестве параметров. (Больше не нужно создавать
файл dir самостоятельно; Программа
install-info автоматически создаст этот файл,
если он не существует.)
Index: Makefile
===================================================================
RCS file: /usr/cvs/ports/editors/emacs/Makefile,v
retrieving revision 1.26
diff -u -r1.26 Makefile
--- Makefile 1996/11/19 13:14:40 1.26
+++ Makefile 1997/05/20 10:25:09 1.28
@@ -20,5 +20,8 @@
post-install:
.for file in emacs-19.34 emacsclient etags ctags b2m
strip ${PREFIX}/bin/${file}
.endfor
+.for info in emacs vip viper forms gnus mh-e cl sc dired-x ediff ccmode
+ install-info ${PREFIX}/info/${info} ${PREFIX}/info/dir
+.endfor
.include <bsd.port.mk>
Отредактируйте файл pkg-plist, добавив
аналогичные директивы @exec, не забыв о
@unexec для
pkg_delete.
Index: pkg/pkg-plist
===================================================================
RCS file: /usr/cvs/ports/editors/emacs/pkg-plist,v
retrieving revision 1.15
diff -u -r1.15 pkg-plist
--- pkg-plist 1997/03/04 08:04:00 1.15
+++ pkg-plist 1997/05/20 10:25:12 1.17
@@ -16,7 +14,14 @@
man/man1/etags.1.gz
man/man1/ctags.1.gz
+@unexec install-info --delete %D/info/emacs %D/info/dir
:
+@unexec install-info --delete %D/info/ccmode %D/info/dir
info/cl
info/cl-1
@@ -87,6 +94,18 @@
info/viper-3
info/viper-4
+@exec install-info %D/info/emacs %D/info/dir
:
+@exec install-info %D/info/ccmode %D/info/dir
libexec/emacs/19.34/i386--freebsd/cvtmail
libexec/emacs/19.34/i386--freebsd/digest-doc
Команды @unexec install-info --delete
указываются до собственно файлов info, чтобы они могли прочесть
файлы. Кроме того, команды @exec install-info
следуют за файлами info и командой @exec,
которая создает файл dir file.Протестируйте вашу
работу и полюбуйтесь ею. :-).
Проверяйте файл dir до и после выполнения
каждого шага.Файлы pkg-*Есть несколько приёмов работы с файлами
pkg-*, которые мы ещё не
описали, но они иногда могут быть очень кстати.pkg-messageЕсли вам нужно вывести сообщение для человека, устанавливающего
приложение, то вы можете поместить сообщение в файл
pkg-message. Эта возможность часто оказывается
полезной для вывода дополнительных шагов установки, которые нужно
предпринять после выполнения команды pkg_add, или
для вывода информации о лицензировании.Файл pkg-message не нужно добавлять в
pkg-plist. И он не будет автоматически
выводиться, если пользователь использует порт, а не пакадж, так что
вы должны будете сами выводить его при выполнении цели
post-install.pkg-installЕсли при установке бинарного пакаджа по команде
pkg_add вашему порту нужно выполнить какие-то
дополнительные действия или команды, то вы можете сделать это с
помощью скрипта pkg-install. Этот скрипт будет
автоматически добавлен к пакаджу, и будет дважды запускаться по
команде pkg_add. Первый раз в виде
${SH} pkg-install ${PKGNAME}
PRE-INSTALL, а второй раз как ${SH} {PKGNAME}
POST-INSTALL.
Для распознавания того, в каком режиме запущен скрипт, можно
использовать параметр $2. Переменная
окружения PKG_PREFIX будет принимать значение,
соответствующее каталогу, в который устанавливается пакадж.
Дополнительная информация находится на странице Справочника о
команде &man.pkg.add.1;.Этот скрипт не запускается автоматически, если вы
устанавливаете порт командой make install.
Если же вам действительно необходимо его запустить, то запустите
его явно из файла Makefile порта.pkg-reqЕсли вашему порту нужно определять, должен ли он устанавливаться
или нет, то вы можете создать скрипт “необходимости”
pkg-req. Он будет вызван автоматически
в момент установки/удаления для определения того, должны ли они
реально выполняться.
+
+ Скрипт будет запущен в процессе установки командой
+ pkg_add, как pkg-req
+ ${PKGNAME} INSTALL. В процессе удаления он
+ будет запущен командой pkg_delete, как
+ pkg-req ${PKGNAME} DEINSTALL.Изменение содержимого pkg-plist в зависимости
от make-переменныхНекоторые порты, в частности, порты p5-, должны менять содержимое
своих файлов pkg-plist в зависимости от того, с
какими параметрами они были отконфигурированы (или в зависимости от
версии языка perl в случае портов p5-). Чтобы облегчить этот
процесс, любые вхождения ключевых слов %%OSREL%%,
%%PERL_VER%% и %%PERL_VERSION%%
в файле pkg-plist будут заменяться соответствующими
значениями. Значением %%OSREL%% является номер
версии операционной системы (например, 2.2.7).
%%PERL_VERSION%% обозначает полный номер версия
perl (например, 5.00502), а
%%PERL_VER%% - номер версии perl без номера
патча (например, 5.005).Если вам нужно сделать другие подстановки, вы можете указать в
переменной PLIST_SUB список пар
VAR=VALUE,
и все вхождения %%VAR%%
в файле pkg-plist будут заменяться на значение
VALUE.Например, если у вас имеется порт, который устанавливает много
файлов в каталог, зависящий от версии, вы можете задать нечто типа
OCTAVE_VERSION= 2.0.13
PLIST_SUB= OCTAVE_VERSION=${OCTAVE_VERSION}
в файле Makefile и использовать
%%OCTAVE_VERSION%% везде, где нужно указать
номер версии в файле pkg-plist. Таким образом,
при обновлении порта вам не нужно будет менять десятки (а в некоторых
случаях и сотни) строк в файле pkg-plist.Эта подстановка (так же, как и добавление любых страниц Справочника) будет сделана
между выполнением целей do-install и
post-install, посредством чтения файла
PLIST и записью в файл TMPPLIST
(по умолчанию это файл
WRKDIR/.PLIST.mktmp). Так
что если ваш порт строит PLIST на лету, делайте
это во время или до выполнения цели
do-install. Кроме того, если вашему порту
требуется отредактировать получающийся файл, делайте это в цели
post-install изменением файла
TMPPLIST.Изменение имён файлов
pkg-*Все имена файлов
pkg-*
определяются с помощью переменных, так что вы можете изменить их,
если это нужно, в вашем файле Makefile. Это
особенно полезно, если вы используете одни и те же файлы
pkg-*
совместно между несколькими портами или
пишете в один из вышеперечисленных файлов (в главе о записи в каталоги, отличные от
WRKDIR объяснено, почему не рекомендуется
осуществлять запись непосредственно в файлы
pkg-*.Вот список имён переменных и их значений по умолчанию. (Значение
PKGDIR по умолчанию равно
${MASTERDIR}.)ПеременнаяЗначение по умолчаниюCOMMENT${PKGDIR}/pkg-commentDESCR${PKGDIR}/pkg-descrPLIST${PKGDIR}/pkg-plistPKGINSTALL${PKGDIR}/pkg-installPKGDEINSTALL${PKGDIR}/pkg-deinstallPKGREQ${PKGDIR}/pkg-reqPKGMESSAGE${PKGDIR}/pkg-messageПожалуйста, изменяйте значения этих переменных, а не
переопределяйте PKG_ARGS. Если вы измените
значение переменных PKG_ARGS, то эти файлы при
установке из порта будут установлены в каталог
/var/db/pkg некорректно.Проблемы с лицензированиемНекоторые программные пакеты имеют ограниченные лицензии или
их использование в некоторых странах может оказаться (как нарушение
патента). То, что мы можем с этим сделать, сильно
зависит от точных формулировок конкретных лицензионных
соглашений.На вас, как на человека, портирующего приложение, ложится
обязанность прочесть лицензионные соглашения на программное
обеспечение и удостовериться, что проект FreeBSD не будет являться
их нарушителем, если будет заниматься распространением исходного
- кода или в откомпилированном виде по ftp или на компакт-дисках. Если
+ кода или в откомпилированном виде по FTP или на компакт-дисках. Если
у вас возникли сомнения, то, пожалуйста, обратитесь в
адрес &a.ports;.Имеется две переменные, которые вы можете задать в Makefile
в наиболее часто встречающихся ситуациях:Если порт имеет лицензию типа “не продавать для
достижения прибыли”, задайте в переменной
NO_CDROM строку, описывающую причину этого. Мы
не будем помещать такие порты на компакт-диск во время выпуска
релиза. Дистрибутивный файл и пакадж будут доступны по
- ftp.
+ FTP.
Если получающийся пакадж должен строиться каждый раз уникальным
образом или получающийся бинарный пакадж не может распространяться
по лицензионным соображениям, то в переменной
NO_PACKAGE укажите строку, описывающую причину
- этого. Мы не будем помещать такие пакаджи ни на ftp-сервер, ни на
+ этого. Мы не будем помещать такие пакаджи ни на FTP-сервер, ни на
компакт-диск во время выпуска релиза. Однако дистрибутивный файл
будет помещен на оба носителя.Если порт имеет юридические ограничения на использованию
(например, патентованное программное обеспечение) или имеет
лицензию “не для коммерческого использования”, то в
переменной RESTRICTED укажите строку,
описывающую причину этого. Для таких портов ни дистрибутивный
файл, ни пакаджи не будут доступны даже с наших серверов
- ftp.
+ FTP.
Лицензия GNU General Public License (GPL), как версии 1, так и
версии 2, для портов вызвать проблем не должна.Если вы являетесь коммиттером, обязательно обновите также файл
ports/LEGAL.ОбновлениеЕсли вы заметите, что ваш порт устарел по сравнению с последней
авторской версией, первым делом проверьте, что у вас находится самая
последняя версия порта. Вы можете найти их в каталоге
- ports/ports-current на зеркальных серверах ftp.
+ ports/ports-current на зеркальных серверах FTP.
Кроме того, вы можете использовать CVSup для поддержки актуальности
всей Коллекции портов, как это описано в Руководстве.Следующий шаг - это посылка письма человеку, ведущему этот порт
(майнтайнеру), если он указан в файле Makefile
порта. Этот человек может уже работать над обновлением, или иметь
причину не обновлять порт прямо сейчас (например, из-за проблем со
стабильностью функционирования новой версии).Если ведущий попросил сделать обновление вас, или такой персоны не
нашлось, то, пожалуйста, выполните обновление и пошлите рекурсивный
diff-файл (подойдет как в унифицированном, так и контекстно-зависимом
формате, однако коммиттеры предпочитают унифицированный формат)
сравнения нового и старого каталогов нам (например, если каталог с
модифицированным портом называется superedit,
а оригинальный, совпадающий с находящимся в нашем дереве портов,
superedit.bak, то пошлите нам результат выполнения
команды diff -ruN superedit.bak superedit).
Пожалуйста, проверьте результат работы этой команды, так, чтобы все
изменения имели смысл. Лучший способ послать нам diff-файл - включить
его в посылку по команде &man.send-pr.1; (категория
ports). Будьте добры, в сообщении отметьте все
добавленные или удаленные файлы, так как они будут непосредственно
указаны CVS при выполнении операции коммита. Если diff-файл имеет
размер, превышающий 20КБ, сожмите его и обработайте утилитой uuencode;
в противном случае просто включите его как есть в PR.Повторяем еще раз - для посылки обновлений существующих портов
используйте утилиту &man.diff.1;, а не &man.shar.1;!Что нужно, а что нельзя делатьВот список часто встречающихся действий, которые нужно и которые
нельзя делать во время процесса портирования. Вы должны проверять ваш
порт по этому списку, и вы также можете проверять порты в базе
сообщений PR, которые присланы другими людьми. Присылайте любые
комментарии о портах, которые вы проверили, так, как это описано в
главе о Сообщениях об ошибках
и общих замечаниях. Проверка портов в базе сообщений PR позволит
нам быстрее коммиттить их и удостовериться, что вы знаете, что
делаете.Удаление отладочной информации в бинарных файлахУдаляйте отладочную информацию из бинарных файлов. Если в
исходных текстах файлы уже усекается, это прекрасно; в противном
случае вы должны добавить в цель post-install
правило для выполнения этой операции самим. Вот пример:
post-install:
strip ${PREFIX}/bin/xdl
Для проверки того, удалена ли отладочная информация из
установленного выполнимого файла, выполните команду &man.file.1;.
Если утилита не выдаст строку not stripped, то
файл уже обработан.Макросы INSTALL_*Используйте макросы, которые есть в файле
bsd.port.mk для обеспечения правильных прав
доступа и владения файлов в своих целях
*-install.INSTALL_PROGRAM - это команда для
установки бинарных выполнимых файлов.INSTALL_SCRIPT - это команда для установки
выполнимых скриптов.INSTALL_DATA - это команда для установки
совместно используемых файлов данных.INSTALL_MAN - это команда для установки
страниц Справочника и другой документации (никаких файлов она не
сжимает).В основе работы этих макросов лежит команда
install со всеми соответствующими флагами.
Смотрите пример их использования ниже.WRKDIRНе пишите ничего в файлы вне каталога WRKDIR.
Каталог WRKDIR является единственным местом,
которое гарантированно будет доступно для записи во время построения
порта (обратитесь к главе о компиляции портов с
компакт-диска за
примером построения портов из дерева, доступного только для чтения).
Если вам нужно изменить какой-либо из файлов
pkg-*, сделайте это,
переопределив переменную, но не
перезаписывая их.WRKDIRPREFIXДобейтесь того, чтобы ваш порт принимал во внимание значение
переменной WRKDIRPREFIX. Большинство портов об
этом не заботятся. В частности, если вы обращаетесь к каталогу
WRKDIR другого порта, заметьте, что его правильным
местоположением является
WRKDIRPREFIXPORTSDIR/subdir/name/work not PORTSDIR/subdir/work
или .CURDIR/../../subdir/name/work
или что-то подобное.Кроме того, если вы сами задаете WRKDIR, то
должны поставить перед ним знак
${WRKDIRPREFIX}${.CURDIR}.Различение операционных систем и версий ОСВы можете встретиться с кодом, который требует модификаций
или условной компиляции в зависимости от того, с какой версией
- UNIX он работает. Если вам нудно сделать такие изменения в коде для
+ Unix он работает. Если вам нудно сделать такие изменения в коде для
условной компиляции, то вы должны делать изменения как можно
более общими, чтобы мы могли перенести код на системы FreeBSD версий
1.x, а также и на другие системы BSD, такие, как 4.4BSD от CSRG,
BSD/386, 386BSD, NetBSD, и OpenBSD.Предпочтительным способом отделения кода для 4.3BSD/Reno (1990) и
и более новых версий BSD является использование макроса
BSD, определенного в файле
<sys/param.h>. Хорошо, если этот файл уже
включен; если это не так, то добавьте такой код:
#if (defined(__unix__) || defined(unix)) && !defined(USG)
#include <sys/param.h>
#endif
в соответствующем месте файла .c. Мы
надеемся, что все системы, в которых определены эти две константы,
имеют файл sys/param.h. Если вы обнаружите
систему, в которой это не так, мы хотим знать. Пошлите, пожалуйста,
письмо на адрес &a.ports;.Другим способом является использование для этого стиля GNU
Autoconf:
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif
Не забудьте добавить -DHAVE_SYS_PARAM_H к
CFLAGS в файле Makefile
при использовании этого метода.Как только вы включите sys/param.h, то
сможете воспользоваться следующим:
#if (defined(BSD) && (BSD >= 199103))
для определения того, компилируется ли программа на основе кода
Net2 версии 4.3 или более новой версии (например, FreeBSD 1.x,
4.3/Reno, NetBSD 0.9, 386BSD, BSD/386 1.1 и ниже).Используйте:
#if (defined(BSD) && (BSD >= 199306))
для определения того, компилируется ли программа на основе кода
4.4 или более новой (например, FreeBSD 2.x, 4.4, NetBSD 1.0, BSD/386
2.0 и выше).Значение макроса BSD равно
199506 для кода на основе 4.4BSD-Lite2. Оно
задано только для информационной целей. Оно не должно использоваться
для различия между версиями FreeBSD, основанными на коде 4.4-Lite
и версиями, в которые включены изменения из 4.4-Lite2. Вместо этого
нужно использовать макрос __FreeBSD__.Реже используйте:__FreeBSD__ определен во всех версиях
FreeBSD. Используйте его, если изменение, вносимое вами,
касается только FreeBSD. Проблемы
портирования, такие, как использование
sys_errlist[] или
strerror() являются особенностями систем
BSD, а не FreeBSD.Во FreeBSD 2.x, значение __FreeBSD__
определено как 2. В более ранних версиях оно
равно 1. В более поздних версиях это значение
увеличивается в соответствии со старшим номером версии
системы.Если вам нужно отделить системы FreeBSD 1.x от систем
FreeBSD 2.x или 3.x, правильным способом, как правило, будет
использование макроса BSD, описанное выше.
Если это действительно изменение, специфичное для FreeBSD
(например, особая опция для динамической библиотеки при
использовании ld), то для распознавания
систем FreeBSD 2.x и более поздних нормальным будет использование
__FreeBSD__ и
#if __FreeBSD__ > 1. Если вам нужно более
точное определение версий FreeBSD, начиная с 2.0-RELEASE, то
вы можете использовать следующее:
#if __FreeBSD__ >= 2
#include <osreldate.h>
# if __FreeBSD_version >= 199504
/* 2.0.5+ release specific code here */
# endif
#endif
Релиз__FreeBSD_version2.0-RELEASE1194112.1-CURRENT199501, 1995032.0.5-RELEASE1995042.2-CURRENT до выхода 2.11995082.1.0-RELEASE1995112.2-CURRENT до выхода 2.1.51995122.1.5-RELEASE1996072.2-CURRENT до выхода 2.1.61996082.1.6-RELEASE1996122.1.7-RELEASE1996122.2-RELEASE2200002.2.1-RELEASE220000 (без изменений)2.2-STABLE после выхода 2.2.1-RELEASE220000 (без изменений)2.2-STABLE после включения texinfo-3.92210012.2-STABLE после включения top2210022.2.2-RELEASE2220002.2-STABLE после выхода 2.2.2-RELEASE2220012.2.5-RELEASE2250002.2-STABLE после выхода 2.2.5-RELEASE2250012.2-STABLE после появления ldconfig -R2250022.2.6-RELEASE2260002.2.7-RELEASE2270002.2-STABLE после выхода 2.2.7-RELEASE227001
- 2.2-STABLE после изменения в semctl(2)
+ 2.2-STABLE после изменения в &man.semctl.2;2270022.2.8-RELEASE2280002.2-STABLE после выхода 2.2.8-RELEASE228001
- 3.0-CURRENT до изменения в mount(2)
+ 3.0-CURRENT до изменения в &man.mount.2;300000
- 3.0-CURRENT после изменения в mount(2)
+ 3.0-CURRENT после изменения в &man.mount.2;300001
- 3.0-CURRENT после изменения в semctl(2)
+ 3.0-CURRENT после изменения в &man.semctl.2;3000023.0-CURRENT после изменений в аргументах ioctl3000033.0-CURRENT после перехода на формат ELF3000043.0-RELEASE3000053.0-CURRENT после выхода 3.0-RELEASE3000063.0-STABLE после разбиения на ветки 3/43000073.1-RELEASE3100003.1-STABLE после выхода 3.1-RELEASE3100013.1-STABLE после изменения в порядке следования
конструкторов/деструкторов в C++3100023.2-RELEASE3200003.2-STABLE3200013.2-STABLE после несовместимых изменений в IPFW и
сокетах3200023.3-RELEASE3300003.3-STABLE330001
- 3.3-STABLE после добавления mkstemps() в libc
+ 3.3-STABLE после добавления &man.mkstemp.3; в libc3300023.4-RELEASE3400003.4-STABLE3400014.0-CURRENT после появления ветки 3.44000004.0-CURRENT после изменения в работе динамического
компоновщика4000014.0-CURRENT после изменения в порядке следования
конструкторов/деструкторов в C++400002
- 4.0-CURRENT после появления функции dladdr(3)
+ 4.0-CURRENT после появления функции &man.dladdr.3;4000034.0-CURRENT после исправления ошибки в работе функции
__deregister_frame_info динамического компоновщика (а также
4.0-CURRENT после интеграции EGCS 1.1.2)400004
- 4.0-CURRENT после изменения интерфейса функции suser(9)
- (а также 4.0-CURRENT после появления newbus)
+ 4.0-CURRENT после изменения интерфейса функции
+ &man.suser.9; (а также 4.0-CURRENT после появления
+ newbus)4000054.0-CURRENT после изменения в регистрации cdevsw4000064.0-CURRENT после добавления so_cred в проверки на
уровне сокетов4000074.0-CURRENT после добавления обработчика системного
вызова poll в libc_r4000084.0-CURRENT после перехода в ядре с типа
dev_t на указатель
struct specinfo4000094.0-CURRENT после исправления дыры в безопасности
- jail(2)
+ &man.jail.2;
4000104.0-CURRENT после изменения в типе данных
sigset_t4000114.0-CURRENT после перехода на компилятор
GCC 2.95.24000124.0-CURRENT после появления добавляемых обработчиков
ioctl режима linux4000134.0-CURRENT после заимствования OpenSSL4000144.0-CURRENT после изменения в C++ ABI компилятора
GCC 2.95.2 по умолчанию с -fvtable-thunks на
-fno-vtable-thunks4000154.0-CURRENT после заимствования OpenSSH4000164.0-RELEASE4000174.0-STABLE после появления 4.0-RELEASE4000184.0-STABLE после интеграции кода библиотеки
libxpg4 в libc.4000204.0-STABLE после обновления пакета Binutils до версии
2.10.0, изменения в схеме пометки выполнимых файлов ELF и
включения tcsh в качестве базового компонента.4000214.1-RELEASE4100004.1-STABLE после выхода 4.1-RELEASE410001
- 4.1-STABLE после переноса функции setproctitle() из
+ 4.1-STABLE после переноса функции &man.setproctitle.3; из
библиотеки libutil в libc.4100024.1.1-RELEASE4110004.1.1-STABLE после выхода 4.1.1-RELEASE4110014.2-RELEASE4200004.2-STABLE после объединения libgcc.a и libgcc_r.a,
а также соответствующих изменений в компоновке
GCC.4200015.0-CURRENT5000005.0-CURRENT после добавления дополнительных полей в
заголовке ELF и изменения метода пометки принадлежности
к определённой системе для выполнимых файлов в формате
ELF.5000015.0-CURRENT после изменений в метаданных kld.5000025.0-CURRENT после изменений buf/bio.5000035.0-CURRENT после обновления binutils.5000045.0-CURRENT после интеграции кода библиотеки libxpg4 в
libc и появления интерфейса TASKQ.5000055.0-CURRENT после добавления интерфейсов AGP.5000065.0-CURRENT после обновления Perl до версии 5.6.05000075.0-CURRENT после обновления кода KAME до версии
2000/07.5000085.0-CURRENT после изменений в ether_ifattach() и
ether_ifdetach().5000095.0-CURRENT после возврата в настройках утилиты mtree,
применяемых по умолчанию, обратно к оригинальным и добавления
флага -L для перехода по символическим ссылкам.5000105.0-CURRENT после изменения в API для kqueue.500011
- 5.0-CURRENT после перемещения setproctitle() из библиотеки
- libutil в libc.
+ 5.0-CURRENT после перемещения &man.setproctitle.3; из
+ библиотеки libutil в libc.5000125.0-CURRENT после первого коммита SMPng.5000135.0-CURRENT после переноса <sys/select.h> в
<sys/selinfo.h>.5000145.0-CURRENT после объединения libgcc.a и
libgcc_r.a, а также соответствующих изменений в
компоновке GCC.5000155.0-CURRENT после изменения, позволяющего libc и
libc_r быть скомпонованными вместе, что делает параметр
-pthread ненужным.5000165.0-CURRENT после перехода на использование
- struct xucred вместо struct ucred для стабилизиции
- экспортируемого API ядра для mountd и т.д.
+ struct xucred вместо struct ucred для стабилизиции
+ экспортируемого API ядра для mountd и т.д.
5000175.0-CURRENT после добавления переменной make
- CPUTYPE позволяющей контролировать специфичные
- для CPU оптимизации.
+ CPUTYPE позволяющей контролировать специфичные
+ для CPU оптимизации.
500018
+
+
+ 5.0-CURRENT после переноса machine/ioctl_fd.h в
+ sys/fdcio.h
+ 500019
+
+
+
+ 5.0-CURRENT после изменения имен для локализации.
+ 500020
+
+
+
+ 5.0-CURRENT после импортирования Bzip2.
+ 500021
+
+
+
+ 5.0-CURRENT с поддержкой SSE.
+ 500022
+ Заметьте, что 2.2-STABLE иногда идентифицирует себя как
“2.2.5-STABLE” после 2.2.5-RELEASE. Такой принцип
использовался год и месяц, но мы решили изменить его на более
однозначную систему нумерации старший/младший, начиная с версии
2.2. Это объясняется тем, что параллельная разработка в нескольких
ветках делает непрактичным идентификацию релизов просто по их
реальным датам выпуска. Если вы сейчас делаете порт, вам не стоит
заботиться о старых версиях -CURRENT; они перечислены здесь просто
в информационных целях.Из сотен уже сделанных портов только в одном или двух случаях
потребовалось использование __FreeBSD__. Если
старые порты использовали этот макрос не по назначению, вовсе не
значит, что вам нужно поступать точно также.Написание чего-либо после
bsd.port.mkНе пишите ничего после строки
.include <bsd.port.mk>. Этой строки можно
избежать, включив в где-то в середину вашего файла
Makefile файл
bsd.port.pre.mk, и
файл bsd.port.post.mk в конец.Вам нужно включить либо пару файлов
pre.mk/post.mk, либо
только bsd.port.mk; не смешивайте два этих
случая.В файле bsd.port.pre.mk определяются лишь
несколько переменных, которые могут быть использованы в тестах из
файла Makefile, в файле
bsd.port.post.mk заданы остальные.Вот некоторые важные переменные, определенные в файле
bsd.port.pre.mk (это не полный список, для
выяснения полного списка прочтите, пожалуйста, сам файл
bsd.port.mk).ПеременнаяОписаниеARCHАрхитектура машины в виде, получаемом по команде
uname -m (например,
i386)OPSYSТип операционной системы, получаемый по команде
uname -s (например,
FreeBSD)OSRELВерсия релиза операционной системы (например,
2.1.5 или 2.2.7)OSVERSIONВерсия операционной системы в виде числа, то же, что и
__FreeBSD_version.PORTOBJFORMATФормат объектных файлов, используемых в системе
(aout или elf)LOCALBASEКорень дерева “local” (например,
/usr/local/)X11BASEКорень дерева “X11” (например,
/usr/X11R6)PREFIXКуда, собственно, устанавливается порт (обратитесь к
подробной информации о PREFIX).Если вы задаете переменные USE_IMAKE,
USE_X_PREFIX, или MASTERDIR,
то делайте это перед тем, как включать
bsd.port.pre.mk.Вот несколько примеров того, что вы можете написать после
bsd.port.pre.mk:
# no need to compile lang/perl5 if perl5 is already in system
.if ${OSVERSION} > 300003
BROKEN= perl is in system
.endif
# only one shlib version number for ELF
.if ${PORTOBJFORMAT} == "elf"
TCL_LIB_FILE= ${TCL_LIB}.${SHLIB_MAJOR}
.else
TCL_LIB_FILE= ${TCL_LIB}.${SHLIB_MAJOR}.${SHLIB_MINOR}
.endif
# software already makes link for ELF, but not for a.out
post-install:
.if ${PORTOBJFORMAT} == "aout"
${LN} -sf liblinpack.so.1.0 ${PREFIX}/lib/liblinpack.so
.endif
Установка дополнительной документацииЕсли с вашим программным обеспечением поставляется некоторая
документация, отличающаяся от стандартных страниц Справочника и
файлов info, которая, как вы думаете, будет полезна пользователям,
установите ее в каталог
PREFIX/share/doc. Это может
быть сделано, как и в предыдущем разделе, в цели
post-install.Создайте для вашего порта новый каталог. Имя каталога должно
соответствовать тому, что представляет из себя порт. Обычно это
означает PORTNAME. Однако, если
вы думаете, что пользователь захочет иметь разные версии порта,
установленные одновременно, то вы можете использовать полное имя
PKGNAME.Сделайте установку документации зависящей от переменной
NOPORTDOCS для того, чтобы пользователи могли
выключить это в файле /etc/make.conf, как
здесь:
post-install:
.if !defined(NOPORTDOCS)
${MKDIR} ${PREFIX}/share/doc/xv
${INSTALL_MAN} ${WRKSRC}/docs/xvdocs.ps ${PREFIX}/share/doc/xv
.endif
Не забудьте включить их также в файл
pkg-plist! (Не беспокойтесь здесь о
NOPORTDOCS; на данный момент в пакаджах нет
способа прочитать значения переменных из
/etc/make.conf.)Кроме того, вы можете использовать файл
pkg-message для вывода сообщений во
время установки. За подробной информацией обратитесь к разделу
об использовании
pkg-message.Файл pkg-message не нужно добавлять в
pkg-plist.DIST_SUBDIRНе позволяйте вашему порту засорять
/usr/ports/distfiles. Если вашему порту
требуется сгрузить много файлов, или он содержит имя файла,
могущее вызвать конфликты с другими портами (например,
Makefile), то укажите в переменной
DIST_SUBDIR имя порта (должны подойти
${PORTNAME} или
${PKGNAMEPREFIX}${PORTNAME}). Это изменит значение
переменной DISTDIR со значения по умолчанию
/usr/ports/distfiles к значению
/usr/ports/distfiles/DIST_SUBDIR,
и в результате все, что требуется для порта, будет помещено в этот
подкаталог.Он заглянет также в подкаталог с тем же именем на
основном резервном сервере ftp.FreeBSD.org.
(Явное задание переменной DISTDIR в вашем файле
Makefile этого не сделает, так что, пожалуйста,
воспользуйтесь DIST_SUBDIR.)Это не коснется тех сайтов MASTER_SITES,
которые вы указали в вашем файле Makefile.Информация о пакаджеДайте информацию о пакадже, то есть
pkg-comment, pkg-descr и
pkg-plist.Заметьте, что эти файлы теперь используются не только в
системе пакаджей, и они обязательны, даже если
определена переменная NO_PACKAGE.Строки RCSНе помещайте строки RCS в патчи. CVS будет изменять их при
помещении файлов в дерево портов, и когда мы будем их оттуда
извлекать, они будут уже другие, поэтому применение патчей
окончится неудачей. Строчки RCS предваряются знаком доллара
($), и обычно начинаются с
$Id или
$RCS.Рекурсивные файлы diffИспользование параметра рекурсии () с командой
diff для генерации патчей - это хорошо, но все же,
пожалуйста, смотрите на получающиеся патчи, чтобы убедиться в
отсутствии ненужного мусора. В частности, diff между двумя
резервными копиями файлов, файлы Makefile, когда
как порт использует Imake или
GNU-версию программы configure, и так далее,
не нужны, и должны быть удалены. Если вы отредактировали файл
configure.in и запустили
autoconf для перегенерации
configure, не нужно включать файлы diff для
configure (они частенько вырастают до нескольких
тысяч строк!); задайте USE_AUTOCONF=yes и
включите дифф-файл для configure.in.Кроме того, если вы удаляете файл, то это можно сделать и в цели
post-extract, а не внутри патча. Как только
вы будете удовлетворены получающимся дифф-файлом, разбейте его на
несколько по одному патчу на отдельный файл.PREFIXПопытайтесь сделать так, чтобы установка вашего порта
осуществлялась относительно каталога PREFIX.
(Значение этой переменной будет установлено в
LOCALBASE (по умолчанию
/usr/local), если только не заданы переменные
USE_X_PREFIX или USE_IMAKE,
в случае чего он будет принят равным X11BASE
(по умолчанию /usr/X11R6).)Отсутствие явного указания /usr/local или
/usr/X11R6 нигде в исходном коде сделает порт
гораздо более гибким и способным удовлетворить потребности других
серверов. Для портов, которые используют X, это происходит
автоматически; в противном случае зачастую это может быть сделано
простой заменой строк /usr/local (или
/usr/X11R6 для портов X, не использующих imake)
в различных скриптах/файлах Makefile порта на чтение
PREFIX, так как эта переменная автоматически
передается далее на каждом этапе построения и установки.Проверьте, что ваше приложение не устанавливает чего-либо в
каталог /usr/local вместо
PREFIX. Это можно быстро проверить следующим
образом:
&prompt.root; make clean; make package PREFIX=/var/tmp/p
ort-nameЕсли что-то было установлено за пределами
PREFIX, то процесс создания пакаджа сообщит об
отсутствии файлов.
+
Здесь не проверяется ни наличие внешних ссылок, ни корректность
использования LOCALBASE в качестве ссылки на
файлы из других портов. Проверка установки в каталог
/var/tmp/port-name
делает это.Не задавайте переменную USE_X_PREFIX до тех
пор, пока она на самом деле не понадобится для порта (то есть он
будет скомпонован с библиотеками X или нужно будет обращаться к
файлам из X11BASE).Переменная PREFIX может быть переназначена в
вашем файле Makefile или в окружении
пользователя. Однако строго не рекомендуется отдельным портам
устанавливать эту переменную явно в файле
Makefiles.Кроме того, обратитесь к программам/файлам из других портов с
переменными, перечисленными выше, без указания явных маршрутов.
Например, если ваш порт требует, чтобы макро PAGER
являлся полным путем утилиты less, используйте
флаг компилятора:
-DPAGER=\"${PREFIX}/bin/less\"
или
-DPAGER=\"${LOCALBASE}/bin/less\"
если это порт X, вместо того, чтобы задавать
-DPAGER=\"/usr/local/bin/less\". Этот способ
имеет больше шансов на работу, если системный администратор
переместил все дерево `/usr/local' куда-то в другое место.ПодкаталогиПопробуйте поместить все файлы порта в правильных подкаталогах
каталога PREFIX. Некоторые порты игнорируют все
установки и помещают все в подкаталог с именем порта, что
неправильно. Также многие порты помещают все, кроме бинарных файлов,
файлов заголовков и страниц Справочника, в подкаталог каталога
lib, что не очень хорошо соответствует парадигме
BSD. Многие файлы должны быть перемещены в одно из следующих
местоположений: etc
(настроечные/конфигурационные файлы), libexec
(выполнимые файлы, запускаемые из других программ),
sbin (исполнимые файлы для
администраторов/менеджеров системы), info
(документация в формате info для просмотрщика info) или
share (независимые от архитектуры файлы).
Обратитесь к &man.hier.7; для прояснения деталей, правила,
покрывающие /usr, достаточно хорошо подходят
также и к /usr/local. Исключением являются
порты, имеющие дело с “новостями” USENET. Они могут
использовать каталог
PREFIX/news для установки
своих файлов.Очистка пустых каталоговЗаставьте ваш порты очищать за собой при удалении. Обычно это
достигается добавлением строк @dirrm для всех
каталогов, которые создаются этим портом. Вам нужно удалить
подкаталоги до того, как вы сможете удалить родительские
каталоги.
:
lib/X11/oneko/pixmaps/cat.xpm
lib/X11/oneko/sounds/cat.au
:
@dirrm lib/X11/oneko/pixmaps
@dirrm lib/X11/oneko/sounds
@dirrm lib/X11/oneko
Однако иногда @dirrm будет выдавать ошибку,
потому что другие порты тоже используют тот же самый подкаталог. Вы
можете вызвать команду rmdir из
@unexec для удаления без выдачи предупреждений
только пустого каталога.
@unexec rmdir %D/share/doc/gimp 2>/dev/null || true
Эта команда не выведет никаких сообщений об ошибках и не вызовет
аварийного завершения работы pkg_delete, даже если
каталог PREFIX/share/doc/gimp
не пуст из-за того, что другие порты установили сюда какие-то
файлы.Идентификаторы UIDЕсли вашему порты требуется наличие некоторого пользователя в
системе, на которую он устанавливается, пусть скрипт
pkg-install вызовет команду
pw для его автоматического создания. Посмотрите
для примера на net/cvsup-mirror.Если ваш порт должен использовать тот же самый идентификатор
пользователя или группы при установке двоичного пакаджа, который был
при компиляции, то вы должны выбрать свободный UID в диапазоне от 50
до 99 и зарегистрировать его ниже. Взгляните для примера на
japanese/Wnn.Проверьте, что вы не используете UID, уже используемый системой
или другими портами. Вот текущий список UID между 50 и 99.
majordom:*:54:54:Majordomo Pseudo User:/usr/local/majordomo:/nonexistent
cyrus:*:60:60:the cyrus mail server:/nonexistent:/nonexistent
gnats:*:61:1:GNATS database owner:/usr/local/share/gnats/gnats-db:/bin/sh
uucp:*:66:66:UUCP pseudo-user:/var/spool/uucppublic:/usr/libexec/uucp/uucico
xten:*:67:67:X-10 daemon:/usr/local/xten:/nonexistent
pop:*:68:6:Post Office Owner (popper):/nonexistent:/nonexistent
wnn:*:69:7:Wnn:/nonexistent:/nonexistent
ifmail:*:70:66:Ifmail user:/nonexistent:/nonexistent
pgsql:*:70:70:PostgreSQL pseudo-user:/usr/local/pgsql:/bin/sh
ircd:*:72:72:IRCd hybrid:/nonexistent:/nonexistent
alias:*:81:81:QMail user:/var/qmail/alias:/nonexistent
qmaill:*:83:81:QMail user:/var/qmail:/nonexistent
qmaild:*:82:81:QMail user:/var/qmail:/nonexistent
qmailq:*:85:82:QMail user:/var/qmail:/nonexistent
qmails:*:87:82:QMail user:/var/qmail:/nonexistent
qmailp:*:84:81:QMail user:/var/qmail:/nonexistent
qmailr:*:86:82:QMail user:/var/qmail:/nonexistent
msql:*:87:87:mSQL-2 pseudo-user:/var/db/msqldb:/bin/sh
mysql:*:88:88:MySQL Daemon:/var/db/mysql:/sbin/nologin
vpopmail:*:89:89::0:0:User &:/usr/local/vpopmail:/nonexistent
Пожалуйста, при посылке нового (или обновлении старого) порта
напишите замечание, что резервируете новый UID или GID в этом
диапазоне. Это позволит нам держать список зарезервированных
идентификаторов в актуальном состоянии.Поступайте разумноФайл Makefile должен выполнять действия
просто и небеспричинно. Если вы можете сделать что-то на несколько
строк короче или более читабельно, сделайте это. В качестве примеров
можно привести использование конструкций .if
утилиты make вместо соответствующей конструкции if
командного процессора, ненужность переопределения цели
do-extract при возможности переопределения
EXTRACT* и использование
GNU_CONFIGURE вместо
CONFIGURE_ARGS+= --prefix=${PREFIX}.Использование CFLAGSПорт должен принимать во внимание переменную
CFLAGS. Если он этого не делает, то, пожалуйста,
добавьте в файл Makefile строчку
NO_PACKAGE=ignores cflags.Пример файла Makefile, в котором принимается
во внимание переменная CFLAGS, приводится далее.
Отметьте употребление символов +=:
CFLAGS += -Wall -Werror
А вот пример, в котором не учитывается значение переменной
CFLAGS:
CFLAGS = -Wall -Werror
В системе FreeBSD переменная CFLAGS определена
в файле /etc/make.conf. В первом примере к
переменной CFLAGS добавляются дополнительные флаги,
при этом сохраняются все определения, данные ранее на уровне системы.
Во втором примере всё, что было задано ранее, игнорируется.Конфигурационные файлыЕсли для работы порта требуются наличие некоторых
конфигурационных файлов в каталоге
PREFIX/etc,
не просто установите их и перечислите в файле
pkg-plist. Это приведёт к тому, что по команде
pkg_delete или при новой установке файлы,
тщательно отредактированные и настроенные пользователем, будут
уничтожены.Вместо этого установите файлы с примерами с неким расширением
(filename.sample
подойдет) и выведите сообщение, указывающее на то, чтобы
пользователь скопировал и отредактировал файл перед тем, как работать
с программным обеспечением.Утилита portlintПроверяйте вашу работу с помощью утилиты portlint
перед тем, как послать ее нам или выполнить коммитт.ПожеланияПосылайте подходящие изменения/патчи авторам/сопровождающему
для включения в следующий релиз. Это только сделает вашу работу
гораздо легче при выходе следующего релиза.README.htmlНе включайте сюда файл README.html. Этот файл
не является частью дерева cvs, и он генерируется при помощи команды
make readme.РазноеФайлы pkg-comment,
pkg-descr и pkg-plist вы
должны проверять дважды. Если вы просматриваете порт и думаете,
что его можно переформулировать иначе, сделайте это.Пожалуйста, не создавайте дополнительных копий лицензии GNU
General Public License в нашей системе.Будьте внимательны с юридическими вопросами! Не делайте из нас
нелегальных распространителей ПО!Если вы испытываете затруднения…Посмотрите существующие примеры и файл
bsd.port.mk перед тем, как задавать нам вопросы!
;-)Задавайте нам вопросы, если у вас появились проблемы! Не бейтесь
головой об стену! :-)Примерный MakefileВот примерный Makefile, который можно
использовать при создании нового порта. Обязательно удалите все
дополнительные комментарии (те, которые в скобках)!Вам рекомендуется следовать этому формату (соблюдая порядок
следования переменных, пустые строки между разделами, и так далее).
Этот формат разработан для того, чтобы важная информация была легко
найдена. Мы рекомендуем вам воспользоваться утилитой portlint для проверки файла
Makefile.
[заголовок...просто чтобы нам было легче идентифицировать порт.]
# New ports collection makefile for: xdvi
[строчка "version required" необходима только тогда, когда переменная
PORTVERSION недостаточно конкретна для описания порта.]
# Date created: 26 May 1995
[Это человек, который сделал первоначальный порт для FreeBSD, в частности,
тот, кто создал первую версию этого файла Makefile. Запомните, что позже
при обновлении порта эта строка меняться не должна.]
# Whom: Satoshi Asami <asami@FreeBSD.org>
#
# $FreeBSD$
[ ^^^^^^^^^ Эта строка будет автоматически заменена со строчкой RCS ID
системой CVS при выполнении операции коммитта в наше хранилище. При
обновлении порта не приводите эту строку обратно к виду
"$FreeBSD$". CVS сделает все автоматически.]
#
[секция описания собственно порта и основного сервера - сначала всегда
PORTNAME и PORTVERSIONA, за ним следует CATEGORIES, а затем
MASTER_SITES, за которым может идти MASTER_SITE_SUBDIR.
PKGNAMEPREFIX и PKGNAMESUFFIX, если они нужны, следуют за ними.
Затем следует DISTNAME, EXTRACT_SUFX и/или DISTFILES, а потом, если это нужно,
EXTRACT_ONLY.]
PORTNAME= xdvi
PORTVERSION= 18.2.]
CATEGORIES= print
[не забывайте лидирующий слэш ("/")!
если вы не используете макросы MASTER_SITE_*]
MASTER_SITES= ${MASTER_SITE_XCONTRIB}
MASTER_SITE_SUBDIR= applications
PKGNAMEPREFIX= ja-
DISTNAME= xdvi-pl18
[задайте это, если исходный код поставляется не в виде
стандартного файла ".tar.gz"]
EXTRACT_SUFX= .tar.Z
[секция патчей -- может быть пустой]
PATCH_SITES= ftp://ftp.sra.co.jp/pub/X11/japanese/
PATCHFILES= xdvi-18.patch1.gz xdvi-18.patch2.gz
[сопровождающий; *обязательное поле*! Это человек (предпочтительно с
привилегиями на операцию коммитта), с которым может связаться пользователь
для получения ответов на вопросы и посылки сообщений об ошибках - этот
человек должен быть создателем порта или кем-то, кто может передать
вопросы создателю порта. Если вы на самом деле не хотите указывать здесь
свой адрес, задайте здесь "ports@FreeBSD.org".]
MAINTAINER= asami@FreeBSD.org
[зависимости -- могут быть пустыми]
RUN_DEPENDS= gs:${PORTSDIR}/print/ghostscript
LIB_DEPENDS= Xpm.5:${PORTSDIR}/graphics/xpm
[этот раздел для остальных стандартных переменных из bsd.port.mk, кроме
тех, что перечислены выше]
[Если порт задает вопросы во время этапов настройки, построения,
установки...]
IS_INTERACTIVE= yes
[Если распаковка происходит в каталог, отличных от ${DISTNAME}...]
WRKSRC= ${WRKDIR}/xdvi-new
[Если патчи делались не относительно ${WRKSRC}, вам, может быть, не
придется изменять эту переменную]
PATCH_DIST_STRIP= -p1
[Если порт требует скрипта "configure", генеруемого GNU-версией программы
autoconf]
GNU_CONFIGURE= yes
[Если для построения порту требуется GNU-версия утилиты make, а не
/usr/bin/make...]
USE_GMAKE= yes
[Если это приложение X и требует запуска "xmkmf -a"...]
USE_IMAKE= yes
[и так далее]
[В правилах ниже используются нестандартные переменные]
MY_FAVORITE_RESPONSE= "yeah, right"
[теперь специальные правила, в порядке их вызова]
pre-fetch:
я что-то выкачиваю, точно
post-patch:
мне кое-что сделать после применения патча, великолепно
pre-install:
и потом еще кое-что перед установкой, ого
[и, наконец, эпилог]
.include <bsd.port.mk>
Автоматическое создание списка упаковкиПервым делом убедитесь, что ваш порт практически полностью
завершен, осталось только создать pkg-plist.
Создайте пустой файл pkg-plist.
&prompt.root; touch pkg-plistЗатем создайте новый набор каталогов, в которые может быть
установлен ваш порт, и установите все зависимости.
&prompt.root; mtree -U -f /etc/mtree/BSD.local.dist -d -e -p /var/tmp/port-name
&prompt.root; make depends PREFIX=/var/tmp/port-nameСохраните структуру каталогов в новом файле.
&prompt.root; (cd /var/tmp/port-name && find * -type d) > OLD-DIRSЕсли ваш порт принимает во внимание PREFIX (а он
должен это делать), то тогда вы можете установить порт и создать список
упаковки.
&prompt.root; make install PREFIX=/var/tmp/port-name
&prompt.root; (cd /var/tmp/port-name && find * \! -type d) > pkg-plistКроме того, в список упаковки вы должны добавить все вновь
созданные каталоги.
&prompt.root; (cd /var/tmp/port-name && find * -type d) | comm -13 OLD-DIRS - | sed -e 's#^#@dirrm #' >> pkg-plist
- И наконец, вам нужно вручную отшлифовать список упаковки. Я
- обманул вас, когда сказал, что все происходит автоматически. Страницы
- Справочника должны быть перечислены в файле
+ И наконец, вам нужно вручную отшлифовать список упаковки; его
+ создание автоматизировано не полностью. Страницы
+ справочной системы должны быть перечислены в файле
Makefile порта в переменных
MANn, а не в списке
упаковки. Пользовательские конфигурационные файлы должны быть удалены
или быть установлены как
filename.sample.
Файл info/dir включать в список не нужно, но
должны быть добавлены соответствующие строчки
install-info, так, как это описано в разделе о файлах в формате info. Все
библиотеки, устанавливаемые портом, должны быть перечислены так, как
это описано в разделе о динамических библиотеках.Имена пакаджейДалее описаны некоторые соглашения, которым вы должны следовать
в именовании ваших пакаджей. Они были разработаны для облегчения
просмотра каталога, так как пакаджей уже имеется достаточно много и еще
больше их появляется, а пользователи отвернутся от нас, если список не
понравится их взору!Имя пакаджа должно иметь вид
language_region-name-compiled.specifics-version.numbers.Имя пакаджа определяется как
${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}.
Вы должны задавать значения переменных в соответствии с этим
форматом.FreeBSD пытается поддерживать языки, на которых разговаривают
ее пользователи. Часть language-
должна быть двухсимвольным сокращением от названия языка по
стандарту ISO-639, если порт специфичен для конкретного языка.
Примерами являются ja для японского,
ru для русского, vi для
вьетнамского, zh для китайского,
ko для корейского и de для
немецкого языков.Если ваш порт специфичен для конкретного региона внутри области
использования языка, добавьте также двухсимвольный код страны.
Примерами являются en_US для US English и
fr_CH для Swiss French.Часть language- должна задаваться в
переменной PKGNAMEPREFIX.Первая буква части name должна быть в нижнем
регистре. (Оставшаяся часть названия может содержать буквы в
верхнем регистре, так что принимайте решение сами, когда преобразуете
имя программного пакета, содержащего в имени некоторое количество
заглавных букв.) Существует традиция именовать модули для Perl 5,
добавляя впереди p5- и преобразуя пару двоеточий в
дефис; например, модуль Data::Dumper будет
именоваться p5-Data-Dumper. Если программное
обеспечение содержит в имени числа, дефисы или подчеркивания, то вы
можете включить также и их (например,
kinput2).Если порт может быть построен с различными статически заданными значениями по
умолчанию (обычно это часть имени каталога в семействе
портов), то часть -compiled.specifics
должна определять вкомпилированные значения по умолчанию (дефис
не обязателен). Примерами являются размеры бумаги и
шрифтов.Часть compiled.specifics должна
задаваться в переменной PKGNAMESUFFIX.Строка с номером версии должна следовать за дефисом
(-) и являться списком разделенных двоеточием
чисел и букв в нижнем регистре. В частности, не разрешается иметь
еще один дефис внутри строки с обозначением номера версии.
Единственным исключением является строчка pl
(означающая `уровень патчей'), которая может использоваться
только тогда, когда у программного обеспечения
нет старшего и младшего номера версии. Если в номер версии
программного обеспечения включена строчка типа "alpha", "beta", "rc"
или "pre", возьмите из неё первую букву и поставьте её непосредственно
после точки. Если после таких строк номер версии ещё продолжается,
то после буквы должно следовать число без дополнительной разделяющей
точки.Смысл такого формата заключается в удобстве сортировки портов
по номеру версии. В частности, следите за тем, чтобы компоненты
номера версии разделялись точкой, и если там присутствует дата,
то используйте формат
yyyy.mm.dd, но не
dd.mm.yyyy
или не совместимый с проблемой Г2000
yy.mm.dd.Вот несколько (реальных) примеров того, как преобразовать имя из
оригинального, придуманного авторами, к подходящему для имени
пакаджа:Имя дистрибутиваPKGNAMEPREFIXPORTNAMEPKGNAMESUFFIXPORTVERSIONОбоснованиеmule-2.2.2(пусто)mule(пусто)2.2.2Изменений не потребовалосьXFree86-3.3.6(пусто)XFree86(пусто)3.3.6Изменений не потребовалосьEmiClock-1.0.2(пусто)emiclock(пусто)1.0.2Для отдельных программ имена с заглавными буквами
запрещеныrdist-1.3alpha(пусто)rdist(пусто)1.3.aСтрочки типа alpha запрещеныes-0.9-beta1(пусто)es(пусто)0.9.b1Строчки типа beta запрещеныmailman-2.0rc3(пусто)mailman(пусто)2.0.r3Строчки типа rc запрещеныv3.3beta021.src(пусто)tiff(пусто)3.3Что это такое было вообще?tvtwm(пусто)tvtwm(пусто)pl11Всегда требуется указание номера версииpiewm(пусто)piewm(пусто)1.0Всегда требуется указание номера версииxvgr-2.10pl1(пусто)xvgr(пусто)2.10.1pl разрешено только при отсутствии
старшего/младшего номера версииgawk-2.15.6ja-gawk(пусто)2.15.6Версия на японском языкеpsutils-1.13(пусто)psutils-letter1.13Размер бумаги задается статически во время построения
пакаджаpkfonts(пусто)pkfonts3001.0Пакадж для шрифтов 300dpiЕсли в исходном коде абсолютно нет информации о номере версии и не
похоже, что автор собирается выпускать другую версию, то в качестве
номера версии задайте просто 1.0 (как в примере с
piewm выше). В противном случае спросите автора программы или
используйте дату
(yyyy.mm.dd)
в качестве номера версии.КатегорииКак вы уже знаете, порты разделяются на несколько категорий.
Но чтобы эта классификация работала хорошо, очень важно, чтобы как те,
кто занимается портированием, так и пользователи понимали, что содержит
каждая категория, и как мы определяем, что помещать в каждую
из них.Текущий список категорийВо-первых, это текущий список категорий. Те, которые отмечены
звездочкой (*), являются
виртуальными категориями—они не имеют
собственного подкаталога в дереве портов.Для каждой виртуальной категории имеется файл
pkg/COMMENT с ее однострочным описанием
в соответствующем подкаталоге (например,
archivers/pkg/COMMENT).КатегорияОписаниеafterstep*Порты, поддерживающие менеджер окон AfterStep.archiversИнструменты для работы с архивами.astroПриложения, связанные с астрономией.audioПоддержка работы со звуком.benchmarksУтилиты для измерения производительности системы.biologyПрограммное обеспечение, связанное с биологией.cadИнструменты Систем Автоматизированного
Проектирования.chineseПоддержка китайского языка.commsКоммуникационное программное обеспечение. В основном
программы для работы с последовательным портом.convertersУтилиты для преобразования символьных форматов.databasesБазы данных.deskutilsТо, что было на столе до изобретения компьютеров.develУтилиты для разработки программного обеспечения. Не
помещайте сюда библиотеки просто потому что это
библиотеки—если они подпадают под какую-то другую
категорию, то их быть здесь не должно.editorsРедакторы общего назначения. Специализированные редакторы
относят к разделу для соответствующих инструментов (например,
редактор математических формул попадает в категорию
math).elisp*Порты для Emacs lisp.emulatorsЭмуляторы других операционных систем. Эмуляторы терминалов
сюда не относятся—те, которые
разработаны для X, должны быть в категории
x11, а текстовые в
comms или misc, в
зависимости от конкретного их предназначения.frenchПоддержка французского языка.ftpКлиенты и серверы FTP. Если ваш порт понимает как FTP,
так и HTTP, поместите его в категорию ftp и
укажите вторичную категорию www.gamesИгры.germanПоддержка немецкого языка.gnome*Порты проекта GNU Object Model Environment (GNOME)
Project.graphicsГрафические утилиты.hebrewПоддержка иврита.ircУтилиты для работы с Internet Relay Chat.ipv6*Программное обеспечение, связанное с IPv6.japaneseПоддержка японского языка.javaПоддержка языка Java.kde*Порты проекта K Desktop Environment (KDE) Project.koreanПоддержка корейского языка.langЯзыки программирования.linux*Linux приложения и утилиты.mailПрограммы для работы с электронной почтой..mathПрограммное обеспечение для численных вычислений и другие
утилиты, связанные с математикой.mboneПриложения для MBone.miscРазличные утилиты—в основном то, что не попадает в
другие категории. Это единственная категория, которая не должна
указываться вместе с любой другой невиртуальной категорией. Если
вы указываете misc вместе с чем-то еще в
строке CATEGORIES, это значит, что вы можете
спокойно удалить misc и просто поместить порт
в этот другой подкаталог!netРазличное сетевое программное обеспечение.newsПрограммное обеспечение для работы с конференциями
USENET.offix*Порты из набора OffiX.palmПрограммная поддержка 3Com Palm(tm).perl5*Порты, которым для работы требуется perl версии 5.
+
+
+
+ picobsd
+ Порты для поддержки PicoBSD.plan9*Различные программы из plan9.printПрограммное обеспечение для печати. Инструменты для верстки
(просмотрщики и тому подобное) тоже относятся сюда.python*Программное обеспечение, написанное на языке python.ruby*Программное обеспечение, написанное на языке ruby.russianПоддержка русского языка.
+
+ science
+ Научные программы, которые не подпадают под другие категории,
+ скажем, astro, biology
+ или math.
+
+
securityПрограммы, обеспечивающие безопасность системы.shellsРазличные командные процессоры.sysutilsСистемные утилиты.tcl76*Порты, которым для работы нужен Tcl версии 7.6.tcl80*Порты, которым для работы нужен Tcl версии 8.0.tcl81*Порты, которым для работы нужен Tcl версии 8.1.tcl82*Порты, которым для работы нужен Tcl версии 8.2.textprocУтилиты для текстовой обработки. Инструменты для верстки
помещаются в print/, а не сюда.tk42*Порты, которым для работы нужен Tk версии 4.2.tk80*Порты, которым для работы нужен Tk версии 8.0.tk81*Порты, которым для работы нужен Tk версии 8.1.tk82*Порты, которым для работы нужен Tk версии 8.2.tkstep80*Порты, которым для работы нужен TkSTEP версии 8.0.
+
+
+
+ ukrainian
+ Поддержка украинского языка.vietnameseПоддержка вьетнамского языка.windowmaker*Порты, поддерживающие менеджер окон WindowMakerwwwПрограммное обеспечение, связанное с World Wide Web.
Поддержка языка HTML относится сюда же.x11X Window System и иже с ними. Эта категория предназначена
только для программного обеспечения, которое поддерживает
оконную систему. Не помещайте сюда обычные приложения X. Если
ваш порт является приложением для X, задайте
USE_XLIB (что подразумевается при
использовании USE_IMAKE) и укажите подходящую
категорию. Кроме того, многие такие приложения относятся к
категориям x11-* (смотрите ниже).x11-clocksЧасы для X11.x11-fmМенеджеры файлов для X11.x11-fontsШрифты для X11 и утилиты для работы с ними.x11-serversСерверы для X11.x11-toolkitsПакеты разработчика для X11.x11-wmОконные менеджеры для X11.zope*Поддержка zope.Выбор правильной категорииТак как многие категории перекрываются, вам часто необходимо
будет выбирать, какая их них должна быть основной для вашего порта.
Есть несколько правил, по которым можно решить этот вопрос. Вот
список приоритетов, в уменьшающейся степени предпочтения.Сначала всегда идут категории, специфичные для языков.
Например, если ваш порт устанавливает японские шрифты для X11,
то строчка CATEGORIES должна иметь вид
japanese x11-fonts.Более конкретные категории предпочтительней перед точных. В
частности, редактор HTML должен быть описан как
www editors, а не наоборот. Кроме того, вам не
нужно указывать категорию net, если порт
относится к любой из категорий irc,
mail, mbone,
news, security или
www.x11 используется как вторичная категория
только в случае, когда в качестве основной категории указан
естественный язык. В частности, вам не нужно указывать
x11 в качестве категории для
приложений X.Режимы для редактора Emacs должны
помещаться в ту же категорию, что и приложение, которое
поддерживается этим режимом, а не в editors.
Например, режим Emacs для
редактирования исходного кода некоторого языка программирования
должен быть помещен в категорию lang.Если ваш порт решительным образом не подпадает ни под какую
категорию, поместите его в misc.Если вы не уверены в правильности выбора категории, пожалуйста,
отметьте это в вашей посылке по send-pr, чтобы мы
могли обсудить это до того, как включить порт в Коллекцию. Если вы
являетесь коммиттером, пошлите замечание на адрес &a.ports;, чтобы мы
могли обсудить это—зачастую новые порты помещаются не в ту
категорию только для того, чтобы их оттуда сразу же удалили.Изменения в этом документе и системе портовЕсли вы сопровождаете большое количество портов, то должны
отслеживать &a.ports;. Важные изменения в схеме работы портов будут
объявляться здесь. Вы всегда можете найти более подробную информацию о
самых последних изменениях в
журнале изменений CVS файла bsd.port.mk.Вот, парни, и все!Итак, малыш, это был длинный рассказ, не так ли? Спасибо за то,
что вы шли с нами до самого конца. Теперь, когда вы знаете, как
создавать порты, воспользуйтесь этими знаниями и преобразуйте все, что
есть на свете, в порты! Это самый легкий способ принять участие в
Проекте FreeBSD!
:-)
diff --git a/ru_RU.KOI8-R/books/porters-handbook/freebsd.dsl b/ru_RU.KOI8-R/books/porters-handbook/freebsd.dsl
index 4564a1c493..c44af03706 100644
--- a/ru_RU.KOI8-R/books/porters-handbook/freebsd.dsl
+++ b/ru_RU.KOI8-R/books/porters-handbook/freebsd.dsl
@@ -1,42 +1,42 @@
-
+
+
+
]>
.")
(make empty-element gi: "br")
(literal "По вопросам связанным с этом документацией, пишите по адресу <")
- (make element gi: "a"
- attributes: (list (list "href" "mailto:doc@freebsd.org"))
- (literal "doc@freebsd.org"))
- (literal ">.")))
+ (create-link (list (list "HREF" "mailto:doc@FreeBSD.org"))
+ (literal "doc@FreeBSD.org"))
+ (literal ">.")))
(element quote
(make sequence
(literal "``")
(process-children)
(literal "''")))
]]>