-
Notifications
You must be signed in to change notification settings - Fork 701
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Be more careful in handling unconfigured programs in the program database #9967
Conversation
I've been trying to construct a test for these hard to trigger bugs, but I was unable to. I think it would be reasonable to move forward with this even if there are no tests given the difficulty in defining a test case for these properties. |
I recall this was quite a good patch. Could anyone please review? @andreabedini @Mikolaj |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
57cc721
to
96dc01a
Compare
We should configure unconfigured programs before serialising them (using the Binary ProgramDb instance) in Distribution.Client.ProjectPlanning.configureCompiler, as otherwise we can accidentally discard information. This isn't currently a live bug, because in practice we end up re-running configuration steps when interfacing with the Cabal library. However, in the bright future in which we avoid re-configuring things when building a Cabal package that we already determined when invoking cabal-install, this starts causing problems.
In configureRequiredProgram, we would unconditionally configure the program, even if it was configured already. To explain why this is problematic: - The programs we try to configure in this function are those that arise from a "build-tool-depends" field of a package. - If the program is not in the "unconfigured" state, we would unconditionally treat it as a simpleProgram. This means that if such a program is builtin but is not a simpleProgram, we might fail to configure it properly. This problem arises when we configure programs more eagerly: when, in the past, we might have gone looking up an unconfigured program and successfully configured it, now we might find the program is already configured. One example in which this would cause an issue is when we have build-tool-depends: hsc2hs If we end up re-configuring hsc2hs in configureRequiredProgram, we would treat it as a simple program, which would cause us to be unable to determine its version.
This commit configures the unconfigured programs in the program database when we are building a custom Setup script. This ensures that we can find the "strip" program which might otherwise still be unconfigured.
There was some hacky logic in place to give a "haskell-suite" compiler a dummy location so that we would attempt to configure it. This logic is no longer necessary since 'configureRequiredProgram' was changed to accomodate the situation in which 'lookupKnownProgram' fails. In fact, it is downright harmful, as this dummy location will trigger errors when we attempt to configure all known programs, which is a necessary step before attempting to serialise a program database.
96dc01a
to
6ac9dfb
Compare
@mergify backport 3.12 |
✅ Backports have been created
|
This PR contains several commits that address problems with how we were handling unconfigured programs in the program database:
Binary ProgramDb
instance) inDistribution.Client.ProjectPlanning.configureCompiler
, as otherwise we can accidentally discard information.Not doing so can lead to situations in which we can build a package just fine, but if we re-start a build we will fail,
because the program database on disk stored after configuring doesn't match the program database in memory.
configureRequiredProgram
needs to gracefully handle an already-configured program.Not doing so means we would fall back to the
simpleProgram
treatment, which can causeCabal
to fail to configure a program such ashsc2hs
which has custom logic for parsing its version number.Setup
executable, we would pass a program database for use of thestripExe
command. However,the
strip
program might not be configured in this program database; so we make sure to configure it (in the correctenvironment).
Template Α: This PR modifies behaviour or interface.
TODO: