Hi Tamar,

I think the difficulty here is more with dynamic *outputs* rather than dynamic 
inputs/dependencies.

We do not statically know which of the following three alternatives holds:

  *   `*.dyn_o/hi` files are not built at all.
  *   `*.dyn_o/hi` files are built via a separate execution of GHC.
  *   `*.dyn_o/hi` files are built together with `*.o/hi` files, in a single 
execution of GHC with `-dynamic-too`.

Here is the current implementation:

https://gitlab.haskell.org/ghc/ghc/blob/master/hadrian/src/Rules/Compile.hs#L51-69

I believe the last person looking into this was James Foster, so CC-ing to him 
in case he has any insights.

Cheers,
Andrey

________________________________
From: Phyx <[email protected]>
Sent: 10 December 2019 07:47
To: Andrey Mokhov <[email protected]>
Cc: Simon Peyton-Jones ([email protected]) <[email protected]>; Ben 
Gamari <[email protected]>; [email protected] <[email protected]>
Subject: Re: More failure

Hi Andrey,

I'm not sure what the original issue here is (should probably find the original 
message) but

> The Make build system happens to do the right thing, somehow. I believe we 
> should be able to express the same logic in Shake, but it's not easy.

I believe this typically works because GCC and GHC support dumping the 
dependencies that a command would have caused to a file. So your dynamic 
dependencies don't matter as their static to the build system after this 
invocation.

See
https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/separate_compilation.html#dependency-generation

These Compilers are able to dump out make rules which enabled better dependency 
handling..

Kind regards,
Tamar

Sent from my Mobile

On Tue, Dec 10, 2019, 00:58 Andrey Mokhov 
<[email protected]<mailto:[email protected]>> wrote:

Hi Simon,



(Re-sending from the email address that’s allowed on the mailing list.)



> Ugh.  That's not a very happy state of affairs, is it?  It didn't happen with 
> 'make'.

> Is it a fundamental problem, or just not yet fixed?



I think this is not a fundamental problem, but the problem of getting 
dependencies right.



In this case, the complexity comes from the fact that a single invocation of 
GHC produces a set of files, and which set depends on the command line flags, 
which are in turn determined dynamically by reading environment settings 
(specifically, `platformSupportsSharedLibs`).



Such rules are hard to describe precisely, because build systems are tuned to 
the typical case where we statically know, for every output file, which rule 
produces it -- recall the Tasks = k -> Maybe Task function from our paper. In 
this case, we deal with something like k -> f (Maybe Task) instead, i.e. with 
`f` around the Maybe.



The Make build system happens to do the right thing, somehow. I believe we 
should be able to express the same logic in Shake, but it's not easy.



(I never really had a chance to look at dynamic builds, since they are not 
supported on Windows. I guess I should finally find a Linux box for Hadrian.)



Cheers,

Andrey

_______________________________________________
ghc-devs mailing list
[email protected]<mailto:[email protected]>
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
_______________________________________________
ghc-devs mailing list
[email protected]
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

Reply via email to