11.6 O Utilitário Unix. Make o Gestor do Projectos
O Utilitário Make é uma ferramenta do sistema operativo Unix.
É um gerador de comandos que é muito utilizado como uma ferramenta de engenharia de software para agestão e manutenção de programas.
Make funcione através um ficheiro de descrições que gere comandos para serem executados pelo Shell de Unix. É muito utilizado para gerir as dependências entre ficheiros.
Um Ficheiro Simples de Make
Por convenção o ficheiro de descrição tem nome Makefile
O utilitário make chamado do shell de Unix leia esta ficheiro.
> make program
è criar uma versão, a mais nova, do "program".
à fazer todos os passos necessário de compilação e linking.
Exemplo : um programa para uma lista-ligada que tem:
Para criar o executável a sequência de comandos seria
> cc -c main.c
> cc -c iointerface.c
> cc -c listafn.c
> as -o sort.o sort.s
> cc -o lista main.o iointerface.o listafn.o sort.o /usr/projecto/biglib.a
# Makefile para listaligada
# O compilador de C , podia ser cc , gcc etc.
CC = cc
# O compilador de Assembly
AS = as
lista : main.o iointerface.o listafn.o sort.o o /usr/projecto/biglib.a
$(CC) -o lista main.o iointerface.o listafn.o sort.o usr/projecto/biglib.a
main.o : main.c
$(CC) -c main.c
iointerface.o : iointerface.c
$(CC) -c iointerface.c
listafn.o : listafn.c
$(CC) -c listafn.c
sort.o : sort.s
$(AS) -o sort.o sort.s
# Limpar
limpar :
/bin/rm -f core *.o
Este ficheiro contem
O Alvo é o que nos pretendemos criar.
É separado das suas dependências através um colon. :.
As linhas seguintes são os comandos. (começam com um tab )
Portanto os comandos especifiquem como é que o alvo é criado a partir das suas dependências.
Por exemplo
Para criar este alvo > make main.o
Para criar este alvo > make limpar
cc -o lista main.o iointerface.o listafn.o sort.o /usr/projecto/biglib.a
Para criar este alvo > make lista
Verificação das Dependências
A utilidade de make reside neste parte. Considere o caso em cima quando desejamos criara o executável lista através make lista e um dos ficheiros objecto não existe ou que um dos seus ficheiro código fonte tenha sido alterado e portanto um dos ficheiros objecto refere uma versão velha !
Make a ser invocado primeiro verifique as dependências do alvo !
i) se um dos ficheiros dos dependências não existe procure no resto das suas linhas para uma indicação como é que este ficheiro necessário pode ser criado.
ii) Para qualquer dependência verifique para ver se alguma dos dependência é mais nova do que a versão velha lista. Isto é fácil como Unix guarde sempre o ultimo tempo de modificação dum ficheiro.
iii) repete um processo recursivo para cada dependência, verificando cada dependência quando puder.
Make execute um mínimo número de comandos.. ver os exemplo a seguir
CASO 1: todos os ficheiro fonte alterados
ciunix> make lista
cc -c main.c
cc -c iointerface.c
cc -c listafn.c
as -o sort.o sort.c
cc -o lista main.o iointerface.o listafn.o sort.o /usr/projecto/biglib.a
CASO 2: apenas o ficheiro main.c alterado
ciunix> make lista
cc -c main.c
cc -o lista main.o iointerface.o listafn.o
CASO 3 : ficheiro main.c alterado mas criado o ficheiro objecto )
ciunix> make lista
cc -o lista main.o iointerface.o listafn.o
CASO 4 : nenhum ficheiro alterado .. não vale a pena recompilar !
ciunix> make lista
'lista' is up to date