Revista Do Linux  
EDIÇÃO DO MÊS
 Produto
 Atualidades
 Slackware
 Entrevista
 CD do mês
 Capa
 Open Source
 Corporativo
 Programação
 Zope
 Digitalização

 

Compile Programas em Linux
Baixar os fontes de um programa e compilá-los não é um bicho de sete cabeças

Pois é. Finalmente você encontrou aquele programa que estava procurando há tempos na Internet, só que... você encontrou os fontes para serem compilados em sua máquina, não o pacotinho "rpm" que você tanto queria. "Open source" é isso! Tudo o que você tem a fazer agora é simplesmente descompactar, compilar e instalar o programa. Para facilitar as coisas vamos dar um exemplo concreto, utilizando um programa simples, a bc, uma calculadora algébrica do modo texto. Você pode obter a última versão do bc em ftp.gnu.org/gnu/bc/. Enquanto escrevíamos este artigo a última versão do bc era a 1.05a, e é esta que utilizaremos em nosso exemplo.

Uma vez que você tenha feito o download dos fontes, o passo seguinte é escolher um diretório para descompactá-lo. Em princípio você pode utilizar algum diretório dentro de seu próprio diretório home, mas, supondo que você tenha acesso como root, um lugar mais genérico e apropriado seria em /usr/local/src. É uma boa prática concentrar todos os fontes dos programas instalados em sua máquina a partir de um diretório base.

Muito provavelmente o arquivo que você baixou da Internet está compactado. Em Linux há duas ferramentas básicas para compactação e descompactação: o tar e o gzip. O tar é um simples "agregador" de arquivos, e com ele você pode agrupar vários arquivos e diretórios, com sua estrutura, em um único arquivo. Já o gzip é um compactador propriamente dito, no mesmo estilo do pkzip ou do arj.

Daqui para frente vamos admitir que você tem acesso como root ao sistema, e acreditamos que seja o caso da maioria dos leitores. Portanto, vá para o diretório /usr/local/src e descompacte o arquivo:


# cd /usr/local/src
# tar xvfz /onde/voce/baixou/bc-1.05a.tar.gz

O próprio comando para descompactação criou um outro diretório, chamado bc-1.05, no diretório onde você está. O passo seguinte é entrar neste diretório e dar uma olhada no que tem lá:


# cd bc-1.05
# ls -l

Regra geral: sempre leia o README e o INSTALL. Eles são fonte importantíssima de informações sobre o programa que você irá compilar em seu sistema. Em geral eles estão em formato texto, sendo visualizáveis através de ferramentas como o less ou cat. A ferramenta less é a mais adequada, pois permite paginação e busca.


[root@linux bc-1.05]# less README

Podemos ver que o README contém, em geral, informações a respeito do programa e detalhes de utilização. Por sua vez, o arquivo INSTALL contém as instruções que você deve seguir para gerar o programa executável.


[root@linux bc-1.05]# less INSTALL

Em geral, ao lermos o arquivo INSTALL, ele indica que o primeiro passo é entrar no diretório onde estão os fontes (nós já estamos nele!) e executar ./configure. Bem, ./configure é uma das etapas mais comuns neste processo de compilar programas em sua própria máquina. Isto vem do fato de que a grande maioria dos programas são preparados para serem "abertos" através de outros programas, que são geralmente o Autoconf, o Automake e o m4. Uma vez que o objetivo aqui é o de compilar um programa que já está preparado para ser compilado, e não o de gerar um, vamos em frente.

Em última instância o objetivo do script configure é o de coletar informações variáveis e dependentes do sistema onde se irá compilar o programa, com o intuito de se criar um outro arquivo, chamado Makefile, que será utilizado nas fases de compilação, teste (se houver) e instalação. Quando os fontes de um programa seguem a estrutura padrão utilizada nos aplicativos Linux, os passos para se gerar um programa se resumem nos seguintes comandos:



./configure
make
make install

