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
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.