3.4. Вопросы повышенной сложности

3.4.1. Как самому сделать порт

Итак, теперь вас интересует, как создать собственный порт или обновить существующий? Великолепно!

Ниже находятся некоторые указания по созданию нового порта для FreeBSD. Если вы хотите обновить существующий порт, вы должны прочесть их, а затем Section 3.4.14.

Если этот документ недостаточно подробен, вы должны обратиться к файлу /usr/ports/Mk/bsd.port.mk, который включается в make-файл каждого порта. Он хорошо прокомментирован, и даже если вы не занимаетесь хаканьем make-файлов каждодневно, из него вы сможете узнать много нового. Кроме того, конктретные вопросы можно задать в Список рассылки посвященный Портам FreeBSD .

Note: Только часть переменных (VAR), которые могут быть переопределены, описаны в этом документе. Большинство (если не все) описаны в начале файла bsd.port.mk. В этом файле используется нестандарная настройка шага табуляции. Emacs и Vim должны распознать это при загрузке файла. Как vi, так и ex могут быть настроены на использование правильного значения выдачей команды :set tabstop=4 после загрузки файла.

3.4.2. Быстрое портирование

В этом разделе будет описано, как сделать порт на скорую руку. Во многих случаях этого бывает недостаточно, но мы посмотрим.

Во-первых, скачайте оригинальный tar-файл и поместите его в каталог DISTDIR, который по умолчанию есть не что иное, как /usr/ports/distfiles.

Note: Здесь предполагается, что программное обеспечени компилируется без проблем как есть, то есть для работы приложения на вашей системе FreeBSD не потребовалось абсолютно никаких изменений. Если требовалось что-то изменить, то вам придется обратиться также и к следующему разделу.

3.4.2.1. Создание файла Makefile

Минимальный Makefile будет выглядеть примерно так:

    # New ports collection makefile for:   oneko

    # Date created:        5 December 1994

    # Whom: 	       asami

    #

    # $FreeBSD$

    #

    

    PORTNAME=      oneko

    PORTVERSION=   1.1b

    CATEGORIES=    games

    MASTER_SITES=  ftp://ftp.cs.columbia.edu/archives/X11R5/contrib/

    

    MAINTAINER=    asami@FreeBSD.org

    

    MAN1=	       oneko.1

    MANCOMPRESSED= yes

    USE_IMAKE=     yes

    

    .include <bsd.port.mk>

          

Посмотрим, сможете ли вы его понять. Не обращайте внимание на содержимое строчки $FreeBSD$, она будет заполнена автоматически системой CVS, когда порт будет импортирован в наше дерево портов. Вы можете найти более подробный пример в разделе пример Makefile.

3.4.2.2. Создание информационных файлов

Имеется три информационных файла, которые требуются для любого порта, вне зависимости от того, является ли он пакаджем или нет. Это COMMENT, DESCR, и PLIST, а располагаются они в подкаталоге pkg.

3.4.2.2.1. COMMENT

Это однострочное описание порта. Пожалуйста, не включайте сюда название пакаджа (или номер версии программного обеспечения). Комментарий должен начинаться с заглавной буквы и не заканчиваться точкой. Вот пример:

    A cat chasing a mouse all over the screen

    	

3.4.2.2.2. DESCR

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

Note: Это не руководство и не подробнейшее описание того, как использовать или компилировать порт! Пожалуйста, будьте внимательны при копировании текста из 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

    	

3.4.2.2.3. PLIST

Здесь перечисляются все файлы, устанавливаемые портом. Его также называют ``списком для упаковки'', патому что пакадж генерируется упаковкой файлов, которые здесь указаны. Имена путей указываются относительно установочного префикса (обычно /usr/local или /usr/X11R6). Если вы используете переменные MANn (а вы должны это делать), то указывать страницы справочника здесь не нужно.

Вот маленький пример:

    bin/oneko

    lib/X11/app-defaults/Oneko

    lib/X11/oneko/cat1.xpm

    lib/X11/oneko/cat2.xpm

    lib/X11/oneko/mouse.xpm

    @dirrm lib/X11/oneko

    	

Обратитесь к странице Справочника по команде pkg_create(1) с подробным описанием формата списка упаковки.

Note: В списке вы должны указать все файлы, но не каталоги. Кроме того, если порт создает каталоги сам на этапе установки, нужно добавить директивы @dirrm в подходящие места для удаления их при удалении порта.

Рекомендуется, чтобы имена файлов в этом списке были отсортированы в алфавитном порядке. Это позволит значительно облегчить сверку изменений при обновлении порта.

Создание списка упаковки вручную может оказаться весьма трудоемкой задачей. Если порт устанавливает большое количество файлов, раздел об автоматическом построении списка упаковки может помочь сэкономить время.

3.4.2.3. Создание файла с контрольной суммой

Просто введите команду make makesum. Правила утилиты make автоматически сгенерируют файл files/md5.

3.4.2.4. Тестирование порта

Вы должны удостовериться, что правила построения порта выполняют именно то, что вы хотите, включая создание пакаджа для порта. Вот те важные вещи, которые вы должны проверить.

  • PLIST не содержит ничего сверх того, что устанавливается вашим портом

  • PLIST содержит абсолютно все, что устанавливается вашим портом

  • Ваш порт может быть переустановлен множество раз с помощью указания цели reinstall

  • Ваш порт подчищает за собой после своего удаления

Рекомендуемый порядок проверки

  1. make install

  2. make package

  3. make deinstall

  4. pkg_add package-name

  5. make deinstall

  6. make reinstall

  7. make package

Проверьте, что ни на шаге package, ни на шаге deinstall не выдается никаких предупреждений. После выполнения шага 3 проверьте, что все новые каталоги были успешно удалены. Также попробуйте запустить программное обеспечение после выполнения шага 4, чтобы убедиться, что оно работает правильно при установке из пакаджа.

3.4.2.5. Проверка вашего порта утилитой portlint

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

3.4.2.6. Посылка порта

Первым делом удостоверьтесь, что вы прочитали раздел о том, что можно и нельзя делать.

Теперь, когда вы счастливы от своего первого порта, единственное, что осталось сделать, это включить его в основное дерево портов FreeBSD и осчастливить этим всех остальных. Нам не нужен ни ваш каталог work, ни пакадж pkgname.tgz, так что удалите их прямо сейчас. Затем просто включите вывод команды shar `find port_dir` в сообщение об ошибке и пошлите его с помощью программы send-pr(1) (обратитесь к разделу Сообщения об ошибках и общие замечания для получения подробной инфомации о программе send-pr(1). Если неупакованный порт превышает 20 КБ, то сожмите его в tar-файл и воспользуйтесь утилитой uuencode(1) перед тем, как ключить его в сообщение (можно посылать такие файлы, даже если сообщение не превышают 20КБ, но это не рекомендуется). Не забудьте указать в сообщении категорию ports и класс change-request. Не указывайте, что сообщение имеет статус confidential!)

Повторим еще раз, что не нужно включать ни оригинальный файл с дистрибутивом, ни каталог work, ни пакадж, построенный вами командой make package.

Note: В прошлом мы просили вас закачивать новые порты на ftp-сервер (ftp.FreeBSD.org). Больше этого делать не нужно, так как на каталог incoming/ нет доступа в режиме чтения, из-за большого количества пиратского программного обеспечения, оказавшегося в нем.

Мы посмотрим на ваш порт, вернет его обратно, если это будет нужно, и включим его в дерево. Ваше имя также появится в списке ``Людей, внесших свой вклад'' в Руководстве и других файлах. Это ли не круто?!? :-)

3.4.3. Медленное портирование

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

3.4.3.1. Как всё это работает

Во-первых, когда пользователь дает в своем каталоге с портом команду make, происходит целая череда событий, и во время чтения этого текста может оказаться полезным иметь файл bsd.port.mk открытым в другом окне, что сильно поможет в их понимании.

Но не волнуйтесь сильно, если вы не до конца понимаете, что делается в bsd.port.mk, не так уж много людей его понимает... :->

  1. Запускается цель fetch. Цель fetch отвечает за то, что архив исходных текстов имеется в наличии локально в каталоге DISTDIR. Если цель fetch не может найти требуемые файлы в каталоге DISTDIR, то он будет искаться по указателю URL MASTER_SITES, который устанавливается в Makefile, а также на нашем основном ftp-сервере по адресу ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/, куда мы по возможности помещаем дистрибутивные файлы для архива. Затем она попытается сгрузить указанный файл с помощью FETCH, полагая, что запрашивающая машина имеет прямое подключение к Интернет. Если файл скачается удачно, то он будет помещен в каталог DISTDIR для последующего использования и обработки.

  2. Выполняется цель extract. Она ищет дистрибутивный файл порта (как правило, tar-архив gzip) в каталоге DISTDIR и распаковывает его во временный каталог, задаваемый переменной WRKDIR (по умолчанию work).

  3. Выполняется цель patch. Во-первых, применяются все патчи, заданные переменной PATCHFILES. Во-вторых, если какие-либо патчи имеются в каталоге PATCHDIR (по умлолнанию это подкаталог patches), они применяются в этот момент в алфавитном порядке.

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

    1. Если существует скрипт scripts/configure, то он запускается.

    2. Если задана переменная HAS_CONFIGURE или GNU_CONFIGURE, то запускается скрипт WRKSRC/configure.

    3. Если задана переменная USE_IMAKE, то запускается команда XMKMF (по умолчанию это xmkmf -a).

  5. Выполняется цель 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.

