Button: A fast, correct, and elegantly simple build system.
Jason White via Digitalmars-d-announce
digitalmars-d-announce at puremagic.com
Sat Jun 18 01:38:21 PDT 2016
On Friday, 17 June 2016 at 20:36:53 UTC, H. S. Teoh wrote:
> - Assuming that a revision control system is in place, and a
> workspace is checked out on revision X with no further
> modifications, then invoking the build tool should ALWAYS,
> without any exceptions, produce exactly the same outputs, bit
> for bit. I.e., if your workspace faithfully represents
> revision X in the RCS, then invoking the build tool will
> produce the exact same binary products as anybody else who
> checks out revision X, regardless of their initial starting
> conditions.
Making builds bit-for-bit reproducible is really, really hard to
do, particularly on Windows. Microsoft's C/C++ compiler embeds
timestamps and other nonsense into the binaries so that every
time you build, even when no source changed, you get a different
binary. Google wrote a tool to help eliminate this
non-determinism as a post-processing step called
zap_timestamp[1]. I want to eventually include something like
this with Button on Windows. I'll probably have to make a PE
reader library first though.
Without reproducible builds, caching outputs doesn't work very
well either.
Moral of the story is, if you're writing a compiler, for the sake
of build systems everywhere, make the output deterministic! For
consecutive invocations, without changing any source code, I want
the hashes of the binaries to be identical every single time. DMD
doesn't do this and it saddens me greatly.
[1]
https://github.com/google/syzygy/tree/master/syzygy/zap_timestamp
More information about the Digitalmars-d-announce
mailing list