o make nao eh arquivo de lote ou script nao!
o make eh uma ferramenta que verifica pares do tipo "eu quero isso":"eu tenho isso". em cada par ele verifica se o cara da direita eh mais novo ou nao que o cara da esquerda. por exemplo, pega um Makefile simples:
all: fabim
o all eh o target geral do make. para ele atingir os objetivos, ele precisa do fabim. ali tah simples, p/ fazer o fabim, ele nao precisa de mais nada, entao ele vai inferir:
fabim: fabim.c
se vc quiser, pode fazer um Makefile com as duas regras:
all: fabim
fabim: fabim.c
veja que aih tem tb uma segunda diferenca cavalar p/ um arquivo de lote: o make checa as datas. vc roda make e ele soh recompila realmente se fabim.c for mais novo que o atual binario fabim. e daih vc rapidamente percebe q isso pode ser muito util com headers:
all: fabim
fabim: fabim.c fabim.h
nao eh perfeito, mas se vc alterar tanto o .c quanto o .h ele recompila. mas quando vc tem muitos arquivos, vc normalmente precisa compilar os .o separadamente e linkar. entao vc pode ter:
all: fabim
fabim: fabim.o mastk.o
fabim.o: fabim.c fabim.h
mastk.o: mastk.c mastk.h
agora a coisa ficou seria! quando vc compila a primeira vez, ele chega das datas de cada .h e .c, gera o .o e, se tiver algum .o novo, ele relinka p/ formar o binario final.
mas escrever cada .o e suas dependencias .c e .h eh um saco, entao:
TARGET=fabim
OBJS=fabim.o mastk.o
DEPS=fabim.h mastk.h
CFLAGS=-Wall -O3
all: $(TARGET)
$(TARGET): $(OBJS)
%.o: %.c $(DEPS)
clean:
-rm $(TARGET) $(OBJS)
se vc alterar um .c, ele recompila apenas ele e relinka. se vc alterar um .h, ele falha. infelizmente a descricao precisa ser mais completa, pq ele nao sabe exatamente o que estamos querendo fazer... o mais completo seria ensinar ele o que precisa ser feito:
TARGET = fabim
OBJS = fabim.o mastk.o
DEPS = fabim.h mastk.h
CFLAGS = -Wall -O3
CC = gcc
LD = gcc
RM = rm
all: $(TARGET)
$(TARGET): $(OBJS)
$(LD) -o $@ $< $(LDFLAGS)
%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
clean:
-$(RM) $(TARGET) $(OBJS)
agora sim. mexeu em um .h, ele recompila tudo. mexeu em um .c, ele recompila soh o .c. veja que eh um caminho: uma alternativa mais completa, mas mais dificil de manter seria ter uma entrada p/ cada .o referenciando seu respectivo .c e .h. mas eh mais dificil de manter.
uma dica eh ter varios diretorios e makefiles, assim as dependencias ficam hierarquicas e vc nao precisa recompilar o sistema inteiro soh pq mudou um .h em uma aplicacao. isso fica restrito ao Makefile daquela aplicacao. mas, normalmente, mudar um .h jah gera bastante problemas e acho que nao tem uma receita de bolo universal.
da mesma forma, tem gente q prefere fazer um find e achar todos os .c e .h. eu francamente nao acho muito interessante pq as vezes tem arquivos .c e .h q estao no projeto, mas nao estao sendo usados. dah p/ automatizar isso, mas tem que saber o que esta fazendo tb neh hehehe
vc pode automatizar tudo e com isso ter uma compilacao bem simples, mas eu prefiro ter certeza do que estou compilando. de qq forma, o make facilita enormemente a vida em projetos grandes, pq poupa bastante tempo de compilacao. se vc muda uma unica linha em um arquivo .c, ele nao precisa recompilar tudo novamente.
ah sim: roda um make -d que ele mostra tudo! ;D
fabim escreveu:AH, tá agóra eu consegui destravar o fuse de limitação de visão longa. Consegui entender agora, bhá !!
Na verdade, o make, é simplesmente uma automação do que pode ser feito manualmente.
Eu por exemplo posso compilar 10 X *.C.
E depois eu posso montar eles, etc.
O make na verdade faz tudo como se eu estivesse no terminal digitando aqueles comandos.
É isso mêmu ?