Capítulo 5. Gerenciando mais código com Make
O utilitário GNU make, normalmente abreviado make, é uma ferramenta para controlar a geração de executáveis a partir de arquivos fonte. make determina automaticamente quais partes de um programa complexo foram alteradas e precisam ser recompiladas. make usa arquivos de configuração chamados Makefiles para controlar a forma como os programas são construídos.
5.1. Visão geral do GNU make
e Makefile
Para criar uma forma utilizável (geralmente arquivos executáveis) a partir dos arquivos de origem de um determinado projeto, execute várias etapas necessárias. Registre as ações e sua seqüência para poder repeti-las posteriormente.
O Red Hat Enterprise Linux contém o GNU make
, um sistema de construção projetado para este fim.
Pré-requisitos
- Entendendo os conceitos de compilação e vinculação
GNU make
GNU make
lê Makefiles que contém as instruções que descrevem o processo de construção. Um Makefile contém múltiplos rules que descrevem uma forma de satisfazer uma determinada condição (target) com uma ação específica (recipe). As regras podem depender hierarquicamente de outra regra.
Rodando make
sem nenhuma opção faz com que ele procure por um Makefile no diretório atual e tente alcançar o alvo padrão. O nome real do arquivo Makefile pode ser um de Makefile
, makefile
, e GNUmakefile
. O alvo padrão é determinado a partir do conteúdo do Makefile.
Detalhes do Makefile
Os makefiles utilizam uma sintaxe relativamente simples para definir variables e rules, que consiste de um target e um recipe. O alvo especifica qual é a saída se uma regra é executada. As linhas com receitas devem começar com o caracter TAB.
Normalmente, um Makefile contém regras para compilar arquivos fonte, uma regra para ligar os arquivos objeto resultantes, e um alvo que serve como ponto de entrada no topo da hierarquia.
Considere o seguinte Makefile
para construir um programa em C que consiste em um único arquivo, hello.c
.
all: hello hello: hello.o gcc hello.o -o hello hello.o: hello.c gcc -c hello.c -o hello.o
Este exemplo mostra que para atingir a meta all
, é necessário o arquivo hello
. Para obter hello
, é necessário hello.o
(vinculado por gcc
), que por sua vez é criado a partir de hello.c
(compilado por gcc
).
O alvo all
é o alvo padrão porque é o primeiro alvo que não começa com um período (.). Rodando make
sem nenhum argumento é então idêntico a rodar make all
, quando o diretório atual contém este Makefile
.
Típico makefile
Um Makefile mais típico usa variáveis para generalização das etapas e adiciona um alvo "limpo" - remover tudo menos os arquivos fonte.
CC=gcc CFLAGS=-c -Wall SOURCE=hello.c OBJ=$(SOURCE:.c=.o) EXE=hello all: $(SOURCE) $(EXE) $(EXE): $(OBJ) $(CC) $(OBJ) -o $@ %.o: %.c $(CC) $(CFLAGS) $< -o $@ clean: rm -rf $(OBJ) $(EXE)
A adição de mais arquivos fonte a esse Makefile requer apenas adicioná-los à linha onde a variável FONTE está definida.
Recursos adicionais
- Marca GNU: Introdução
- Capítulo 2, Código de Construção com GCC