blah: blah.o
cc blah.o -o blah # Runs third
blah.o: blah.c
cc -c blah.c -o blah.o # Runs second
blah.c:
echo "int main() { return 0; }" > blah.c # Runs first
Quando eu executo make
o comando, ele dá a saída esperada. Agora, se eu touch
o arquivo blah.c, a saída é cc -c blah.c -o blah.o cc blah.o -o blah
, mas quando eu executo o delete
arquivo blah.c, ele continua a criá-lo e a saída é echo "int main() {return 0; }" > blah.c cc -c blah.c -o blah.o cc blah.o -o blah
.
Agora o que não consigo entender é como o 'blah' soube que blah.c não está disponível. Ele apenas verificou blah.o cujo carimbo de data/hora não mudou. É que o próprio blah.o verifica blah.c para qualquer atualização quando foi verificado por 'blah'. De qualquer forma, por que as duas saídas são diferentes? É que touch
ing o arquivo blah.c não o removeu, e blah.o está ciente disso, então ele apenas atualizou seu carimbo de data/hora. O que está realmente acontecendo?