| Проект Документация за FreeBSD - Учебник за нови участници | ||
|---|---|---|
| Prev | Chapter 7 Процес на компилиране на документацията | Next |
Това се обяснява най-добре с поглед върху кода. Това са вградените (include) системни файлове:
doc.project.mk е главният вграден файл на проекти, който включва всички следващи файлове.
doc.subdir.mk е отговорен за обхождането на дървото с документи по време на компилирането и процеса на инсталиране.
doc.install.mk доставя променливите които определят собствеността и инсталацията на документите.
doc.docbook.mk се включва ако DOCFORMAT е docbook и DOC има стойност.
Разгледайте:
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"
DOCFORMAT и MAINTAINER имат стойности по подразбиране ако не са им дадени от make файла на документа.
PREFIX е префикса под който инструментите за компилиране на документацията са инсталирани. При стандартно инсталирани пакети и портове, това е /usr/local.
PRI_LANG трябва да бъде със стойността на натуралния език и енкодинг за читателите за които се компилира документацията. US English е по подразбиране.
Note: PRI_LANG по никой начин не определя кои документи ще бъдат компилирани. Главната цел на променливата е да препратки често използвани документи в корена на документацията на FreeBSD.
Линията .if defined(DOC) е пример за условие в make което както и в други програми дефинира поведение ако определени условия са изпълнени и друго ако не са. defined е функция която връща различен резултат в зависимост от това дали зададената променлива е дефинирана.
.if ${DOCFORMAT} == "docbook", следното проверява дали DOCFORMAT променливата има стойност "docbook", и ако, включва doc.docbook.mk.
Двата .endif-а след горните условия, просто маркират къде се прекратява условието.
Това е твърде дълго за да се обясни само с пример, би трябвало да можете да го разберете със знанията получени от предишните глави, и малкото помощ дадена тук.
SUBDIR е списъка с поддиректории през които процеса на компилиране трябва да премине.
ROOT_SYMLINKS е името на директорията която трябва да бъде свързана с корена на документите при инсталирането с тяхното истинско местоположение, ако текущият език е приоритетният език (зададен от PRI_LANG).
COMPAT_SYMLINK е описана в секцията Makefile-ве на поддиректориите .
Зависимите са описват по следния начин 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 да продължи и в поддиректориите изтривайки компилираните файлове надолу, но не и обратно на горе.
install и package вървят по дървото на директориите викайки истинската версия на себе си. (realinstall and realpackage респективно)
clean премахва файловете създадени от процеса на компилиране (обхождайки дървото на директориите). cleandir прави същото, но премахвайки също и обектните директории, ако има такива.
exists е друга условна функция която връща true ако даденият файл съществува.
empty връща true ако дадената променлива е празна.
target връща true ако дадената цел не съществува.
.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>.