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