Contents|Index|Previous|Next

Interrupting or Killing make

If make gets a fatal signal while a command is executing, it may delete the target file that the command was supposed to update. This is done if the target file’s last-modification time has changed since make first checked it.

The purpose of deleting the target is to make sure that it is remade from scratch when make is next run. Why is this? Suppose you use Ctrl-c while a compiler is running, and it has begun to write an object file ‘foo.o’. The Ctrl-c kills the compiler, resulting in an incomplete file whose last-modification time is newer than the source file ‘foo.c’. But make also receives the Ctrl-c signal and deletes this incomplete file. If make did not do this, the next invocation of make would think that ‘foo.o’ did not require updating—resulting in a strange error message from the linker when it tries to link an object file half of which is missing.

You can prevent the deletion of a target file in this way by making the special target, .PRECIOUS, depend on it. Before remaking a target, make checks to see whether it appears on the dependencies of .PRECIOUS, and thereby decides whether the target should be deleted if a signal happens. Some reasons why you might do this are that the target is updated in some atomic fashion, or exists only to record a modification-time (its contents do not matter), or must exist at all times to prevent other sorts of trouble.