$ cat makefile
b: a
cp a b
a:
# noop
$ rm -f a; touch b; make
# noop
cp a b
cp: cannot stat 'a': No such file or directory
make: *** [makefile:2: b] Error 1
По правилу a понятно: target file не существует – выполняем команды. Что команд нет – не наши проблемы.
А по правилу b не понятно ни черта. Оба правила не .PHONY, файл b существует, a не существует – и правило тем не менее выполняется.
Либо make после отработки правила a вообще не считывает mtime(a) повторно, а тупо берёт текущее время – но это крайне дурацкое кроилово для тулзы, которая на каждый чих в шел форкается. Собственно, я тут вообще глупость написал: что mtime, что текущее время – один syscall.
Либо же явно закодировано: если файл-зависимость не существует после выполнения правила-зависимости, то выполняем зависимое как будто его mtime < mtime зависимости. А нахрена?



