Isto é melhor explicado pela inspeção no código. Aqui estão os arquivos include do sistema:
O doc.project.mk é o
principal arquivo include do projeto, que inclui todos os
arquivos includes necessários.
O doc.subdir.mk controla a
navegação na árvore de
documentação durante
o processo de construção e
instalação.
O doc.install.mk fornece as
variáveis que afetam a propriedade e a
instalação de documentos.
O doc.docbook.mk é
incluído se o DOCFORMAT
for docbook e se a variável
DOC estiver definida.
Por inspeção:
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"As variáveis DOCFORMAT e
MAINTAINER serão atribuídas
com valores padrão, se o valor das mesmas não
tiver sido definido no arquivo Makefile do documento.
O PREFIX define o caminho no
qual os aplicativos de
construção da documentação
estão instalados. Para uma instalação
normal através de pacotes e/ou ports, este caminho
será sempre /usr/local.
A variável PRI_LANG deve ser
configurada para refletir o idioma e a
codificação nativa dos usuários aos
quais os documentos se destinam. O Inglês Americano
(US English) é o padrão.
A variável PRI_LANG de
maneira alguma afeta quais documentos serão,
ou que poderão, ser compilados. Sua
função principal é criar links para
os documentos referenciados com maior frequência no
diretório raiz de instalação da
documentação do FreeBSD.
A linha .if defined(DOC) é
um exemplo da condicional do make
, como em outros programas, define o comportamento se
alguma condição é verdadeira ou se
é falsa. defined é uma
função que retorna se uma dada
variável está definida ou não.
A seguir, .if ${DOCFORMAT} == "docbook"
, testa se a variável DOCFORMAT
é "docbook", e neste
caso, inclue o doc.docbook.mk.
Os dois .endifs fecham as duas
condicionais anteriores, marcando o fim da sua
aplicação.
Este arquivo é muito longo para ser explicado por inspeção, você deve ser capaz de interpretá-lo com o conhecimento adquirido nos capítulos anteriores, e com a pequena ajuda dada aqui.
SUBDIR é a lista de
subdiretórios nos quais o processo de
construção deve ser executado.
ROOT_SYMLINKS são os nomes
dos diretórios que devem ser linkados para a
raíz de instalação do documento
a partir da sua localização atual, se o
idioma atual for o idioma primário (especificado
por PRI_LANG).
O COMPAT_SYMLINK já foi
descrito na seção Makefiles de subdiretório
.
As dependências são descritas por
target:
dependência1 dependência2 ...
, nas quais, para construir o
target, você necessita
primeiramente construir as dependências
informadas.
Depois desta descrição, instruções de como construir o target podem ser passadas, no caso do processo de conversão entre o target e estas dependências não tiver sido previamente definido, ou se esta conversão em particular não for a mesma que a definida pelo método padrão de conversão.
A dependência especial .USE
define o equivalente a uma macro.
_SUBDIRUSE: .USE
.for entry in ${SUBDIR}
@${ECHO} "===> ${DIRPRFX}${entry}"
@(cd ${.CURDIR}/${entry} && \
${MAKE} ${.TARGET:S/realpackage/package/:S/realinstall/install/} DIRPRFX=${DIRPRFX}${entry}/ )
.endforNo código acima, _SUBDIRUSE
é agora uma macro, a qual irá
executar determinados comandos quando for listada como
dependência.
O que define esta macro a parte de outros targets?
Basicamente, ela é executada após
as instruções passadas no
processo de construção por ser uma
dependência para o mesmo, e ela não
configura o .TARGET, que é a
variável que contém o nome do target atual
que está sendo construído.
clean: _SUBDIRUSE
rm -f ${CLEANFILES}No código acima, o clean
irá usar a macro _SUBDIRUSE
depois de ter executado a instrução
rm -f ${CLEANFILES}. De fato, isto causa
uma limpeza (clean) na
árvore de diretórios, deletando os arquivos
construídos enquanto vai
descendo pelos subdiretórios,
e não quando vai na direção
oposta.
install e
package, ambos descem pela
árvore de diretórios executando a sua
versão real dentro dos subdiretórios.
(realinstall e
realpackage
respectivamente).
O clean remove os
arquivos criados pelo processo de
compilação (e também desce na
árvore de diretórios).
O cleandir faz a mesma
coisa, e também remove o diretório
de objetos se este existir.
exists é outra
função condicional que retorna verdadeiro
se o arquivo informado existir.
empty retorna verdadeiro se a
variável informada estiver vazia.
target retorna verdadeiro se o
target informado ainda não existir.
O .for fornece uma maneira de
repetir instruções definidas para cada
elemento separado por espaço em uma variável.
Ele faz isso atribuíndo uma variável para
conter o elemento atual da lista que está sendo
examinada.
_SUBDIRUSE: .USE
.for entry in ${SUBDIR}
@${ECHO} "===> ${DIRPRFX}${entry}"
@(cd ${.CURDIR}/${entry} && \
${MAKE} ${.TARGET:S/realpackage/package/:S/realinstall/install/} DIRPRFX=${DIRPRFX}${entry}/ )
.endforNo código acima, se SUBDIR
estiver vazia, nenhuma ação será
executada; se ela possuir um ou mais elementos, as
instruções entre o .for e
o .endfor serão repetidas para
cada elemento, com o entry
sendo substituído com o valor do elemento
atual.
Este, e outros documentos, podem ser obtidos em ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/
Para perguntas sobre FreeBSD, leia a
documentação antes de contatar
<questions@FreeBSD.org>.
Para perguntas sobre esta documentação, envie e-mail para
<doc@FreeBSD.org>.