Note: ``Основные'' цели (к примеру, extract, configure, итд.) не делают ничего больше, чем проверяют успешность завершения всех предыдущих шагов и вызывают настоящие цели или скрипты, и их не нужно менять. Если вам нужно изменить распаковку, исправляйте do-extract, но никогда не трогайте extract!

Теперь вы представляете, что происходит, когда пользователь набирает команду make, теперь давайте пройдемся через рекомендуемые для создания настоящего порта шаги.

3.4.3.2. Получение исходного кода

Получите оригинальные исходные тексты (обычно) в виде упакованного tar-архива (foo.tar.gz или foo.tar.Z) и скопируйте его в каталог DISTDIR. Всегда используйте исходные тексты основной ветки разработки везде, где это возможно.

Если вы не можете найти ftp/http сайт с хорошим подключением к сети, или находите только сайты, которые имеют раздражающе нестандартные форматы, то можете захотеть поместить копию на надежный сервер ftp или http, который вам доступен (например, ваша домашняя страница). Проверьте, что вы установили переменную MASTER_SITES в значение, которое соответствует вашему решению.

Если вы не можете найти доступного и надежного места для помещения дистрибутивного файла (если вы являетесь коммиттером. можете просто поместить его в ваш каталог public_html/ на машине freefall), мы можем ``держать'' его, поместив в ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/LOCAL_PORTS/ на крайний случай. Пожалуйста, отразите это местоположение как MASTER_SITE_LOCAL. Пошлите письмо в адрес Список рассылки посвященный Портам FreeBSD , если вы не уверены, как следует поступить.

Если дистрибутивные файлы вашего порта постоянно меняются по непонятным причинам, остается поместить дистрибутив на вашу домашнюю веб-страницу и указать ее первой в списке MASTER_SITES. Это позволит избежать получения ошибок ``checksum mismatch'' у пользователей, а также уменьшит нагрузку на людей, сопровождающих наш ftp-сервер. Также, если у порта имеется только один основной сервер, то рекомендуется поместить архивную копию на свой сайт и указать его в списке MASTER_SITES вторым.

