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

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

Reply via email to