<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <p>Ah! I see. This is a bit disappointing as it reduces the utility
      of fsatrace linting: the programmer is forced to decide if shallow
      dependencies are sufficient (changes in deep dependencies always
      change shallow dependencies). Hopeful similar scenarios are rare.
      Perhaps the best step forward is to simply silence the linting
      using `trackAllow ["//*.hi"]` for haskell object rules. Then I can
      continue tracking down other missing dependencies in Hadrian with
      fsatrace linting.<br>
    </p>
    <div class="moz-cite-prefix">On 3/27/19 5:38 PM, Andrey Mokhov
      wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:WM!fcaf66c3f9a6e867789c229ec2af1d4101f05732a33eabc3a5c95d8b36cee4c35e14b55a562511dd8fec271e476652ad!@mailhub-mx4.ncl.ac.uk">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <div dir="auto">
        <div>Simon's insight is great: if deep dependencies are captured
          by shallow dependencies then the cloud build system is correct
          even if only direct shallow inputs are tracked.</div>
        <div dir="auto"><br>
        </div>
        <div dir="auto">That's a very non-trivial invariant, and I guess
          this means we can't rely on fsatrace linting for GHC
          compilation rules, because all deep dependencies will be
          reported as untracked. </div>
        <div dir="auto"><br>
        </div>
        <div dir="auto">Cheers, </div>
        <div dir="auto">Andrey<br>
          <div class="gmail_extra" dir="auto"><br>
            <div class="gmail_quote">On 27 Mar 2019 18:27, Simon Peyton
              Jones <a class="moz-txt-link-rfc2396E" href="mailto:simonpj@microsoft.com"><simonpj@microsoft.com></a> wrote:<br
                type="attribution">
              <blockquote class="quote" style="margin:0 0 0
                .8ex;border-left:1px #ccc solid;padding-left:1ex">
                <div>
                  <div>
                    <p style="margin-left:36pt">With that in mind, and
                      considering a cloud build system where "<b><span
                          style="color:#1f497d">all direct inputs and
                          direct outputs must be declared</span></b>"</p>
                    <p> </p>
                    <p><b><span
                          style="font-size:11pt;font-family:'calibri' ,
                          sans-serif;color:red">But I question that
                          assumption</span></b><span
                        style="font-size:11pt;font-family:'calibri' ,
                        sans-serif">.   As I mentioned, with GHC at
                        least, the if a deep dependency changes then one
                        of the shallow dependencies will change.  So I
                        claim that even for cloud build it should be
                        enough to depend only on shallow dependencies.</span></p>
                    <p><span style="font-size:11pt;font-family:'calibri'
                        , sans-serif"> </span></p>
                    <p><span style="font-size:11pt;font-family:'calibri'
                        , sans-serif">This is only true because GHC
                        offers this guarantee.  We’d need to be sure
                        that every deep dependency was either ‘needed’
                        or was reflected in the contents (perhaps via a
                        fingerprint) another ‘needed’ thing.</span></p>
                    <p><span style="font-size:11pt;font-family:'calibri'
                        , sans-serif"> </span></p>
                    <p><span style="font-size:11pt;font-family:'calibri'
                        , sans-serif">Simon</span></p>
                    <p><span style="font-size:11pt;font-family:'calibri'
                        , sans-serif"> </span></p>
                    <div style="border:none;border-left:solid blue
                      1.5pt;padding:0cm 0cm 0cm 4pt">
                      <div>
                        <div style="border:none;border-top:solid #e1e1e1
                          1pt;padding:3pt 0cm 0cm 0cm">
                          <p><b><span
                                style="font-size:11pt;font-family:'calibri'
                                , sans-serif">From:</span></b><span
                              style="font-size:11pt;font-family:'calibri'
                              , sans-serif"> ghc-devs
                              <a class="moz-txt-link-rfc2396E" href="mailto:ghc-devs-bounces@haskell.org"><ghc-devs-bounces@haskell.org></a>
                              <b>On Behalf Of </b>David Eichmann<br>
                              <b>Sent:</b> 27 March 2019 17:12<br>
                              <b>To:</b> Andrey Mokhov
                              <a class="moz-txt-link-rfc2396E" href="mailto:andrey.mokhov@newcastle.ac.uk"><andrey.mokhov@newcastle.ac.uk></a>;
                              Neil Mitchell <a class="moz-txt-link-rfc2396E" href="mailto:ndmitchell@gmail.com"><ndmitchell@gmail.com></a><br>
                              <b>Cc:</b> GHC developers
                              <a class="moz-txt-link-rfc2396E" href="mailto:ghc-devs@haskell.org"><ghc-devs@haskell.org></a><br>
                              <b>Subject:</b> Re: Hadrian Transitive
                              Dependencies</span></p>
                        </div>
                      </div>
                      <p> </p>
                      <p>Hello,<span style="font-size:11pt"></span></p>
                      <p>To reiterate some definitions consider this
                        scenario:</p>
                      <ul type="disc">
                        <li>A.hs imports B.hs and B.hs imports C.hs</li>
                        <li>`ghc -M A.hs` reports that A.o depends on:
                          A.hs, B.hi</li>
                        <li>`ghc -c A.hs` produces A.o and accesses
                          A.hs, B.hi, and C.hi</li>
                      </ul>
                      <p>There seems to be some confusion about the term
                        "Direct Dependency" I'll use these definitions:</p>
                      <p>"Shallow Dependency": With respect to a haskell
                        object file X.o, the shallow dependencies are
                        the source file X.hs and interface files Y.hi
                        for all modules Y imported by X.</p>
                      <ul type="disc">
                        <li>These are the dependencies of X.o as
                          reported by `ghc -M X.hs`</li>
                        <li>In the above scenario:</li>
                      </ul>
                      <ul type="disc">
                        <li>
                          <ul type="circle">
                            <li>A.o depends on: A.hs, B.hi</li>
                          </ul>
                        </li>
                      </ul>
                      <p>"Deep Dependency": With respect to a haskell
                        object file X.o, the deep dependencies are all
                        hi files required by ghc to build X.o excluding
                        direct dependencies:</p>
                      <ul type="disc">
                        <li>This is a subset of modules transitively
                          imported by X</li>
                        <li>These dependencies are NOT reported by `ghc
                          -M X.hs`</li>
                      </ul>
                      <p>"Direct Dependency": if the command to create
                        file X accesses file Y, then X directly depends
                        on Y (= Y is a direct dependency of X).</p>
                      <ul type="disc">
                        <li>In the above scenario:</li>
                      </ul>
                      <ul type="disc">
                        <li>
                          <ul type="circle">
                            <li>A.o directly depends on: A.hs, B.hi, and
                              C.hi</li>
                          </ul>
                        </li>
                      </ul>
                      <ul type="disc">
                        <li>SPJ noted that .hi files list direct
                          dependencies.</li>
                        <li>The direct dependencies of a haskell object
                          file is the union of its shallow and deep
                          dependencies.</li>
                      </ul>
                      <p>"Direct Output": All files created by a rule.</p>
                      <p>With that in mind, and considering a cloud
                        build system where "<b><span
                            style="color:#1f497d">all direct inputs and
                            direct outputs must be declared</span></b>"
                        (where this agrees with the definitions above)
                        can we do the following for the build rule of a
                        haskell object file X.o?</p>
                      <ol start="1" type="1">
                        <li>`need` the shallow dependencies as reported
                          by `ghc -M`. This guarantees that all shallow
                          and deep dependencies (i.e. all direct
                          dependencies) are built.</li>
                        <li>build X.o and X.hi</li>
                        <li>Inspect X.hi to derive the direct
                          dependencies (and hence deep dependencies)</li>
                        <li>`needed` the deep dependencies</li>
                      </ol>
                      <p>Is there already an easy way to inspect *.hi
                        files in this way? Is this use of `needed`
                        valid?</p>
                      <p>- David E</p>
                      <p> </p>
                      <div>
                        <p>On 3/27/19 3:05 PM, Andrey Mokhov wrote:</p>
                      </div>
                      <blockquote
                        style="margin-top:5pt;margin-bottom:5pt">
                        <p><span
                            style="font-size:11pt;font-family:'calibri'
                            , sans-serif;color:#1f497d">Hi David,</span></p>
                        <p><span
                            style="font-size:11pt;font-family:'calibri'
                            , sans-serif;color:#1f497d"> </span></p>
                        <p><span
                            style="font-size:11pt;font-family:'calibri'
                            , sans-serif;color:#1f497d">We had a
                            discussion about this with Neil some time
                            ago, and I think we had the following list
                            of progressively more complex invariants for
                            different types of build systems:</span></p>
                        <p><span
                            style="font-size:11pt;font-family:'calibri'
                            , sans-serif;color:#1f497d"> </span></p>
                        <ul style="margin-top:0cm" type="disc">
                          <li style="margin-left:0cm"><span
                              style="font-size:11pt;font-family:'calibri'
                              , sans-serif;color:#1f497d">Non-cloud
                              build systems: *<b>all direct inputs must
                                be declared</b>*. If you miss a direct
                              input dependency then a build may complete
                              successfully but with an incorrect result.</span></li>
                        </ul>
                        <p><span
                            style="font-size:11pt;font-family:'calibri'
                            , sans-serif;color:#1f497d"> </span></p>
                        <ul style="margin-top:0cm" type="disc">
                          <li style="margin-left:0cm"><span
                              style="font-size:11pt;font-family:'calibri'
                              , sans-serif;color:#1f497d">Cloud build
                              systems: *<b>all direct inputs and direct
                                outputs must be declared</b>*. If you
                              miss a direct output then a build may fail
                              because the cloud will not be able to
                              restore the corresponding output.</span></li>
                        </ul>
                        <p><span
                            style="font-size:11pt;font-family:'calibri'
                            , sans-serif;color:#1f497d"> </span></p>
                        <ul style="margin-top:0cm" type="disc">
                          <li style="margin-left:0cm"><span
                              style="font-size:11pt;font-family:'calibri'
                              , sans-serif;color:#1f497d">Cloud build
                              systems with shallow (deferred)
                              materialisation of build artefacts: *<b>all
                                transitive inputs and direct outputs
                                must be declared</b>*. Let’s say you’d
                              like to download the resulting GHC binary
                              directly, without materialising any
                              intermediate artefacts. Then you’ll need
                              to know GHC’s ultimate transitive inputs.</span></li>
                        </ul>
                        <p><span
                            style="font-size:11pt;font-family:'calibri'
                            , sans-serif;color:#1f497d"> </span></p>
                        <p><span
                            style="font-size:11pt;font-family:'calibri'
                            , sans-serif;color:#1f497d">I think for now
                            we are really keen to make Hadrian a cloud
                            build system, but whether shallow builds are
                            valuable enough is not clear. Maybe not.
                            Therefore, I’d say we don’t need to track
                            transitive inputs right now. Furthermore, if
                            we were to track all transitive inputs, we
                            would lose the desirable early cutoff
                            property, which prevents rebuilding after
                            adding a comment in a file on which a lot of
                            other files transitively depend on.</span></p>
                        <p><span
                            style="font-size:11pt;font-family:'calibri'
                            , sans-serif;color:#1f497d"> </span></p>
                        <p><span
                            style="font-size:11pt;font-family:'calibri'
                            , sans-serif;color:#1f497d">Having said
                            that, if we really access a file during
                            compilation, then I think it is *<b>not</b>*
                            a transitive dependency by definition! Any
                            file which is accessed during a build rule
                            is a direct dependency.</span></p>
                        <p><span
                            style="font-size:11pt;font-family:'calibri'
                            , sans-serif;color:#1f497d"> </span></p>
                        <p><span
                            style="font-size:11pt;font-family:'calibri'
                            , sans-serif;color:#1f497d">> GHC is
                            reading *.hi files that are not reported as
                            dependencies by</span></p>
                        <p><span
                            style="font-size:11pt;font-family:'calibri'
                            , sans-serif;color:#1f497d">> `ghc -M 
                            -include-pkg-deps`. This is because they are
                            not direct, but transitive</span></p>
                        <p><span
                            style="font-size:11pt;font-family:'calibri'
                            , sans-serif;color:#1f497d">>
                            dependencies!</span></p>
                        <p><span
                            style="font-size:11pt;font-family:'calibri'
                            , sans-serif;color:#1f497d"> </span></p>
                        <p><span
                            style="font-size:11pt;font-family:'calibri'
                            , sans-serif;color:#1f497d">So, here I’m
                            confused. If we read a file A when compiling
                            a file B, then it’s by definition a direct
                            dependency. Perhaps we just read too much?
                            Maybe the solution is to switch to
                            fine-grained `ghc -M` mode, to analyse
                            import dependencies for a single module
                            instead of doing it transitively, which I
                            believe was discussed in a ticket some time
                            ago? I can’t find this ticket, but I think
                            Alp was looking into it at some point. Alp:
                            do you remember it?</span></p>
                        <p><span
                            style="font-size:11pt;font-family:'calibri'
                            , sans-serif;color:#1f497d"> </span></p>
                        <p><span
                            style="font-size:11pt;font-family:'calibri'
                            , sans-serif;color:#1f497d">Thank you for
                            all your work on Hadrian!</span></p>
                        <p><span
                            style="font-size:11pt;font-family:'calibri'
                            , sans-serif;color:#1f497d"> </span></p>
                        <p><span
                            style="font-size:11pt;font-family:'calibri'
                            , sans-serif;color:#1f497d">Cheers,</span></p>
                        <p><span
                            style="font-size:11pt;font-family:'calibri'
                            , sans-serif;color:#1f497d">Andrey</span></p>
                        <p><span
                            style="font-size:11pt;font-family:'calibri'
                            , sans-serif;color:#1f497d"> </span></p>
                        <div>
                          <div style="border:none;border-top:solid
                            #e1e1e1 1pt;padding:3pt 0cm 0cm 0cm">
                            <p><b><span
                                  style="font-size:11pt;font-family:'calibri'
                                  , sans-serif">From:</span></b><span
                                style="font-size:11pt;font-family:'calibri'
                                , sans-serif"> David Eichmann [<a
                                  href="mailto:davide@well-typed.com"
                                  moz-do-not-send="true">mailto:davide@well-typed.com</a>]
                                <br>
                                <b>Sent:</b> 27 March 2019 12:54<br>
                                <b>To:</b> Neil Mitchell <a
                                  href="mailto:ndmitchell@gmail.com"
                                  moz-do-not-send="true"><ndmitchell@gmail.com></a>;
                                Andrey Mokhov
                                <a
                                  href="mailto:andrey.mokhov@newcastle.ac.uk"
                                  moz-do-not-send="true"><andrey.mokhov@newcastle.ac.uk></a>;
                                GHC developers
                                <a href="mailto:ghc-devs@haskell.org"
                                  moz-do-not-send="true"><ghc-devs@haskell.org></a><br>
                                <b>Subject:</b> Hadrian Transitive
                                Dependencies</span></p>
                          </div>
                        </div>
                        <p> </p>
                        <p>Hello Shake/Hadrian contributors and the
                          like,</p>
                        <p>Recently I've been putting Hadrian's fsatrace
                          linting feature to good use, tracking down
                          missing dependencies in Hadrian. Ultimately,
                          we want to use shake's cloud build / shared
                          cache feature and ensure it works across CI
                          builds. Unfortunately the feature isn't
                          working smoothly with Hadrian: see <a
href="https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitlab.haskell.org%2Fghc%2Fghc%2Fissues%2F16295&data=02%7C01%7Csimonpj%40microsoft.com%7Cbd87a25e08f441fe763d08d6b2d76b25%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636893035618959820&sdata=BomxywLkHm7mriTubSnCql6YJDJBR96K1tQbskKBMn4%3D&reserved=0"
                            moz-do-not-send="true">
                            #16295</a>. This is very desirable to
                          improve CI build times. It is my understanding
                          that in order to get caching to work:</p>
                        <p>1. All accessed files must declared with
                          `need` AND<br>
                          2. All created files must be declared with
                          `produces` (or be the target of the build
                          rule)
                        </p>
                        <p>Is my understanding correct? Or is there a
                          weaker condition (perhaps only 2 is
                          necessary)?</p>
                        <p>If I'm correct, this amounts to fixing all
                          fsatrace lint errors. See <a
href="https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitlab.haskell.org%2Fghc%2Fghc%2Fissues%2F16400%23note_188901&data=02%7C01%7Csimonpj%40microsoft.com%7Cbd87a25e08f441fe763d08d6b2d76b25%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636893035618969820&sdata=Kmnd%2B8%2FATQBw0AfCTvvl7oix5syXbPAeV7h473t8H7E%3D&reserved=0"
                            moz-do-not-send="true">
                            here</a> for a breakdown of lint errors /
                          missing dependencies. A large portion of these
                          are Haskell interface files (i.e. *.hi files).
                          Before building a Haskell object file,
                          dependencies are discovered via `ghc` using
                          the `-M  -include-pkg-deps` options.
                          Unfortunately, shake's fsatrace linting
                          complains about other *.hi files being
                          accessed! For example when building
                          `stage1/libraries/mtl/build/Control/Monad/RWS/Class.o`
                          we get the following dependencies from ghc:</p>
                        <pre>_build/stage1/libraries/mtl/build/Control/Monad/RWS/Class.o : libraries/mtl/Control/Monad/RWS/Class.hs</pre>
                        <pre>_build/stage1/libraries/mtl/build/Control/Monad/RWS/Class.o : _build/stage1/lib/../lib/x86_64-linux-ghc-8.9.20190325/base-4.13.0.0/Prelude.hi</pre>
                        <pre>_build/stage1/libraries/mtl/build/Control/Monad/RWS/Class.o : _build/stage1/lib/../lib/x86_64-linux-ghc-8.9.20190325/base-4.13.0.0/Data/Monoid.hi</pre>
                        <pre>_build/stage1/libraries/mtl/build/Control/Monad/RWS/Class.o : _build/stage1/lib/../lib/x86_64-linux-ghc-8.9.20190325/transformers-0.5.5.0/Control/Monad/Trans/RWS/Strict.hi</pre>
                        <pre>_build/stage1/libraries/mtl/build/Control/Monad/RWS/Class.o : _build/stage1/lib/../lib/x86_64-linux-ghc-8.9.20190325/transformers-0.5.5.0/Control/Monad/Trans/RWS/Lazy.hi</pre>
                        <pre>_build/stage1/libraries/mtl/build/Control/Monad/RWS/Class.o : _build/stage1/lib/../lib/x86_64-linux-ghc-8.9.20190325/transformers-0.5.5.0/Control/Monad/Trans/Identity.hi</pre>
                        <pre>_build/stage1/libraries/mtl/build/Control/Monad/RWS/Class.o : _build/stage1/lib/../lib/x86_64-linux-ghc-8.9.20190325/transformers-0.5.5.0/Control/Monad/Trans/Maybe.hi</pre>
                        <pre>_build/stage1/libraries/mtl/build/Control/Monad/RWS/Class.o : _build/stage1/lib/../lib/x86_64-linux-ghc-8.9.20190325/transformers-0.5.5.0/Control/Monad/Trans/Except.hi</pre>
                        <pre>_build/stage1/libraries/mtl/build/Control/Monad/RWS/Class.o : _build/stage1/lib/../lib/x86_64-linux-ghc-8.9.20190325/transformers-0.5.5.0/Control/Monad/Trans/Error.hi</pre>
                        <pre>_build/stage1/libraries/mtl/build/Control/Monad/RWS/Class.o : _build/stage1/lib/../lib/x86_64-linux-ghc-8.9.20190325/transformers-0.5.5.0/Control/Monad/Trans/Class.hi</pre>
                        <pre>_build/stage1/libraries/mtl/build/Control/Monad/RWS/Class.o : _build/stage1/libraries/mtl/build/Control/Monad/Writer/Class.hi</pre>
                        <pre>_build/stage1/libraries/mtl/build/Control/Monad/RWS/Class.o : _build/stage1/libraries/mtl/build/Control/Monad/State/Class.hi</pre>
                        <pre>_build/stage1/libraries/mtl/build/Control/Monad/RWS/Class.o : _build/stage1/libraries/mtl/build/Control/Monad/Reader/Class.hi</pre>
                        <p>And shake complains of the following missing
                          deps:</p>
                        <pre>_build/stage0/bin/ghc -Wall -hisuf hi -osuf o -hcsuf hc -static -hide-all-packages -no-user-package-db '-package-db _build/stage1/lib/package.conf.d' '-this-unit-id mtl-2.2.2' '-package-id base-4.13.0.0' '-package-id transformers-0.5.5.0' -i -i_build/stage1/libraries/mtl/build -i_build/stage1/libraries/mtl/build/autogen -ilibraries/mtl/. -Iincludes -I_build/generated -I_build/stage1/libraries/mtl/build -I/home/david/ghc/_build/stage1/lib/x86_64-linux-ghc-8.9.20190325/base-4.13.0.0/include -I/home/david/ghc/_build/stage1/lib/x86_64-linux-ghc-8.9.20190325/integer-gmp-1.0.2.0/include -I/home/david/ghc/_build/stage1/lib/x86_64-linux-ghc-8.9.20190325/rts-1.0/include -I_build/generated -optc-I_build/generated -optP-include -optP_build/stage1/libraries/mtl/build/autogen/cabal_macros.h -outputdir _build/stage1/libraries/mtl/build -Wnoncanonical-monad-instances -optc-Werror=unused-but-set-variable -optc-Wno-error=inline -c libraries/mtl/Control/Monad/RWS/Class.hs -o _build/stage1/libraries/mtl/build/Control/Monad/RWS/Class.o -O2 -H32m -Wall -fno-warn-unused-imports -fno-warn-warnings-deprecations -Wcompat -Wnoncanonical-monad-instances -Wnoncanonical-monadfail-instances -XHaskell2010 -XSafe -ghcversion-file=/home/david/MEGA/File_Dump/Well-Typed/GHC/_nosync_git/ghc/_build/generated/ghcversion.h -Wno-deprecated-flags</pre>
                        <pre>Lint checking error - _build/HEAD_default/stage1/libraries/mtl/build/Control/Monad/RWS/Class.o - 22 values were used but not depended upon:</pre>
                        <pre>  Used:  _build/HEAD_default/stage0/lib/settings</pre>
                        <pre>  Used:  _build/HEAD_default/stage0/lib/platformConstants</pre>
                        <pre>  Used:  _build/HEAD_default/stage0/lib/llvm-targets</pre>
                        <pre>  Used:  _build/HEAD_default/stage0/lib/llvm-passes</pre>
                        <pre>  Used:  _build/HEAD_default/stage0/lib/package.conf.d/package.cache</pre>
                        <pre>  Used:  _build/HEAD_default/stage1/lib/package.conf.d/package.cache</pre>
                        <pre>  Used:  _build/HEAD_default/stage1/lib/x86_64-linux-ghc-8.9.20190325/base-4.13.0.0/GHC/Float.hi</pre>
                        <pre>  Used:  _build/HEAD_default/stage1/lib/x86_64-linux-ghc-8.9.20190325/base-4.13.0.0/GHC/Base.hi</pre>
                        <pre>  Used:  _build/HEAD_default/stage1/lib/x86_64-linux-ghc-8.9.20190325/ghc-prim-0.5.3/GHC/Types.hi</pre>
                        <pre>  Used:  _build/HEAD_default/stage1/lib/x86_64-linux-ghc-8.9.20190325/base-4.13.0.0/GHC/Maybe.hi</pre>
                        <pre>  Used:  _build/HEAD_default/stage1/lib/x86_64-linux-ghc-8.9.20190325/transformers-0.5.5.0/Control/Monad/Trans/Writer/Lazy.hi</pre>
                        <pre>  Used:  _build/HEAD_default/stage1/lib/x86_64-linux-ghc-8.9.20190325/transformers-0.5.5.0/Control/Monad/Trans/Writer/Strict.hi</pre>
                        <pre>  Used:  _build/HEAD_default/stage1/lib/x86_64-linux-ghc-8.9.20190325/transformers-0.5.5.0/Control/Monad/Trans/State/Lazy.hi</pre>
                        <pre>  Used:  _build/HEAD_default/stage1/lib/x86_64-linux-ghc-8.9.20190325/transformers-0.5.5.0/Control/Monad/Trans/State/Strict.hi</pre>
                        <pre>  Used:  _build/HEAD_default/stage1/lib/x86_64-linux-ghc-8.9.20190325/transformers-0.5.5.0/Control/Monad/Trans/Reader.hi</pre>
                        <pre>  Used:  _build/HEAD_default/stage1/lib/x86_64-linux-ghc-8.9.20190325/transformers-0.5.5.0/Control/Monad/Trans/List.hi</pre>
                        <pre>  Used:  _build/HEAD_default/stage1/lib/x86_64-linux-ghc-8.9.20190325/transformers-0.5.5.0/Control/Monad/Trans/Cont.hi</pre>
                        <pre>  Used:  _build/HEAD_default/stage1/lib/x86_64-linux-ghc-8.9.20190325/ghc-prim-0.5.3/GHC/Tuple.hi</pre>
                        <pre>  Used:  _build/HEAD_default/stage1/lib/x86_64-linux-ghc-8.9.20190325/base-4.13.0.0/GHC/IO/Exception.hi</pre>
                        <pre>  Used:  _build/HEAD_default/stage1/lib/x86_64-linux-ghc-8.9.20190325/integer-gmp-1.0.2.0/GHC/Integer/Type.hi</pre>
                        <pre>  Used:  _build/HEAD_default/stage1/lib/x86_64-linux-ghc-8.9.20190325/base-4.13.0.0/Data/Either.hi</pre>
                        <pre>  Used:  _build/HEAD_default/stage1/lib/x86_64-linux-ghc-8.9.20190325/base-4.13.0.0/GHC/Natural.hi</pre>
                        <p>GHC is reading *.hi files that are not
                          reported as dependencies by `ghc -M 
                          -include-pkg-deps`. This is because they are
                          not direct, but
                          <i>transitive</i> dependencies! How do we fix
                          these lint errors (again with the goal of
                          using shakes shared cache feature)? Some
                          ideas:</p>
                        <p>* Wildly over approximate dependencies. This
                          may be easier to implement but cause unneeded
                          recompilation (when a false dependency
                          changes). Either:<br>
                              * `need` all dependent packages' interface
                          files recursively as well as transitive
                          dependencies reported by `ghc -M 
                          -include-pkg-deps` within the current package.
                          OR<br>
                              * OR `need` all transitive dependencies
                          reported by `ghc -M  -include-pkg-deps`. This
                          will likely result in fewer dependencies but
                          requires a bit more work in recovering
                          dependent packages' dependency graphs.<br>
                          * Perhaps transitive dependencies are not
                          important for shared caching to work. Change
                          shakes linting feature to allow (untracked?)
                          transitive dependencies to be accessed.
                        </p>
                        <p>Feed back would be greatly appreciated.</p>
                        <p>David Eichmann</p>
                        <p> </p>
                        <pre>-- </pre>
                        <pre>David Eichmann, Haskell Consultant</pre>
                        <pre>Well-Typed LLP, <a href="https://nam06.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.well-typed.com&data=02%7C01%7Csimonpj%40microsoft.com%7Cbd87a25e08f441fe763d08d6b2d76b25%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636893035618979828&sdata=ZUSCHtfKiOsTYbS%2Bo%2FAuhSuXwtM5TKnzVPubJjZd6RI%3D&reserved=0" moz-do-not-send="true">http://www.well-typed.com</a></pre>
                        <pre> </pre>
                        <pre>Registered in England & Wales, OC335890</pre>
                        <pre>118 Wymering Mansions, Wymering Road, London W9 2NF, England </pre>
                      </blockquote>
                      <pre>-- </pre>
                      <pre>David Eichmann, Haskell Consultant</pre>
                      <pre>Well-Typed LLP, <a href="https://nam06.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.well-typed.com&data=02%7C01%7Csimonpj%40microsoft.com%7Cbd87a25e08f441fe763d08d6b2d76b25%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636893035618989837&sdata=QxSKBt9C1rO8AwS0C8%2FIPhK43naICuuJ8ebdIzaudnQ%3D&reserved=0" moz-do-not-send="true">http://www.well-typed.com</a></pre>
                      <pre> </pre>
                      <pre>Registered in England & Wales, OC335890</pre>
                      <pre>118 Wymering Mansions, Wymering Road, London W9 2NF, England </pre>
                    </div>
                  </div>
                </div>
              </blockquote>
            </div>
            <br>
          </div>
        </div>
      </div>
    </blockquote>
    <pre class="moz-signature" cols="72">-- 
David Eichmann, Haskell Consultant
Well-Typed LLP, <a class="moz-txt-link-freetext" href="http://www.well-typed.com">http://www.well-typed.com</a>

Registered in England & Wales, OC335890
118 Wymering Mansions, Wymering Road, London W9 2NF, England </pre>
  </body>
</html>