The main task for build system is deciding if the target is out-of-date and needs rebuilding. The single most reliable way to do that is to compare file’s content with previously recorded one. But that is too expensive.
So direct content storage/comparison can be replaced with
collision-resistant hash function of enough length.
uses BLAKE3 with 256-bit
output for that purpose.
Also it stores file’s size. Obviously if size differs, then file’s content too and there is no need to read and hash it.
But still it could be relatively expensive. So there are additional
possible checks that can skip need of hash checking, based on some trust
to the underlying filesystem and operating system behaviour, controlled
$REDO_INODE_TRUST environment variable value:
Do not trust filesystem at all, except for file’s size knowledge. Most reliable mode.
ctime value of file’s inode. It should change every time
inode is updated. If nothing is touched and
ctime is the same,
then assume that file was not modified and we do not try to read its
ctime also changes if link count is
updated and ownership, that could give false positive decision and force
mtime value of file’s inode. It should change every time
file’s content is updated. But unfortunately there are
many reasons it won’t.
Pay attention that although
mtime is considered harmful (link
above), and is hardly acceptable in build system like Make, because it
compares timestamps of two files, redo is satisfied only with the fact
of its changing, so badly jumping clocks are not so devastating. Modern
filesystem and operating systems with micro- and nano-seconds resolution
timestamps should be pretty good choice for
However GNU/Linux with
ext4 filesystem can easily have pretty big
granularity of 10ms.
$REDO_INODE_TRUST=ctime by default.