diff --git a/ru_RU.KOI8-R/books/porters-handbook/Makefile b/ru_RU.KOI8-R/books/porters-handbook/Makefile
new file mode 100644
index 0000000000..bf397ec4f0
--- /dev/null
+++ b/ru_RU.KOI8-R/books/porters-handbook/Makefile
@@ -0,0 +1,32 @@
+#
+# $FreeBSD$
+# $FreeBSDru: frdp/doc/ru_RU.KOI8-R/books/porters-handbook/Makefile,v 1.2 2000/09/17 15:15:41 phantom Exp $
+#
+# Build the FreeBSD Porter's Handbook.
+#
+
+MAINTAINER=andy@FreeBSD.org.ua
+
+DOC?= book
+
+FORMATS?= html-split
+
+INSTALL_COMPRESSED?= gz
+INSTALL_ONLY_COMPRESSED?=
+
+NO_TIDY= YES
+
+#
+# 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
+
+# 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
new file mode 100644
index 0000000000..9ec325bb1f
--- /dev/null
+++ b/ru_RU.KOI8-R/books/porters-handbook/book.sgml
@@ -0,0 +1,4596 @@
+
+
+
+%man;
+
+%bookinfo;
+ %authors;
+
+%mailing-lists;
+]>
+
+
+
+
+ Руководство по портированию приложений во FreeBSD
+
+
+ The FreeBSD Russian Documentation Project
+
+
+ Апрель 2000
+
+
+ 2000
+
+ 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 install
+
+
+
+ make package
+
+
+
+ make deinstall
+
+
+
+ pkg_add package-name
+
+
+
+
+ make deinstall
+
+
+
+ make reinstall
+
+
+
+ make 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.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-сервере
+ по адресу
+ 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, который вам доступен (например, ваша домашняя
+ страница). Проверьте, что вы установили переменную
+ MASTER_SITES в значение, которое соответствует
+ вашему решению.
+
+ Если вы не можете найти доступного и надёжного места для
+ помещения дистрибутивного файла, то мы сами сможем разместить его на
+ сервере ftp.FreeBSD.org. Дистрибутивный файл должен
+ быть помещён в каталог ~/public_distfiles/
+ одного из пользователей машины freefall. Попросите
+ того, кто коммиттил ваш порт, сделать это. Этот человек также задаст
+ переменной MASTER_SITES значение
+ MASTER_SITE_LOCAL, а в переменной
+ MASTER_SITE_SUBDIR укажет своё имя пользователя
+ с машины freefall.
+
+ Если дистрибутивные файлы вашего порта постоянно меняются по
+ непонятным причинам, остается поместить дистрибутив на вашу домашнюю
+ веб-страницу и указать ее первой в списке
+ MASTER_SITES. Это позволит избежать получения
+ ошибок checksum mismatch у пользователей, а
+ также уменьшит нагрузку на людей, сопровождающих наш 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-серверы.
+
+
+
+
+ Настройка файла 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 и
+ PORTEPOCH
+
+
+ PORTREVISION
+
+ Переменная 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-сервере или компакт-диске. Пожалуйста, посмотрите на
+ список существующих категорий и выберите те из них,
+ которые более всего подходят к вашему порту.
+
+ Этот список также определяет, куда в дереве портов будет помещен
+ порт. Если вы укажете здесь более одной категории, то
+ предполагается, что файлы порта будут помещены в подкаталог с именем
+ первой категории. Посмотрите раздел о категориях для получения
+ подробной информации о том, как правильно выбрать категории.
+
+ Если ваш порт действительно относится к чему-то, что абсолютно
+ не имеет отношения ни к одной из существующих категорий, вы можете
+ даже создать новую категорию. В этом случае, пожалуйста, пошлите
+ письмо с вашим предложением на адрес &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, задайте имена этих файлов в
+ переменной 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 и
+ RUN_DEPENDS—по крайней мере смысл
+ будет более понятен.
+
+
+
+
+ Механизм построения
+
+ Если ваш пакадж использует 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, Я не думаю,
+ что это подходит для портов, потому что вам нужно будет
+ продублировать информацию в трех местах
+ (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 для
+ перегенерации файлов 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. Я также удалил установку
+ информационного файла 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-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-comment
+
+
+
+ DESCR
+ ${PKGDIR}/pkg-descr
+
+
+
+ PLIST
+ ${PKGDIR}/pkg-plist
+
+
+
+ PKGINSTALL
+ ${PKGDIR}/pkg-install
+
+
+
+ PKGDEINSTALL
+ ${PKGDIR}/pkg-deinstall
+
+
+
+ PKGREQ
+ ${PKGDIR}/pkg-req
+
+
+
+ PKGMESSAGE
+ ${PKGDIR}/pkg-message
+
+
+
+
+
+ Пожалуйста, изменяйте значения этих переменных, а не
+ переопределяйте PKG_ARGS. Если вы измените
+ значение переменных PKG_ARGS, то эти файлы при
+ установке из порта будут установлены в каталог
+ /var/db/pkg некорректно.
+
+
+
+
+ Проблемы с лицензированием
+
+ Некоторые программные пакеты имеют ограниченные лицензии или
+ их использование в некоторых странах может оказаться (как нарушение
+ патента). То, что мы можем с этим сделать, сильно
+ зависит от точных формулировок конкретных лицензионных
+ соглашений.
+
+
+ На вас, как на человека, портирующего приложение, ложится
+ обязанность прочесть лицензионные соглашения на программное
+ обеспечение и удостовериться, что проект FreeBSD не будет являться
+ их нарушителем, если будет заниматься распространением исходного
+ кода или в откомпилированном виде по ftp или на компакт-дисках. Если
+ у вас возникли сомнения, то, пожалуйста, обратитесь в
+ адрес &a.ports;.
+
+
+ Имеется две переменные, которые вы можете задать в Makefile
+ в наиболее часто встречающихся ситуациях:
+
+
+
+ Если порт имеет лицензию типа “не продавать для
+ достижения прибыли”, задайте в переменной
+ NO_CDROM строку, описывающую причину этого. Мы
+ не будем помещать такие порты на компакт-диск во время выпуска
+ релиза. Дистрибутивный файл и пакадж будут доступны по
+ ftp.
+
+
+
+ Если получающийся пакадж должен строиться каждый раз уникальным
+ образом или получающийся бинарный пакадж не может распространяться
+ по лицензионным соображениям, то в переменной
+ NO_PACKAGE укажите строку, описывающую причину
+ этого. Мы не будем помещать такие пакаджи ни на ftp-сервер, ни на
+ компакт-диск во время выпуска релиза. Однако дистрибутивный файл
+ будет помещен на оба носителя.
+
+
+
+ Если порт имеет юридические ограничения на использованию
+ (например, патентованное программное обеспечение) или имеет
+ лицензию “не для коммерческого использования”, то в
+ переменной RESTRICTED укажите строку,
+ описывающую причину этого. Для таких портов ни дистрибутивный
+ файл, ни пакаджи не будут доступны даже с наших серверов
+ ftp.
+
+
+
+
+ Лицензия GNU General Public License (GPL), как версии 1, так и
+ версии 2, для портов вызвать проблем не должна.
+
+
+
+ Если вы являетесь коммиттером, обязательно обновите также файл
+ ports/LEGAL.
+
+
+
+
+ Обновление
+
+ Если вы заметите, что ваш порт устарел по сравнению с последней
+ авторской версией, первым делом проверьте, что у вас находится самая
+ последняя версия порта. Вы можете найти их в каталоге
+ 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 он работает. Если вам нудно сделать такие изменения в коде для
+ условной компиляции, то вы должны делать изменения как можно
+ более общими, чтобы мы могли перенести код на системы 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_version
+
+
+
+
+
+ 2.0-RELEASE
+ 119411
+
+
+
+ 2.1-CURRENT
+ 199501, 199503
+
+
+
+ 2.0.5-RELEASE
+ 199504
+
+
+
+ 2.2-CURRENT до выхода 2.1
+ 199508
+
+
+
+ 2.1.0-RELEASE
+ 199511
+
+
+
+ 2.2-CURRENT до выхода 2.1.5
+ 199512
+
+
+
+ 2.1.5-RELEASE
+ 199607
+
+
+
+ 2.2-CURRENT до выхода 2.1.6
+ 199608
+
+
+
+ 2.1.6-RELEASE
+ 199612
+
+
+
+ 2.1.7-RELEASE
+ 199612
+
+
+
+ 2.2-RELEASE
+ 220000
+
+
+
+ 2.2.1-RELEASE
+ 220000 (без изменений)
+
+
+
+ 2.2-STABLE после выхода 2.2.1-RELEASE
+ 220000 (без изменений)
+
+
+
+ 2.2-STABLE после включения texinfo-3.9
+ 221001
+
+
+
+ 2.2-STABLE после включения top
+ 221002
+
+
+
+ 2.2.2-RELEASE
+ 222000
+
+
+
+ 2.2-STABLE после выхода 2.2.2-RELEASE
+ 222001
+
+
+
+ 2.2.5-RELEASE
+ 225000
+
+
+
+ 2.2-STABLE после выхода 2.2.5-RELEASE
+ 225001
+
+
+
+ 2.2-STABLE после появления ldconfig -R
+ 225002
+
+
+
+ 2.2.6-RELEASE
+ 226000
+
+
+
+ 2.2.7-RELEASE
+ 227000
+
+
+
+ 2.2-STABLE после выхода 2.2.7-RELEASE
+ 227001
+
+
+
+ 2.2-STABLE после изменения в semctl(2)
+ 227002
+
+
+
+ 2.2.8-RELEASE
+ 228000
+
+
+
+ 2.2-STABLE после выхода 2.2.8-RELEASE
+ 228001
+
+
+
+ 3.0-CURRENT до изменения в mount(2)
+ 300000
+
+
+
+ 3.0-CURRENT после изменения в mount(2)
+ 300001
+
+
+
+ 3.0-CURRENT после изменения в semctl(2)
+ 300002
+
+
+
+ 3.0-CURRENT после изменений в аргументах ioctl
+ 300003
+
+
+
+ 3.0-CURRENT после перехода на формат ELF
+ 300004
+
+
+
+ 3.0-RELEASE
+ 300005
+
+
+
+ 3.0-CURRENT после выхода 3.0-RELEASE
+ 300006
+
+
+
+ 3.0-STABLE после разбиения на ветки 3/4
+ 300007
+
+
+
+ 3.1-RELEASE
+ 310000
+
+
+
+ 3.1-STABLE после выхода 3.1-RELEASE
+ 310001
+
+
+
+ 3.1-STABLE после изменения в порядке следования
+ конструкторов/деструкторов в C++
+ 310002
+
+
+
+ 3.2-RELEASE
+ 320000
+
+
+
+ 3.2-STABLE
+ 320001
+
+
+
+ 3.2-STABLE после несовместимых изменений в IPFW и
+ сокетах
+ 320002
+
+
+
+ 3.3-RELEASE
+ 330000
+
+
+
+ 3.3-STABLE
+ 330001
+
+
+
+ 3.3-STABLE после добавления mkstemps() в libc
+ 330002
+
+
+
+ 3.4-RELEASE
+ 340000
+
+
+
+ 3.4-STABLE
+ 340001
+
+
+
+ 4.0-CURRENT после появления ветки 3.4
+ 400000
+
+
+
+ 4.0-CURRENT после изменения в работе динамического
+ компоновщика
+ 400001
+
+
+
+ 4.0-CURRENT после изменения в порядке следования
+ конструкторов/деструкторов в C++
+ 400002
+
+
+
+ 4.0-CURRENT после появления функции dladdr(3)
+ 400003
+
+
+
+ 4.0-CURRENT после исправления ошибки в работе функции
+ __deregister_frame_info динамического компоновщика (а также
+ 4.0-CURRENT после интеграции EGCS 1.1.2)
+ 400004
+
+
+
+ 4.0-CURRENT после изменения интерфейса функции suser(9)
+ (а также 4.0-CURRENT после появления newbus)
+ 400005
+
+
+
+ 4.0-CURRENT после изменения в регистрации cdevsw
+ 400006
+
+
+
+ 4.0-CURRENT после добавления so_cred в проверки на
+ уровне сокетов
+ 400007
+
+
+
+ 4.0-CURRENT после добавления обработчика системного
+ вызова poll в libc_r
+ 400008
+
+
+
+ 4.0-CURRENT после перехода в ядре с типа
+ dev_t на указатель
+ struct specinfo
+ 400009
+
+
+
+ 4.0-CURRENT после исправления дыры в безопасности
+ jail(2)
+ 400010
+
+
+
+ 4.0-CURRENT после изменения в типе данных
+ sigset_t
+ 400011
+
+
+
+ 4.0-CURRENT после перехода на компилятор
+ GCC 2.95.2
+ 400012
+
+
+
+ 4.0-CURRENT после появления добавляемых обработчиков
+ ioctl режима linux
+ 400013
+
+
+
+ 4.0-CURRENT после заимствования OpenSSL
+ 400014
+
+
+
+ 4.0-CURRENT после изменения в C++ ABI компилятора
+ GCC 2.95.2 по умолчанию с -fvtable-thunks на
+ -fno-vtable-thunks
+ 400015
+
+
+
+ 4.0-CURRENT после заимствования OpenSSH
+ 400016
+
+
+
+ 4.0-RELEASE
+ 400017
+
+
+
+ 4.0-STABLE после появления 4.0-RELEASE
+ 400018
+
+
+
+ 4.0-STABLE после интеграции кода библиотеки
+ libxpg4 в libc.
+ 400020
+
+
+
+ 4.0-STABLE после обновления пакета Binutils до версии
+ 2.10.0, изменения в схеме пометки выполнимых файлов ELF и
+ включения tcsh в качестве базового компонента.
+ 400021
+
+
+
+ 4.1-RELEASE
+ 410000
+
+
+
+ 4.1-STABLE после выхода 4.1-RELEASE
+ 410001
+
+
+
+ 4.1-STABLE после переноса функции setproctitle() из
+ библиотеки libutil в libc.
+ 410002
+
+
+
+ 4.1.1-RELEASE
+ 411000
+
+
+
+ 4.1.1-STABLE после выхода 4.1.1-RELEASE
+ 411001
+
+
+
+ 5.0-CURRENT
+ 500000
+
+
+
+ 5.0-CURRENT после добавления дополнительных полей в
+ заголовке ELF и изменения метода пометки принадлежности
+ к определённой системе для выполнимых файлов в формате
+ ELF.
+ 500001
+
+
+
+ 5.0-CURRENT после изменений в метаданных kld.
+ 500002
+
+
+
+ 5.0-CURRENT после изменений buf/bio.
+ 500003
+
+
+
+ 5.0-CURRENT после обновления binutils.
+ 500004
+
+
+
+ 5.0-CURRENT после интеграции кода библиотеки libxpg4 в
+ libc и появления интерфейса TASKQ.
+ 500005
+
+
+
+ 5.0-CURRENT после добавления интерфейсов AGP.
+ 500006
+
+
+
+ 5.0-CURRENT после обновления Perl до версии 5.6.0
+ 500007
+
+
+
+ 5.0-CURRENT после изменений в ether_ifattach() и
+ ether_ifdetach().
+ 500009
+
+
+
+ 5.0-CURRENT после обновления кода KAME до версии
+ 2000/07.
+ 500008
+
+
+
+ 5.0-CURRENT после изменения в API для kqueue.
+ 500011
+
+
+
+ 5.0-CURRENT после перемещения setproctitle() из библиотеки
+ libutil в libc.
+ 500012
+
+
+
+ 5.0-CURRENT после первого коммита SMPng.
+ 500013
+
+
+
+ 5.0-CURRENT после возврата в настройках утилиты mtree,
+ применяемых по умолчанию, обратно к оригинальным и добавления
+ флага -L для перехода по символическим ссылкам.
+ 500010
+
+
+
+
+
+
+
+
+ Заметьте, что 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, так как эта переменная автоматически
+ передается далее на каждом этапе построения и установки.
+
+ Не задавайте переменную 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 недостаточно конкретна для описания порта.]
+# Version required: pl18 + japanization patches 18.1 and 18.2
+[это дата создания первой версии этого файла Makefile.
+Никогда не изменяйте эту строку при обновлении порта.]
+# 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" или
+ "pre", возьмите из неё первую букву и поставьте её непосредственно
+ после точки. Если после таких строк номер версии ещё продолжается,
+ то после буквы должно следовать число без дополнительной разделяющей
+ точки.
+
+ Смысл такого формата заключается в удобстве сортировки портов
+ по номеру версии. В частности, следите за тем, чтобы компоненты
+ номера версии разделялись точкой, и если там присутствует дата,
+ то используйте формат
+ yyyy.mm.dd, но не
+ dd.mm.yyyy
+ или не совместимый с проблемой Г2000
+ yy.mm.dd.
+
+
+
+ Вот несколько (реальных) примеров того, как преобразовать имя из
+ оригинального, придуманного авторами, к подходящему для имени
+ пакаджа:
+
+
+
+
+
+ Имя дистрибутива
+ PKGNAMEPREFIX
+ PORTNAME
+ PKGNAMESUFFIX
+ PORTVERSION
+ Обоснование
+
+
+
+
+
+ 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 запрещены
+
+
+
+ v3.3beta021.src
+ (пусто)
+ tiff
+ (пусто)
+ 3.3
+ Что это такое было вообще?
+
+
+
+ tvtwm
+ (пусто)
+ tvtwm
+ (пусто)
+ pl11
+ Всегда требуется указание номера версии
+
+
+
+ piewm
+ (пусто)
+ piewm
+ (пусто)
+ 1.0
+ Всегда требуется указание номера версии
+
+
+
+ xvgr-2.10pl1
+ (пусто)
+ xvgr
+ (пусто)
+ 2.10.1
+ pl разрешено только при отсутствии
+ старшего/младшего номера версии
+
+
+
+ gawk-2.15.6
+ ja-
+ gawk
+ (пусто)
+ 2.15.6
+ Версия на японском языке
+
+
+
+ psutils-1.13
+ (пусто)
+ psutils
+ -letter
+ 1.13
+ Размер бумаги задается статически во время построения
+ пакаджа
+
+
+
+ pkfonts
+ (пусто)
+ pkfonts
+ 300
+ 1.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.
+
+
+
+ plan9*
+ Различные программы из plan9.
+
+
+
+ print
+ Программное обеспечение для печати. Инструменты для верстки
+ (просмотрщики и тому подобное) тоже относятся сюда.
+
+
+
+ python*
+ Программное обеспечение, написанное на языке python.
+
+
+
+ ruby*
+ Программное обеспечение, написанное на языке ruby.
+
+
+
+ russian
+ Поддержка русского языка.
+
+
+
+ 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.
+
+
+
+ vietnamese
+ Поддержка вьетнамского языка.
+
+
+
+ windowmaker*
+ Порты, поддерживающие менеджер окон WindowMaker
+
+
+
+ www
+ Программное обеспечение, связанное с World Wide Web.
+ Поддержка языка HTML относится сюда же.
+
+
+
+ x11
+ X 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
new file mode 100644
index 0000000000..4564a1c493
--- /dev/null
+++ b/ru_RU.KOI8-R/books/porters-handbook/freebsd.dsl
@@ -0,0 +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 ">.")))
+
+
+ (element quote
+ (make sequence
+ (literal "``")
+ (process-children)
+ (literal "''")))
+ ]]>
+
+
+
+
+