Compilação de programas com m ake

Preview:

DESCRIPTION

Compilação de programas com m ake. Prof. André Leon S. Gradvohl , Dr. gradvohl@ft.unicamp.br. Plano de apresentação. O que é o make ? Vantagens Estrutura de um makefile Dependências e regras Makefile avançado. O que é o make ?. - PowerPoint PPT Presentation

Citation preview

Compilação de programas com make

Prof. André Leon S. Gradvohl, Dr.

gradvohl@ft.unicamp.br

2

Plano de apresentação• O que é o make?

• Vantagens

• Estrutura de um makefile• Dependências e regras

• Makefile avançado

3

O que é o make?• Make é um utilitário para facilitar a manutenção de

programas.• A proposta do make é determinar automaticamente

(baseado na data dos arquivos) que pedaços de um programa precisam ser recompilados; em seguida executar comandos para compilá-los e montá-los novamente em um único programa.

• Na verdade, o make pode ser usado para qualquer tarefa que envolva atualização de arquivos.

• Para usar o make, é preciso editar um arquivo texto (puro), geralmente chamado makefile, com as regras de compilação.

4

Vantagens do make• As vantagens do make são:

1. Organizar do processo de compilação dos arquivos

2. Evitar a compilação desnecessária de arquivos que não foram modificados.

3. Facilitar a manutenção dos arquivos necessários para a criação do programa.

4. Otimizar o processo de compilação dos programas.

5

Estrutura de um makefile• O makefile consiste de linhas de dependência que

definem um target (regra), seguida por dois pontos e, opcionalmente, um conjunto de arquivos ou outras regras dos quais a regra inicial depende.

• Após cada linha de dependência, pode existir uma série de comandos que definem como transformar os arquivos na regra.

6

Estrutura de um makefile• Exemplo:

CC=gccprograma: arq1.o arq2.o<TAB> $(CC) arq1.o arq2.o –o programaarq1.o: arq1.c<TAB> $(CC) –c arq1.c –o arq1.o arq2.o: arq2.c<TAB> $(CC) –c arq2.c –o arq2.o

Para obter a regra programa, é preciso

executar antes as regras arq1.o e arq2.o

Para executar a regra arq1.o, é preciso que o

arquivo arq1.c. Se existir, arq1.c será compilado e gerará o arquivo arq1.o .

Para executar a regra arq2.o, é preciso que o

arquivo arq2.c. Se existir, arq2.c será compilado e gerará o arquivo arq2.o .

7

Estrutura de um makefile• Exemplo:

CC=gccprograma: arq1.o arq2.o<TAB> $(CC) arq1.o arq2.o –o programaarq1.o: arq1.c<TAB> $(CC) –c arq1.c –o arq1.o arq2.o: arq2.c<TAB> $(CC) –c arq2.c –o arq2.o

O que acontece se o arquivo arq2.c for modificado?

R. Apenas as regras 1 e 3 serão executadas novamente.

8

Exercício makefile• Suponha que tenhamos um programa em C dividido da

seguinte forma:1. No arquivo main.c está o programa principal.

2. No arquivo funcoes.h está a definição de todas as funções principais que serão usadas no programa.

3. No arquivo funcoesAux.h está a definição de todas as funções principais que serão usadas no programa.

4. No arquivo funcoes.c estão as funções principais do programa.

5. No arquivo funcoesAux.c estão as funções auxiliares do programa.

• Observações:I. As funções principais utilizam funções auxiliares.

II. A função main, no programa principal, utiliza tanto funções principais quanto funções auxiliares.

III. Queremos criar uma regra que apague o programa executável e todos os arquivos objeto (.o) gerados a partir das funções auxiliares.

Como seria esse makefile para gerar o programa Prog.exe?

9

Exercício makefile: SoluçãoCC=gccProg.exe: main.o funcoes.o funcoesAux.o

$(CC) main.o funcoes.o funcoesAux.o –o Prog.exemain.o: main.c funcoes.h funcoesAux.h

$(CC) –c main.c –o main.ofuncoes.o: funcoes.c funcoes.h funcoesAux.h

$(CC) -c funcoes.c –o funcoes.ofuncoesAux.o: funcoesAux.c funcoesAux.h

