1 / 17

Compilação de programas com m ake

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

jerom
Download Presentation

Compilação de programas com m ake

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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: • Organizar do processo de compilação dos arquivos • Evitar a compilação desnecessária de arquivos que não foram modificados. • Facilitar a manutenção dos arquivos necessários para a criação do programa. • 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 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 . Exemplo: CC=gcc programa: arq1.o arq2.o <TAB> $(CC) arq1.o arq2.o –o programa arq1.o: arq1.c <TAB> $(CC) –c arq1.c –o arq1.o arq2.o: arq2.c <TAB> $(CC) –c arq2.c –o arq2.o

  7. Estrutura de um makefile O que acontece se o arquivo arq2.c for modificado? R. Apenas as regras 1 e 3 serão executadas novamente. Exemplo: CC=gcc programa: arq1.o arq2.o <TAB> $(CC) arq1.o arq2.o –o programa arq1.o: arq1.c <TAB> $(CC) –c arq1.c –o arq1.o arq2.o: arq2.c <TAB> $(CC) –c arq2.c –o arq2.o

  8. Exercício makefile • Suponha que tenhamos um programa em C dividido da seguinte forma: • No arquivo main.c está o programa principal. • No arquivo funcoes.h está a definição de todas as funções principais que serão usadas no programa. • No arquivo funcoesAux.hestá a definição de todas as funções principais que serão usadas no programa. • No arquivo funcoes.c estão as funções principais do programa. • No arquivo funcoesAux.c estão as funções auxiliares do programa. • Observações: • As funções principais utilizam funções auxiliares. • A função main, no programa principal, utiliza tanto funções principais quanto funções auxiliares. • 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ção CC=gcc Prog.exe: main.ofuncoes.ofuncoesAux.o $(CC) main.ofuncoes.ofuncoesAux.o –o Prog.exe main.o: main.cfuncoes.hfuncoesAux.h $(CC) –c main.c –o main.o funcoes.o: funcoes.cfuncoes.hfuncoesAux.h $(CC) -c funcoes.c –o funcoes.o funcoesAux.o: funcoesAux.cfuncoesAux.h $(CC) -c funcoesAux.c –o funcoesAux.o clean: rm –f funcoesAux.ofuncoesAux.omain.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 compilador CC=gcc #definição da biblioteca LIBS=-lpthread Prog.exe: main.ofuncoes.ofuncoesAux.o $(CC)main.ofuncoes.ofuncoesAux.o$(LIBS)–o Prog.exe main.o: main.cfuncoes.hfuncoesAux.h $(CC) –c main.c –o main.o funcoes.o: funcoes.cfuncoes.hfuncoesAux.h $(CC) -c funcoes.c –o funcoes.o funcoesAux.o: funcoesAux.cfuncoesAux.h $(CC) -c funcoesAux.c –o funcoesAux.o clean: rm –f funcoesAux.ofuncoesAux.omain.oProg.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 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. FONTES=$(wildcard *.c) OBJETOS=$(FONTES:.c=.o) lista: listaFonteslistaObjetos listaFontes: $(FONTES) @echo “Os arquivos fonte sao” $(FONTES) listaObjetos: $(OBJETOS) @echo “Os arquivos objetos sao” $(OBJETOS)

  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 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. O que faz o arquivo makefile a seguir? CC=gcc LIBS=-lpthread FONTES=$(wildcard *.c) OBJETOS=$(FONTES:.c=.o) Prog.exe: $(OBJETOS) $(CC) $(OBJETOS) $(LIBS) -o $@ %.o: %.c $(CC) -c $< -o $@ clean: rm -f *.o Prog.exe

  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.

More Related