Primer do Projeto de Documentação do FreeBSD para novos colaboradores
Anterior | Capítulo 7 O processo de construção da documentação | Próxima

# 7.3 Includes do Make do projeto de documentação do FreeBSD

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.

## 7.3.1 `doc.project.mk`

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"

### 7.3.1.1 Variáveis

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.

> Nota: 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.

### 7.3.1.2 Condicionais

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 `.endif`s fecham as duas condicionais anteriores, marcando o fim da sua aplicação.

## 7.3.2 doc.subdir.mk

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.

### 7.3.2.1 Variáveis

- `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 .

### 7.3.2.2 Targets e Macros

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}/ )
    .endfor

No 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.

#### 7.3.2.2.1 Targets fornecidos

- `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.

### 7.3.2.3 Mais Condicionais

- `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.

### 7.3.2.4 Construção de Looping no `make (.for)`

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}/ )
    .endfor

No 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.

Anterior | Principal | Próxima
Entendendo `Makefile`s na árvore da documentação | Acima | O Website

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>.