Если вашему порту требуются дополнительные `патчи', доступные в Интернет, скачайте также и их, поместив в каталог DISTDIR. Не волнуйтесь, если они находятся не на том же сайте, откуда взят дистрибутивный архив, мы умеем обрабатытвать такие ситуации (смотрите описание PATCHFILES ниже).

3.4.3.3. Модификация порта

Распакуйте копию дистрибутивного файла в отдельный каталог и внесите изменения, которые необходимы для того, чтобы порт компилировался нормально в текущей версии FreeBSD. Тщательно отслеживайте все, что вы делаете, этот процесс вам предстоит автоматизировать. Все, включая удаление, добавление или модификацию в файлах должны будут выполняться автоматически с помощью скриптов или файлов патчей, когда вы завершите работу над портом.

Если вашему порту во время компиляции, установки и настройки требуется довольно много взаимодействовать с пользователем, то посмотрите на один из классических скриптов Configure Лэрри Уолла (Larry Wall) и сделайте сами что-либо подобное. Предназначение новой коллекции портов - это сделать каждое приложение в стиле ``plug-and-play'' настолько, насколько это вообще возможно для конечного пользователя при минимальном использовании дискового пространства.

Note: Если явно не указано обратное, то патчи, скрипты и другие файлы, которые вы создали и предоставили для Коллекции Портов FreeBSD, неявно подпадают под стандартные условия лицензии BSD.

3.4.3.4. Создание патчей

Файлы, которые добавлялись или изменялись в процессе создания порта, могут быть выявлены вызовом программы diff с рекурсией, а результат работы этой программы может быть в дальнейшем передан программе patch. Каждый набор патчей, который вы собираетесь применить, должен быть собран в файл с именем patch-xx, где xx означает порядок, в которой будут применяться патчи -- это делается в алфавитном порядке, то есть сначала aa, затем ab и так далее. Эти файлы должны находиться в каталоге PATCHDIR, откуда они будут взяты автоматически. Все патчи должны быть сделаны относительно каталога WRKSRC (как правило, это каталог, в который распаковывается исходный архив и где будет выполняться построение). Для упрощения внесения изменений и обновлений вы должны избегать наличия более чем одного патча для одного и того же файла (например, патчей patch-aa и patch-ab, оба меняющих файл WRKSRC/foobar.c).

3.4.3.5. Конфигурирование

Поместите все дополнительные команды, требуемые для настройки, в ваш скрипт configure и сохраните его в подкаталоге scripts. Как отмечено выше, вы можете сделать это целями в файле Makefile и/или скриптами с именами pre-configure или post-configure.

3.4.3.6. Обработка пользовательского ввода

Если для построения, конфигурации или установки вашего порта требуется некоторый ввод со стороны пользователя, то задайте переменную IS_INTERACTIVE в вашем файле Makefile. В случае ``ночного построения'' это позволит пропустить ваш порт, если пользователь в своем окружении задал переменную BATCH (и если пользователь установил переменную INTERACTIVE, то будут строиться только порты, которые требуют взаимодействия с пользователем.

При наличии разумных ответов на задаваемые вопросы, подходящих по умолчанию, также рекомендуется проверять переменную PACKAGE_BUILDING и выключать интерактивный скрипт, если он есть. Это позволит нам строить пакаджи для помещения на компакт-диски и ftp-серверы.

3.4.4. Настройка файла Makefile

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

Итак, расположим решаемые задачи в порядке их возникновения при создании вашего нового файла Makefile:

3.4.4.1. Оригинальные исходный код

Находится ли он в каталоге 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 для переопределения действий по умолчанию, хотя к этому нужно будет прибегать в очень редких случаях, если вообще придётся.

3.4.4.2. PORTNAME и PORTVERSION

В переменной PORTNAME вы должны указать основную часть имени вашего порта, а в переменной PORTVERSION - номер версии.

3.4.4.3. Переменные PKGNAMEPREFIX и PKGNAMESUFFIX

Две необязательные переменные, PKGNAMEPREFIX и PKGNAMESUFFIX, объядиняются со значениями PORTNAME и PORTVERSION для формирования PKGNAME в форме ${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}. Добейтесь того, чтобы это соответствовало нашим рекомендациям по правильному выбору названий для пакаджей. В частности, в переменной PORTVERSION не разрешается использование дефиса (-). Кроме того, если в имени пакаджа присутствует часть language- или compiled.specifics, то используйте переменные PKGNAMEPREFIX и PKGNAMESUFFIX, соответственно. Не делайте их частью значения переменной PORTNAME.

3.4.4.4. DISTNAME

В переменной DISTNAME указывается имя порта так, как назвали его создатели программного обеспечения. Значение DISTNAME по умолчанию совпадает с ${PORTNAME}-${PORTVERSION}, так что переопределите её значение в случае необходимости. DISTNAME используется только в двух местах. Во-первых, список дистрибутивных файлов (DISTFILES) по умолчанию состоит из ${DISTNAME}${EXTRACT_SUFX}. И во-вторых, предполагается, что дистрибутивный файл будет распакован в подкаталог с именем WRKSRC, значение которого по умолчанию есть не что иное, как work/${DISTNAME}.

Заметьте, что значения переменных PKGNAMEPREFIX и PKGNAMESUFFIX не влияют на значение DISTNAME.

3.4.4.5. CATEGORIES

В процессе создания пакаджа он помещается в каталог /usr/ports/packages/All, а в одном или более подкаталогов из /usr/ports/packages создаются на него ссылки. Имена этих подкаталогов определяются переменной CATEGORIES. Такая схема нужна для облегчения жизни пользователя, когда он сталкивается с массой пакаджей на ftp-сервере или компакт-диске. Пожалуйста, посмотрите на список существующих категорий и выберите те из них, которые более всего подходят к вашему порту.

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

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

Note: Для имен категорий проверка ошибок не вполняется. Команда make package будет просто счастлива создать новый каталог если вы ошибетесь в имени категории, так что будьте внимательны!

3.4.4.6. MASTER_SITES

Содержит часть с каталогом ftp/http-URL, которая указывает на оригинальный архив на сервере MASTER_SITES. Не забудьте лидирующий слэш (/)!

Макрос команды make будет пытаться воспользоваться этой переменной для получения дистрибутивного файла с помощью программы FETCH, если он не будет найден в системе.

Рекомендуется помещать в список много сайтов, предпочтительно с разных континентов. Это поможет при наличии проблем с мировой сетью, и мы даже планируем добавить поддержку автоматического определения ближайшего сайта и сгрузки файлов оттуда!

Если оригинальный архив находится на одном из следующих популярных серверов: X-contrib, GNU, Perl CPAN, TeX CTAN, или Linux Sunsite, указывайте эти сайты в простой форме при помощи MASTER_SITE_XCONTRIB, MASTER_SITE_GNU, MASTER_SITE_PERL_CPAN, MASTER_SITE_TEX_CTAN, и MASTER_SITE_SUNSITE. В переменной MASTER_SITE_SUBDIR просто задайте путь к архиву. Вот пример:

    MASTER_SITES=	      ${MASTER_SITE_XCONTRIB}

    MASTER_SITE_SUBDIR=   applications

          

Пользователь может также задать значения переменных MASTER_SITE_* в файле /etc/make.conf для того, чтобы переопределить выбранные нами варианты, и использовать вместо них свои любимые зеркала этих популярных архивов.

3.4.4.7. PATCHFILES

Если вашему порту требуются некоторых дополнительные патчи, которые доступны по ftp или http, задайте имена этих файлов в переменной PATCHFILES, а в переменной PATCH_SITES укажите URL того каталога, в котором они содержатся (формат такой же, как для MASTER_SITES).

Если патч не относится к самому верху дерева исходных текстов (то есть WRKSRC), потому что он содержит некоторые дополнительные пути, установите соответственно значение переменной PATCH_DIST_STRIP. В частности, если все имена путей в патче имеют дополнительный путь foozolix-1.0/ перед именем файла, то задайте PATCH_DIST_STRIP=-p1.

Не волнуйтесь, если патчи упакованы, они будут распакованы автоматически, если имена файлов оканчиваются на .gz или .Z.

Если патч распространяется вместе с какими-то другими файлами, такими, как документация, в виде tar-архива gzip, вы не можете просто использовать PATCHFILES. Если это ваш случай, добавьте имя и местоположение архива с патчем к DISTFILES и MASTER_SITES. Затем из цели pre-patch примените патч либо через запуск оттуда команды patch, либо скопировав файл с патчем в каталог PATCHDIR и назвав его patch-xx.

Note: Отметьте, что архив будет распакован вне исходного кода, как обычно, и к тому же его не нужно явно распаковывать, если это обычный архив gzip или compress. Если вы сделаете последнее, приложите дополнительные усилия для того, чтобы не перезаписать что-либо, уже существующее в этом каталоге. Также не забудьте добавить команду для удаления скопированного патча в цели pre-clean.

3.4.4.8. MAINTAINER

Укажите здесь ваш адрес электронной почты. Пожалуйста. :-)

Подробное описание того, за что отвечает лицо, поддерживающее порт, дается в главе MAINTAINER on Makefiles.

3.4.4.9. Зависимости

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

3.4.4.9.1. LIB_DEPENDS

Эта переменная указывает, от каких совмествно используемых библиотек зависит порт. Это список пар lib:dir[:target] где lib - это имя библиотеки, dir - это каталог, в котором можно ее найти в случае, если ее нет на машине, и target - это цель, которую нужно вызвать в этом каталоге. Например,

     LIB_DEPENDS=

    	  jpeg.9:${PORTSDIR}/graphics/jpeg:install
проверит наличие библиотеки jpeg со старшим номером версии 9 и перейдет в подкаталог graphics/jpeg вашего дерева портов для ее построения и установки, если библиотека отсутствует. Часть target может быть опущена, если она равна DEPENDS_TARGET (по умолчанию install).

Note: Часть lib - это аргумент, который передается команде ldconfig -r | grep -wF. В этой переменной не должно быть регулярных выражений.

Зависимость проверяется дважды, один раз внутри цели extract, а затем из цели install. Кроме того, имя зависимости помещается в пакадж, так что pkg_add будет автоматически его устанавливать, если его нет на пользовательской системе.

3.4.4.9.2. RUN_DEPENDS

В этой переменной перечисляются выполнимые файлы или файлы, от которых зависит работа порта. Это список пар вида path:dir[:target] где path - это имя программы или файла, а dir - каталог, в котором можно найти порт в случае, если его нет в системе, и target - это цель, которую нужно вызвать в этом каталоге. Если path начинается со слэша (/), он воспринимается как файл и его существование проверяется командой test -e; в противном случае предполагается, что это выполнимый файл и для определения того, имеется ли программа в пути поиска пользователя, используется команда which -s.

Например,

    RUN_DEPENDS=   ${PREFIX}/etc/innd:${PORTSDIR}/news/inn \

    	       wish8.0:${PORTSDIR}/x11-toolkits/tk80

    	

проверит, существует ли файл или каталог /usr/local/etc/innd и построит и установит его из подкаталога news/inn дерева портов, если он не будет найден. Он также проверит, имеется ли выполнимый файл с именем wish8.0 в вашем пути поиска, перейдет в подкаталог x11-toolkits/tk80 вашего дерева портов для его построения и установки, если он не будет найден.

Note: В приведенном примере innd является выполнимым файлом; если выполнимый файл находится в необычном для пользовательского маршрута поиска файлов месте, вы должны указать полный путь к файлу.

Зависимость проверяется внутри цели install. Кроме того, имя зависимости помещается в пакадж, так что программа pkg_add будет автоматически его устанавливать, если он не будет найден в пользовательской системе. Часть target может быть опущена, если она совпадает с DEPENDS_TARGET.

3.4.4.9.3. BUILD_DEPENDS

В этой переменной перечисляются выполнимые или обычные файлы, которые требуются порту для его построения. Как и RUN_DEPENDS, это список пар path:dir[:target] Например,

     BUILD_DEPENDS=

    	  unzip:${PORTSDIR}/archivers/unzip
будет проверять наличие выполнимого фала с именем unzip и перейдет в подкаталог archivers/unzip вашего дерева портов для его построения и установки, если последний не будет найден.

Note: Под ``построением'' здесь понимается все от распаковки до компиляции. Зависимость проверяется из цели extract. Часть target может быть опущена, если она совпадает с DEPENDS_TARGET.

3.4.4.9.4. FETCH_DEPENDS

В этой переменной перечисляются выполняемые файлы или просто файлы, которые требуются порту для сгрузки. Как и предыдущие две переменные, это список пар path:dir[:target] Например,

     FETCH_DEPENDS=

    	  ncftp2:${PORTSDIR}/net/ncftp2
будет проверять наличие выполняемого файла с именем ncftp2 и перейдет в каталог net/ncftp2 вашего дерева портов для его построения и установки, если тот не будет найден.

Зависимость проверяется при выполнении цели fetch. Часть target может быть опушена, если она совпадает с DEPENDS_TARGET.

3.4.4.9.5. DEPENDS

Если имеется зависимость, которая не подпадает ни под одну из вышеперечисленных четырех категорий, или ваш порт требует наличия исходных текстов другого порта в распакованном виде кроме того, что этот порт должен быть установлен, то воспользуйтесь этой переменной. Это список пар dir[:target], потому что, в отличие от предыдущих случаев, ничего не проверяется. Часть target может быть опущена, если она совпадает с DEPENDS_TARGET.

3.4.4.9.6. Переменные зависимостей общего вида

Определите переменную 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 в составе системы, когда как другие - нет.)

3.4.4.9.7. Замечания касательно зависимостей

Как уже отмечено выше, целью, которая вызывается по умолчанию в случае, когда это требует зависимость, является 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--по крайней мере смысл будет более понятен.

3.4.4.10. Механизм построения

Если ваш пакадж использует 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 на этапе конфигурирования. Если использование флага -a является для вашего порта проблематичным, задайте XMKMF=xmkmf. Если порт использует команду imake, но не воспринимает цель install.man, то должна быть задана переменная NO_INSTALL_MANPAGES=yes. Кроме того, автор программы должен быть пристрелен. :->

Если в файле Makefile из дистрибутива вашего порта в качестве главной цели для построения указано нечто, отличное от all, то задайте соответствующим образом переменную ALL_TARGET. То же самое касается целей install и INSTALL_TARGET.

3.4.5. Особые соглашения

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

3.4.5.1. ldconfig

Если ваш порт устанавливает совместно используемую библиотеку, добавьте цель post-install в ваш Makefile, и запускайте там ${LDCONFIG} -m в каталоге, где установлена новая библиотека (обычно PREFIX/lib) для ее регистрации в кэше совместно используемых библиотек.

Добавьте пару соответствующих команд @exec /sbin/ldconfig -m и @unexec /sbin/ldconfig -R в файл pkg/PLIST, чтобы пользователь, устанавливающий пакадж, мог использовать динамическую библиотеку сразу же, а удаление пакаджа не приводило к тому, что система полагала, что библиотека все еще имеется в наличии. Эти строчки должны следовать сразу же за строчкой с совместно используемой библиотекой, как здесь:

    lib/libtvl80.so.1

    @exec /sbin/ldconfig -m %D/lib

    @unexec /sbin/ldconfig -R

          

Никогда не позволяйте себе добавлять строчку, которая говорит ldconfig без аргументов в вашем файле Makefile или pkg/PLIST. Это приведет к сбросу кэша библиотек к содержимому только /usr/lib, и возникновению кошмарных проблем с машиной пользователя ("Помогите, после установки этого порта xinit больше не запускается!"). Всякий, кто посмеет это сделать, будет пристрелен на месте и острым ножичком разрезан на 65,536 кусочков, его печень будет отдана на съедение воронам, а сам он будет приговорен к бесконечной смерти в глубочайших безднах ада (не обязательно в указанной последовательности...)

3.4.6. MASTERDIR

Если вашему порту требуется построение довольно различающихся версий пакаджей через переменную (задающую, например, разрешение, или размер бумаги), которая принимает различные значения, создайте для каждого пакаджа отдельный подкаталог, чтобы пользователям было легче определить, каким пакаджем воспользоваться, но попробуйте использовать совместно между портами как можно больше файлов. В типичном случае вам потребуются только очень короткие файлы Makefile во всех каталогах, кроме одного, если вы будете использовать переменные с умом. В отдельных файлах Makefiles вы можете использовать переменную MASTERDIR для указания каталога, в котором находятся все остальные файлы. Также используйте переменную как часть PKGNAMESUFFIX, чтобы пакаджи имели разные имена.

Продемонстрируем это на примере. Вот часть файла japanese/xdvi300/Makefile:

    PORTNAME=       xdvi

    PORTVERSION=    17

    PKGNAMEPREFIX=  ja-

    PKGNAMESUFFIX=  ${RESOLUTION}

     :

    # default

    RESOLUTION?=   300

    .if ${RESOLUTION} != 118 && ${RESOLUTION} != 240 && \

           ${RESOLUTION} != 300 && ${RESOLUTION} != 400

           @${ECHO} "Error: invalid value for RESOLUTION: \"${RESOLUTION}\""

           @${ECHO} "Possible values are: 118, 240, 300 (default) and 400."

           @${FALSE}

    .endif

        

Каталог japanese/xdvi300 содержит также все обычные патчи, файлы для пакаджа и так далее. Если вы введете здесь команду make, она возьмет в качестве разрешения значение по умолчанию (300) и построит порт обычным образом.

Для другого разрешения приведем полный xdvi118/Makefile:

    RESOLUTION=	118

    MASTERDIR=	${.CURDIR}/../xdvi300

    

    .include ${MASTERDIR}/Makefile

        

(xdvi240/Makefile и xdvi400/Makefile похожи). Задание MASTERDIR говорит bsd.port.mk, что обычный набор подкаталогов типа PATCHDIR и PKGDIR находится в каталоге xdvi300. Строчка RESOLUTION=118 переопределят строку RESOLUTION=300 в файле xdvi300/Makefile и порт будет построен с разрешением 118.

3.4.7. Версии динамических библиотек

Первым делом прочтите, пожалуйста, наши правила нумерации версий динамических библиотек для понимания того, что делать с версиями совместно используемых библиотек вообще. Не полагайтесь слепо на то, что авторы программного обеспечения знают, что творят; многие это не понимают. Очень важно с точностью следовать всем этим правилам, так как мы получаем достаточно уникальную ситуацию, когда пытаемся иметь несколько наборов потенциально несовместимых программных пакетов. Невнимательное включение портов вызывало большие проблемы относительно совместно используемых библиотек в прошлом (вы когда либо задумывались, почему порт jpeg-6b имеет библиотеку версии 9?). Если не уверены, пошлите сообщение по адресу Список рассылки посвященный Портам FreeBSD . В большинстве случаев ваша работа закончивается опеределением правильного номера динамической библиотеки и созданием соответствующих патчей для реализации этого.

3.4.8. Страницы Справочника

Переменные MAN[1-9LN] автоматически добавят любые страницы Справочника к файлу pkg/PLIST (это означает, что вам не нужно указывать страницы Справочника в файле PLIST--обратитесь к главе о генерации файла PLIST для получения более подробной информации). Это также позволяет на этапе установки автоматически упаковывать и распаковывать страницы Справочника в зависимости от значения переменной NOMANCOMPRESS в файле /etc/make.conf.

Если ваш порт пытается задать несколько имен для страниц Справочника при помощи символических или жестких ссылок, то вы должны использовать переменную MLINKS, чтобы указать на это. Ссылка, установленная вашим портом, будет уничтожена и создана заново сценарием bsd.port.mk для проверки того, что она указывает на правильный файл. Любые страницы Справочника, перечисленные в переменной MLINKS, не должны фигурировать в файле 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).

3.4.9. Порты, которым требуется Motif

Существует много приложений, которым для компиляции требуется библиотека Motif (которую можно приобрести у нескольких поставщиков, хотя есть и бесплатный клон в x11-toolkits/lesstif, о котором говорится, что с ним работает множество приложений). Так как это распространенный пакет и его лицензионное соглашение обычно позволяет распространение статически скомпонованных бинарных файлов, мы обратили особое внимание на работу с портами, которым требуется Motif, так чтобы мы могли легко создавать бинарные файлы, скомпонованные как динамически (для тех, кто строит приложение из порта), так и статически (для тех, кто будет распространять приложения в виде пакаджей).

3.4.9.1. REQUIRES_MOTIF

Если вашему порту требуется Motif, задайте эту переменную в файле Makefile. Это не позволит людям, у которых нет собственной копии Motif, даже попытаться построить порт.

3.4.9.2. MOTIFLIB

Эта переменная будет установлена сценарием bsd.port.mk в соответствующее значение, соответствующее библиотеке Motif. Пожалуйста, измените исходные тексты для использования этой переменной там, где упоминается библиотека Motif, в Makefile или Imakefile.

Могут быть два случая:

  • Ели порт обращается к библиотеке Motif как -lXm в своих файлах Makefile или Imakefile, просто подставьте вместо этих обращений ${MOTIFLIB}.

  • Если порт использует XmClientLibs в своем файле Imakefile, измените это обращение на ${MOTIFLIB} ${XTOOLLIB} ${XLIB}.

Заметьте, что переменная MOTIFLIB (как правило) раскрывается в -L/usr/X11R6/lib -lXm или /usr/X11R6/lib/libXm.a, так что нет нужды впереди добавлять -L или -l.

3.4.10. Шрифты для X11

Если ваш порт устанавливает шрифты для системы X Window, поместите их в каталог X11BASE/lib/X11/fonts/local. Этот каталог впервые появился в XFree86 release 3.3.3. Если он не существует, то, будьте добры, создайте его и выведите сообщение, обращающее внимание пользователя на необходимость обновить XFree86 до версии 3.3.3 или более новой, или по крайней мере добавить этот каталог к маршруту поиска шрифтов в файле /etc/XF86Config.

3.4.11. Файлы в формате info

Новая версия texinfo (включенная в 2.2.2-RELEASE и выше), содержит утилиту с именем install-info для установки и удаления компонент в файле dir. Если ваш порт устанавливает какие-либо документы в формате info, то, пожалуйста, следуйте этим инструкциям, чтобы ваш порт/пакадж корректно обновлял пользовательский файл PREFIX/info/dir. (Приносим извинения за размер этого раздела, но это необходимо для объединения всех файлов info вместе. Если это делается правильно, то будет создан прекрасный список, так что прислушайтесь к моим советам!

Во-первых, вот что вы (как создатель порта) должны знать

    % 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. :

        

Note: Эта программа на будет на самом деле устанавливать info-файлы; она просто добавляет или удаляет элементы списка в файле dir.

Далее приводится процедура, состоящая из семи шагов, для преобразования портов к использованию install-info. В качестве примера я буду использовать editors/emacs.

  1. Посмотрите в исходные тексты документов в формате 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й позиции табуляции).

    Note: Заметьте, что вы можете указать только одну компоненту info для файла из-за ошибки в работе утилиты install-info --delete, которая удаляет только первую компоненту, даже если вы укажете несколько компонент в разделе .

    Вы можете передать компоненты dir утилите install-info в качестве аргументов (--section и --entry), вместо того, чтобы изменять исходный текст файлов texinfo, Я не думаю, что это подходит для портов, потому что вам нужно будет продублировать информацию в трех местах (Makefile и @exec/@unexec в файле PLIST; смотрите ниже). Однако, если файлы info имеют японскую (или другую многобайтовую кодировку), вам нужно юудет передать дополнительные аргументы команде install-info, потому что makeinfo не может работать с такими файлами texinfo. (Посмотрите файлы Makefile и PLIST в каталоге japanese/skk на предмет того, как это сделать).

  2. Вернитесь обратно в каталог с портом, выполните команду 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 уже имеется файл с таким же именем (этот патч здесь не показан).

  3. Если в файле 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); \
    
        	
  4. (Этот шаг необходим, если только вы модифицируете уже существующий порт.) Взгляните на файл 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 PLIST
    
        --- PLIST	1997/03/04 08:04:00	1.15
    
        +++ 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
    
        	
  5. Добавьте цель 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>
    
        	
  6. Отредактируйте файл PLIST, добавив аналогичные директивы @exec, не забыв о @unexec для pkg_delete.

        Index: pkg/PLIST
    
        ===================================================================
    
        RCS file: /usr/cvs/ports/editors/emacs/pkg/PLIST,v
    
        retrieving revision 1.15
    
        diff -u -r1.15 PLIST
    
        --- PLIST	1997/03/04 08:04:00	1.15
    
        +++ 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
    
        	

    Note: Команды @unexec install-info --delete указываются до собственно файлов info, чтобы они могли прочесть файлы. Кроме того, команды @exec install-info следуют за файлами info и командой @exec, которая создает файл dir file.

  7. Протестируйте вашу работу и полюбуйтесь ею. :-). Проверяйтеьте файл dir до и после выполнения каждого шага.

3.4.12. Подкаталог pkg/

Есть несколько приемов работы с подкаталогом pkg/, которые мы еще не описали, но они иногда могут быть очень кстати.

3.4.12.1. MESSAGE

Если вам нужно вывести сообщение для человека, устанавливающего приложение, то вы можете поместить сообщение в файл pkg/MESSAGE. Эта возможность часто оказывается полезной для вывода дополнительных шагов установки, которые нужно предпринять после выполнения команды pkg_add, или для вывода информации о лицензировании.

Note: Файл pkg/MESSAGE не нужно добавлять в pkg/PLIST. И он не будет автоматически выводиться, если пользователь использует порт, а не пакадж, так что вы должны будете сами выводить его при выполнении цели post-install.

3.4.12.2. INSTALL

Если при установке бинарного пакаджа по команде pkg_add вашему порту нужно выполнить какие-то дополнительные действия или команды, то вы можете сделать это с помощью скрипта pkg/INSTALL. Этот скрипт будет автоматически добавлен к пакаджу, и будет дважды запускаться по команде pkg_add. Первый раз в виде INSTALL ${PKGNAME} PRE-INSTALL, а второй раз как INSTALL ${PKGNAME} POST-INSTALL. Для распознавания того, в каком режиме запущен скрипт, можно использовать параметр $2. Переменная окружения PKG_PREFIX будет принимать значение, соответствующее каталогу, в который устанавливается пакадж. Дополнительная информация находится на странице Справочника о команде pkg_add(1).

Note: Этот скрипт не запускается автоматически, если вы устанавливаете порт командой make install. Если же вам действительно необходимо его запустить, то запустите его явно из файла Makefile порта.

3.4.12.3. REQ

Если вашему порту нужно определять, должен ли он устанавливаться или нет, то вы можете создать скрипт ``необходимости'' pkg/REQ. Он будет вызван автоматически в момент установки/удаления для определения того, должны ли они реально выполняться.

3.4.12.4. Изменение содержимого PLIST в зависимости от make-переменных

Некоторые порты, в частности, порты p5-, должны менять содержимое своих файлов PLIST в зависимости от того, с какими параметрами они были отконфигурированы (или в зависимости от версии языка perl в случае портов p5-). Чтобы облегчить этот процесс, любые вхождения ключевых слов %%OSREL%%, %%PERL_VER%% и %%PERL_VERSION%% в файле PLIST будут заменяться соответствующими значениями. Значением %%OSREL%% является номер версии операционной системы (например, 2.2.7). %%PERL_VERSION%% обозначает полный номер версия perl (например, 5.00502), а %%PERL_VER%% - номер версии perl без номера патча (например, 5.005).

Если вам нужно сделать другие подстановки, вы можете указать в переменной PLIST_SUB список пар VAR=VALUE, и все вхождения %%VAR%% в файле PLIST будут заменяться на значение VALUE.

Например, если у вас имеется порт, который устанавливает много файлов в каталог, зависящий от версии, вы можете задать нечто типа

    OCTAVE_VERSION= 2.0.13

    PLIST_SUB=	OCTAVE_VERSION=${OCTAVE_VERSION}

    	
в файле Makefile и использовать %%OCTAVE_VERSION%% везде, где нужно указать номер версии в файле PLIST. Таким образом, при обновлении порта вам не нужно будет менять десятки (а в некоторых случаях и сотни) строк в файле PLIST.

Эта подстановка (так же, как и добавление любых страниц Справочника) будет сделана между выполнением целей do-install и post-install, посредством чтения файла PLIST и записью в файл TMPPLIST (по умолчанию это файл WRKDIR/.PLIST.mktmp). Так что если ваш порт строит PLIST на лету, делайте это во время или до выполнения цели do-install. Кроме того, если вашему порту требуется отредактировать получающийся файл, делайте это в цели post-install изменением файла TMPPLIST.

3.4.12.5. Изменение имен файлов в подкаталоге pkg

Все имена фалов в подкаталоге pkg определяются с помощью переменных, так что вы можете изменить их, если это нужно, в вашем файле Makefile. Это особенно полезно, если вы используете один и тот же подкаталог pkg совместно между несколькими портами или пишете в один из вышеперечисленных файлов (в главе о записи в каталоги, отличные от WRKDIR объяснено, почему не рекомендуется осуществлять запись непосредственно в подкаталог pkg).

Вот список имен переменных и их значений по умолчанию.

ПеременнаяЗначение по умолчанию
COMMENT${PKGDIR}/DESCR
DESCR${PKGDIR}/DESCR
PLIST${PKGDIR}/PLIST
PKGINSTALL${PKGDIR}/PKGINSTALL
PKGDEINSTALL${PKGDIR}/PKGDEINSTALL
PKGREQ${PKGDIR}/REQ
PKGMESSAGE${PKGDIR}/MESSAGE

Пожалуйста, изменяйте значения этих переменных, а не переопределяйте PKG_ARGS. Если вы измените значение переменных PKG_ARGS, то эти файлы при установке из порта будут установлены в каталог /var/db/pkg некорректно.

3.4.13. Проблемы с лицензированием

Некоторые программные пакеты имеют ограниченные лицензии или могут являться нарушением закона (патент PKP на шифрование открытым ключом и ITAR (экспорт криптографического программного обеспечения) - это всего лишь два из них). То, что мы можем с этим сделать, сильно зависит от точных формулировок конкретных лицензионных соглашений.

Note: На вас, как на человека, портирующего приложение, ложится обязанность прочесть лицензионные соглашения на программное обеспечение и удостовериться, что проект FreeBSD не будет являться их нарушителем, если будет заниматься распространением исходного кода или в откомпилированном виде по ftp или на компакт-дисках. Если у вас возникли сомнения, то, пожалуйста, обратитесь в адрес Список рассылки посвященный Портам FreeBSD .

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

  1. Если порт имеет лицензию типа ``не продавать для достижения прибыли'', задайте в переменной NO_CDROM строку, описывающую причину этого. Мы не будем помещать такие порты на компакт-диск во время выпуска релиза. Дистрибутивный файл и пакадж будут доступны по ftp.

  2. Если получающийся пакадж должен строиться каждый раз уникальным образом или получающийся бинарный пакадж не может распространяться по лицензионным соображениям, то в переменной NO_PACKAGE укажите строку, описывающую причину этого. Мы не будем помещать такие пакаджи ни на ftp-сервер, ни на компакт-диск во время выпуска релиза. Однако дистрибутивный файл будет помещен на оба носителя.

  3. Если порт имеет юридические ограничения на использованию (например, криптографическое программное обеспечение) или имеет лицензию ``без коммерческого использования'', то в переменной RESTRICTED укажите строку, описывающую причину этого. Для таких портов ни дистрибутивный файл, ни пакаджи не будут доступны даже с наших серверов ftp.

Note: Лицензия GNU General Public License (GPL), как версии 1, так и версии 2, для портов вызвать проблем не должна.

Note: Если вы являетесь коммиттером, обязательно обновите также файл ports/LEGAL.

3.4.14. Обновление

Если вы заметите, что ваш порт устарел по сравнению с последней авторской версией, первым делом проверьте, что у вас находится самая последняя версия порта. Вы можете найти их в каталоге ports/ports-current на зеркальных серверах ftp. Кроме того, вы можете использовать CVSup для поддержки актуальности всей Коллекции портов, как это описано в .

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

Если ведущий попросил сделать обновление вас, или такой персоны не нашлось, то, пожалуйста, выполните обновление и пошлите рекурсивный diff-файл (подойдет как в унифицированном, так и контекстно-зависимом формате, однако коммиттеры предпочитают унифицированный формат) сравнения нового и старого каталогов нам (например, если каталог с модифицированным портом называется superedit, а оригинальный, совпадающий с находящимся в нашем дереве портов, superedit.bak, то пошлите нам результат выполнения команды diff -ruN superedit.bak superedit). Пожалуйчта, проверьте результат работы этой команды, ьак, чтобы все изменения имели смысл. Лучший способ послать нам diff-файл - включить его в посылку по команде send-pr(1) (категория ports). Будьте добры, в сообщении отметьте все добавленные или удаленные файлы, так как они будут непосредственно указаны CVS при выполнении операции коммита. Если diff-файл имеет размер, превышающий 20КБ, сожмите его и обработайте утилитой uuencode; в противном случае просто включите его как есть в PR.

Note: Повторяем еще раз - для посылки обновлений существующих портов используйте утилиту diff(1), а не shar(1)!

3.4.15. Что нужно, а что нельзя делать

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

3.4.15.1. Удаление отладочной информации в бинарных файлах

Удаляйте отладочную информацию из бинарных файлов. Если в исходных текстах файлы уже усекается, это прекрасно; в противном случае вы должны добавить в цель post-install правило для выполнения этой операции самим. Вот пример:

    post-install:

    	strip ${PREFIX}/bin/xdl

          

Для проверки того, удалена ли отладочная информация из установленного выполнимого файла, выполните команду file(1). Если утилита не выдаст строку not stripped, то файл уже обработан.

3.4.15.2. Макросы INSTALL_*

Используйте макросы, которые есть в файле bsd.port.mk для обеспечения правильных прав доступа и владения файлов в своих целях *-install. Вот они:

  • INSTALL_PROGRAM - это команда для установки бинарных выполнимых файлов.

  • INSTALL_SCRIPT - это команда для установки выполнимых скриптов.

  • INSTALL_DATA - это команда для установки совместно используемых файлов данных.

  • INSTALL_MAN - это команда для установки страниц Справочника и другой документации (никаких файлов она не сжимает).

В основе работы этих макросов лежит команда install со всеми соответствующими флагами. Смотрите пример их использования ниже.

3.4.15.3. WRKDIR

Не пишите ничего в файлы вне каталога WRKDIR. Каталог WRKDIR является единственным местом, которое гарантированно будет доступно для записи во время построения порта (обратитесь к главе о компиляции портов с компакт-диска за примером построения портов из дерева, доступного только для чтения). Если вам нужно изменить некоторый файл в каталоге PKGDIR, сделайте это, переопределив переменную, не перезаписывая его.

3.4.15.4. WRKDIRPREFIX

Добейтесь того, чтобы ваш порт принимал во внимание значение переменной WRKDIRPREFIX. Большинство портов об этом не заботятся. В частности, если вы обращаетесь к каталогу WRKDIR другого порта, заметьте, что его правильным местоположением является WRKDIRPREFIXPORTSDIR/subdir/name/work not PORTSDIR/subdir/work или .CURDIR/../../subdir/name/work или что-то подобное.

Кроме того, если вы сами задаете WRKDIR, то должны поставить перед ним знак ${WRKDIRPREFIX}${.CURDIR}.

3.4.15.5. Различение операционных систем и версий ОС

Вы можете встретиться с кодом, который требует модификаций или условной компиляции в зависимости от того, с какой версией 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. Если вы обнаружите систему, в которой это не так, мы хотим знать. Пошлите, пожалуйста, письмо на адрес Список рассылки посвященный Портам FreeBSD .

Другим способом является использование для этого стиля 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-RELEASE119411
    2.1-CURRENT199501, 199503
    2.0.5-RELEASE199504
    2.2-CURRENT до выхода 2.1199508
    2.1.0-RELEASE199511
    2.2-CURRENT до выхода 2.1.5199512
    2.1.5-RELEASE199607
    2.2-CURRENT до выхода 2.1.6199608
    2.1.6-RELEASE199612
    2.1.7-RELEASE199612
    2.2-RELEASE220000
    2.2.1-RELEASE220000 (без изменений)
    2.2-STABLE после выхода 2.2.1-RELEASE220000 (без изменений)
    2.2-STABLE после включения texinfo-3.9221001
    2.2-STABLE после включения top221002
    2.2.2-RELEASE222000
    2.2-STABLE после выхода 2.2.2-RELEASE222001
    2.2.5-RELEASE225000
    2.2-STABLE после выхода 2.2.5-RELEASE225001
    2.2-STABLE после появления ldconfig -R225002
    2.2.6-RELEASE226000
    2.2.7-RELEASE227000
    2.2-STABLE после выхода 2.2.7-RELEASE227001
    2.2-STABLE после изменения в semctl(2)227002
    2.2.8-RELEASE228000
    2.2-STABLE после выхода 2.2.8-RELEASE228001
    3.0-CURRENT до изменения в mount(2)300000
    3.0-CURRENT после изменения в mount(2)300001
    3.0-CURRENT после изменения в semctl(2)300002
    3.0-CURRENT после изменений в аргументах ioctl300003
    3.0-CURRENT после перехода на формат ELF300004
    3.0-RELEASE300005
    3.0-CURRENT после выхода 3.0-RELEASE300006
    3.0-STABLE после разбиения на ветки 3/4300007
    3.1-RELEASE310000
    3.1-STABLE после выхода 3.1-RELEASE310001
    3.1-STABLE после изменения в порядке следования конструкторов/деструкторов в C++310002
    3.2-RELEASE320000
    3.2-STABLE320001
    3.2-STABLE после несовместимых изменений в IPFW и сокетах320002
    3.3-RELEASE330000
    3.3-STABLE330001
    3.3-STABLE после добавления mkstemps() в libc330002
    3.4-RELEASE340000
    3.4-STABLE340001
    4.0-CURRENT после появления ветки 3.4400000
    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 после изменения в регистрации cdevsw400006
    4.0-CURRENT после добавления so_cred в проверки на уровне сокетов400007
    4.0-CURRENT после добавления обработчика системного вызова poll в libc_r400008
    4.0-CURRENT после перехода в ядре с типа dev_t на указатель struct specinfo400009
    4.0-CURRENT после исправления дыры в безопасности jail(2)400010
    4.0-CURRENT после изменения в типе данных sigset_t400011
    4.0-CURRENT после перехода на компилятор GCC 2.95.2400012
    4.0-CURRENT после появления добавляемых обработчиков ioctl режима linux400013
    4.0-CURRENT после заимствования OpenSSL400014
    4.0-CURRENT после изменения в C++ ABI компилятора GCC 2.95.2 по умолчанию с -fvtable-thunks на -fno-vtable-thunks400015
    4.0-CURRENT после заимствования OpenSSH400016
    4.0-RELEASE400017
    4.0-STABLE после появления 4.0-RELEASE400018
    5.0-CURRENT500000
    5.0-CURRENT после добавления дополнительных полей в заголовке ELF и изменения метода пометки принадлежности к определённой системе для выполнимых файлов в формате ELF.500001
    5.0-CURRENT после изменений в метаданных kld.500002

Note: Заметьте, что 2.2-STABLE иногда идентифицирует себя как ``2.2.5-STABLE'' после 2.2.5-RELEASE. Такой принцип использовался год и месяц, но мы решили изменить его на более однозначную систему нумерации старший/младший, начиная с версии 2.2. Это объясняется тем, что параллельная разработка в нескольких ветках делает непрактичным идентификацию релизов просто по их реальным датам выпуска. Если вы сейчас делаете порт, вам не стоит заботиться о старых версиях -CURRENT; они перечислены здесь просто в информационных целях.

Из сотен уже сделанных портов только в одном или двух случаях потребовалось использование __FreeBSD__. Если старые порты использовали этот макрос не по назначению, вовсе не значит, что вам нужно поступать точно также.

3.4.15.6. Написание чего-либо после bsd.port.mk

Не пишите ничего после строки .include <bsd.port.mk>. Этой строки можно избежать, включив в где-то в середину вашего файла Makefile файл bsd.port.pre.mk, и файл bsd.port.post.mk в конец.

Note: Вам нужно включить либо пару файлов 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).

Note: Если вы задаете переменные 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

          

3.4.15.7. Установка дополнительной документации

Если с вашим программным обеспечением поставляется некоторая документация, отличающаяся от стандартных страниц Справочника и файлов 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.

Note: Файл MESSAGE не нужно добавлять в pkg/PLIST).

3.4.15.8. DIST_SUBDIR

Не позволяйте вашему порту засорять /usr/ports/distfiles. Если вашему порту требуется сгрузить много файлов, или он содержит имя файла, могущее вызвать конфликты с другими портами (например, Makefile), то укажите в переменной DIST_SUBDIR имя порта (должны подойти ${PORTNAME} или ${PKGNAMEPREFIX}${PORTNAME}). Это изменит значение переменной DISTDIR со значения по умолчанию /usr/ports/distfiles к значению /usr/ports/distfiles/DIST_SUBDIR, и в результате все, что требуется для порта, будет помещено в этот подкаталог.

Он заглянет также в подкаталог с тем же именем на основном резервном сервере ftp.FreeBSD.org. (Явное задание переменной DISTDIR в вашем файле Makefile этого не сделает, так что, пожалуйста, воспользуйтесь DIST_SUBDIR.)

Note: Это не коснется тех сайтов MASTER_SITES, которые вы указали в вашем файле Makefile.

3.4.15.9. Информация о пакадже

Поместите информацию о пакадже, то есть COMMENT, DESCR, и PLIST, в каталог pkg.

Note: Заметьте, что эти файлы теперь используются не только в сситеме пакаджей, и они обязательны, даже если определена переменная NO_PACKAGE.

3.4.15.10. Строки RCS

Не помещайте строки RCS в патчи. CVS будет изменять их при помещении файлов в дерево портов, и когда мы будем их оттуда извлекать, они будут уже другие, поэтому применение патчей окончится неудачей. Строчки RCS предваряются знаком доллара ($), и обычно начинаются с $Id или $RCS.

3.4.15.11. Рекурсивные файлы diff

Использование параметра рекурсии (-r) с командой diff для генерации патчей - это хорошо, но все же, пожалуйста, смотрите на получающиеся патчи, чтобы убедиться в отсутствии ненужного мусора. В частности, diff между двумя резервными копиями файлов, файлы Makefile, когда как порт использует Imake или GNU-версию программы configure, и так далее, не нужны, и должны быть удалены. Если вы отредактировали файл configure.in и запустили autoconf для перегенерации configure, не нужно включать файлы diff для configure (они частенько вырастают до нескольких тысяч строк!); задайте USE_AUTOCONF=yes и включите дифф-файл для configure.in.

Кроме того, если вы удаляете файл, то это можно сделать и в цели post-extract, а не внутри патча. Как только вы будете удовлетворены получающимся дифф-файлом, разбейте его на несколько по одному патчу на отдельный файл.

3.4.15.12. PREFIX

Попытайтесь сделать так, чтобы установка вашего порта осуществлялась относительно каталога PREFIX. (Значение этой переменной будет установлено в LOCALBASE (по умолчанию /usr/local), если только не заданы переменные USE_X_PREFIX или USE_IMAKE, в случае чего он будет принят равным X11BASE (по умолчанию /usr/X11R6).)

Отсутствие явного указания /usr/local или /usr/X11R6 нигде в исходном коде сделает порт гораздо более гибким и способным удовлетворить потребности других серверов. Для портов, которые используют X, это происходит автоматически; в противном случае зачастую это может быть сделано простой заменой строк /usr/local (или /usr/X11R6 для портов X, не использующих imake) в различных скриптах/файлах Makefile порта на чтение PREFIX, так как эта переменная автоматически передается далее на каждом этапе построения и установки.

Не задавайте переменную USE_X_PREFIX до тех пор, пока она на самом деле не понадобится для порта (то есть он будет скомпонован с библиотеками X или нужно будет обращаться к файлам из X11BASE).

Переменная PREFIX может быть переназначена в вашем файле Makefile или в окружении пользователя. Однако строго не рекомендуется отдельным портам устанавливать эту переменную явно в файле Makefiles.

Кроме того, обратитесь к программам/файлам из других портов с переменными, перечисленными выше, без указания явных маршрутов. Например, если ваш порт требует, чтобы макро PAGER являлся полным путем утилиты less, используйте флаг компилятора:

    -DPAGER=\"${PREFIX}/bin/less\"

    	
или
    -DPAGER=\"${LOCALBASE}/bin/less\"

    	
если это порт X, вместо того, чтобы задавать -DPAGER=\"/usr/local/bin/less\". Этот способ имеет больше шансов на работу, если системный администратор переместил все дерево `/usr/local' куда-то в другое место.

