Apenas tocando no arquivo mod1.c
, make
deve apenas recompilar esse arquivo de origem, produzir seu arquivo de objeto correspondente, mod1.o
, e não deve recompilar mod2.c
, porque o arquivo de objeto mod2.o
ainda estará completamente atualizado ( mod2.c
está, como intocado, ainda mais antigo que mod2.o
, então não há necessidade de recompilar). Mas eu obtenho o seguinte comportamento:
(Esta não é uma criação pessoal, é de um exemplo escrito de uma fonte em make
[dizendo o texto que alguém testemunhará como make
sabe que mod2.c
está intocado e não o recompilará]).
Faça o arquivo
$ cat Makefile
SRC = mod1.c mod2.c main.c
OBJ = mod1.o mod2.o main.o
PROG = dbtest
$(PROG): $(OBJ)
gcc $(OBJ) -o $(PROG)
$(OBJ): $(SRC)
O problema:
$ make
make: 'dbtest' is up to date.
$ touch mod1.c
$ make
cc -c -o mod1.o mod1.c
cc -c -o mod2.o mod2.c
cc -c -o main.o main.c
gcc mod1.o mod2.o main.o -o dbtest
Conteúdo dos arquivos
$ cat mod1.c
#include <stdio.h>
void foo() {
printf("Hello ");
}
$ cat mod2.c
#include <stdio.h>
void bar() {
printf(“World\n”);
}
$ cat main.c
#include <stdio.h>
void foo();
void bar();
int main (void) {
foo();
bar();
return 0;
}
O problema vem desta linha:
Que se expande para
que diz que
mod1.o
,mod2.o
, emain.o
dependem demod1.c
,mod2.c
, emain.c
, de modo que todos os três devem ser reconstruídos se algum dos arquivos de origem for alterado.Para obter o comportamento desejado, remova a linha: O Make usará suas regras internas que dizem que um determinado
.o
arquivo é criado a partir de seu.c
arquivo equivalente, se tal arquivo existir.