$(CC) -c funcoesAux.c –o funcoesAux.oclean:

rm –f funcoesAux.o funcoesAux.o main.o Prog.exe

10

Makefile avançado• Como qualquer interpretador de scripts, o make também

interpreta variáveis e alguns símbolos reservados.• Por exemplo, podemos especificar qual o compilador a

ser utilizado, atribuindo o nome do compilador à variável CC, como fizemos nos exemplos anteriores:• CC=gcc

• Podemos também especificar bibliotecas específicas:• LIBS=-lpthread

11

Makefile avançado• Como qualquer interpretador de scripts, o make aceita

comentários, interpreta variáveis e alguns símbolos reservados.

• Por exemplo, podemos especificar qual o compilador a ser utilizado, atribuindo o nome do compilador à variável CC, como fizemos nos exemplos anteriores:• CC=gcc

• Podemos também especificar bibliotecas específicas:• LIBS=-lpthreads

• Veja o exemplo a seguir.

12

Makefile avançado#Definicao do compiladorCC=gcc#definição da bibliotecaLIBS=-lpthreadProg.exe: main.o funcoes.o funcoesAux.o

$(CC) main.o funcoes.o funcoesAux.o $(LIBS)–o Prog.exemain.o: main.c funcoes.h funcoesAux.h

$(CC) –c main.c –o main.ofuncoes.o: funcoes.c funcoes.h funcoesAux.h

$(CC) -c funcoes.c –o funcoes.ofuncoesAux.o: funcoesAux.c funcoesAux.h

$(CC) -c funcoesAux.c –o funcoesAux.oclean:

rm –f funcoesAux.o funcoesAux.o main.o Prog.exe

13

Makefile avançado• Além das variáveis definidas pelo usuário, o makefile

possui alguns truques. Por exemplo:• FONTES=$(wildcard *.c)• O comando lista todos os arquivos que terminam com .c no

diretório atual.• OBJETOS=$(FONTES:.c=.o)• O comando substitui todos os arquivos Fontes que contêm

extensão .c por .o.

• Informe o que acontece no exemplo a seguir:

14

Makefile avançado

FONTES=$(wildcard *.c)OBJETOS=$(FONTES:.c=.o)lista: listaFontes listaObjetoslistaFontes: $(FONTES)@echo “Os arquivos fonte sao” $(FONTES)

listaObjetos: $(OBJETOS)@echo “Os arquivos objetos sao” $(OBJETOS)

O que acontece se os arquivos com a extensão .o não existirem?

R. O make os cria, pois sabe que os arquivos .c são compilados com o compilador para a linguagem C.

15

Makefile avançado• Na seção de regras, um truque interessante pode ser o

seguinte:%.o: %.c$(CC) –c $< -o $@

• Basicamente, o que a regra diz é que todo arquivo .o depende de um arquivo .c.

• O comando para gerar o arquivo .o a partir do arquivo .c é a seguinte:• Compilador $(CC) –c sem o linker.• Deve usar como fonte a dependência $<• E gerar como saída a regra $@

• Portanto, o comando pode ser substituído por:gcc –c arq1.c –o arq1.o

16

Exercício makefile avançado• O que faz o arquivo makefile a seguir?

CC=gccLIBS=-lpthreadFONTES=$(wildcard *.c)OBJETOS=$(FONTES:.c=.o)Prog.exe: $(OBJETOS)

$(CC) $(OBJETOS) $(LIBS) -o $@

%.o: %.c$(CC) -c $< -o $@

clean:rm -f *.o Prog.exe

Considera como FONTES todos os

arquivos com extensão.c.

os arquivos com extensão .o possuem o mesmo nome dos

arquivos .c e ficarão na variável OBJETOS.

Para gerar o Prog.exe são necessários todos os

arquivos objetos.

Para cada arquivo .o deve existir um arquivo .c que deve ser compilado de acordo com o

comando abaixo.

17

Por fim...• Nessa apresentação não foram exploradas todas as

possibilidades do make, apenas as mais comuns.• O make é muito poderoso e, se bem utilizado, pode

diminuir bastante o tempo gasto para compilar um programa.

Recommended