Glaudiston's profileSite pessoal de Glaudist...PhotosBlogListsMore Tools Help

Blog


    November 22

    Autotools, ah se todos usassem !!!

    autotools é um conjunto de ferramentas que simplifica a verificação de dependências e compilação de programas.

    É tão usado no mundo opensource que é até um padrão usado e recomendado pelo gnu.
    tudo se torna simples quando se tem um projeto usando autotools...
    Você apenas descompacta os fontes com:
    tar xvf nomedoarquivo.tar.bz2
    depois usa:
    ./configure
    make
    make install

    Se o código depender de outro componente que não exista em seu ambiente, ele vai ser detectado no ./configure ... sendo assim fica fácil descobrir o que está faltando e instalar esta dependência antes de executar o make que é a parte demorada do processo.

    O make é a compilação do programa... isto costuma demorar... e muitas vezes tem que executar centenas de subcompilações com linhas de comandos que incluem várias bibliotecas e que seria inviável para um usuário digitá-las na mão, um script para esta compilação poderia ser mantido pelo desenvolvedor do programa, mas daria muito trabalho a ele. É aqui que entra o autotools, ele cria este script automaticamente com um esforço mínimo do desenvolvedor.
    Mas infelismente muitos projetos não o usam.

    Vou mostrar em um exemplo prático como é fácil e prático usá-lo.

    Vamos criar um novo diretório com o nome autotools-example:
    $ mkdir autotools-example
    $ cd autotools-example

    teremos um subdiretório src onde ficaram os fontes:
    $ mkdir src

    e agora vamos criar um arquivo representando o nosso código:
    cat > src/main.c << "EOF"
    #include <stdio.h>

    int main(int argc, char** argv)
    {
            printf("funciona!!!\n");
            return 0;
    }

    EOF

    pronto... já temos um código do programa, hora de usar o autotools pra compilar.
    O autotools precisa de um arquivo de referência onde ele vai pesquisar para saber o nome do programa que está sendo compilado e qual é a versão atual, onde estão os arquivos fontes, além de validações obrigatórias ou opcionais, como por exemplo um programa que pode ou não ter suporte a som, dependendo de um parâmetro que o usuário passa para o ./configure... também é no configure.ac que o desenvolvedor personaliza mensagens para o usuário e adiciona verificações adicionais para certificar que o código será compilado.

    parece complicado né ? mas na prática é simples... olhe:
    Primeiro use o autoscan que varre todos os arquivos do diretório e subdiretórios para detectar os arquivos fontes e criar o configure.ac que é um dos arquivos essenciais do autotools que o programador deve editar.
    $ autoscan
    agora devem ter sido criados 2 arquivos: autoscan.log e configure.scan.

    o arquivo configure.scan é o configure.ac que nós precisamos para o autotools, e que foi criado automaticamente pelo comando autoscan e o autoscan.log registra algum erro ou mensagens ocorridas durante o processo do autoscan.
    renomeie o arquivo configure.scan para configure.ac :
    $ mv configure.scan configure.ac

    vamos olhar o conteúdo do configure.ac e analisar o que precisaremos atualizar:
    $ more configure.ac
    #                                                -*- Autoconf -*-
    # Process this file with autoconf to produce a configure script

    AC_PREREQ(2.61)
    AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
    AC_CONFIG_SRCDIR([src/main.c])
    AC_CONFIG_HEADER([config.h])

    # Checks for programs.
    AC_PROG_CC

    # Checks for libraries.

    # Checks for header files.

    # Checks for typedefs, structures, and compiler characteristics.

    # Checks for library functions.

    AC_OUTPUT

    bom... vamos ver...
    todas as linhas começando com #(sharp, cerquilha, ou jogo da velha, como preverir) são comentários, e ignorados pelo autotools, então a primeira linha de código é:
    AC_PREREQ(2.61)
    está dizendo que no ambiente onde será compilado, deve existir instalado o autotools versão 2.61 ou superior.

    Logo após vem:
    AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
    aqui temos o lugar onde dizemos ao autotools qual é o nosso programa, a versão do nosso programa, e o endereço de email para onde os usuários devem mandar emails em caso de erros. atualize isto como preferir como no exemplo abaixo:
    AC_INIT(autotools-example, 1.0, [seuemail at dominio dot com] )

    depois temos:
    AC_CONFIG_SRCDIR([src/main.c])
    aqui ele detectou corretamente o nosso diretório de códigos fontes.

    AC_CONFIG_HEADER([config.h])
    este arquivo config.h deve pelo comando autoheader e server para definir variáveis de compilação para o autotools, como o PACKAGE_NAME, opções ativas por padrão... etc...
    $ autoheader

    agora vamos criar nosso script configure...
    $ autoconf

    pronto... se tudo deu certo, agora você terá um arquivo configure em seu diretório, execute-o:
    $ ./configure

    ele vai verificar tudo pela primeira vez e criar o config.h...

    mas ainda precisamos cuidar do automake que irá compilar o nosso projeto.
    para isto precisamos adicionar um AM_INIT_AUTOMAKE( nomedoprograma, versao ) no configure.ac, então adicione isto logo abaixo de AC_CONFIG_HEADER.
    AM_INIT_AUTOMAKE(exemplo, 1.0)

    além disto também é necessário informar quais Makefiles precisam ser criados... então no finao do arquivo configure.ac altere a linha AC_OUTPUT para:
    AC_OUTPUT([
            Makefile
            src/Makefile
    ])

    pronto, agora execute um autoreconf para atualizar os arquivos:
    $ autoreconf
    vamos atualizar o automake agora com o parâmetro --add-missing, para que ele crie os arquivos faltantes:
    $ automake --add-missing

    agora um ultimo passo é criar o Makefile.am que é bem simples:
    cat > Makefile.am << "EOF"
    SUBDIRS = src

    EXTRA_DIST = NOTES autogen.sh

    EOF

    e um Makefile.ac no diretório de fontes, onde informaremos quem deve ser compilado:
    cat > src/Makefile.am <<"EOF"
    bin_PROGRAMS = exemplo
    exemplo_SOURCES = main.c

    EOF

    vamos criar um script pra reconfigurar os arquivos, já fizemos isto, mas precisaremos fazer varias vezes durante o desenvolvimento, um script vai ajudar muito:

    cat > autogen.sh <<"EOF"
    #!/bin/sh
    #
    aclocal
    automake --add-missing --foreign
    autoconf

    ./configure $*
    EOF

    agora execute ele:
    $ sh autogen.sh

    bem... se vc executar o automake:
    $ automake
    vai receber várias mensagens de erros dizendo q ele não encontrou arquivos necessários... alguns podem ser criados automaticamentes com o parâmetro --add-missing... então vamos criá-los:
    $ automake --add-missing
    $ touch NEWS README AUTHORS ChangeLog

    lembre-se de transformar os links simbólicos possivelmente criados pelo automake --add-missing em arquivos reais antes de compartilhar seu projeto, vc pode fazer isto copiando os arquivos dos links e substituindo-os.

    Neste ponto já deve estar tudo pronto, e você já pode executar:
    ./configure
    make

    e já deve ter um arquivo executavel com o nome exemplo na pasta src... então execute:
    $ src/exemplo
    funciona!!!

    se apareceu funciona!!! parabéns, vc acaba de criar seu primeiro projeto com autotools...

    depois vou mostrar como gerenciar dependências, como o SDL e outros...

    Qualquer dúvida usem os comentários.
    Abs...
    Ton

    Comments

    Please wait...
    Sorry, the comment you entered is too long. Please shorten it.
    You didn't enter anything. Please try again.
    Sorry, we can't add your comment right now. Please try again later.
    To add a comment, you need permission from your parent. Ask for permission
    Your parent has turned off comments.
    Sorry, we can't delete your comment right now. Please try again later.
    You've exceeded the maximum number of comments that can be left in one day. Please try again in 24 hours.
    Your account has had the ability to leave comments disabled because our systems indicate that you may be spamming other users. If you believe that your account has been disabled in error please contact Windows Live support.
    Complete the security check below to finish leaving your comment.
    The characters you type in the security check must match the characters in the picture or audio.

    To add a comment, sign in with your Windows Live ID (if you use Hotmail, Messenger, or Xbox LIVE, you have a Windows Live ID). Sign in


    Don't have a Windows Live ID? Sign up

    Trackbacks

    The trackback URL for this entry is:
    http://glaudiston.spaces.live.com/blog/cns!50A3054EE15AB96C!298.trak
    Weblogs that reference this entry
    • None