Apesar de existirem algumas outras alternativas às ferramentas automáticas do GNU, o GNU Autotools ainda é o mais utilizado no mundo por motivos de confiança em relação à resultados finais. Ou seja, a experiência levou à essa estabilidade.
Infelizmente, há muita documentação obsoleta na internet sobre o Autotools e muitas reclamações sobre ferramentas automáticas, por esse motivo decidi documentar um teste moderno e bem simplista que eu criei e vou compartilhar com vocês essa experiência que fiz questão de torná-la o mais básico possível para poder alcançar o entendimento.
Mas ainda assim, não deixe de exibir exemplos que funcionem em projetos maiores, que por sinal a ideia é a mesma, só precisa ter um pouco mais de atenção nas configurações.
Todos os tópicos foram separados com Passo à Passo e Listas ordenadas para facilitar a compreensão.
O GNU Autotools , também conhecido como GNU Build System , é um conjunto de ferramentas de programação projetadas para ajudar a tornar os pacotes de código-fonte portáteis para muitos sistemas Unix .
Pode ser difícil tornar um programa de software portátil: o compilador C difere de sistema para sistema; algumas funções da biblioteca estão ausentes em alguns sistemas; arquivos de cabeçalho podem ter nomes diferentes. Uma maneira de lidar com isso é escrever código condicional, com blocos de código selecionados por meio de diretivas de pré-processador (#ifdef
); mas devido à grande variedade de ambientes de construção, essa abordagem rapidamente se torna incontrolável. O Autotools foi projetado para solucionar esse problema de maneira mais fácil.
O Autotools faz parte da cadeia de ferramentas GNU e é amplamente utilizado em muitos pacotes de software livre e de código aberto . Suas ferramentas componentes são licenciadas por software livre sob a Licença Pública Geral GNU, com exceções especiais de licença permitindo seu uso com software proprietário .
O GNU Build System possibilita a criação de muitos programas usando um processo de duas etapas: configure seguido por make .
O Autotools consiste nos programas utilitários GNU Autoconf , Automake e Libtool . Outras ferramentas relacionadas frequentemente usadas ao lado dele incluem o programa GNU make, o GNU gettext , o pkg-config e o GNU Compiler Collection , também chamada GCC/G++.
configure.ac
, execute:Foram criados os arquivos:
autoscan-2.69.log
econfigure.scan
. Onde o conteúdo de autoscan-2.69.log está vazio e o conteúdo de configure.ac é:
configure.scan
para configure.ac
:configure.ac
que possui as informações: AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS) para os nomes do seu projeto, ex.:
AC_INIT(teste, 1.0, teste@terminalroot.com.br) . Caso deseje, use o Sed para isso, assim:Ou use um editor de texto de preferência, exemplo: Vim .
Ao final meu arquivo ficou assim:
configure
inicial:Foram criados: 1 novo diretório e 1 novo arquivo:
autom4te.cache/
e oconfigure
. O conteúdo dos mesmos são extensos, oconfigure
por exemplo possui 3549 linhas.
Makefile.am
:E insira esse conteúdo dentro:
Makefile.am
só que desta vez dentro do diretório src/
:E insira esse conteúdo dentro:
Makefile.am
só que desta vez dentro do diretório man/
:E insira esse conteúdo dentro:
Makefile.am
só que desta vez dentro do diretório scripts/
:E insira esse conteúdo dentro:
Makefile.am
só que desta vez dentro do diretório doc/
:E insira esse conteúdo dentro:
Makefile.am
só que desta vez dentro do diretório examples/
:E insira esse conteúdo dentro:
Abra o arquivo
vim configure.ac
E insira o conteúdo AM_INIT_AUTOMAKE(teste, 1.0), logo depois do AC_INIT([teste], [1.0], [teste@terminalroot.com.br]):
Se quiser que fique mais fácil, basta usar esse comando abaixo( Sed ):
Alterando a linha que contém: AC_OUTPUT com Sed (caso deseje use um editor de texto e faça manualmente):
configure
e os modelos de Makefile:Foi gerado mais um arquivo no diretório raíz do projeto, com o nome:
aclocal.m4
Makefile.in
com o argumento --add-missing
:A saída será algo similar ou igual(se usou os arquivos desse tutorial) à:
Perceba a linha: configure.ac:8: error: required file ‘config.h.in’ not found , se isso aparecer também para você, rode:
configure
:Se quiser verificar se está tudo certo, rode o ./configure
, o make
e teste a execução do programa: cd src/ && ./teste
, a saída será: Somente um teste para o Autotools .
E se quiser instalar no sistema, rode:
Considerando que você tem o
sudo
instalado e faz parte do grupo, caso contrário omake install
só funcionará com oroot
.
A instalação vai criar alguns diretório e fazer as seguintes cópias dos arquivos para os caminhos:
teste
(independente do diretório que você estiver) vai obter a saída da execução do programa: Somente um teste para o Autotools;script-teste.sh
(independente do diretório que você estiver) vai obter a saída da execução do programa: Only a teste;info teste
ou man teste
(independente do diretório que você estiver) vai obter o manual;cat /usr/local/share/doc/teste/README.md
;cat /usr/local/share/doc/teste/my-example-teste.dat
.Para desinstalar precisará estar no diretório de testes/
e rode o comando:
Absolutamente TUDO será desinstalado, a saída será similar/igual:
Caso deseje ver funcionando tudo que fizemos aqui, use arquivos pré-prontos ou execute um script simples de Bash:
E use os arquivos de ambiente já pré-criados: gnu-autotools/testes/
ou simplesmente rode o script que cria os arquivos do zero: ./gnu-autotools.sh
Ou gere tudo inclusive os comandos do Autotools via script com o arquivo: ./gnu-autotools-full.sh
Em resumo o GNU Autotools :
autoscan
tenta produzir uma arquivo configure.ac
correto pela execução de analises simples nos arquivos do pacote;autoconf
produz dois arquivos: autom4te.cache
e o configure
;autom4te.cache
é um diretório usado para acelerar o trabalho das ferramentas, e pode ser removido quando o pacote for liberado;configure
é o script shell que é chamado pelos usuários finais. Nesse ponto, o que o arquivo configure faz é somente checar por dependências como sugerido pelo autoscan, então nada muito conclusivo ainda;automake
o autoconf
. O automake
gera alguns “modelos” que os scripts gerados pelo autoconf
traduzirão nos Makefiles. Um arquivo makefile inicial é necessário na raiz do pacote: ./Makefile.am;automake
assumirá. O modo “foreign” significa não GNU, e é comum ser usado;Makefile.am
para cada um desses diretórios. O automake
irá passar por casa um deles para produzir o arquivo Makefile.in
correspondente. Esses arquivos *.in
serão usados pelos scripts do autoconf
para produzir os arquivos Makefile
finais.src/Makefile.am
definimos todos os arquivos que serão criados e compilados. Em geral, os sufixos em letras maiúsculas como “_PROGRAMS” são chamados primary e dizem parcialmente o que executar no seu argumento; os prefixos, em letras minúsculas (não tem um nome pré-fixado) dizem o diretório onde será instalado. Para informar diversos arquivos, usa-se assim mais ou menos:scripts/
geralmente possuem o Shell Script que irá chamar o executável, bem como modelos de autocomplete(compgen) de parâmetros. Utilizamos um conteúdo de exemplo, mas o certo mesmo seria assim (exemplo do script do Firefox):Ou seja, ele chamará o executável que foi compilado e instalado em /opt
no seu devido diretório ;
aclocal
cria as ferramentas que geram cada script gera o arquivo aclocal.m4
que contém macros para as coisas do automake
;automake
lê o configure.ac
e o Makefile.a
m, interpreta-os e, para cada Makefile.am
produz um Makefile.in
. O argumento --add-missing
diz ao automake
para fornecer scripts padrão para qualquer erro reportado, assim pode ser omitido nas próximas execuções;autoreconf
(usado para regularizar a falta de config.h.in
) compila todas as ferramentas relevantes na ordem correta e instala os arquivos ausentes. Os parâmetros -f
(considera que tudo está obsoleto e força a reconfiguração) e -i
(faz uma cópia de arquivos auxiliares presentes no sistema para seu projeto, chama o autoheader
) . Ainda poderíamos unir ao parâmetro -v
ficando -vfi
para ver os detalhes dos procedimentos.
autotools
→ autoscan
(configure.scan) → configure.ac
→ autoconf
(autom4te.cache e configure inicial) → Makefile.am
(*
) → aclocal
(aclocal.m4) → automake
(Makefile.in) → autoreconf
(config.h.in/header
) → autoconf(./configure
) → Makefile
(make && make install)
gnu autotools make linguagemc cpp