5.4. Includes do Make do Projeto de Documentação do FreeBSD

make(1) includes são melhor explicados por uma inspeção de código. Aqui estão os arquivos include do sistema:

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

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

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

5.4.1.2. Condicionais

A linha .if defined(DOC) é um exemplo da condicional do make ( 1 ) 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

5.4.2. doc.subdir.mk

Este arquivo é muito longo para ser explicado em detalhes. Estas notas descrevem as principais funcionalidades.

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

  • COMPAT_SYMLINK já foi descrito na seção Makefiles de Subdiretório.

5.4.2.2. Targets e Macros

As dependências são descritas por target: dependência1 dependência2 ..., nas quais, para construir o target, é necessário 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 diferencia essa macro 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 usará a macro _SUBDIRUSE depois de ter executado a instrução rm -f $ {CLEANFILES}. De fato, isso faz com que clean vá mais a fundo na árvore de diretórios, excluindo os arquivos construídos à medida que vai descendo pelos subdiretórios, e não quando vai na direção oposta.

5.4.2.2.1. Targets Fornecidos
  • install e package ambos percorrem a árvore de diretórios executando as suas versões reais dentro dos subdiretórios (realinstall e realpackage respectivamente).

  • clean remove arquivos criados pelo processo de compilação (e também desce na árvore de diretórios). cleandir faz a mesma coisa, e também remove o diretório de objetos se este existir.

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

5.4.2.4. Construções de Looping no make (.for)

.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 .for e .endfor serão repetidas para cada elemento, com o entry sendo substituído com o valor do elemento atual.

All FreeBSD documents are available for download at https://download.freebsd.org/ftp/doc/

Questions that are not answered by the documentation may be sent to <freebsd-questions@FreeBSD.org>.
Send questions about this document to <freebsd-doc@FreeBSD.org>.