Open patrickdoc opened 2 years ago
@patrickdoc hi! could be this closed after #7973?
Item 2 is mostly just about cleaning up the docs/user interface for using ghc-options in cabal.project, so not a huge deal.
Item 3 is a "gotcha". Some flags (basically any options like -ddump or -Wall) can only be added/removed from a project by first running cabal clean
. Not a huge problem because it has a workaround, but probably going to cause a ticket or two in the future.
It can probably be closed because 2 and 3 are not really bugs, just rough edges.
Oh, so i was wrong about #7973 fixing the cache issue and i have to reopen the linked issues (#4247 and #7816) 🤦
@patrickdoc could you confirm those ones should be reopened, please? thanks!
ok I ve reopened the issues related with caching, sorry for the noise!
Closing #4247 seems correct to me. The original purpose of that ticket is achieved. (and is actually the cause of #7816)
There are a bunch of tickets around some weird behaviors when trying to apply
ghc-options
. I've linked some below, but there are others that are semi-related as well.This issue tries to capture most of the problems in a single place to resolve them.
There are a few ways to pass
ghc-options
(or, more generally${program}-options
for programs likeld
,gcc
,alex
,happy
)cabal.project
In
cabal.project
:[1] The
configureCompiler
phase pulls the options from the local config, which then gets applied to the entire plan's config, triggering a full rebuild. Reproducer:Problematic code: https://github.com/haskell/cabal/blob/65318cc6b82fe25cef6ba3b98feae68369bf4f37/cabal-install/src/Distribution/Client/ProjectPlanning.hs#L464-L515
Related tickets:
3579 (includes a comment that the
program-options
stanza was intended to only apply locally)7368
3883
Command line
Input from the command line suffers a similar fate:
This time it is more intentional: https://github.com/haskell/cabal/blob/65318cc6b82fe25cef6ba3b98feae68369bf4f37/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs#L198-L220
This note indicates that the idea behind applying these options globally is that you want a consistent tool-chain for the entire build. While that seems reasonable for program paths, I can't think of any good examples for program args.
Related tickets:
6183
1176 (the last two comments are about trying to apply local-only flags)
Caching and Recompilation Avoidance
These problems are complicated by recompilation avoidance. Some flags do not affect output, so are excluded from the package hash. This same logic is used to determine whether or not the config has changed: https://github.com/haskell/cabal/blob/65318cc6b82fe25cef6ba3b98feae68369bf4f37/cabal-install/src/Distribution/Client/ProjectBuilding.hs#L346-L349
This causes some flags to get stuck in the config cache until either a
cabal clean
or a non-ignored flag is applied. Reproducer:Related tickets:
4247 (exclusion of certain flags from package hash)
7816
Proposal
This makes only-local flags possible, and the previous functionality is still available with:
At that point it would probably be best to remove this stanza:
and make a top-level
ghc-options
legal to be consistent with all the other package settings. This is technically a breaking change, but the stanza is currently undocumented and broken, so it's unlikely to break too many workflows.To fix the caching, the best option I can think of is: a. Only cache the normalized config so that we aren't left with a
-ddump-simpl
that we can't get rid of b. Use the non-normalized config when building so that the user still gets what they want