O comando ./configure é na verdade um script, uma série de instruções gravadas em um arquivo texto que são entendidas pelo Linux como comandos. O que estes comandos fazem basicamente é verificar a existência de uma série de arquivos do sistema operacional, imprescindíveis para que se possa gerar o arquivo executável. O produto final do comando ./configure é um arquivo chamado Makefile. Ele contém parâmetros que serão lidos pelo comando make, detalhado a seguir.

O comando make gera o programa final através da checagem de diversas dependências e da execução de programas de compilação e link-edição. Complicado? Vejamos esses conceitos com mais detalhes.

A grande maioria dos programas para o ambiente Linux é codificada nas linguagens C e C++. Não vamos entrar em muitos detalhes nos comandos dessas linguagens, o importante é lembrar que C e C++ são linguagens estruturadas e modulares, ou seja, permitem a criação de módulos simples que são gradualmente associados para gerar um programa maior. Por exemplo, dois módulos que compõem o bc são o numeric.c e o string.c, cada um contendo funções que executam tarefas específicas: o numeric.c faz todo o tratamento de operações aritméticas, enquanto o string.c trata as cadeias de caracteres digitadas quando executamos o programa.

A modularidade é ótima para a organização dos componentes do programa, mas acaba gerando um problema: existem diversas informações que são compartilhadas entre os módulos, que devem estar sempre em concordância. Para isso, seria necessário discriminar essas informações em cada um dos módulos, o que poderia causar erros caso essa discriminação fosse feita errôneamente. A linguagem C/C++ resolve esse problema através da utilização dos includes, arquivos com as discriminações das informações compartilhadas que são incluídos pelos módulos, daí o seu nome. O conceito de includes é utilizado até pelo kernel, sendo que muitos deles contêm informações vitais para a geração e configuração do Linux.

Quando um include é utilizado por um módulo, dizemos que este "depende" daquele, pois caso não exista, o módulo não terá informações fundamentais para sua execução. Além disso, se a informação que está contida em um include for modificada, o módulo que depende dele deverá ser atualizado. Pois bem, é isso que o comando make faz: checa os módulos e os includes dos quais os módulos dependem, para verificar se não houve nenhuma mudança, comparando as datas de criação de cada um.

A compilação é o processo de transformar os comandos em linguagem C/C++ para comandos que o computador entende, chamados de linguagem de máquina. O processo pode ser encarado como um tradutor, convertendo palavras em código binário (zeros e uns). O resultado final de uma compilação é um arquivo denominado código objeto, que contém os comandos em linguagem de máquina. Mas ele ainda não está pronto para ser executado. Ainda falta a link-edição.

Diversos comandos de uso freqüente foram desenvolvidos, testados e aprovados para o uso geral, sendo armazenados em arquivos denominados bibliotecas. A link-edição é a adição ao código objeto desses comandos, que são copiados das bibliotecas às quais pertencem. O produto final da link-edição é o programa executável.

Voltemos à questão das dependências. Como vimos, um programa, para ser gerado, depende de um código objeto e bibliotecas. Além disso, o código objeto e as bibliotecas dependem de um código fonte e dos includes associados a eles. Todas essas dependências são informadas ao programa make, através do arquivo Makefile.

O programa make checa se houve alteração em qualquer um dos módulos, a partir da data de criação do arquivo correspondente ao programa que está sendo gerado. Em nosso caso, o programa bc ainda não existia, e o make foi realizando checagens para as dependências dos códigos objeto. Como estes também não existiam, o make foi verificar os programas fontes e os include. Caso não existisse um include, o make interromperia a geração do programa, mostrando uma mensagem de erro. Como todos os arquivos estavam presentes, o make gerou os códigos objeto, realizou a link-edição e, por fim, gerou o programa.

O comando make é bastante poderoso e genérico. Ele é um dos integrantes da "caixa de ferramentas" do Linux. Seu principal objetivo é o de automatizar as tarefas relativas à geração de programas, desde a compilação até a instalação dos programas no sistema. O make não serve apenas para programas escritos em linguagem C/C++, mas para virtualmente qualquer linguagem. Com make install você está literalmente instalando o programa bc em seu sistema.

 

A Revista do Linux é editada pela Conectiva S/A
Todos os Direitos Reservados.

Política de Privacidade