# Automake

GNU Automake é uma ferramenta de programação que produz arquivos makefile portáveis para o uso do programa make, usado na compilação de software. É produzido pela Free Software Foundation como um dos programas GNU, e é parte do GNU build system. Os makefiles produzidos seguem padrões de codificação GNU.
Ele é escrito em linguagem de programação Perl e deve ser usado com o autoconf. Automake contém os seguintes comandos:
* aclocal
* automake
aclocal, entretanto, é um programa de propósito geral que pode ser útil para usuários autoconf. O GNU Compiler Collection, por exemplo, usa aclocal mesmo sendo o makefile escrito manualmente.
Como Autoconf, Automake pode ser difícil de lidar porque ele não é inteiramente compatível com versões anteriores. Por exemplo, um projeto criado com automake 1.4 pode não necessariamente funcionar com automake 1.9.

## Enfoque

Automake tenta facilitar o trabalho de escrever um makefile, utilizando linguagem de alto nível, em contraposição de ter de escrever todo o arquivo manualmente. Ele pede:
* uma linha que declara o nome do programa a ser construído;
* uma lista de arquivos fontes;
* uma lista de opções para comandos de linha a serem passados para o compilador (diretórios onde os arquivos podem ser encontrados);
* uma lista de opções para comandos de linha a serem passados para o linker (quais bibliotecas o programa utiliza e em que diretórios eles podem ser achados).
Dessa informação, Automake gera um makefile que permite ao usuário:
* compilar o programa;
* limpar (isto é, remove os arquivos intermediários da compilação);
* instala o programa em diretórios padrão;
* desinstala o programa de onde ele foi instalado;
* cria um arquivo de distribuição de código (comumente chamado um tarball);
* testa se esse arquivo é autosuficiente, e em particular se o programa pode ser compilado num diretório outro que não o diretório em que será utilizado.

### Geração de dependências

Automake também gera automaticamente as dependências, de modo que quando o arquivo fonte é modificado, a próxima invocação do comando make sabe quais os arquivos fonte precisam recompilação. Se o compilador permitir, Automake tenta fazer um sistema dinâmico de dependências: quando o arquivo fonte é compilado, que dependências de arquivos são atualizadas perguntando ao compilador para regenerar a lista de recompilação. Em outras palavras, traceamento de dependências é o efeito colateral de um processo de compilação. Essa tentativa de evitar o problema com dependências de sistema estáticas, onde as dependências são detectadas somente quando o programador começa a trabalhar no projeto.
Nesse caso, se um arquivo fonte ganha uma nova dependência (por exemplo, se o programador acrescenta uma nova directiva #include em um arquivo fonte C) e, em seguida, é introduzida uma discrepância entre o real dependências e aqueles que são utilizados pelo sistema de compilação . O programador deve, então, regenerar as dependências, mas corre o risco de nos esquecermos de o fazer.
No caso geral, automake gera dependências através da bundled depcomp script, que irá invocar o compilador adequadamente ou retroceder para makedepend. Se o compilador é suficientemente recente versão do gcc, porém, a dependência automake irá inline geração código para chamar o gcc diretamente.

### Libtool

Automake pode também ajudar na compilação de bibliotecas gerando automaticamente makefiles que irão invocar o Libtool. O programador é então aliviado de ter de saber como chamar a Libtool diretamente, e o projeto se benefecia do uso de uma ferramenta criação de biblioteca portável.

## Saneando o ambiente de construção

Muitos Autoconf configuram scripts de saída com a mensagem "checking whether build environment is sane..." cedo na fase de configuração. Essa mensagem é o resultado de testes feitos pela macro do Automake: AM_SANITY_CHECK. Ela checa se o arquivo criado no diretório de construção é mais novo que o arquivo fonte do diretório de fontes. Pode falhar em sistemas onde o relógio não é ajustado. Essa macro roda automaticamente de AM_INIT_AUTOMAKE.