Makefile

Um ficheiro Makefile contém uma sucessão de regras encadeadas. Uma regra divide-se em três áreas: objetivo, dependências e comandos, dispostos da seguinte forma:

objetivo: dependências
<TAB>comando

Uma regra interpreta-se do seguinte modo: se alguma dependência for mais nova – tiver uma data de criação ou modificação mais recente – que o objetivo, o comando será executado para atualizar o objetivo.

As dependências são ficheiros originais – ficheiros com código fonte – ou, por sua vez, são objetivos de outras regras.

Listagem 125 Makefile
 1main.elf: main.o stack.o
 2    gcc main.o stack.o -o main.elf
 3
 4main.o: main.c
 5    gcc -c main.c -o main.o
 6
 7stack.o: stack.c stack.h
 8    gcc -c stack.c -o stack.o
 9
10clean:
11    rm -rf *.o main.elf

A invocação simples do programa make, procura o ficheiro com nome makefile na diretoria corrente e processa a primeira regra. No exemplo, a regras das linhas 1 e 2.

$ make

Começa por verificar as dependências. As que forem objetivos de outras regras, são processadas segundo essas regras. Neste caso main.o e stack.o são objetivos de outras regras. Depois de processadas as dependências, são comparadas as datas das dependências com a data do objetivo, neste caso comparadas as datas de main.o e stack.o com a data de main.elf. Se alguma dependência for mais recente que o objetivo o comando gcc main.o stack.o -o main.elf é acionado.

Se as dependências não forem objetivos de outras regras, são ficheiros originais. Neste caso passa-se logo para a comparação de datas. Na segunda regra (linhas 4 e 5) é comparada a data de main.o – objetivo – com a data de main.c – dependência – se esta for mais recente então é executado o comando gcc -c main.c -o main.o.

Gerar todos os objetivos presentes em makefile independentemente das datas:

$ make -B

Especificar a regra que se pretende aplicar. Neste caso, apenas a regra clean que aciona a eliminação os ficheiros intermédios.

$ make clean

Usar um ficheiro Makefile com nome diferente de makefile. Por exemplo, makelib.

$ make -f makelib

Num ficheiro Makefile podem usar-se artifícios de escrita para agilizar a sua definição, designadamente: variáveis; variáveis automáticas; regras implícitas.

A variável CFLAGS, definida na linha 3, é usada para especificar opções de compilação comuns. É utilizada nas linhas 8 e 11.

A variável OBJECTS, aplicada como dependência da regra das linhas 7 e 8, permite especificar os ficheiros que irão ser usado para gerar o executável main.elf.

Aos objetivos terminados em .o, para os quais exista uma dependência com o mesmo nome e terminada em .c, e não exista um regra explicita, é aplicada a regras implícita das linhas 10 e 11. Utilizando regras implícitas dispensa-se a escrita de uma regras explicita para cada ficheiro fonte, o que se traduz em grande simplificação nos projetos extensos.

 1CC = gcc
 2
 3CFLAGS = -Wall -g -Og
 4
 5OBJECTS = main.o stack.o
 6
 7main.elf: $(OBJECTS)
 8    $(CC) $(CFLAGS) $^ -o $@
 9
10%.o: %.c
11    $(CC) $(CFLAGS) -c -o $@ $<
12
13clean:
14    rm -rf *.o main

Variáveis automáticas

$@

nome completo do objetivo

$^

todas as dependências

$<

nome da primeira dependência

$?

nome das dependência mais recentes que o objetivo

$*

nome do objetivo sem a extensão

Referências

GNU makehttp://www.gnu.org/software/make/manual/make.html