3.4.15.13. Подкаталоги

Попробуйте поместить все файлы порта в правильных подкаталогах каталога PREFIX. Некоторые порты игнорируют все установки и помещают все в подкаталог с именем порта, что неправильно. Также многие порты помещают все, кроме бинарных файлов, файлов заголовков и страниц Справочника, в подкаталог каталога lib, что не очень хорошо соответствует парадигме BSD. Многие файлы должны быть перемещены в одно из следующих местоположений: etc (настроечные/конфигурационные файлы), libexec (выполнимые файлы, запускаемые из других программ), sbin (исполнимые файлы для администраторов/менеджеров системы), info (документация в формате info для просмотрщика info) или share (независимые от архитектуры файлы). Обратитесь к hier(7) для прояснения деталей, правила, покрывающие /usr, достаточно хорошо подходят также и к /usr/local. Исключением являются порты, имеющие дело с ``новостями'' USENET. Они могут использовать каталог PREFIX/news для установки своих файлов.

3.4.15.14. Очистка пустых каталогов

Заставьте ваш порты очищать за собой при удалении. Обычно это достигается добавлением строк @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 не пуст из-за того, что другие порты установили сюда какие-то файлы.

3.4.15.15. Идентификаторы 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

          

Пожалуйста, при посылке нового (или обновлении старого) порта напишите замечание, что резервируете новый UID или GID в этом диапазоне. Это позволит нам держать список зарезервированных идентификаторов в актуальном состоянии.

