170 likes | 248 Views
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 ?.
E N D
Compilação de programas com make 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? 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.
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.
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.
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
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
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?
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
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
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.
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
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:
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)
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
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
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.