Olá, olá, e bem vindos a mais um tutorial de programação – ou será esse o primeiro? – de TP, Toupeira Profissional.

Enfim, como programador, eu entendo das agruras do ofício. Mas talvez a pior parte seja compilar e recompilar código trocentas vezes no mesmo dia durante uma fase de testes, ou um bug irritantemente persistente. Em um projeto com pelo menos uns 5 arquivos de código fonte, é simplesmente foda. Felizmente inventaram o aplicativo make, que faz todo o trabalho de compilação e renovação dos executáveis e o que mais por si só.

E é por isso que dedicamos este tutorial em duas partes para explicar como usar o make de forma que ele trabalhe para você de forma saudável, prática e bem-comportada. Vamos começar.

Começando do começo: o que é um make?

Não tem como usar termos mais simples, o make é um aplicativo que serve para gerenciar projetos. Como ele faz isso, entretanto, é a grande sacada.

O make usa um arquivo, o "Makefile", para definir o que deverá ser feito. Em resumo, o Makefile contém uma lista de módulos, cada qual com suas dependências e instruções para processá-lo. Seguindo essas indicações o make faz as operações necessárias.

Um exemplo, por favor

Pois sim. Suponhamos que temos um projeto programado em C, o projeto "xyz", que é composto de vários módulos: o x, o y e o z. Simples não? Enfim, um Makefile plausível seria o seguinte:

xyz: x.o y.o z.o
gcc -o xyz x.o y.o z.o

x.o: x.c x.h
gcc -c -o x.o x.c

y.o: y.c y.h
gcc -c -o y.o y.c

z.o: z.c z.h
gcc -c -o z.o z.c

Executando "make xyz" – ou somente "make", pois o programa automaticamente processa a primeira especificação encontrada de cima pra baixo –, o programa toma conhecimento de que o executável xyz depende dos módulos x.o y.o e z.o. Isso significa que, se os arquivos não existirem ou tiverem sido mudados desde a últiam compilação, o make deve recompilá-los seguindo as instruções especificadas na declaração de cada módulo – e verificando também mudanças nos arquivos .c e .h especificados –, e depois atualizar o xyz compilando-o conforme definido. Senão, ele simplesmente termina e diz que não há nada a ser feito.

Mas o que mais dá pra fazer?

Bom, o make não serve apenas para compilação de programas. Ele pode ser usado para basicamente todo tipo de operação, desde que o Makefile esteja escrito de acordo. Por exemplo, ele também pode ser usado para limpar a pasta dos arquivos-objeto, criar pacotes, listar os arquivos em tais e tais pastas... enfim, tudo depende de como se escreve o Makefile.

E como se escreve um Makefile? Bem, por ora posso dizer que a estrutura básica é simplesmente como o exmpmlo já dado. Além disso, pode-se usar várias construções de shellscript e também alguns comandos do próprio make.

Mas como exatamente? Vamos deixar para o próximo post... ;)