3.4.15.16. Поступайте разумно

Файл Makefile должен выполнять действия просто и небеспричинно. Если вы можете сделать что-то на несколько строк короче или более читабельно, сделайте это. В качестве примеров можно привести использование конструкций .if утилиты make вместо соответствующей конструкции if командного процессора, ненужность переопределения цели do-extract при возможности переопределения EXTRACT* и использование GNU_CONFIGURE вместо CONFIGURE_ARGS+= --prefix=${PREFIX}.

3.4.15.17. Использование CFLAGS

Порт должен принимать во внимание переменную CFLAGS. Если он этого не делает, то, пожалуйста, добавьте в файл Makefile строчку NO_PACKAGE=ignores cflags.

3.4.15.18. Конфигурационные файлы

Если для работы порта требуются наличие некоторых конфигурационных файлов в каталоге PREFIX/etc, не просто установите их и перечислите в файле pkg/PLIST. Это приведет к тому, что по команде pkg_delete или при новой установке файлы, тщательно отредактированные и настроенные пользователем, будут уничтожены.

Вместо этого установите файлы с примерами с неким расширением (filename.sample подойдет) и выведите сообщение, указывающее на то, чтобы пользователь скопировал и отредактировал файл перед тем, как работать с программным обеспечением.

3.4.15.19. Утилита portlint

