Copyright © 2000, 2001, 2002, 2003, 2004 The FreeBSD Documentation Project
FreeBSD это зарегистрированная торговая марка The FreeBSD Foundation.
UNIX это зарегистрированная торговая марка The Open Group в США и других странах.
Sun, Sun Microsystems, SunOS, Solaris, и Java это торговые марки или зарегистрированные торговые марки Sun Microsystems, Inc. в Соединенных Штатах и других странах.
Apple и QuickTime это торговые марки Apple Computer, Inc., зарегистрированные в США и других странах.
Macromedia и Flash это торговые марки или зарегистрированные торговые марки Macromedia, Inc. в Соединенных Штатах и/или других странах.
Microsoft, Windows, и Windows Media это или зарегистрированные торговые марки или торговые марки Microsoft Corporation в Соединенных Штатах и/или других странах.
PartitionMagic это зарегистрированная торговая марка PowerQuest Corporation в Соединенных Штатах и/или других странах.
Многие из обозначений, используемых производителями и продавцами для обозначения своих продуктов, заявляются как торговые марки. Когда такие обозначения появляются в этой книге, и Проекту FreeBSD известно о торговой марке, к обозначению добавляется знак '™'.
Распространение и использование исходных (SGML DocBook) и ``скомпилированных'' форм (SGML, HTML, PDF, PostScript, RTF и прочих) с модификацией или без оной, разрешены при соблюдении следующих соглашений:
Распространяемые копии исходного кода (SGML DocBook) должны сохранять вышеупомянутые объявления copyright, этот список положений и следующий отказ от ответственности в первых строках этого файла в неизменном виде.
Распространяемые копии скомпилированных форм (преобразованные в другие DTD, конвертированные в PDF, PostScript, RTF и другие форматы) должны повторять вышеупомянутые объявления copyright, этот список положений и следующий отказ от ответственности в документации и/или других материалах, поставляемых с дистрибьюцией.
Важно: ЭТА ДОКУМЕНТАЦИЯ ПОСТАВЛЯЕТСЯ ПРОЕКТОМ ДОКУМЕНТАЦИИ FREEBSD "КАК ЕСТЬ" И ЛЮБЫЕ ЯВНЫЕ ИЛИ НЕЯВНЫЕ ГАРАНТИИ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ НЕЯВНЫМИ ГАРАНТИЯМИ, КОММЕРЧЕСКОЙ ЦЕННОСТИ И ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ ОТРИЦАЮТСЯ. НИ ПРИ КАКИХ УСЛОВИЯХ ПРОЕКТ ДОКУМЕНТИРОВАНИЯ FREEBSD НЕ НЕСЕТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБОЙ ПРЯМОЙ, КОСВЕННЫЙ, СЛУЧАЙНЫЙ, СПЕЦИАЛЬНЫЙ, ОБРАЗЦОВЫЙ ИЛИ ПОСЛЕДУЮЩИЙ УЩЕРБЫ (ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ПОСТАВКОЙ ТОВАРОВ ЗАМЕНЫ ИЛИ УСЛУГ; ПОТЕРЮ ДАННЫХ ИЛИ ИХ НЕПРАВИЛЬНУЮ ПЕРЕДАЧУ ИЛИ ПОТЕРИ; ПРИОСТАНОВЛЕНИЕ БИЗНЕСА), И ТЕМ НЕ МЕНЕЕ ВЫЗВАННЫЕ И В ЛЮБОЙ ТЕОРИИ ОТВЕТСТВЕННОСТИ, НЕЗАВИСИМО ОТ КОНТРАКТНОЙ, СТРОГОЙ ОТВЕТСТВЕННОСТИ, ИЛИ ПРАВОНАРУШЕНИИ (ВКЛЮЧАЯ ХАЛАТНОСТЬ ИЛИ ИНЫМ СПОСОБОМ), ВОЗНИКШЕМ ЛЮБЫМ ПУТЕМ ПРИ ИСПОЛЬЗОВАНИИ ЭТОЙ ДОКУМЕНТАЦИИ, ДАЖЕ ЕСЛИ БЫ БЫЛО СООБЩЕНО О ВОЗМОЖНОСТИ ТАКОГО УЩЕРБА.
Коллекция портов FreeBSD является способом, используемым практически каждым для установки приложений ("портов") на FreeBSD. Как и почти всё остальное во FreeBSD, эта система в основном является добровольно поддерживаемым начинанием. Важно иметь это в виду при чтении данного документа.
Во FreeBSD любой может прислать новый порт либо изъявить желание поддерживать существующий порт, если его никто ещё никто не поддерживает--вам не нужно иметь никаких особых привилегий на внесение изменений, чтобы это делать.
Итак, вы интересуетесь, как создать собственный порт или обновить существующий? Великолепно!
Ниже находятся некоторые указания по созданию нового порта для FreeBSD. Если вы хотите обновить существующий порт, вы должны прочесть их, а затем Гл. 15.
Если этот документ недостаточно подробен, вы должны обратиться к файлу /usr/ports/Mk/bsd.port.mk, который включается в make-файл каждого порта. Он хорошо прокомментирован, и даже если вы не занимаетесь хаканьем make-файлов каждодневно, из него вы сможете узнать много нового. Кроме того, конкретные вопросы можно задать, послав письмо на адрес Список рассылки, посвящённый Портам FreeBSD.
Замечание: Только часть переменных (VAR), которые могут быть переопределены, описаны в этом документе. Большинство (если не все) описаны в начале файла /usr/ports/Mk/bsd.port.mk; остальные, скорее всего, тоже там описаны. Заметьте, что в этом файле используется нестандартная настройка шага табуляции: Emacs и Vim должны распознать это при загрузке файла. Как vi(1), так и ex(1) могут быть настроены на использование правильного значения выдачей команды :set tabstop=4 после загрузки файла.
В этом разделе будет описано, как сделать порт на скорую руку. Во многих случаях этого бывает не достаточно, так что вам нужно будет прочитать документ дальше.
Во-первых, скачайте оригинальный tar-файл и поместите его в каталог DISTDIR, который по умолчанию есть не что иное, как /usr/ports/distfiles.
Замечание: Здесь предполагается, что программное обеспечение компилируется без проблем как есть, то есть для работы приложения на вашей системе FreeBSD не потребовалось абсолютно никаких изменений. Если требовалось что-то изменить, то вам придется обратиться также и к следующему разделу.
Минимальный Makefile будет выглядеть примерно так:
# New ports collection makefile for: oneko # Date created: 5 December 1994 # Whom: asami # # $FreeBSD$ # PORTNAME= oneko PORTVERSION= 1.1b CATEGORIES= games MASTER_SITES= ftp://ftp.cs.columbia.edu/archives/X11R5/contrib/ MAINTAINER= asami@FreeBSD.org MAN1= oneko.1 MANCOMPRESSED= yes USE_IMAKE= yes .include <bsd.port.mk>
Посмотрим, сможете ли вы его понять. Не обращайте внимание на содержимое строчки $FreeBSD$, она будет заполнена автоматически системой CVS, когда порт будет импортирован в наше дерево портов. Вы можете найти более подробный пример в разделе пример Makefile.
Имеется два информационных файла, которые требуются для любого порта, вне зависимости от того, является ли он пакетом или нет. Это pkg-descr и pkg-plist. Префикс pkg- отличает их от других файлов.
Это более подробное краткое описание порта. От одного до нескольких абзацев, кратко описывающих, что представляет собой порт, будет достаточно.
Замечание: Это не руководство и не подробнейшее описание того, как использовать или компилировать порт! Пожалуйста, будьте внимательны при копировании текста из 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
Здесь перечисляются все файлы, устанавливаемые портом. Его также называют ``списком для упаковки'', потому что пакет генерируется упаковкой файлов, которые здесь указаны. Имена путей указываются относительно установочного префикса (обычно /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) с подробным описанием формата списка упаковки.
Замечание: В списке вы должны указать все файлы, но не каталоги. Кроме того, если порт создает каталоги сам на этапе установки, нужно добавить директивы @dirrm в подходящие места для удаления их при удалении порта.
Рекомендуется, чтобы имена файлов в этом списке были отсортированы в алфавитном порядке. Это позволит значительно облегчить сверку изменений при обновлении порта.
Создание списка упаковки вручную может оказаться весьма трудоёмкой задачей. Если порт устанавливает большое количество файлов, раздел об автоматическом построении списка упаковки может помочь сэкономить время.
Существует только одно исключение, когда у порта может отсутствовать pkg-plist. Если порт устанавливает лишь несколько файлов, а возможно, и каталогов, то они могут быть перечислены в переменных PLIST_FILES и PLIST_DIRS, соответственно, внутри файла Makefile порта. К примеру, мы можем обойтись без файла pkg-plist у приведённого выше порта oneko, добавив следующие строки в Makefile:
PLIST_FILES= bin/oneko \
lib/X11/app-defaults/Oneko \
lib/X11/oneko/cat1.xpm \
lib/X11/oneko/cat2.xpm \
lib/X11/oneko/mouse.xpm
PLIST_DIRS= lib/X11/oneko
Конечно, переменная PLIST_DIRS не должна задаваться, если порт не устанавливает никаких каталогов.
Обратной стороной такого способа перечисления файлов и каталогов порта является невозможность использования последовательностей команд, описанных в pkg_create(1). Поэтому он подходит для простых портов, что делает их ещё более простыми. Одновременно с этим положительным моментом является уменьшение количества файлов в коллекции портов. Пожалуйста, подумайте над использованием этой техники, прежде чем создавать pkg-plist.
Далее мы увидим, как можно использовать файлы pkg-plist и PLIST_FILES выполнения более сложных задач.
Просто введите команду make makesum. Правила утилиты make автоматически сгенерируют файл distinfo.
Вы должны удостовериться, что правила построения порта выполняют именно то, что вы хотите, включая создание пакета для порта. Вот те важные вещи, которые вы должны проверить.
pkg-plist не содержит ничего сверх того, что устанавливается вашим портом
pkg-plist содержит абсолютно все, что устанавливается вашим портом
Ваш порт может быть переустановлен множество раз с помощью указания цели reinstall
Ваш порт подчищает за собой после своего удаления
Рекомендуемый порядок проверки
make install
make package
make deinstall
pkg_add package-name
make deinstall
make reinstall
make package
Проверьте, что ни на шаге package, ни на шаге deinstall не выдается никаких предупреждений. После выполнения шага 3 проверьте, что все новые каталоги были успешно удалены. Также попробуйте запустить программное обеспечение после выполнения шага 4, чтобы убедиться, что оно работает правильно при установке из пакета.
Будьте добры, пользуйтесь утилитой portlint для проверки того, что ваш порт соответствует нашим рекомендациям. Программа portlint является частью Коллекции Портов. В частности, вы можете захотеть проверить, правильно ли сформирован файл Makefile и соответствующим ли образом наименован пакет.
Первым делом удостоверьтесь, что вы прочитали раздел о том, что можно и нельзя делать.
Теперь, когда вы счастливы от своего первого порта, единственное, что осталось сделать, это включить его в основное дерево портов FreeBSD и осчастливить этим всех остальных. Нам не нужен ни ваш каталог work, ни пакет pkgname.tgz, так что удалите их прямо сейчас. Затем просто включите вывод команды shar `find port_dir` в сообщение об ошибке и пошлите его с помощью программы send-pr(1) (обратитесь к разделу Сообщения об ошибках и общие замечания для получения подробной информации о программе send-pr(1)). Если размер неупакованного порта превышает 20КБ, то сожмите его в tar-файл и воспользуйтесь утилитой uuencode(1) перед тем, как включить его в сообщение (можно посылать такие файлы, даже если сообщение не превышают 20КБ, но это не рекомендуется). Не забудьте указать в сообщении категорию ports и класс change-request (Не указывайте, что сообщение имеет статус confidential!). Добавьте также краткое описание программы, порт которой вы создали, в раздел ``Description'' отправляемого PR и сам порт в виде архива shar или архива tar, обработанного утилитой uuencode, поместив его в раздел ``Fix''.
Замечание: Вы можете значительно облегчить нашу работу, если в тему сообщения о проблеме поместите хорошее описание. Мы рекомендуем нечто вроде ``New port: <категория>/<название порта> <краткое описание порта>'' для новых портов и ``Update port: <категория>/<имя порта> <краткое описание обновления>'' в случае обновления портов. Если вы следуете этой схеме, то шансы на то, что на ваше PR вскоре кто-то взглянет, гораздо выше.
Повторим ещё раз, что не нужно включать ни оригинальный файл с дистрибутивом, ни каталог work, ни пакет, построенный вами командой make package.
После того как вы послали порт, пожалуйста, потерпите. Иногда включение нового порта может занять до нескольких месяцев, а иногда всего несколько дней. Здесь вы можете найти список портов ожидающих своей очереди для включения во FreeBSD.
Мы рассмотрим ваш порт, при необходимости вернём его обратно, а затем включим порт в наше дерево. Ваше имя также появится в списке Дополнительных контрибуторов проекта FreeBSD и других файлах. Разве это не великолепно?!? :-)
Итак, все оказалось не так уж и просто, и порт потребовал некоторых модификаций для того, чтобы заставить его работать. В этом разделе мы расскажем, шаг за шагом, как его модифицировать, чтобы он работал с нашей системой портов.
Во-первых, когда пользователь дает в своем каталоге с портом команду make, происходит целая череда событий. Во время чтения этого текста может оказаться полезным иметь файл bsd.port.mk открытым в другом окне, что сильно поможет в их понимании.
Но не волнуйтесь сильно, если вы не до конца понимаете, что делается в bsd.port.mk, не так уж много людей его понимает... :->
Запускается цель fetch. Цель fetch отвечает за то, что архив исходных текстов имеется в наличии локально в каталоге DISTDIR. Если цель fetch не может найти требуемые файлы в каталоге DISTDIR, то он будет искаться по указателю URL MASTER_SITES, который устанавливается в Makefile, а также на нашем основном FTP-сервере по адресу ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/, куда мы по возможности помещаем дистрибутивные файлы для архива. Затем она попытается сгрузить указанный файл с помощью FETCH, полагая, что запрашивающая машина имеет прямое подключение к Интернет. Если файл скачается удачно, то он будет помещен в каталог DISTDIR для последующего использования и обработки.
Выполняется цель extract. Она ищет дистрибутивный файл порта (как правило, tar-архив gzip) в каталоге DISTDIR и распаковывает его во временный каталог, задаваемый переменной WRKDIR (по умолчанию work).
Выполняется цель patch. Во-первых, применяются все патчи, заданные переменной PATCHFILES. Во-вторых, если какие-либо файлы с патчами, носящие имена patch-*, имеются в подкаталоге PATCHDIR (по умолчанию это каталог files), то они применяются в этот момент в алфавитном порядке.
Запускается цель configure. Здесь может выполняться любая из многих различных вещей.
Если существует скрипт scripts/configure, то он запускается.
Если задана переменная HAS_CONFIGURE или GNU_CONFIGURE, то запускается скрипт WRKSRC/configure.
Если задана переменная USE_IMAKE, то запускается команда XMKMF (по умолчанию это xmkmf -a).
Выполняется цель build. Она отвечает за переход в собственный рабочий каталог порта (WRKSRC) и его построение. Если задана переменная USE_GMAKE, будет использоваться GNU-версия утилиты make, в противном случае будет использована системная утилита make.
Выше перечислены стандартные действия. Кроме того, вы сами можете определить цели pre-что-то или post-что-то, или создать скрипты с такими именами в подкаталоге scripts, и они будут запущены до или после выполнения действий по умолчанию.
Например, если у вас есть цель post-extract, определённая в вашем файле Makefile и файл pre-build в подкаталоге scripts, то после выполнения обычных действий по распаковке, будет вызвана цель post-extract а скрипт pre-build будет выполнен перед запуском стандартных правил построения. Рекомендуется использовать цели из Makefile, если действия достаточно просты, потому что в дальнейшем будет проще определить, какие нестандартные действия требует порт.
Действия по умолчанию выполняются целями do-что-то из bsd.port.mk. Например, команды для распаковки порта находятся в цели do-extract. Если вам не хватает цели по умолчанию, вы можете ее исправить, переопределив цель do-something в вашем файле Makefile.
Замечание: ``Основные'' цели (к примеру, extract, configure и так далее) не делают ничего больше, чем проверяют успешность завершения всех предыдущих шагов и вызывают настоящие цели или скрипты, и их не нужно менять. Если вам нужно изменить распаковку, исправляйте do-extract, но никогда не меняйте способ работы extract!
Теперь вы представляете, что происходит, когда пользователь набирает команду make, теперь давайте пройдемся через шаги, рекомендуемые для создания настоящего порта.
Получите оригинальные исходные тексты (обычно) в виде упакованного tar-архива (foo.tar.gz или foo.tar.Z) и скопируйте его в каталог DISTDIR. Всегда используйте исходные тексты основной ветки разработки везде, где это возможно.
Вам потребуется задать значение переменной MASTER_SITES так, чтобы оно указывало на местоположение оригинального tar-архива. В файле bsd.sites.mk вы найдёте краткие обозначения для большинства популярных сайтов. Пожалуйста, используйте эти сайты--и соответствующие определения--везде, где это возможно, чтобы избежать проблем повторения одной и той же информации в базе источников. Так как эти сайты со временем меняются, для всех причастных поддержка становится настоящим кошмаром.
Если вы не можете найти FTP/HTTP сайт с хорошим подключением к сети, или находите только сайты, которые имеют раздражающе нестандартные форматы, то можете захотеть поместить копию на надежный сервер FTP или HTTP, который вам доступен (например, ваша домашняя страница).
Если вы не можете найти доступного и надёжного места для помещения дистрибутивного файла, то мы сами сможем разместить его на сервере ftp.FreeBSD.org; однако это наименее рекомендуемое решение. Дистрибутивный файл должен быть помещён в каталог ~/public_distfiles/ одного из пользователей машины freefall. Попросите того, кто коммиттил ваш порт, сделать это. Этот человек также задаст переменной MASTER_SITES значение MASTER_SITE_LOCAL, а в переменной MASTER_SITE_SUBDIR укажет своё имя пользователя с машины freefall.
Если дистрибутивные файлы вашего порта постоянно меняются по неизвестным причинам без изменения версий со стороны автора, остаётся только поместить дистрибутив на вашу домашнюю Web-страницу и указать её первой в списке MASTER_SITES. Если можете, попытайтесь договориться с автором порта об этом; это действительно помогает в достижении некоторого управления исходным кодом. Хостирование собственной версии поможет избежать появления ошибок у пользователей типа “checksum mismatch”, а также уменьшит нагрузку на людей, сопровождающих наш FTP-сервер. Также, если у порта имеется только один основной сервер, то рекомендуется поместить архивную копию на свой сайт и указать его в списке MASTER_SITES вторым.
Если вашему порту требуются дополнительные `патчи', доступные в Интернет, скачайте также и их, поместив в каталог DISTDIR. Не волнуйтесь, если они находятся не на том же сайте, откуда взят дистрибутивный архив, мы умеем обрабатывать такие ситуации (смотрите описание PATCHFILES ниже).
Распакуйте копию дистрибутивного файла в отдельный каталог и внесите изменения, которые необходимы для того, чтобы порт компилировался нормально в текущей версии FreeBSD. Тщательно отслеживайте все, что вы делаете, этот процесс вам предстоит автоматизировать. Все, включая удаление, добавление или модификацию в файлах должны будут выполняться автоматически с помощью скриптов или файлов патчей, когда вы завершите работу над портом.
Если вашему порту во время компиляции, установки и настройки требуется довольно много взаимодействовать с пользователем, то посмотрите на один из классических скриптов Configure Лэрри Уолла (Larry Wall) и сделайте сами что-либо подобное. Предназначение новой коллекции портов - это сделать каждое приложение в стиле ``plug-and-play'' настолько, насколько это вообще возможно для конечного пользователя при минимальном использовании дискового пространства.
Замечание: Если явно не указано обратное, то патчи, скрипты и другие файлы, которые вы создали и предоставили для Коллекции Портов FreeBSD, неявно подпадают под стандартные условия лицензии BSD.
Файлы, которые добавлялись или изменялись в процессе создания порта, могут быть выявлены вызовом программы diff(1) с рекурсией, а результат работы этой программы может быть в дальнейшем передан программе patch(1). Каждый набор патчей, который вы собираетесь применить, должен быть собран в файл с именем patch-*, где * означает порядок, в которой будут применяться патчи -- это делается в алфавитном порядке, то есть сначала aa, затем ab и так далее. Если хотите, вы можете использовать имена файлов, указывающие на имена файлов, к которым применяются патчи, такие, как patch-Imakefile или patch-src-config.h. Эти файлы должны находиться в каталоге PATCHDIR, откуда они будут взяты автоматически. Все патчи должны быть сделаны относительно каталога WRKSRC (как правило, это каталог, в который распаковывается исходный архив и где будет выполняться построение). Для упрощения внесения изменений и обновлений вы должны избегать наличия более чем одного патча для одного и того же файла (например, патчей patch-aa и patch-ab, оба меняющих файл WRKSRC/foobar.c).
Не помещайте строки RCS в патчи. CVS будет изменять их при помещении файлов в дерево портов, и когда мы будем их оттуда извлекать, они будут уже другие, поэтому применение патчей окончится неудачей. Строчки RCS предваряются знаком доллара ($), и обычно начинаются с $Id или $RCS.
Использование параметра рекурсии (-r) с командой diff(1) для генерации
патчей - это хорошо, но всё же, пожалуйста, смотрите на получающиеся патчи, чтобы
убедиться в отсутствии ненужного мусора. В частности, diff-разниц между двумя резервными
копиями файлов, файлы Makefile, когда как порт использует Imake или GNU-версию программы configure, и
так далее, не нужны, и должны быть удалены. Если вы отредактировали файл configure.in и запустили autoconf для
перегенерации configure, не нужно включать файлы diff для configure (они частенько вырастают до нескольких тысяч строк!);
задайте USE_AUTOCONF_VER=213 и включите diff-файл для configure.in.
Кроме того, если вы удаляете файл, то это можно сделать и в цели post-extract, а не внутри патча. Как только вы будете удовлетворены получающимся diff-файлом, разбейте его на несколько по одному патчу на отдельный файл.
Поместите все дополнительные команды, требуемые для настройки, в ваш скрипт configure и сохраните его в подкаталоге scripts. Как отмечено выше, вы можете сделать это целями в файле Makefile и/или скриптами с именами pre-configure или post-configure.
Если для построения, конфигурации или установки вашего порта требуется некоторый ввод со стороны пользователя, то вы должны задать переменную IS_INTERACTIVE в вашем файле Makefile. В случае ``ночного построения'' это позволит пропустить ваш порт, если пользователь в своем окружении задал переменную BATCH (и если пользователь установил переменную INTERACTIVE, то будут строиться только порты, которые требуют взаимодействия с пользователем. Это сэкономит значительное количество времени на части машин, которые постоянно строят порты (смотрите ниже).
При наличии разумных ответов на задаваемые вопросы, подходящих по умолчанию, также рекомендуется проверять переменную PACKAGE_BUILDING и выключать интерактивный скрипт, если он есть. Это позволит нам строить пакеты для помещения на компакт-диски и FTP-серверы.
Настройка файла Makefile достаточно проста, и мы снова предполагаем, что перед тем, как начать, вы посмотрите на существующие примеры. К тому же в этом руководстве имеется примерный Makefile, так что взгляните на него и, пожалуйста, следуйте порядку переменных и разделов в этом образце, чтобы облегчить чтение вашего порта другими людьми.
Итак, расположим решаемые задачи в порядке их возникновения при создании вашего нового файла Makefile:
Находится ли он в каталоге DISTDIR в виде стандартного упакованного архиватором gzip tar-архива с именем типа foozolix-1.2.tar.gz? Если это так, можно перейти к следующему шагу. Если нет, то вы должны попытаться переопределить некоторые из переменных DISTNAME, EXTRACT_CMD, EXTRACT_BEFORE_ARGS, EXTRACT_AFTER_ARGS, EXTRACT_SUFX или DISTFILES в зависимости от того, насколько необычен формат дистрибутивного файла. (Самый распространённый случай - это EXTRACT_SUFX=.tar.Z, когда tar-файл упакован обычной утилитой compress, а не архиватором gzip.)
В худшем случае вы можете просто определить свою собственную цель do-extract для переопределения действий по умолчанию, хотя к этому нужно будет прибегать в очень редких случаях, если вообще придётся.
В первой части Makefile порта ему даётся название, указывается его номер версии и принадлежность к правильной категории.
В переменной PORTNAME вы должны указать основную часть имени вашего порта, а в переменной PORTVERSION - номер версии.
Переменная PORTREVISION представляет собой монотонно увеличивающееся число, которое обнуляется при каждом увеличении значения переменной PORTVERSION (то есть каждый раз, когда создателями выпускается новый официальный релиз), и добавляется к имени пакета, если оно не равно нулю. Изменения в PORTREVISION используются автоматизированными инструментами (например, pkg_version(1)) для определения факта появления нового пакета.
Значение PORTREVISION должно увеличиваться каждый раз, когда в порте FreeBSD делаются изменения, которые достаточно сильно затрагивают содержимое или структуру соответствующего пакета.
Примеры случаев, когда значение PORTREVISION должно быть увеличено:
Добавление патчей для исправления пробелов в безопасности, ошибок, или добавления новой функциональности в порт.
Изменения в файле Makefile порта для включения и выключения параметров, определяемых при компиляции пакета.
Изменения в списке упаковки или в поведении пакета во время его установки (например, изменение скрипта, генерирующего начальные данные для пакета, такие, как ssh-ключи для хоста).
Увеличение версии динамической библиотеки, от которой зависит порт (в этом случае тот, кто попытается установить старый пакет после установки более новой версии библиотеки, не сможет этого сделать, потому что при этом будет делаться поиск старой библиотеки libfoo.x, а не libfoo.(x+1)).
Большие функциональные изменения в дистрибутивном файле порта, происходящие без объявлений, и приводящие к большим изменениям, то есть изменения в дистрибутиве требуют корректировки файла distinfo без соответствующего изменения PORTVERSION, когда как команда diff -ru между новой и старой версиями показывает нетривиальные изменения в коде.
Примеры изменений, которые не требуют увеличения переменной PORTREVISION:
Изменения стиля в скелете порта без функциональных изменений в пакете.
Изменения в переменной MASTER_SITES или другие функциональные изменения порта, которые не затрагивают получающегося пакета.
Тривиальные патчи к дистрибутивному файлу, такие, как исправления опечаток, которые не так уж важны, что пользователи пакета должны озаботиться обновлением.
Исправления, касающиеся этапа построения, которые делают возможным построение пакета, если ранее это было невозможно сделать (пока изменения не приводят к изменению работы на любых других платформах, на которых порт ранее строился). Так как PORTREVISION отражает содержимое пакета, то, если ранее пакет не строился, то нет нужды увеличивать PORTREVISION для отметки изменения.
Правило, которому нужно приблизительно следовать, заключается в том, что нужно спрашивать себя, является ли вносимое в порт изменение таким, что от него выиграют все (в виде усовершенствования, исправления или благодаря тому, что новый пакет будет вообще работоспособным), и примите во внимание тот факт, что при этом все, кто регулярно обновляют своё дерево портов, будут обязаны это сделать. Если это так, то переменная PORTREVISION должна быть увеличена.
Время от времени разработчик программного обеспечения или создатель порта FreeBSD делают что-то не так и выпускают версию программы, номер которой меньше предыдущей версии. Примером этого является порт, название которого меняется с foo-20000801 на foo-1.0 (изначально это не считалось бы более новой версией, так как 20000801 численно больше, чем 1).
В ситуациях, подобных этой, должно быть увеличено значение PORTEPOCH. Если значение PORTEPOCH не равно нулю, то оно добавляется к имени пакета, как описано в разделе выше. Значение PORTEPOCH никогда не должно уменьшаться или сбрасываться в ноль, потому что это приведёт к ошибке сравнения с пакетом с меньшим номером эпохи (то есть то, что пакет устарел, обнаружено не будет): номер новой версии (например, 1.0,1 в примере выше) останется меньше, чем номер предыдущей версии (20000801), однако суффикс ,1 интерпретируется различными автоматизированными утилитами особым образом, и окажется больше, чем предполагаемый суффикс ,0 более раннего пакета).
Некорректное уменьшение или сброс PORTEPOCH приводит к печальным последствиям; если вы не поняли, о чём шла речь ранее, пожалуйста, всё же разберитесь с этим, либо спросите в списках рассылки.
Предполагается, что в большинстве портов переменная PORTEPOCH использоваться не будет, но при корректном использовании PORTVERSION может появиться необходимость её иметь, если в будущих релизах программное обеспечение должно изменить структуру номера версии. Однако создателям портов нужно быть внимательными, когда разработчик выпускает релиз без официального номера версии -- эдакие ``промежуточные'' релизы. Имеется соблазн пометить релиз датой его выхода, что может вызвать проблемы, как и в примере выше, когда будет выпущен новый ``официальный'' релиз.
Например, если промежуточный релиз помечен датой 20000917, а предыдущая версия программного обеспечения имела номер 1.2, то промежуточному релизу должно быть поставлено в соответствие значение PORTVERSION, равное 1.2.20000917 или что-то похожее, но не 20000917, так как последующий релиз, скажем, 1.3, должен иметь численно большее значение.
Выполнен коммит порта gtkmumble, версии 0.10, в коллекцию портов.
PORTNAME= gtkmumble PORTVERSION= 0.10
Значение PKGNAME станет равным gtkmumble-0.10.
Обнаружен пробел в безопасности, что потребовало создания локального патча для FreeBSD. Соответственно было увеличено значение переменной PORTREVISION.
PORTNAME= gtkmumble PORTVERSION= 0.10 PORTREVISION= 1
PKGNAME принимает значение gtkmumble-0.10_1
Разработчиком выпущена новая версия с номером 0.2 (оказалось, что под номером 0.10 автор имел в виду 0.1.0, а не ``то, что будет выпущено после версии 0.9'' - извините, теперь уже поздно). Так как новый младший номер версии 2 по значению меньше, чем номер предыдущей версии 10, то должно быть увеличено значение PORTEPOCH для того, чтобы заставить распознавать вновь создаваемый пакет как ``более новый''. Так как это новый релиз программы, то PORTREVISION обнуляется (или удаляется из файла Makefile).
PORTNAME= gtkmumble PORTVERSION= 0.2 PORTEPOCH= 1
PKGNAME принимает значение gtkmumble-0.2,1
Следующий релиз имеет номер версии 0.3. Так как значение переменной PORTEPOCH никогда не уменьшается, что переменные, определяющие версии, теперь выглядят так:
PORTNAME= gtkmumble PORTVERSION= 0.3 PORTEPOCH= 1
PKGNAME принимает значение gtkmumble-0.3,1
Замечание: Если значение PORTEPOCH этим обновлением было бы сброшено в 0, то кто-нибудь, имеющий установленный пакет gtkmumble-0.10_1, не смог бы опознать пакет gtkmumble-0.3 как более новый, так как 3 было бы меньше, чем 10. Помните, что в первую очередь это касается PORTEPOCH.
Две необязательные переменные, PKGNAMEPREFIX и PKGNAMESUFFIX, объединяются со значениями PORTNAME и PORTVERSION для формирования PKGNAME в форме ${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}. Добейтесь того, чтобы это соответствовало нашим рекомендациям по правильному выбору названий для пакетов. В частности, в переменной PORTVERSION не разрешается использование дефиса (-). Кроме того, если в имени пакета присутствует часть language- или -compiled.specifics (смотрите ниже), то используйте переменные PKGNAMEPREFIX и PKGNAMESUFFIX, соответственно. Не делайте их частью значения переменной PORTNAME.
Далее описаны некоторые соглашения, которым вы должны следовать в именовании ваших пакетов. Они были разработаны для облегчения просмотра каталога, так как имеется уже тысячи пакетов, а пользователи отвернутся от нас, если список не понравится их взору!
Имя пакета должно иметь вид [language[_region]]-name[[-]compiled.specifics]-version.numbers.
Имя пакета определяется как ${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}. Вы должны задавать значения переменных в соответствии с этим форматом.
FreeBSD пытается поддерживать языки, на которых разговаривают её пользователи. Часть language- должна быть двухсимвольным сокращением от названия языка по стандарту ISO-639, если порт специфичен для конкретного языка. Примерами являются ja для японского, ru для русского, vi для вьетнамского, zh для китайского, ko для корейского и de для немецкого языков.
Если ваш порт специфичен для конкретного региона внутри области использования языка, добавьте также двухсимвольный код страны. Примерами являются en_US для US English и fr_CH для Swiss French.
Часть language- должна задаваться в переменной PKGNAMEPREFIX.
Первая буква части name должна быть в нижнем регистре. (Оставшаяся часть названия может содержать буквы в верхнем регистре, так что принимайте решение сами, когда преобразуете имя программного пакета, содержащего в имени некоторое количество заглавных букв.) Существует традиция именовать модули для perl 5, добавляя впереди p5- и преобразуя пару двоеточий в дефис; например, модуль Data::Dumper будет именоваться p5-Data-Dumper. Если программное обеспечение содержит в имени числа, дефисы или подчеркивания, то вы можете включить также и их (например, kinput2).
Если порт может быть построен с различными статически заданными значениями по умолчанию (обычно это часть имени каталога в семействе портов), то часть -compiled.specifics должна определять вкомпилированные значения по умолчанию (дефис не обязателен). Примерами являются размеры бумаги и шрифтов.
Часть -compiled.specifics должна задаваться в переменной PKGNAMESUFFIX.
Строка с номером версии должна следовать за дефисом (-) и являться списком разделенных двоеточием чисел и букв в нижнем регистре. В частности, не разрешается иметь еще один дефис внутри строки с обозначением номера версии. Единственным исключением является строчка pl (означающая ``patchlevel''), которая может использоваться только тогда, когда у программного обеспечения нет старшего и младшего номера версии. Если в номер версии программного обеспечения включена строчка типа ``alpha'', ``beta'', ``rc'' или ``pre'', возьмите из неё первую букву и поставьте её непосредственно после точки. Если после таких строк номер версии ещё продолжается, то после буквы должно следовать число без дополнительной разделяющей точки.
Смысл такого формата заключается в удобстве сортировки портов по номеру версии. В частности, следите за тем, чтобы компоненты номера версии разделялись точкой, и если там присутствует дата, то используйте формат yyyy.mm.dd, но не dd.mm.yyyy или не совместимый с проблемой Г2000 yy.mm.dd.
Вот несколько (реальных) примеров того, как преобразовать имя из оригинального, придуманного авторами, к подходящему для имени пакета:
| Имя дистрибутива | PKGNAMEPREFIX | PORTNAME | PKGNAMESUFFIX | PORTVERSION | Обоснование |
|---|---|---|---|---|---|
| mule-2.2.2 | (пусто) | mule | (пусто) | 2.2.2 | Изменений не потребовалось |
| XFree86-3.3.6 | (пусто) | XFree86 | (пусто) | 3.3.6 | Изменений не потребовалось |
| EmiClock-1.0.2 | (пусто) | emiclock | (пусто) | 1.0.2 | Для отдельных программ имена с заглавными буквами запрещены |
| rdist-1.3alpha | (пусто) | rdist | (пусто) | 1.3.a | Строчки типа alpha запрещены |
| es-0.9-beta1 | (пусто) | es | (пусто) | 0.9.b1 | Строчки типа beta запрещены |
| mailman-2.0rc3 | (пусто) | mailman | (пусто) | 2.0.r3 | Строчки типа rc запрещены |
| v3.3beta021.src | (пусто) | tiff | (пусто) | 3.3 | Что это такое было вообще? |
| tvtwm | (пусто) | tvtwm | (пусто) | pl11 | Всегда требуется указание номера версии |
| piewm | (пусто) | piewm | (пусто) | 1.0 | Всегда требуется указание номера версии |
| xvgr-2.10pl1 | (пусто) | xvgr | (пусто) | 2.10.1 | pl разрешено только при отсутствии старшего/младшего номера версии |
| gawk-2.15.6 | ja- | gawk | (пусто) | 2.15.6 | Версия на японском языке |
| psutils-1.13 | (пусто) | psutils | -letter | 1.13 | Размер бумаги задается статически во время построения пакета |
| pkfonts | (пусто) | pkfonts | 300 | 1.0 | пакет для шрифтов 300dpi |
Если в исходном коде абсолютно нет информации о номере версии и не похоже, что автор собирается выпускать другую версию, то в качестве номера версии задайте просто 1.0 (как в примере с piewm выше). В противном случае спросите автора программы или используйте дату (yyyy.mm.dd) в качестве номера версии.
В процессе создания пакета он помещается в каталог /usr/ports/packages/All, а в одном или более подкаталогов из /usr/ports/packages создаются на него ссылки. Имена этих подкаталогов определяются переменной CATEGORIES. Такая схема нужна для облегчения жизни пользователя, когда он сталкивается с массой пакетов на FTP-сервере или компакт-диске. Пожалуйста, посмотрите на список существующих категорий и выберите те из них, которые более всего подходят к вашему порту.
Этот список также определяет, куда в дереве портов будет помещен порт. Если вы укажете здесь более одной категории, то предполагается, что файлы порта будут помещены в подкаталог с именем первой категории. Посмотрите раздел о категориях для получения подробной информации о том, как правильно выбрать категории.
Если ваш порт действительно относится к чему-то, что абсолютно не имеет отношения ни к одной из существующих категорий, вы можете даже создать новую категорию. В этом случае, пожалуйста, пошлите письмо с вашим предложением на адрес Список рассылки, посвящённый Портам FreeBSD. Однако, вообще говоря, пока не наберётся более чем достаточного количества портов, которые можно отнести к предлагаемой вами категории, ваша идея будет отвергаться.
Замечание: Время от времени кто-нибудь предлагает произвести реорганизацию категорий либо до двухуровневой, либо другого типа на основе ключевых слов. На данный момент из этих предложений ничего не получилось, потому что, хотя они просты в реализации, но предполагаемая переделка всей коллекции портов по меньшей мере приводит в уныние. Пожалуйста, прочтите историю этих предложений в архивах рассылок перед тем, как присылать свои соображения; более того, вы должны быть готовы представить работающий прототип.
Вот текущий список категорий. Те, которые отмечены звёздочкой (*), являются виртуальными категориями--они не имеют собственного подкаталога в дереве портов. Они используются только в качестве вторичных категорий, и только для поиска.
Замечание: Для каждой виртуальной категории имеется файл pkg/COMMENT с ее однострочным описанием в соответствующем подкаталоге (например, archivers/pkg/COMMENT).
| Категория | Описание | Примечания | |
|---|---|---|---|
| accessibility | Порты для помощи пользователям с ограниченными возможностями. | ||
| afterstep* | Порты, поддерживающие менеджер окон AfterStep. | ||
| arabic | Поддержка арабского языка. | ||
| archivers | Инструменты для работы с архивами. | ||
| astro | Приложения, связанные с астрономией. | ||
| audio | Поддержка работы со звуком. | ||
| benchmarks | Утилиты для измерения производительности системы. | ||
| biology | Программное обеспечение, связанное с биологией. | ||
| cad | Инструменты Систем Автоматизированного Проектирования. | ||
| chinese | Поддержка китайского языка. | ||
| comms | Коммуникационное программное обеспечение. | В основном программы для работы с последовательным портом. | |
| converters | Утилиты для преобразования символьных форматов. | ||
| databases | Базы данных. | ||
| deskutils | То, что было на столе до изобретения компьютеров. | ||
| devel | Утилиты для разработки программного обеспечения. | Не помещайте сюда библиотеки просто потому что это библиотеки--если они подпадают под какую-то другую категорию, то их быть здесь не должно. | |
| dns | Программное обеспечение для работы с DNS. | ||
| editors | Редакторы общего назначения. | Специализированные редакторы относят к разделу для соответствующих инструментов (например, редактор математических формул попадает в категорию math). | |
| elisp* | Порты для Emacs lisp. | ||
| emulators | Эмуляторы других операционных систем. | Эмуляторы терминалов сюда не относятся--те, которые разработаны для X, должны быть в категории x11, а текстовые в comms или misc, в зависимости от конкретного их предназначения. | |
| finance | Приложения для работы с деньгами, финансами и всем, что с этим связано. | ||
| french | Поддержка французского языка. | ||
| ftp | Клиенты и серверы FTP. | Если ваш порт понимает как FTP, так и HTTP, поместите его в категорию ftp и укажите вторичную категорию www. | |
| games | Игры. | ||
| german | Поддержка немецкого языка. | ||
| gnome* | Порты Проекта GNOME. | ||
| graphics | Графические утилиты. | ||
| haskell* | Программное обеспечение, связанное с языком Haskell. | ||
| hebrew | Поддержка иврита. | ||
| hungarian | Поддержка венгерского языка. | ||
| ipv6* | Программное обеспечение, связанное с IPv6. | ||
| irc | Утилиты для работы с Internet Relay Chat. | ||
| japanese | Поддержка японского языка. | ||
| java | Программное обеспечение, связанное с языком Java. | ||
| kde* | Порты проекта K Desktop Environment (KDE). | ||
| korean | Поддержка корейского языка. | ||
| lang | Языки программирования. | ||
| linux* | Linux приложения и утилиты. | ||
| lisp* | Программное обеспечение, связанное с языком Lisp. | ||
| Программы для работы с электронной почтой. | |||
| math | Программное обеспечение для численных вычислений и другие утилиты, связанные с математикой. | ||
| mbone | Приложения для MBone. | ||
| misc | Различные утилиты | В основном то, что не попадает в другие категории. Это единственная категория, которая не должна указываться вместе с любой другой невиртуальной категорией. Если вы указываете misc вместе с чем-то ещё в строке CATEGORIES, это значит, что вы можете спокойно удалить misc и просто поместить порт в этот другой подкаталог! Если это возможно, попробуйте найти более подходящую, чем misc, категорию для вашего порта, так как здесь порты теряются. | |
| multimedia | Программное обеспечение для работы с мультимедиа. | ||
| net | Различное сетевое программное обеспечение. | ||
| net-mgmt | Программное обеспечение для сетевого управления. | ||
| news | Программное обеспечение для работы с конференциями USENET. | ||
| offix* | Порты из пакета OffiX. | ||
| palm | Программная поддержка Palm™. | ||
| parallel* | Приложения, связанные с параллельными вычислениями. | ||
| pear* | Порты, относящиеся к технологии Pear PHP. | ||
| perl5* | Порты, которым для работы требуется Perl версии 5. | ||
| picobsd | Порты для поддержки PicoBSD. | ||
| plan9* | Различные программы из Plan9. | ||
| polish | Поддержка польского языка. | ||
| portuguese | Поддержка португальского языка. | ||
| Программное обеспечение для печати. | Инструменты для вёрстки (просмотрщики и тому подобное) тоже относятся сюда. | ||
| python* | Программное обеспечение, связанное с языком Python. | ||
| ruby* | Программное обеспечение, связанное с языком Ruby. | ||
| russian | Поддержка русского языка. | ||
| science | Научные программы, которые не подпадают под другие категории, скажем, astro, biology или math. | ||
| security | Программы, обеспечивающие безопасность системы. | ||
| shells | Различные командные процессоры. | ||
| sysutils | Системные утилиты. | ||
| tcl76* | Порты, которым для работы нужен Tcl версии 7.6. | ||
| tcl80* | Порты, которым для работы нужен Tcl версии 8.0. | ||
| tcl81* | Порты, которым для работы нужен Tcl версии 8.1. | ||
| tcl82* | Порты, которым для работы нужен Tcl версии 8.2. | ||
| tcl83* | Порты, которым для работы нужен Tcl версии 8.3. | ||
| textproc | Утилиты для обработки текстов. | Инструменты для вёрстки помещаются в категорию print, а не сюда. | |
| tk42* | Порты, которым для работы нужен Tk версии 4.2. | ||
| tk80* | Порты, которым для работы нужен Tk версии 8.0. | ||
| tk81* | Порты, которым для работы нужен Tk версии 8.1. | ||
| tk82* | Порты, которым для работы нужен Tk версии 8.2. | ||
| tk83* | Порты, которым для работы нужен Tk версии 8.3. | ||
| tkstep80* | Порты, которым для работы нужен TkSTEP версии 8.0. | ||
| ukrainian | Поддержка украинского языка. | ||
| vietnamese | Поддержка вьетнамского языка. | ||
| windowmaker* | Порты, поддерживающие менеджер окон WindowMaker. | ||
| www | Программное обеспечение, связанное с World Wide Web. | Поддержка языка HTML относится сюда же. | |
| x11 | X Window System и иже с ними. | Эта категория предназначена только для программного обеспечения, которое поддерживает саму оконную систему. Не помещайте сюда обычные приложения для X: большинство из них должны быть перенесены в другие категории x11-* (смотрите ниже). Если ваш порт является приложением для X, задайте USE_XLIB (что подразумевается при использовании USE_IMAKE) и укажите подходящую категорию. | |
| x11-clocks | Часы для X11. | ||
| x11-fm | Менеджеры файлов для X11. | ||
| x11-fonts | Шрифты для X11 и утилиты для работы с ними. | ||
| x11-servers | Серверы для X11. | ||
| x11-toolkits | Пакеты разработчика для X11. | ||
| x11-wm | Оконные менеджеры для X11. | ||
| zope* | Поддержка Zope. |
Так как многие категории перекрываются, вам часто необходимо будет выбирать, какая их них должна быть основной для вашего порта. Есть несколько правил, по которым можно решить этот вопрос. Вот список приоритетов, в уменьшающейся степени предпочтения:
Сначала всегда идут категории, специфичные для языков. Например, если ваш порт устанавливает японские шрифты для X11, то строчка CATEGORIES должна иметь вид japanese x11-fonts.
Более конкретные категории предпочтительней перед более общими. В частности, редактор HTML должен быть описан как www editors, а не наоборот. Кроме того, вы не должны указывать категорию net, если порт относится к одной из категорий irc, mail, mbone, news, security или www, так как net включается автоматически.
x11 используется как вторичная категория только в случае, если в качестве основной категории указан естественный язык. В частности, вам не нужно указывать x11 в качестве категории для приложений X.
Режимы для редактора Emacs должны помещаться в ту же категорию, что и приложение, которое поддерживается этим режимом, а не в editors. Например, режим Emacs для редактирования исходного кода некоторого языка программирования должен быть помещен в категорию lang.
Если ваш порт решительным образом не подпадает ни под какую категорию, поместите его в misc.
Если вы не уверены в правильности выбора категории, пожалуйста, отметьте это в вашем сообщении через send-pr(1), чтобы мы могли обсудить это до того, как включить порт в Коллекцию. Если вы являетесь коммиттером, пошлите замечание на адрес Список рассылки, посвящённый Портам FreeBSD, чтобы мы могли обсудить это. Зачастую новые порты помещаются не в ту категорию только для того, чтобы их оттуда сразу же удалили. Это приводит к излишнему и ненужному росту основного хранилища исходных текстов.
Во второй части Makefile задаётся, какие файлы и откуда должны быть сгружены для того, чтобы построить порт.
В переменной DISTNAME указывается имя порта так, как назвали его создатели программного обеспечения. Значение DISTNAME по умолчанию совпадает с ${PORTNAME}-${PORTVERSION}, так что переопределяете её значение только в случае необходимости. DISTNAME используется только в двух местах. Во-первых, список дистрибутивных файлов (DISTFILES) по умолчанию состоит из ${DISTNAME}${EXTRACT_SUFX}. И во-вторых, предполагается, что дистрибутивный файл будет распакован в подкаталог с именем WRKSRC, значение которого по умолчанию есть не что иное, как work/${DISTNAME}.
Замечание: Значения переменных PKGNAMEPREFIX и PKGNAMESUFFIX не влияют на значение DISTNAME. Заметьте также, что если значение WRKSRC равно work/${PORTNAME}-${PORTVERSION}, и в случае, когда оригинальный архив называется по имени, отличном от ${PORTNAME}-${PORTVERSION}${EXTRACT_SUFX}, скорее всего, вы должны оставить DISTNAME как есть-- лучше переопределить DISTFILES, чем задавать значения как DISTNAME, так и WRKSRC (и, возможно, ещё и EXTRACT_SUFX).
Содержит часть с каталогом FTP/HTTP-URL, которая указывает на оригинальный архив на сервере MASTER_SITES. Не забудьте лидирующий слэш (/)!
Макрос команды make будет пытаться воспользоваться этой переменной для получения дистрибутивного файла с помощью программы FETCH, если он не будет найден в системе.
Рекомендуется помещать в список много сайтов, предпочтительно с разных континентов. Это поможет при наличии проблем с мировой сетью. Мы даже планируем добавить поддержку автоматического определения ближайшего сайта и сгрузки файлов оттуда; наличие нескольких сайтов будет способствовать этому начинанию.
Если оригинальный архив находится на одном из таких популярных серверов, как X-contrib, GNU или Perl CPAN, то указывайте эти сайты в простой форме при помощи MASTER_SITE_* (к примеру, MASTER_SITE_XCONTRIB или MASTER_SITE_PERL_GNU). Просто укажите в переменной MASTER_SITES одно из этих значений, а в переменной MASTER_SITE_SUBDIR задайте путь к архиву. Вот пример:
MASTER_SITES= ${MASTER_SITE_XCONTRIB}
MASTER_SITE_SUBDIR= applications
Эти переменные определены в файле /usr/ports/Mk/bsd.sites.mk. Всё время добавляются новые записи, так что обращайтесь к последней версии этого файла перед тем, как послать нам свой порт.
Пользователь может также задать значения переменных MASTER_SITE_* в файле /etc/make.conf для того, чтобы переопределить выбранные нами варианты, и использовать вместо них свои любимые зеркала этих популярных архивов.
Если у вас имеется один дистрибутивный файл, и в его имени используется странное окончание для указания типа сжатия, задайте переменную EXTRACT_SUFX.
К примеру, если дистрибутивный файл носит имя foo.tgz, а не более привычное foo.tar.gz, вы должны написать:
DISTNAME= foo EXTRACT_SUFX= .tgz
Переменные USE_BZIP2 и USE_ZIP автоматически устанавливают значение EXTRACT_SUFX в .bz2 или .zip соответственно. Если ни одна из этих переменных не задана, то значение EXTRACT_SUFX по умолчанию устанавливается в .tar.gz.
Замечание: Вам не нужно задавать значения EXTRACT_SUFX и DISTFILES одновременно.
Иногда имена сгружаемых файлов не соответствуют имени порта. К примеру, файл может называться source.tar.gz или подобным образом. В других случаях исходный код приложения может располагаться в нескольких отличающихся архивах, и все они должны быть сгружены.
Если это ваш случай, то задайте в переменной DISTFILES список разделённых пробелами имён файлов, которые нужно сгрузить.
DISTFILES= source1.tar.gz source2.tar.gz
Если переменная DISTFILES не задана явно, то её значением по умолчанию будет ${DISTNAME}${EXTRACT_SUFX}.
Если только некоторые из DISTFILES должны быть распакованы--к примеру, часть из них является исходным кодом, а другие представляют собой неупакованную документацию--перечислите имена файлов, которые должны быть распакованы, в EXTRACT_ONLY.
DISTFILES= source.tar.gz manual.html EXTRACT_ONLY= source.tar.gz
Если ни один из DISTFILES не должен распаковываться, то установите пустое значение переменной EXTRACT_ONLY.
EXTRACT_ONLY=
Если вашему порту требуются некоторых дополнительные патчи, которые доступны по FTP или HTTP, задайте имена этих файлов в переменной PATCHFILES, а в переменной PATCH_SITES укажите URL того каталога, в котором они содержатся (формат такой же, как для MASTER_SITES).
Если патч не относится к самому верху дерева исходных текстов (то есть WRKSRC), потому что он содержит некоторые дополнительные пути, установите соответственно значение переменной PATCH_DIST_STRIP. В частности, если все имена путей в патче имеют дополнительный путь foozolix-1.0/ перед именем файла, то задайте PATCH_DIST_STRIP=-p1.
Не волнуйтесь, если патчи упакованы; они будут распакованы автоматически, если имена файлов оканчиваются на .gz или .Z.
Если патч распространяется вместе с какими-то другими файлами, такими, как документация, в виде tar-архива gzip, вы не можете просто использовать PATCHFILES. Если это ваш случай, добавьте имя и местоположение архива с патчем к DISTFILES и MASTER_SITES. Затем воспользуйтесь переменной EXTRA_PATCHES для указания этих файлов, и bsd.port.mk автоматически применит эти патчи. В частности, не копируйте файлы с патчами в каталог PATCHDIR--этот каталог может быть недоступным для записи.
Замечание: Архив будет распакован вне исходного кода, как обычно, и к тому же его не нужно явно распаковывать, если это обычный архив gzip или compress. Если вы сделаете последнее, приложите дополнительные усилия для того, чтобы не перезаписать что-либо, уже существующее в этом каталоге. Также не забудьте добавить команду для удаления скопированного патча в цели pre-clean.
(Этот раздел можно считать немного ``повышенной трудности''; те, кто впервые знакомятся с этим текстом, могут пропустить этот раздел).
В этом разделе находится информация о механизме сгрузки, известном как MASTER_SITES:n и MASTER_SITES_NN. Далее мы будем называть этот механизм MASTER_SITES:n.
Сначала немного общей информации. В OpenBSD имеется полезная возможность, используемая в переменных DISTFILES и PATCHFILES, когда за именами файлов и патчей могут следовать идентификаторы типа :n, где n может быть из диапазона [0-9] и обозначать закреплённую группу. К примеру:
DISTFILES= alpha:0 beta:1
В OpenBSD дистрибутивный файл alpha будет связан с переменной MASTER_SITES0, но не с нашей общей переменной MASTER_SITES, а файл beta с переменной MASTER_SITES1.
Этот очень интересная возможность, которая может уменьшить этот бесконечный поиск работающего сайта для сгрузки.
Просто представьте себе 2 файла в DISTFILES и 20 сайтов в MASTER_SITES; сайты очень медленные, причём beta находится на всех сайтах из MASTER_SITES, а alpha может быть найден только на 20-м сайте. Будет неправильно проверять их все, если создатель знает об этом, не правда ли? Неподходящее начало для таких прекрасных выходных!
Теперь, когда вы получили общее представление, просто представьте ещё большее количество DISTFILES и MASTER_SITES. Уверен, что наш ``начальник системы поиска дистрибутивов'' представляет масштабы нагрузки на сеть, которую это даёт.
В последующих разделах информация будет даваться вместе с реализацией этой идеи во FreeBSD. Мы несколько улучшили концепцию OpenBSD.
В этом разделе рассказывается, как быстро подготовить точную сгрузку нескольких дистрибутивных файлов и патчей с разных сайтов и каталогов. Мы описываем здесь случай упрощённого использования MASTER_SITES:n. Для большинства сценариев этого будет достаточно. Однако, если вам нужна дополнительная информация, обратитесь к следующему разделу.
Некоторые приложения состоят из многих дистрибутивных файлов, которые должны быть сгружены с нескольких различных сайтов. К примеру, Ghostscript состоит из основной программы и большого числа файлов драйверов, которые используются в зависимости от принтера пользователя. Некоторые из этих файлов драйверов поставляются с основной программой, но при этом многие другие должны быть сгружены с множества различных сайтов.
Чтобы это поддерживать, за каждой записью в DISTFILES может следовать символ двоеточия и ``имя метки''. За каждым сайтом, перечисленным в MASTER_SITES, тоже следует двоеточие и метка, которая указывает, какие файлы дистрибутива должны быть сгружены с этого сайта.
Например, рассмотрим приложение, исходный код которого разделён на две части, source1.tar.gz и source2.tar.gz, которые должны быть сгружены с двух различных источников. Файл Makefile порта будет содержать строчки типа Прим. 5-1.
Пример 5-1. Упрощённое использование MASTER_SITES:n с 1 файлом на каждом сайте
MASTER_SITES= ftp://ftp.example1.com/:source1 \
ftp://ftp.example2.com/:source2
DISTFILES= source1.tar.gz:source1 \
source2.tar.gz:source2
Несколько дистрибутивных файлов могут иметь одну и ту же метку. Продолжая предыдущий пример, положим, что имеется и третий дистрибутивный файл, source3.tar.gz, который должен быть сгружен с ftp.example2.com. Тогда файл Makefile будет написан как Прим. 5-2.
Прекрасно, но пример из предыдущего раздела не показал вам всё, что вам нужно? В этом разделе мы подробно опишем, как работает механизм MASTER_SITES:n точной сгрузки и как вы можете изменить ваши порты, чтобы это использовать.
За элементами могут следовать символы :n, где n это [^:,]+, то есть n может теоретически быть любой алфавитно-цифровой строкой, но пока мы будем ограничивать их [a-zA-Z_][0-9a-zA-Z_]+.
Более того, совпадение строк чувствительно к регистру; другими словами, n отличается от N.
Однако следующие слова не могут использоваться для этих нужд, так как они имеют особое значение: default, all и ALL (они используются для своих нужд в ii). Кроме того, DEFAULT является специальным ключевым словом (посмотрите 3).
Элементы, за которыми следуют :n, принадлежат группе n, :m относится к группе m и так далее.
Элементы без таких суффиксов не относятся ни к какой группе, то есть они принадлежат к особой группе DEFAULT. Если вы укажете суффиксом любого элемента DEFAULT, вы просто выполните излишнюю работу, если только вы не хотите отнесения элемента как к группе DEFAULT, так и какой-то другой в одно и то же время (посмотрите на пункт 5).
Следующие примеры равнозначны, но первый более предпочтителен:
MASTER_SITES= alpha MASTER_SITES= alpha:DEFAULT
Группы не являются эксклюзивными, элемент может принадлежать к нескольким отличающимся группам одновременно, а группа может либо иметь несколько различных элементов, либо не иметь их вовсе. Повторяющиеся элементы в одной и той же группе будут являться просто повторяющимися элементами.
Если в хотите, чтобы элемент принадлежал к нескольким группам одновременно, вы можете использовать запятую (,).
Вместо того, чтобы повторять их несколько раз, каждый раз с разным постфиксом, мы можем перечислить несколько групп за раз в одном постфиксе. Например, :m,n,o определяет элемент, принадлежащий группам m, n и o.
Все следующие примеры имеют один смысл, но последний является предпочтительным:
MASTER_SITES= alpha alpha:SOME_SITE MASTER_SITES= alpha:DEFAULT alpha:SOME_SITE MASTER_SITES= alpha:SOME_SITE,DEFAULT MASTER_SITES= alpha:DEFAULT,SOME_SITE
Все серверы внутри определённой группы сортируются в соответствии с MASTER_SORT_AWK. Все группы в MASTER_SITES и PATCH_SITES тоже сортируются.
Семантика групп может использоваться в любой из следующих переменных MASTER_SITES, PATCH_SITES, MASTER_SITE_SUBDIR, PATCH_SITE_SUBDIR, DISTFILES и PATCHFILES в соответствии со следующим синтаксисом:
Все элементы MASTER_SITES, PATCH_SITES, MASTER_SITE_SUBDIR и PATCH_SITE_SUBDIR должны заканчиваться символом прямого слэша /. Если какие-то элементы принадлежат каким-то группам, постфикс группы :n должен следовать сразу после терминирующего символа /. Механизм MASTER_SITES:n опирается на наличие терминирующего символа / во избежание совпадающих элементов, где :n является корректной частью элемента с вхождениями, где :n обозначает группу n. Для целей совместимости, так как терминирующий символ / ранее не требовался в элементах MASTER_SITE_SUBDIR и PATCH_SITE_SUBDIR, если символ, сразу предшествующий постфиксу, не является символом /, то :n будет считаться корректной частью элемента, а не постфиксом группы, даже если за элементом следует :n. Посмотрите Прим. 5-3 и Прим. 5-4.
Пример 5-3. Подробное использование MASTER_SITES:n в MASTER_SITE_SUBDIR
MASTER_SITE_SUBDIR= old:n new/:NEW
Каталоги внутри группы DEFAULT -> old:n
Каталоги внутри группы NEW -> new
Пример 5-4. Подробное использование MASTER_SITES:n с запятыми, несколькими файлами, несколькими серверами и несколькими подкаталогами
MASTER_SITES= http://site1/%SUBDIR%/ http://site2/:DEFAULT \
http://site3/:group3 http://site4/:group4 \
http://site5/:group5 http://site6/:group6 \
http://site7/:DEFAULT,group6 \
http://site8/%SUBDIR%/:group6,group7 \
http://site9/:group8
DISTFILES= file1 file2:DEFAULT file3:group3 \
file4:group4,group5,group6 file5:grouping \
file6:group7
MASTER_SITE_SUBDIR= directory-trial:1 directory-n/:groupn \
directory-one/:group6,DEFAULT \
directory
Предыдущий пример приводит к следующей точной сгрузке. Серверы перечислены в точном порядке их использования.
file1 будет сгружаться с
MASTER_SITE_OVERRIDE
http://site1/directory/
http://site1/directory-one/
http://site1/directory-trial:1/
http://site2/
http://site7/
MASTER_SITE_BACKUP
file2 будет сгружаться точно также, как file1, так как они оба относятся к одной и той же группе
MASTER_SITE_OVERRIDE
http://site1/directory/
http://site1/directory-one/
http://site1/directory-trial:1/
http://site2/
http://site7/
MASTER_SITE_BACKUP
file3 будет сгружен с
MASTER_SITE_OVERRIDE
http://site3/
MASTER_SITE_BACKUP
file4 будет сгружаться с
MASTER_SITE_OVERRIDE
http://site4/
http://site5/
http://site6/
http://site7/
http://site8/directory-one/
MASTER_SITE_BACKUP
file5 будет сгружен с
MASTER_SITE_OVERRIDE
MASTER_SITE_BACKUP
file6 будет сгружаться с
MASTER_SITE_OVERRIDE
http://site8/directory-one/
MASTER_SITE_BACKUP
Как мне сгруппировать одну из специальных переменных из bsd.sites.mk, например, MASTER_SITE_SOURCEFORGE?
Посмотрите Прим. 5-5.
Пример 5-5. Подробное использование MASTER_SITES:n с MASTER_SITE_SOURCEFORGE
MASTER_SITES= http://site1/ ${MASTER_SITE_SOURCEFORGE:S/$/:sourceforge,TEST/}
DISTFILES= something.tar.gz:sourceforge
something.tar.gz будет сгружаться со всех сайтов из MASTER_SITE_SOURCEFORGE.
Как мне использовать это с переменными PATCH*?
Все примеры выполнялись с переменными MASTER*, и они работают точно также и для PATCH*, как это можно видеть в Прим. 5-6.
Все имеющиеся порты остаются без изменений. Код для механизма MASTER_SITES:n активируется, если только есть элементы, которые заканчиваются на :n, как и элементы в соответствии с вышеописанным синтаксисом, особенно как это показано в пункте 7.
Цели порт остаются теми же самыми: checksum, makesum, patch, configure, build и так далее. С обычными исключениями для do-fetch, fetch-list, master-sites и patch-sites.
do-fetch: использует новую группировку с постфиксами в DISTFILES и PATCHFILES с соответствующими элементами групп в MASTER_SITES и PATCH_SITES, которые используют группы из MASTER_SITE_SUBDIR и PATCH_SITE_SUBDIR. Посмотрите Прим. 5-4.
fetch-list: работает также, как старая цель fetch-list с тем исключением, что она группирует, как и do-fetch.
master-sites и patch-sites: (несовместимы со старыми версиями) только возвращают элементы группы DEFAULT; на самом деле они выполняют цели master-sites-default и patch-sites-default соответственно.
Более того, использование целей master-sites-all или patch-sites-all предпочтительно для непосредственной проверки MASTER_SITES или PATCH_SITES. Также работа прямой проверки в последующих версиях не гарантируется. Посмотрите iii.ii для получения более дополнительной информации об этих новых целях.
Новые цели построения портов
Имеются цели master-sites-n и patch-sites-n, которые будут перечислять элементы соответствующей группы n из MASTER_SITES и PATCH_SITES соответственно. К примеру, master-sites-DEFAULT и patch-sites-DEFAULT обе будут возвращать элементы группы DEFAULT, master-sites-test и patch-sites-test группы test и так далее.
Имеются новые цели master-sites-all и patch-sites-all, которые выполняют работу старых master-sites и patch-sites. Они возвращают элементы всех групп, как если бы они все принадлежали одной и той же группе с тем, что она перечисляет ровно столько MASTER_SITE_BACKUP и MASTER_SITE_OVERRIDE, как и группы, определённые в DISTFILES или PATCHFILES; соответственно для master-sites-all и patch-sites-all.
Не позволяйте вашему порту засорять /usr/ports/distfiles. Если вашему порту требуется сгрузить много файлов, или он содержит имя файла, могущее вызвать конфликты с другими портами (например, Makefile), то укажите в переменной DIST_SUBDIR имя порта (должны подойти ${PORTNAME} или ${PKGNAMEPREFIX}${PORTNAME}). Это изменит значение переменной DISTDIR со значения по умолчанию /usr/ports/distfiles к значению /usr/ports/distfiles/DIST_SUBDIR, и в результате всё, что требуется для порта, будет помещено в этот подкаталог.
Он заглянет также в подкаталог с тем же именем на основном резервном сервере ftp.FreeBSD.org. (Явное задание переменной DISTDIR в вашем файле Makefile этого не сделает, так что, пожалуйста, воспользуйтесь DIST_SUBDIR.)
Замечание: Это не коснётся тех сайтов MASTER_SITES, которые вы указали в вашем файле Makefile.
Укажите здесь ваш адрес электронной почты. Пожалуйста. :-)
Заметьте, что в качестве значения для MAINTAINER допустимо использование только одного адреса без поля комментария. Должен использоваться формат user@hostname.domain. Пожалуйста, не включайте никакого описательного текста, например, вашего настоящего имени в эту строку--это несколько сбивает с толку bsd.port.mk. Вместо этого помещайте такую информацию в ваш pkg-descr.
Подробное описание того, за что отвечает лицо, поддерживающее порт, даётся в главе MAINTAINER в Makefiles.
Если мейнтейнер порта не ответил на запрос пользователя об обновлении в течение двух
недель (исключая большие праздники), то это можно считать тайм-аутом от мейнтейнера, и
обновление может быть выполнено без явного подтверждения от мейнтейнера. Если мейнтейнер
не отвечает в течение трёх месяцев, то считается, что он отсутствует, и как мейнтейнер
порта, о котором идёт речь, может быть заменён. Исключениями из этого правила является
всё, что сопровождает Группа Менеджеров Дерева Портов FreeBSD <portmgr@FreeBSD.org> или Группа Офицеров
Безопасности <security-officer@FreeBSD.org>.
Запрещено делать любые несанкционированные изменения в портах, которые ведут эти
группы.
За Группа Менеджеров Дерева Портов FreeBSD <portmgr@FreeBSD.org> оставляется право
снять или назначить кого-либо мейнтейнером, по любой причине, а за the Группа Офицеров
Безопасности <security-officer@FreeBSD.org>
оставляется право лишать или назначать права на сопровождение порта по соображениям
информационной безопасности.
Это однострочное описание порта. Пожалуйста, не включайте сюда название пакета (или номер версии программного обеспечения). Комментарий должен начинаться с заглавной буквы и не заканчиваться точкой. Вот пример:
A cat chasing a mouse all over the screen
В файле Makefile переменная COMMENT должна следовать сразу за переменной MAINTAINER.
Пожалуйста, постарайтесь делать строку COMMENT длиной, меньшей, чем 70 символов, так как она выдаётся пользователям в качестве однострочного описания порта.
Многие порты зависят от других портов. Имеется семь переменных, которые вы можете использовать для обеспечения того, что всё требуемое находится на машине пользователя. Имеется также несколько предопределённых переменных, отражающих зависимости для общих случаев, плюс ещё несколько для управления поведением зависимостей.
Эта переменная указывает, от каких совместно используемых библиотек зависит порт. Это список пар lib:dir[:target] где lib - это имя библиотеки, dir - это каталог, в котором можно ее найти в случае, если ее нет на машине, и target - это цель, которую нужно вызвать в этом каталоге. Например,
LIB_DEPENDS=
jpeg.9:${PORTSDIR}/graphics/jpeg:install
проверит наличие библиотеки jpeg со старшим номером версии 9 и перейдет в подкаталог graphics/jpeg вашего дерева портов для ее построения и установки,
если библиотека отсутствует. Часть target может быть
опущена, если она равна DEPENDS_TARGET (по умолчанию install).Замечание: Часть lib - это аргумент, который передается команде ldconfig -r | grep -wF. В этой переменной не должно быть регулярных выражений.
Зависимость проверяется дважды, один раз внутри цели extract, а затем из цели install. Кроме того, имя зависимости помещается в пакет, так что pkg_add(1) будет автоматически его устанавливать, если его нет на пользовательской системе.
В этой переменной перечисляются выполнимые файлы или файлы, от которых зависит работа порта. Это список пар вида path:dir[:target] где path - это имя программы или файла, а dir - каталог, в котором можно найти порт в случае, если его нет в системе, и target - это цель, которую нужно вызвать в этом каталоге. Если path начинается со слэша (/), он воспринимается как файл и его существование проверяется командой test -e; в противном случае предполагается, что это выполнимый файл и для определения того, имеется ли программа в пути поиска пользователя, используется команда which -s.
Например,
RUN_DEPENDS= ${LOCALBASE}/etc/innd:${PORTSDIR}/news/inn \
wish8.0:${PORTSDIR}/x11-toolkits/tk80
проверит, существует ли файл или каталог /usr/local/etc/innd и построит и установит его из подкаталога news/inn дерева портов, если он не будет найден. Он также проверит, имеется ли выполнимый файл с именем wish8.0 в вашем пути поиска, перейдет в подкаталог x11-toolkits/tk80 вашего дерева портов для его построения и установки, если он не будет найден.
Замечание: В приведенном примере innd является выполнимым файлом; если выполнимый файл находится в необычном для пользовательского маршрута поиска файлов месте, вы должны указать полный путь к файлу.
Зависимость проверяется внутри цели install. Кроме того, имя зависимости помещается в пакет, так что программа pkg_add(1) будет автоматически его устанавливать, если он не будет найден в пользовательской системе. Часть target может быть опущена, если она совпадает с DEPENDS_TARGET.
В этой переменной перечисляются выполнимые или обычные файлы, которые требуются порту для его построения. Как и RUN_DEPENDS, это список пар path:dir[:target] Например,
BUILD_DEPENDS=
unzip:${PORTSDIR}/archivers/unzip
будет проверять наличие выполнимого фала с именем unzip и
перейдет в подкаталог archivers/unzip вашего дерева портов для
его построения и установки, если последний не будет найден.Замечание: Под ``построением'' здесь понимается всё, от распаковки до компиляции. Зависимость проверяется из цели extract. Часть target может быть опущена, если она совпадает с DEPENDS_TARGET.
В этой переменной перечисляются выполняемые файлы или просто файлы, которые требуются порту для сгрузки. Как и предыдущие две переменные, это список пар path:dir[:target] Например,
FETCH_DEPENDS=
ncftp2:${PORTSDIR}/net/ncftp2
будет проверять наличие выполняемого файла с именем ncftp2 и
перейдет в каталог net/ncftp2 вашего дерева портов для его
построения и установки, если тот не будет найден.Зависимость проверяется при выполнении цели fetch. Часть target может быть опущена, если она совпадает с DEPENDS_TARGET.
В этой переменной указываются программы или файлы, которые требуются для распаковки порта. Как и в предыдущих случаях, это список пар вида path