7.3. Включаемые make-файлы Проекта Документирования FreeBSD

Лучше всего это описывается при обсуждении кода. Вот системные включаемые файлы:

7.3.1. doc.project.mk

Рассмотрим пример:

DOCFORMAT?=    docbook
MAINTAINER?=    doc@FreeBSD.org

PREFIX?=    /usr/local
PRI_LANG?=  en_US.ISO8859-1

.if defined(DOC)
.if ${DOCFORMAT} == "docbook"
.include "doc.docbook.mk"
.endif
.endif

.include "doc.subdir.mk"
.include "doc.install.mk"

7.3.1.1. Переменные

Переменным DOCFORMAT и MAINTAINER заданы значения по умолчанию, если они не установлены в make-файле документа.

PREFIX является каталогом, под которым установлены инструменты для построения документации. При обычной установке портов и пакаджей это /usr/local.

PRI_LANG должна быть установлена в значение, соответствующее языку и кодировке, являющейся естественной для тех пользователей, кому предназначена документация. По умолчанию это US English.

Замечание: PRI_LANG не влияет на то, какие документы могут или будут строиться. Ее основное назначение - создание ссылок на часто упоминаемые документы в корне установки документации FreeBSD.

7.3.1.2. Условия

Строка .if defined(DOC) является примером make-условия, которое, как и в других программах, определяет дальнейшие действия, если какое-то условие выполняется или нет. defined является функцией, которая возвращает информацию о том, определена данная переменная или нет.

Затем .if ${DOCFORMAT} == "docbook" проверяет, является ли значением переменной DOCFORMAT "docbook", и в этом случае включается файл doc.docbook.mk.

Две строки .endif закрывают два вышестоящих условия, отмечая конец их действия.

7.3.2. doc.subdir.mk

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

7.3.2.1. Переменные

  • SUBDIR представляет из себя список подкаталогов, которые должны быть охвачены процессом построения.

  • ROOT_SYMLINKS является именами каталогов, которые должны указывать на корень установки документа от их действительных положений, если текущий язык является основным (что задается переменной PRI_LANG).

  • COMPAT_SYMLINK описано в разделе о make-файле подкаталога.

7.3.2.2. Цели и макросы

Зависимости описываются парами target: dependency1 dependency2 ..., и когда вам нужно построить target, вам необходимо сначала построить список зависимостей.

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

Особая зависимость .USE задает эквивалент макроса.

_SUBDIRUSE: .USE
.for entry in ${SUBDIR}
    @${ECHO} "===> ${DIRPRFX}${entry}"
    @(cd ${.CURDIR}/${entry} && \
    ${MAKE} ${.TARGET:S/realpackage/package/:S/realinstall/install/} DIRPRFX=${DIRPRFX}${entry}/ )
.endfor

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

Что отличает этот макрос от других целей? В основном то, что он выполняется после инструкций, данных в процедуре построения, в качестве зависимости для которой он перечислен, и это не влияет на .TARGET, которая является переменной, содержащей название текущей выполняемой цели.

clean: _SUBDIRUSE
    rm -f ${CLEANFILES}

В вышеприведенном фрагменте clean будет использовать макрос _SUBDIRUSE после того, как выполнит инструкцию rm -f ${CLEANFILES}. В результате это приведет к тому, что clean будет углубляться по дереву каталогов, удаляя файлы после перехода ниже, а не на пути назад.

7.3.2.2.1. Предопределенные цели

  • Цели install и package обе переходят вниз по дереву каталогов, вызывая собственные выполняющие реальную работу версии в подкаталогах. (realinstall и realpackage соответственно)

  • clean удаляет файлы, созданные в процессе построения (и тоже переходит вниз по дереву каталогов). cleandir делает то же самое и также удаляет каталог, если он есть.

7.3.2.3. Подробности об условиях

  • exists является еще одной функцией условия, которая возвращает истину, если указанный файл существует.

  • empty возвращает истину, если данная переменная имеет пустое значение.

  • target возвращает истину, если указанная цель еще не существует.

7.3.2.4. Циклы в make (.for)

.for дает способ повторить набор инструкций для каждого элемента списка, заданного в переменной через пробел. Он делает это, присваивая переменной значение текущего элемента перебираемого списка.

_SUBDIRUSE: .USE
.for entry in ${SUBDIR}
    @${ECHO} "===> ${DIRPRFX}${entry}"
    @(cd ${.CURDIR}/${entry} && \
    ${MAKE} ${.TARGET:S/realpackage/package/:S/realinstall/install/} DIRPRFX=${DIRPRFX}${entry}/ )
.endfor

В примере выше если переменная SUBDIR пуста, то не предпринимается никаких действий; если она состоит из одного или более элементов, то инструкции между .for и .endfor будут повторены для каждого элемента, причем entry будет заменена значением текущего элемента.

Этот, и другие документы, могут быть скачаны с ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

По вопросам, связанным с FreeBSD, прочитайте документацию прежде чем писать в <questions@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите <doc@FreeBSD.org>.
По вопросам, связанным с русским переводом документации, пишите в рассылку <frdp@FreeBSD.org.ua>.
Информация по подписке на эту рассылку находится на сайте проекта перевода.