17
Compilação de programas com make Prof. André Leon S. Gradvohl, Dr. [email protected]

Compilação de programas com m ake

  • Upload
    jerom

  • View
    25

  • Download
    0

Embed Size (px)

DESCRIPTION

Compilação de programas com m ake. Prof. André Leon S. Gradvohl , Dr. [email protected]. 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

Page 1: Compilação de programas com  m ake

Compilação de programas com make

Prof. André Leon S. Gradvohl, Dr.

[email protected]

Page 2: Compilação de programas com  m ake

2

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

• Vantagens

• Estrutura de um makefile• Dependências e regras

• Makefile avançado

Page 3: Compilação de programas com  m ake

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.

Page 4: Compilação de programas com  m ake

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.

Page 5: Compilação de programas com  m ake

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.

Page 6: Compilação de programas com  m ake

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 .

Page 7: Compilação de programas com  m ake

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.

Page 8: Compilação de programas com  m ake

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?

Page 9: Compilação de programas com  m ake

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

Page 10: Compilação de programas com  m ake

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

Page 11: Compilação de programas com  m ake

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.

Page 12: Compilação de programas com  m ake

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

Page 13: Compilação de programas com  m ake

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:

Page 14: Compilação de programas com  m ake

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.

Page 15: Compilação de programas com  m ake

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

Page 16: Compilação de programas com  m ake

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.

Page 17: Compilação de programas com  m ake

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.