Проверяйте вашу работу с помощью утилиты portlint перед тем, как послать ее нам или выполнить коммитт.

3.4.15.20. Пожелания

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

3.4.15.21. Разное

Файлы pkg/DESCR, pkg/COMMENT, и pkg/PLIST вы должны проверять дважды. Если вы просматриваете порт и думаете, что его можно переформулировать иначе, сделайте это.

Пожалуйста, не создавайте дополнительных копий лицензии GNU General Public License в нашей системе.

Будьте внимательны с юридическими вопросами! Не делайте из на нелегальных распространителей ПО!

3.4.15.22. Если вы испытываете затруднения...

Посмотрите существующие примеры и файл bsd.port.mk перед тем, как задавать нам вопросы! ;-)

Задавайте нам вопросы, если у вас появились проблемы! Не бейтесь головой об стену! :-)

3.4.16. Примерный Makefile

Вот примерный Makefile, который можно использовать при создании нового порта. Обязательно удалите все дополнительные комментарии (те, которые в скобках)!

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

    [заголовок...просто чтобы нам было легче идентифицировать порт.]

    # New ports collection makefile for:   xdvi

    [строчка "version required" необходима только тогда, когда переменная

    PORTVERSION недостаточно конкретна для описания порта.]

    # Version required:    pl18 + japanization patches 18.1 and 18.2

    [это дата создания первой версии этого файла Makefile.

    Никогла не изменяйте эту строку при обновлении порта.]

    # Date created: 	       26 May 1995

    [Это человек, который сделал первоначальный порт для FreeBSD, в частности,

    тот, кто создал первую версию этого файла Makefile.  Запомните, что позже

    при обновлении порта эта строка меняться не должна.]

    # Whom: 		       Satoshi Asami <asami@FreeBSD.org>

    #

    # $FreeBSD$

    [ ^^^^^^^^^ Эта строка будет автоматически заменена со строчкой RCS ID

    системой CVS при выполнении операции коммитта в наше хранилище.  При

    обновлении порта не приводите эту строку обратно к виду

    "$FreeBSD$".  CVS сделает все автоматически.]

    #

    

    [секция описания собственно порта и основного сервера - сначала всегда

     PORTNAME и PORTVERSIONA, за ним следует CATEGORIES, а затем

     MASTER_SITES, за которым может идти MASTER_SITE_SUBDIR.

     PKGNAMEPREFIX и PKGNAMESUFFIX, если они нужны, следуют за ними.

     Затем следует DISTNAME, EXTRACT_SUFX и/или DISTFILES, а потом, если это нужно,

     EXTRACT_ONLY.]

    PORTNAME=      xdvi

    PORTVERSION=   18.2.]

    CATEGORIES=    print

    [не забывайте лидирующий слэш ("/")!

     если вы не используете макросы MASTER_SITE_*]

    MASTER_SITES=  ${MASTER_SITE_XCONTRIB}

    MASTER_SITE_SUBDIR= applications

    PKGNAMEPREFIX= ja-

    DISTNAME=      xdvi-pl18

    [задайте это, если исходный код поставляется не в виде

     стандартного файла ".tar.gz"]

    EXTRACT_SUFX=  .tar.Z

    

    [секция патчей -- может быть пустой]

    PATCH_SITES=   ftp://ftp.sra.co.jp/pub/X11/japanese/

    PATCHFILES=    xdvi-18.patch1.gz xdvi-18.patch2.gz

    

    [сопровождающий; *обязательное поле*!  Это человек (предпочтительно с

     привилегиями на операцию коммитта), с которым может связаться пользователь

     для получения ответов на вопросы и посылки сообщений об ошибках - этот

     человек должен быть создателем порта или кем-то, кто может передать

     вопросы создателю порта.  Если вы на самом деле не хотите указывать здесь

     свой адрес, задайте здесь "ports@FreeBSD.org".]

    MAINTAINER=    asami@FreeBSD.org

    

    [зависимости -- могут быть пустыми]

    RUN_DEPENDS=   gs:${PORTSDIR}/print/ghostscript

    LIB_DEPENDS=   Xpm.5:${PORTSDIR}/graphics/xpm

    

    [этот раздел для остальных стандартных переменных из bsd.port.mk, кроме

     тех, что перечислены выше]

    [Если порт задает вопросы во время этапов настройки, построения,

     установки...]

    IS_INTERACTIVE=        yes

    [Если распаковка происходит в каталог, отличных от ${DISTNAME}...]

    WRKSRC= 	       ${WRKDIR}/xdvi-new

    [Если патчи делались не относительно ${WRKSRC}, вам, может быть, не

     придется изменять эту переменную]

    PATCH_DIST_STRIP=      -p1

    [Если порт требует скрипта "configure", генеруемого GNU-версией программы

     autoconf]

    GNU_CONFIGURE= yes

    [Если для построения порту требуется GNU-версия утилиты make, а не

     /usr/bin/make...]

    USE_GMAKE=     yes

    [Если это приложение X и требует запуска "xmkmf -a"...]

    USE_IMAKE=     yes

    [и так далее]

    

    [В правилах ниже используются нестандартные переменные]

    MY_FAVORITE_RESPONSE=  "yeah, right"

    

    [теперь специальные правила, в порядке их вызова]

    pre-fetch:

    	я что-то выкачиваю, точно

    

    post-patch:

    	мне кое-что сделать после применения патча, великолепно

    

    pre-install:

    	и потом еще кое-что перед установкой, ого

    

    [и, наконец, эпилог]

    .include <bsd.port.mk>

        

