$ 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 зависимости. А нахрена?