<div dir="ltr">Thanks Matthew. I've now found my example, which I share bellow for the record.<div><br></div><div><div>Cheers!</div><div>Facundo<br><div><br></div><div>> module A where<br>><br>> a :: Bool<br>> a = False<br>> <br>> a2 :: Bool<br>> a2 = True<br></div><div><br></div><div>> module B where<br>><br>> import A<br>><br>> b :: Bool<br>> b = not a<br></div><div><br></div><div>Building I get</div><div><br></div><div>> $ ghc A.hs B.hs</div>> [1 of 2] Compiling A                ( A.hs, A.o )<br>> [2 of 2] Compiling B                ( B.hs, B.o ) [A changed]<br><div>></div><div>> $ ghc --show-iface A.hi | grep "ABI hash"</div>>   ABI hash: 811ba0740c0157da5cd2ea747468b19f<br><div><br></div><div>Changing A.a2 to have a different type causes the ABI hash to change yet GHC doesn't recompile module B:</div><div><br></div><div>> - a2 :: Bool<br></div><div><div><div>> - a2 = True<br></div><div><div>> + a2 :: Int<br>> + a2 = 0<br></div><div><br></div></div></div></div><div><div>> $ ghc A.hs B.hs</div>> [1 of 2] Compiling A                ( A.hs, A.o )<br></div><div>></div><div>> $ ghc --show-iface A.hi | grep "ABI hash"<br>>   ABI hash: 6d7a56ce0b9f5fbca71f48bf08c2db84<br></div></div></div><div><br></div><div>I was previously trying to change the value of a2 rather than the type, which doesn't change the ABI hash if one isn't compiling with optimizations :)</div><div><br></div><div>I also tried doing modifications to the export list of A, but this seems to trigger recompilation of module B in all cases.</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Aug 11, 2022 at 9:20 AM Matthew Pickering <<a href="mailto:matthewtpickering@gmail.com">matthewtpickering@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Facundo,<br>
<br>
If the interface in question is from a home package module, then it's<br>
required that the ABI of the specifically used function is modified<br>
rather than the ABI hash of the whole module. If the interface is from<br>
an external package then if the ABI of the entire module changes then<br>
that is sufficient to trigger recompilation.<br>
<br>
Matt<br>
<br>
On Thu, Aug 11, 2022 at 12:11 PM Domínguez, Facundo<br>
<<a href="mailto:facundo.dominguez@tweag.io" target="_blank">facundo.dominguez@tweag.io</a>> wrote:<br>
><br>
> Dear devs,<br>
><br>
> rules_haskell [1] recently earned the ability to skip recompiling modules when the ABI hashes of dependencies don't change in interface files.<br>
><br>
> We have noticed since then that sometimes ghc --make does avoid rebuilding even when ABI hashes change. However, so far I've been unable to reproduce this in the small. The wiki page on recompilation avoidance does remark that a changing ABI hash is a necessary but not sufficient condition for recompilation [2].<br>
><br>
> Does anyone have a small example showing how ghc avoids rebuilding even when the ABI hash of a dependency changes?<br>
><br>
> Thanks in advance!<br>
> Facundo<br>
><br>
> [1] <a href="https://github.com/tweag/rules_haskell/issues/1760#issuecomment-1179102232" rel="noreferrer" target="_blank">https://github.com/tweag/rules_haskell/issues/1760#issuecomment-1179102232</a><br>
> [2] <a href="https://gitlab.haskell.org/ghc/ghc/-/wikis/commentary/compiler/recompilation-avoidance#interface-file-invariants" rel="noreferrer" target="_blank">https://gitlab.haskell.org/ghc/ghc/-/wikis/commentary/compiler/recompilation-avoidance#interface-file-invariants</a><br>
> _______________________________________________<br>
> ghc-devs mailing list<br>
> <a href="mailto:ghc-devs@haskell.org" target="_blank">ghc-devs@haskell.org</a><br>
> <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs</a><br>
</blockquote></div>