Hello, I hope you all are doing well.
Some time ago, I was using redo for building a C project, but redo, unlike make is
non-standard, so one needed a redo implementation to build the project. At the
time, redo implementations where either written in Python,Go or had annoying bugs
like creating a target even when it was phony. Also, it seemed to me that no
redo really reflected how powerful redo's simplicity is, so I tried implementing
it myself, resulting in baredo [0]. It should be stable enough to be used
in C projects without much effort, since a C compiler is already required.
However, it was pointed out to me that relying on mtime can give wrong results,
for example:
(a) if the clock is set backwards or in case of insufficient granularity in mtime
then a file that gets modified might have the same mtime
(b) an mmap(2)-ed file can get modified but its mtime might not get updated
soon enough
Various redo implementations store a hash of the file's contents so they can
safely decide if its contents have changed or not.
Personally, I find that mtime is reliable enough, (redo especially compares for
equality).
What would you expect from a build system? Should it trust mtime?
Is it responsible for verifing the file's contents for actual changes?
More generally, what are the key features that make a build system useful?
For example,
redo:
- handles filenames correctly (including those with spaces and
newlines). This depends on the scripts respecting that
- can use any executable as building "script"
- does no macro processing etc. and instead leaves that to the
.do file
- flexible/easy dependencies declartions, redo doesn't need to know
the whole dependency tree in advance, e.g.
redo-ifchange hdrs $(cat hdrs)
- can handle dependencies for inexistent files
- each target is treated the same independently of who requires it
- creates its targets atomically
- it basically does only dependecy checking and executing the .do files
so it is needs few code
- easilly supports building targets in parallel without issues
make:
- has standardized behavior
- depends on error-prone mtime comparisons
- doesn't support filenames with spaces (feel free to correct me)
I'm interested in hearing your opinions/experiences about building systems
in general.
Cheers!
[0]
https://github.com/gotroyb127/baredo
Received on Sun Jan 30 2022 - 23:10:27 CET