3.4.17. Автоматическое создание списка упаковки

Первым делом убедитесь, что ваш порт практически полностью завершен, осталось только создать PLIST. Создайте пустой файл PLIST.

    # touch PLIST

        

Затем создайте новый набор каталогов, в которые может быть установлен ваш порт, и установите все зависимости.

    # mtree -U -f /etc/mtree/BSD.local.dist -d -e -p /var/tmp/port-name

    # make depends PREFIX=/var/tmp/port-name

        

Сохраните структуру каталогов в новом файле.

    # (cd /var/tmp/port-name && find * -type d) > OLD-DIRS

        

Если ваш порт принимает во внимание PREFIX (а он должен это делать), то тогда вы можете установить порт и создать список упаковки.

    # make install PREFIX=/var/tmp/port-name

    # (cd /var/tmp/port-name && find * \! -type d) > pkg/PLIST

        

Кроме того, в список упаковки вы должны добавить все вновь созданные каталоги.

    # (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. Все библиотеки, устанавливаемые портом, должны быть перечислены так, как это описано в разделе о ldconfig.

3.4.18. Имена пакаджей

Далее описаны некоторые соглашения, которым вы должны следовать в именовании ваших пакаджей. Они были разработаны для облегчения просмотра каталога, так как пакаджей уже имеется достаточно много и еще больше их появляется, а пользователи отвернутся от нас, если список не понравится их взору!

