Руководство FreeBSD по созданию портов
Пред. | Глава 5. Настройка файла Makefile | След.

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

## 5.14.1. Макросы INSTALL_*

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

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

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

- `INSTALL_LIB` - это команда для установки динамических библиотек.

- `INSTALL_KLD` - это команда для установки загружаемых модулей ядра. Некоторые архитектуры предпочитают, чтобы для модулей сохранялись отладочные сведения, по этой причине используйте эту команду вместо `INSTALL_PROGRAM`.

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

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

В основе работы этих макросов лежит команда `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`:

- `DATADIR` преобразуется в ``PREFIX`/share/`PORTNAME``.

- `DATADIR_REL` преобразуется в `share/`PORTNAME``.

- `DOCSDIR` преобразуется в ``PREFIX`/share/doc/`PORTNAME``.

- `DOCSDIR_REL` преобразуется в `share/doc/`PORTNAME``.

- `EXAMPLESDIR` преобразуется в ``PREFIX`/share/examples/`PORTNAME``.

- `EXAMPLESDIR_REL` преобразуется в `share/examples/`PORTNAME``.

> Замечание: `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>.