7.3 Включени в make файлове на Проект по документация на FreeBSD

Това се обяснява най-добре с поглед върху кода. Това са вградените (include) системни файлове:

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 е по подразбиране.

Note: 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 е описана в секцията Makefile-ве на поддиректориите .

7.3.2.2 Цели (Targets) и макроси

Зависимите са описват по следния начин target: dependency1 dependency2 ..., къде да се компилира target, трябва да компилирате най-напред зависимите (dependencies).

След описването на зависимите могат да бъдат дадени инструкции как да се компилира целта - ако зависимостта между целта и компонентите от които зависи не е предварително зададена или ако точно тази зависимост не същата като по подразбиране.

Специална зависимост .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 е вече макро което ще изпълни определена команда когато се извика като зависимост (dependency).

Кое разграничава това макро от останалите цели? В основни линии то се изпълнява след инструкциите дадени при компилирането (на което е описано като зависимост), и не променя .TARGET, която е променлива съдържаща името на целта която се компилира в момента.

clean: _SUBDIRUSE
    rm -f ${CLEANFILES}

В горния пример, clean ще използва _SUBDIRUSE macro след като изпълни инструкциите rm -f ${CLEANFILES}. Като ефект това кара clean да продължи и в поддиректориите изтривайки компилираните файлове надолу, но не и обратно на горе.

7.3.2.2.1 Предоставени цели

  • install и package вървят по дървото на директориите викайки истинската версия на себе си. (realinstall and realpackage респективно)

  • clean премахва файловете създадени от процеса на компилиране (обхождайки дървото на директориите). cleandir прави същото, но премахвайки също и обектните директории, ако има такива.

7.3.2.3 Още за условностите

  • exists е друга условна функция която връща true ако даденият файл съществува.

  • empty връща true ако дадената променлива е празна.

  • target връща true ако дадената цел не съществува.

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

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

Този и други документи можете да намерите в ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

За въпроси отностно FreeBSD, прочетете документацията преди да попитате в <questions@FreeBSD.org>.
За въпроси отностно този документ, e-mail <doc@FreeBSD.org>.