make(1) includes são melhor explicados por uma inspeção de código. Aqui estão os arquivos include do sistema:
doc.project.mk
é o principal arquivo include do projeto, que inclui todos os arquivos includes necessários.
doc.subdir.mk
controla a navegação na árvore de documentação durante o processo de construção e instalação.
doc.install.mk
fornece as variáveis que afetam a propriedade e a instalação de documentos.
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.
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.
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 ( 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 .endif
s fecham as duas condicionais anteriores, marcando o fim da sua aplicação.
Este arquivo é muito longo para ser explicado em detalhes. Estas notas descrevem as principais funcionalidades.
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.
As dependências são descritas por
, nas quais, para construir o target
: dependência1 dependência2 ...
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.
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.
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.
.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>.