Трудно поверить, но мне кажется, что обычная Makefile idiom " > [email protected]" неверна. В частности, у цели, у которой правило имеет команду, которая выходит из строя, но использует это перенаправление, не будет работать в первый раз, но не в последующие моменты времени. Это связано с тем, что, несмотря на неудачу команды, перенаправление "преуспевает" в смысле создания актуальной (хотя и нулевой) цели.
Мне кажется, что правильная вещь - перенаправить на временный и на успех переименовать это временное значение в цель.
Здесь и пример Makefile:
bad-target:
command-that-will-fail > [email protected]
good-target:
command-that-will-fail > [email protected] || ( rm [email protected]; false )
mv [email protected] [email protected]
clean:
rm -f bad-target good-target
И вот последовательность команд, иллюстрирующая проблему и ее решение:
$ make clean
rm -f bad-target good-target
$ make bad-target
command-that-will-fail > bad-target
/bin/sh: command-that-will-fail: not found
make: *** [bad-target] Error 127
$ make bad-target
make: `bad-target' is up to date.
$ make good-target
command-that-will-fail > good-target.tmp || ( rm good-target.tmp; false )
/bin/sh: command-that-will-fail: not found
make: *** [good-target] Error 1
$ make good-target
command-that-will-fail > good-target.tmp || ( rm good-target.tmp; false )
/bin/sh: command-that-will-fail: not found
make: *** [good-target] Error 1