<div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">2015-09-16 12:18 GMT+01:00 Simon Peyton Jones <span dir="ltr"><<a href="mailto:simonpj@microsoft.com" target="_blank">simonpj@microsoft.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class=""><br>
|  My understanding is that currently, if you build a Haskell project<br>
|  from clean sources with ghc --make, then wipe all the .o/.hi files,<br>
|  and rebuild again from clean, with all the same flags and environment,<br>
|  you are unlikely to end up with identical binaries for either the .o<br>
|  or .hi files<br>
<br>
</span>Is that right Bartosz?  If that's the goal, then can we please say that explicitly on the wiki page?<br>
<br>
Let's hypothesise that it it's the goal. Then I don't understand why, in a single-threaded GHC, you would get non-det results.  Presumably not from lazy-interface-file-loading.  After all the same things would be loaded in the same order, no?<br>
<br>
Before we can propose a solution we need to understand the goal; and having understood the goal we need to understand why the results are non-det right now.   Otherwise we risk fixing the wrong problem.<br>
<br>
Anyway, one step at a time :-) Goal first; then a concrete example that demonstrates the problem; then a hypothesis of what is going wrong...</blockquote><div><br></div><div><span style="font-size:12.8000001907349px">There are two related goals here that I'm trying to tackle at the same time: build speed and binary file compatibility.</span></div><div style="font-size:12.8000001907349px"><br></div><div style="font-size:12.8000001907349px">I've created a wiki and added a concrete example of how the same environment leads to different interface files: <a href="https://ghc.haskell.org/trac/ghc/wiki/DeterministicBuilds#Aconcreteexample" target="_blank">https://ghc.haskell.org/trac/ghc/wiki/DeterministicBuilds#Aconcreteexample</a>.</div><div style="font-size:12.8000001907349px">Simon Marlow has already explained what goes wrong there and the difference is that the first build doesn't have any old interface files that the second build from the same sources does. This happens often in practice in production environments when people switch branches. Another way to trigger it is to remove all the .o files and leave .hi files before rebuilding.</div><span class="im" style="font-size:12.8000001907349px"><div><br></div><div>| <span style="color:rgb(31,73,125);font-family:Calibri,sans-serif;font-size:11pt">Depending on exactly what the problem is, one “solution” might be to not use –make mode.</span></div><p class="MsoNormal" style="font-size:12.8000001907349px"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)"><u></u><u></u></span></p><div><br></div></span><div style="font-size:12.8000001907349px">This is not specific to the --make mode.</div><div style="font-size:12.8000001907349px"><p style="font-size:12.8000001907349px">I've answered other questions on the wiki.</p><span class="im">| Anyway, one step at a time :-) Goal first; then a concrete example that demonstrates the problem; then a hypothesis of what is going wrong...</span><p style="font-size:12.8000001907349px">I'm sorry, I unloaded everything I've learned about this in one post without a clear narrative. </p><p style="font-size:12.8000001907349px"><span style="font-size:small">Cheers</span></p></div></div></div></div>