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 не потребовалось абсолютно никаких изменений. Если + требовалось что-то изменить, то вам придется обратиться также и к + следующему разделу. + + + + Создание файла <filename>Makefile</filename> + + Минимальный 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- + отличает их от других файлов. + + + <filename>pkg-comment</filename> + + Это однострочное описание порта. + Пожалуйста, не включайте сюда название + пакаджа (или номер версии программного обеспечения). + Комментарий должен начинаться с заглавной буквы и не + заканчиваться точкой. Вот пример: + + +A cat chasing a mouse all over the screen + + + + + <filename>pkg-descr</filename> + + Это более подробное краткое описание порта. От одного до + нескольких абзацев, кратко описывающих, что представляет собой + порт, будет достаточно. + + + Это не руководство и не подробнейшее + описание того, как использовать или компилировать порт! + Пожалуйста, будьте внимательны при копировании текста + из 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 + + + + + <filename>pkg-plist</filename> + + Здесь перечисляются все файлы, устанавливаемые портом. Его + также называют “списком для упаковки”, потому что + пакадж генерируется упаковкой файлов, которые здесь указаны. + Имена путей указываются относительно установочного префикса + (обычно /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, чтобы убедиться, что + оно работает правильно при установке из пакаджа. + + + + Проверка вашего порта утилитой + <command>portlint</command> + + Будьте добры, пользуйтесь утилитой 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 для переопределения действий по + умолчанию, хотя к этому нужно будет прибегать в очень редких случаях, + если вообще придётся. + + + + <makevar>PORTNAME</makevar> и + <makevar>PORTVERSION</makevar> + + В переменной PORTNAME вы должны указать + основную часть имени вашего порта, а в переменной + PORTVERSION - номер версии. + + + + <makevar>PORTREVISION</makevar> и + <makevar>PORTEPOCH</makevar> + + + <makevar>PORTREVISION</makevar> + + Переменная PORTREVISION представляет собой + монотонно увеличивающееся число, которое обнуляется при каждом + увеличении значения переменной PORTVERSION (то есть + каждый раз, когда создателями выпускается новый официальный релиз), + и добавляется к имени пакаджа, если оно не равно нулю. Значение + PORTREVISION увеличивается каждый раз, когда + в порте FreeBSD делаются изменения, которые достаточно сильно + затрагивают содержимое или структуру соответствующего пакаджа. + + Примеры случаев, когда значение PORTREVISION должно быть + увеличено: + + + + Добавление патчей для исправления пробелов в безопасности, + ошибок, или добавления новой функциональности в порт + FreeBSD. + + + + Изменения в файле построения порта для включения и выключения + параметров, определяемых при компиляции пакаджа. + + + + Изменения в списке упаковки или в поведении пакаджа во время + его установки (например, изменение скрипта, генерирующего + начальные данные для пакаджа, такие, как ssh-ключи для + хоста). + + + + Увеличение версии динамической библиотеки, от которой зависит + порт (в этом случае тот, кто попытается установить старый пакадж + после установки более новой версии библиотеки, не сможет этого + сделать, потому что при этом будет делаться поиск старой + библиотеки libfoo.x, а не libfoo.(x+1)). + + + + Большие функциональные изменения в дистрибутивном файле порта, + происходящие без объявлений, и приводящие к большим изменениям, то + есть изменения в дистрибутиве требуют корректировки файла + distinfo без соответствующего изменения + PORTVERSION, когда как команда + diff -ru между новой и старой версиями + показывает нетривиальные изменения в коде. + + + + Примеры изменений, которые не требуют увеличения переменной + PORTREVISION: + + + + Изменения стиля в скелете порта без функциональных изменений + в пакадже. + + + + Изменения в переменной MASTER_SITES или + другие функциональные изменения порта, которые не затрагивают + получающегося пакаджа. + + + + Тривиальные патчи к дистрибутивному файлу, такие, как + исправления опечаток, которые не так уж важны, что пользователи + пакаджа должны озаботиться обновлением. + + + + Исправления, касающиеся этапа построения, которые делают + возможным построение пакаджа, если ранее это было невозможно + сделать (пока изменения не приводят к изменению работы на любых + других платформах, на которых порт ранее строился). Так как + PORTREVISION отражает содержимое пакаджа, то + если ранее пакадж не строился, то нет нужды увеличивать + PORTREVISION для отметки изменения. + + + + Правило, которому нужно приблизительно следовать, заключается в + том, что нужно спрашивать себя, является ли вносимое в порт изменение + таким, что кто-либо и где-либо от него выиграет (в виде + усовершенствования, исправления или благодаря тому, что новый пакадж + будет реально работать). Если это так, то переменная + PORTREVISION должна быть увеличена, чтобы + автоматизированные инструменты (например, + pkg_version) смогли обнаружить факт появления + нового пакаджа. + + + + <makevar>PORTEPOCH</makevar> + + Время от времени разработчик программного обеспечения или + создатель порта 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, + должен иметь численно большее значение. + + + + Пример использования переменных <makevar>PORTREVISION</makevar> и + <makevar>PORTEPOCH</makevar> + + Выполнен коммит порта 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. + + + + + + Переменные <makevar>PKGNAMEPREFIX</makevar> + и <makevar>PKGNAMESUFFIX</makevar> + + Две необязательные переменные, PKGNAMEPREFIX и + PKGNAMESUFFIX, объединяются со значениями + PORTNAME и + PORTVERSION для формирования + PKGNAME в форме + ${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}. + Добейтесь того, чтобы это соответствовало нашим рекомендациям по правильному выбору названий + для пакаджей. В частности, в переменной + PORTVERSION не разрешается использование дефиса + (-). Кроме того, если в имени пакаджа + присутствует часть language- или + compiled.specifics, то используйте + переменные PKGNAMEPREFIX и + PKGNAMESUFFIX, соответственно. Не делайте их + частью значения переменной PORTNAME. + + + + <makevar>DISTNAME</makevar> + + В переменной 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). + + + + + <makevar>CATEGORIES</makevar> + + В процессе создания пакаджа он помещается в каталог + /usr/ports/packages/All, а в одном или более + подкаталогов из /usr/ports/packages + создаются на него ссылки. Имена этих подкаталогов определяются + переменной CATEGORIES. Такая схема нужна для + облегчения жизни пользователя, когда он сталкивается с массой + пакаджей на ftp-сервере или компакт-диске. Пожалуйста, посмотрите на + список существующих категорий и выберите те из них, + которые более всего подходят к вашему порту. + + Этот список также определяет, куда в дереве портов будет помещен + порт. Если вы укажете здесь более одной категории, то + предполагается, что файлы порта будут помещены в подкаталог с именем + первой категории. Посмотрите раздел о категориях для получения + подробной информации о том, как правильно выбрать категории. + + Если ваш порт действительно относится к чему-то, что абсолютно + не имеет отношения ни к одной из существующих категорий, вы можете + даже создать новую категорию. В этом случае, пожалуйста, пошлите + письмо с вашим предложением на адрес &a.ports;. + + + + <makevar>MASTER_SITES</makevar> + + Содержит часть с каталогом 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 для того, чтобы переопределить + выбранные нами варианты, и использовать вместо них свои любимые + зеркала этих популярных архивов. + + + + <makevar>PATCHFILES</makevar> + + Если вашему порту требуются некоторых дополнительные патчи, + которые доступны по 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. + + + + + <makevar>MAINTAINER</makevar> + + Укажите здесь ваш адрес электронной почты. Пожалуйста. + :-) + + Подробное описание того, за что отвечает лицо, поддерживающее + порт, даётся в главе MAINTAINER в + Makefiles. + + + + Зависимости + + Многие порты зависят от других портов. Имеется пять переменных, + которые вы можете использовать для обеспечения того, что все + требуемое находится на машине пользователя. Имеется также несколько + предопределенных переменных, отражающих зависимости для общих + случаев, плюс еще несколько для управления поведением + зависимостей. + + + <makevar>LIB_DEPENDS</makevar> + + Эта переменная указывает, от каких совместно используемых + библиотек зависит порт. Это список пар + 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 будет + автоматически его устанавливать, если его нет на пользовательской + системе. + + + + <makevar>RUN_DEPENDS</makevar> + + В этой переменной перечисляются выполнимые файлы или файлы, от + которых зависит работа порта. Это список пар вида + 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. + + + + <makevar>BUILD_DEPENDS</makevar> + + В этой переменной перечисляются выполнимые или обычные файлы, + которые требуются порту для его построения. Как и + RUN_DEPENDS, это список пар + path:dir:target + Например, BUILD_DEPENDS= + unzip:${PORTSDIR}/archivers/unzip будет проверять + наличие выполнимого фала с именем unzip и + перейдет в подкаталог archivers/unzip вашего + дерева портов для его построения и установки, если последний не + будет найден. + + + Под “построением” здесь понимается все от + распаковки до компиляции. Зависимость проверяется из цели + extract. Часть + target может быть опущена, если она + совпадает с DEPENDS_TARGET. + + + + + <makevar>FETCH_DEPENDS</makevar> + + В этой переменной перечисляются выполняемые файлы или просто + файлы, которые требуются порту для сгрузки. Как и предыдущие две + переменные, это список пар + path:dir:target + Например, FETCH_DEPENDS= + ncftp2:${PORTSDIR}/net/ncftp2 будет проверять + наличие выполняемого файла с именем ncftp2 и + перейдет в каталог net/ncftp2 вашего дерева + портов для его построения и установки, если тот не будет + найден. + + Зависимость проверяется при выполнении цели + fetch. Часть + target может быть опущена, если она + совпадает с DEPENDS_TARGET. + + + + <makevar>DEPENDS</makevar> + + Если имеется зависимость, которая не подпадает ни под одну из + вышеперечисленных четырех категорий, или ваш порт требует наличия + исходных текстов другого порта в распакованном виде кроме того, + что этот порт должен быть установлен, то воспользуйтесь этой + переменной. Это список пар + 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. + + + + + + + + <makevar>MASTERDIR</makevar> + + Если вашему порту требуется построение довольно различающихся + версий пакаджей через переменную (задающую, например, разрешение, + или размер бумаги), которая принимает различные значения, создайте для + каждого пакаджа отдельный подкаталог, чтобы пользователям было легче + определить, каким пакаджем воспользоваться, но попробуйте использовать + совместно между портами как можно больше файлов. В типичном случае вам + потребуются только очень короткие файлы 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, так чтобы мы могли + легко создавать бинарные файлы, скомпонованные как динамически (для + тех, кто строит приложение из порта), так и статически (для тех, кто + будет распространять приложения в виде пакаджей). + + + <makevar>REQUIRES_MOTIF</makevar> + + Если вашему порту требуется Motif, задайте эту переменную в + файле Makefile. Это не позволит людям, у которых нет собственной + копии Motif, даже попытаться построить порт. + + + + <makevar>MOTIFLIB</makevar> + + Эта переменная будет установлена сценарием + 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 до и после выполнения + каждого шага. + + + + + + Файлы <filename>pkg-<replaceable>*</replaceable></filename> + + Есть несколько приёмов работы с файлами + pkg-*, которые мы ещё не + описали, но они иногда могут быть очень кстати. + + + <filename>pkg-message</filename> + + Если вам нужно вывести сообщение для человека, устанавливающего + приложение, то вы можете поместить сообщение в файл + pkg-message. Эта возможность часто оказывается + полезной для вывода дополнительных шагов установки, которые нужно + предпринять после выполнения команды pkg_add, или + для вывода информации о лицензировании. + + + Файл pkg-message не нужно добавлять в + pkg-plist. И он не будет автоматически + выводиться, если пользователь использует порт, а не пакадж, так что + вы должны будете сами выводить его при выполнении цели + post-install. + + + + + <filename>pkg-install</filename> + + Если при установке бинарного пакаджа по команде + 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 порта. + + + + + <filename>pkg-req</filename> + + Если вашему порту нужно определять, должен ли он устанавливаться + или нет, то вы можете создать скрипт “необходимости” + pkg-req. Он будет вызван автоматически + в момент установки/удаления для определения того, должны ли они + реально выполняться. + + + + Изменение содержимого <filename>pkg-plist</filename> в зависимости + от 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. + + + + Изменение имён файлов + <filename>pkg-<replaceable>*</replaceable></filename> + + Все имена файлов + 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;! + + + + + <anchor id="porting-dads">Что нужно, а что нельзя делать + + Вот список часто встречающихся действий, которые нужно и которые + нельзя делать во время процесса портирования. Вы должны проверять ваш + порт по этому списку, и вы также можете проверять порты в базе + сообщений 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 со всеми соответствующими флагами. + Смотрите пример их использования ниже. + + + + <makevar>WRKDIR</makevar> + + Не пишите ничего в файлы вне каталога WRKDIR. + Каталог WRKDIR является единственным местом, + которое гарантированно будет доступно для записи во время построения + порта (обратитесь к главе о компиляции портов с + компакт-диска за + примером построения портов из дерева, доступного только для чтения). + Если вам нужно изменить какой-либо из файлов + pkg-*, сделайте это, + переопределив переменную, но не + перезаписывая их. + + + + <makevar>WRKDIRPREFIX</makevar> + + Добейтесь того, чтобы ваш порт принимал во внимание значение + переменной 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__. Если + старые порты использовали этот макрос не по назначению, вовсе не + значит, что вам нужно поступать точно также. + + + + Написание чего-либо после + <filename>bsd.port.mk</filename> + + Не пишите ничего после строки + .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. + + + + + <makevar>DIST_SUBDIR</makevar> + + Не позволяйте вашему порту засорять + /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, а не внутри патча. Как только + вы будете удовлетворены получающимся дифф-файлом, разбейте его на + несколько по одному патчу на отдельный файл. + + + + <makevar>PREFIX</makevar> + + Попытайтесь сделать так, чтобы установка вашего порта + осуществлялась относительно каталога 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}. + + + + Использование <makevar>CFLAGS</makevar> + + Порт должен принимать во внимание переменную + 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 + перед тем, как послать ее нам или выполнить коммитт. + + + + Пожелания + + Посылайте подходящие изменения/патчи авторам/сопровождающему + для включения в следующий релиз. Это только сделает вашу работу + гораздо легче при выходе следующего релиза. + + + + <filename>README.html</filename> + + Не включайте сюда файл README.html. Этот файл + не является частью дерева cvs, и он генерируется при помощи команды + make readme. + + + + Разное + + Файлы pkg-comment, + pkg-descr и pkg-plist вы + должны проверять дважды. Если вы просматриваете порт и думаете, + что его можно переформулировать иначе, сделайте это. + + Пожалуйста, не создавайте дополнительных копий лицензии GNU + General Public License в нашей системе. + + Будьте внимательны с юридическими вопросами! Не делайте из на + нелегальных распространителей ПО! + + + + Если вы испытываете затруднения… + + Посмотрите существующие примеры и файл + bsd.port.mk перед тем, как задавать нам вопросы! + ;-) + + Задавайте нам вопросы, если у вас появились проблемы! Не бейтесь + головой об стену! :-) + + + + + Примерный <filename>Makefile</filename> + + Вот примерный 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 "''"))) + ]]> + + + + +