Red Hat Training

A Red Hat training course is available for RHEL 8

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