5.14. Установка файлов

5.14.1. Макросы INSTALL_*

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

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

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

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

Если вам нужно удалить отладочную информацию из файла без использования макросов INSTALL_PROGRAM и INSTALL_LIB, то это можно сделать при помощи ${STRIP_CMD}. Обычно это делается внутри цели post-install. К примеру:

post-install:
	${STRIP_CMD} ${PREFIX}/bin/xdl

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

5.14.3. Установка целого дерева файлов

Иногда существует необходимость в установке большого количества файлов с сохранением их иерархической организации, т.е. в копировании дерева каталогов целиком из WRKSRC в целевой каталог внутри PREFIX.

Для этой ситуации существует два макроса. Преимущество от использования этих макросов вместо команды cp в том, что они гарантируют установку правильного владельца и прав на конечные файлы. Первый макрос, COPYTREE_BIN, делает все устанавливаемые файлы исполняемыми, что подходит для установки в PREFIX/bin. Второй макрос, COPYTREE_SHARE, не устанавливает на файлы права исполнения, и, таким образом, подходит для установки файлов внутри каталога PREFIX/share.

post-install:
	${MKDIR} ${EXAMPLESDIR}
	(cd ${WRKSRC}/examples/ && ${COPYTREE_SHARE} \* ${EXAMPLESDIR})

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

post-install:
	${MKDIR} ${DATADIR}/summer
	(cd ${WRKSRC}/temperatures/ && ${COPYTREE_SHARE} "June July August" ${DATADIR}/summer/)

А в этом примере будут установлены данные летних месяцев в подкаталог summer каталога DATADIR.

В качестве третьего параметра в макросе COPYTREE_* можно передать дополнительные параметры find. Например, чтобы в первом примере установить все файлы кроме файлов Makefile, можно использовать следующую команду.

post-install:
	${MKDIR} ${EXAMPLESDIR}
	(cd ${WRKSRC}/examples/ && \
		${COPYTREE_SHARE} \* ${EXAMPLESDIR} "! -name Makefile")

Обратите внимание, что эти макросы не производят добавление устанавливаемых файлов в pkg-plist. Вам все еще нужно их перечислить.

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

Если с вашим программным обеспечением поставляется некоторая документация, отличающаяся от стандартных страниц Справочника и файлов info, которая, как вы думаете, будет полезна пользователям, установите ее в каталог PREFIX/share/doc. Это может быть сделано, как и в предыдущем разделе, в цели post-install.

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

Сделайте установку документации зависящей от переменной NOPORTDOCS для того, чтобы пользователи могли выключить это в файле /etc/make.conf, как здесь:

post-install:
.if !defined(NOPORTDOCS)
	${MKDIR} ${DOCSDIR}
	${INSTALL_MAN} ${WRKSRC}/docs/xvdocs.ps ${DOCSDIR}
 .endif

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

Замечание: NOPORTDOCS управляет установкой дополнительной документации в DOCSDIR. Это не относится к стандартным страницам справочника и страницам info. Все, что устанавливается в DATADIR и EXAMPLESDIR, управляется через NOPORTDATA и NOPORTEXAMPLES соответственно.

Эти переменные экспортируются в PLIST_SUB. Их значения появятся там в виде имён путей относительно PREFIX, если это возможно. То есть share/doc/PORTNAME в списке сборки по умолчанию будет заменен на %%DOCSDIR%%, и так далее. (Дополнительную информацию о подстановке в pkg-plist можно найти здесь.)

Все условно устанавливаемые файлы и каталоги с документацией должны быть перечислены в файле pkg-plist с префиксом %%PORTDOCS%%, например:

%%PORTDOCS%%%%DOCSDIR%%/AUTHORS
%%PORTDOCS%%%%DOCSDIR%%/CONTACT
%%PORTDOCS%%@dirrm %%DOCSDIR%%

В качестве альтернативы перечислению файлов документации в файле pkg-plist, порт может указать в переменной PORTDOCS список имён файлов и глобальных шаблонов командного процессора для добавления в окончательный список сборки. Имена будут задаваться относительно DOCSDIR. Таким образом, порт, использующий PORTDOCS и нестандартное местоположение документации, должен задавать соответствующим образом и DOCSDIR. Если каталог указан в PORTDOCS или соответствует шаблону для этой переменной, то полное поддерево с входящими в него файлами и каталогами будет регистрироваться в окончательном списке сборки. Если определена NOPORTDOCS, то файлы и каталоги, перечисленные в PORTDOCS, не будут установлены и добавлены в список сборки порта. Установка документации в PORTDOCS, как это показано выше, остаётся за самим портом. Типичный пример использования PORTDOCS выглядит следующим образом:

PORTDOCS=       README.* ChangeLog docs/*

Замечание: Эквивалентами PORTDOCS для файлов, устанавливаемых в DATADIR и EXAMPLESDIR являются PORTDATA и PORTEXAMPLES соответственно.

Кроме того, вы можете использовать файл pkg-message для вывода сообщений во время установки. За подробной информацией обратитесь к разделу об использовании pkg-message. Файл pkg-message не нужно добавлять в pkg-plist.

5.14.5. Подкаталоги внутри PREFIX

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

По вопросам связанным с системой портов для FreeBSD, пишите по адресу <ports@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите по адресу <doc@FreeBSD.org>.