Имя пакаджа должно иметь вид [language[_region]]-name[[-]compiled.specifics]-version.numbers.

Имя пакаджа определяется как ${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}. Вы должны задавать значения переменных в соответствии с этим форматом.

  1. FreeBSD пытается поддерживать языки, на которых разговаривают ее пользователи. Часть language- должна быть двухсимвольным сокращением от названия языка по стандарту ISO-639, если порт специфичен для конкретного языка. Примерами являются ja для японского, ru для русского, vi для вьетнамского, zh для китайского, ko для корейского и de для немецкого языков.

    Если ваш порт специфичен для конкретного региона внутри области использования языка, добавьте также двухсимвольный код страны. Примерами являются en_US для US English и fr_CH для Swiss French.

    Часть language- должна задаваться в переменной PKGNAMEPREFIX.

  2. Часть name должна быть в верхнем регисте, кроме случаев по настоящему больших программных пакетов (с большим количеством программ в нем). Такие пакеты, как XFree86 (да, на самом деле это порт, проверьте) и ImageMagick подпадают под эту категорию. В противном случае преобразуйте имя (или, по крайней мере, первую букву) в нижний регистр. Если заглавные буквы важны в имени (например, для односимвольных названий типа R или V), то вы можете использовать заглавные буквы по своему усмотрению. Существует традиция именовать модули для Perl 5, добавляя впереди p5- и преобразуя пару двоеточий в дефис; например, модуль Data::Dumper будет именоваться p5-Data-Dumper. Если программное обеспечение содержит в имени числа, дефисы или подчеркивания, то вы можете включить также и их (например, kinput2).

  3. Если порт может быть построен с различными статически заданными значениями по умолчанию (обычно это часть имени каталога в семействе портов), то часть -compiled.specifics должна определять вкомпилированные значения по умолчанию (дефис не обязателен). Примерами являются размеры бумаги и шрифтов.

    Часть compiled.specifics должна задаваться в переменной PKGNAMESUFFIX.

  4. Строка с номером версии должна следовать за дефисом (-) и являться списком разделенных двоеточием чисел и букв в нижнем регистре. В частности, не разрешается иметь еще один дефис внутри строки с обозначением номера версии. Единственным исключением является строчка pl (означающая `уровень патчей'), которая может использоваться только тогда, когда у программного обеспечения нет старшего и младшего номера версии. Если в номер версии программного обеспечения включена строчка типа "alpha", "beta" или "pre", возьмите из неё первую букву и поставьте её непосредственно после точки. Если после таких строк номер версии ещё продолжается, то после буквы должно следовать число без дополнительной разделяющей точки.

    Смысл такого формата заключается в удобстве сортировки портов по номеру версии. В частности, следите за тем, чтобы компоненты номера версии рвзделялись точкой, и если там присутствует дата, то используйте формат yyyy.mm.dd, но не dd.mm.yyyy или не совместимый с проблемой Г2000 yy.mm.dd.

Вот несколько (реальных) примеров того, как преобразовать имя из оригинального, придуманного авторами, к подходящему для имени пакаджа:

Имя дистрибутиваPKGNAMEPREFIXPORTNAMEPKGNAMESUFFIXPORTVERSIONОбоснование
mule-2.2.2 mule 2.2.2Изменений не потребовалось
XFree86-3.3.6 XFree86 3.3.6Изменений не потребовалось
EmiClock-1.0.2(пусто)emiclock(пусто)1.0.2Для отдельных программ имена с заглавными буквами запрещены
rdist-1.3alpha(пусто)rdist(пусто)1.3.aСтрочки типа alpha запрещены
es-0.9-beta1(пусто)es-0.9(пусто)b1Строчки типа beta запрещены
v3.3beta021.src(пусто)tiff(пусто)3.3Что это такое было вообще?
tvtwm(пусто)tvtwm(пусто)pl11Всегда требуется указание номера версии
piewm(пусто)piewm(пусто)1.0Всегда требуется указание номера версии
xvgr-2.10pl1(пусто)xvgr(пусто)2.10.1pl разрешено только при отсутствии старшего/младшего номера версии
gawk-2.15.6ja-gawk(пусто)2.15.6Версия на японском языке
psutils-1.13(пусто)psutils-letter1.13Размер бумаги задается статически во время построения пакаджа
pkfonts(пусто)pkfonts3001.0Пакадж для шрифтов 300dpi

Если в исходном коде абсолютно нет информации о номере версии и не похоже, что автор собирается выпускать другую версию, то в качестве ноера версии задайте просто 1.0 (как в примере с piewm выше). В противном случае спросите автора программы или используйте дату (yyyy.mm.dd) в качестве номера версии.

3.4.19. Категории

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

3.4.19.1. Текущий список категорий

Во-первых, это текущий список категорий. Те, которые отмечены звездочкой (*), являются виртуальными категориями--они не имеют собственного подкаталога в дереве портов.

Note: Для каждой виртуальной категории имеется файл 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, в зависимости от конкретного их предназначения.
ftpКлиенты и серверы FTP. Если ваш порт понимает как FTP, так и HTTP, поместите его в категорию ftp и укажите вторичную категорию www.
gamesИгры.
germanПоддержка немецкого языка.
gnome*Порты проекта GNU Object Model Environment (GNOME) Project.
graphicsГрафические утилиты.
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.
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 относится сюда же.
x11X Window System и иже с ними. Эта категория предназначена только для программного обеспечения, которое поддерживает оконную систему. Не помещайте сюда обычные приложения X. Если ваш порт является приложением для X, задайте USE_XLIB (что подразумевается при использовании USE_IMAKE) и укажите подходящую категорию. Кроме того, многие такие приложения относятся к категориям x11-* (смотрите ниже).
x11-clocksЧасы для X11.
x11-fmМенеджеры файлов для X11.
x11-fontsШрифты для X11 и утилиты для работы с ними.
x11-serversСерверы для X11.
x11-toolkitsПакеты разработчика для X11.
x11-wmОконные менеджеры для X11.

3.4.19.2. Выбор правильной категории

Так как многие категории перекрываются, вам часто необходимо будет выбирать, какая их них должна быть основной для вашего порта. Есть несколько правил, по которым можно решить этот вопрос. Вот список приоритетов, в уменьшающейся степени предпочтения.

  • Сначала всегда идут категории, специфичные для языков. Например, если ваш порт устанавливает японские шрифты для 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, чтобы мы могли обсудить это до того, как включить порт в Коллекцию. Если вы являетесь коммиттером, пошлите замечание на адрес Список рассылки посвященный Портам FreeBSD , чтобы мы могли обсудить это--зачастую новые порты помещаются не в ту категорию только для того, чтобы их оттуда сразу же удалили.

3.4.20. Изменения в этом документе и системе портов

Если вы сопровождаете большое количество портов, то должны отслеживать Список рассылки посвященный Портам FreeBSD . Важные изменения в схеме работы портов будут объявляться здесь. Вы всегда можете найти более подробную информацию о самых последних изменениях в журнале изменений CVS файла bsd.port.mk.

3.4.21. Вот, парни, и все!

Итак, малыш, это был длинный рассказ, не так ли? Спасибо за то, что вы шли с нами до самого конца. Теперь, когда вы знаете, как создавать порты, воспользуйтесь этими знаниями и преобразуйте все, что есть на свете, в порты! Это самый легкий способ принять участие в Проекте FreeBSD! :-)



Banner.Novgorod.Ru