Skip to content
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

Open
wants to merge 4 commits into
base: master
Choose a base branch
from

Conversation

sheaf
Copy link
Collaborator

@sheaf sheaf commented May 3, 2024

This PR contains several commits that address problems with how we were handling unconfigured programs in the program database:

  • 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.
    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.
  • As a follow-on from the above, configureRequiredProgram needs to gracefully handle an already-configured program.
    Not doing so means we would fall back to the simpleProgram treatment, which can cause Cabal to fail to configure a program such as hsc2hs which has custom logic for parsing its version number.
  • When compiling a Setup executable, we would pass a program database for use of the stripExe command. However,
    the strip program might not be configured in this program database; so we make sure to configure it (in the correct
    environment).

Template Α: This PR modifies behaviour or interface.

TODO:

  • Patches conform to the coding conventions.
  • Any changes that could be relevant to users have been recorded in the changelog.
  • The documentation has been updated.
  • Tests have been added.

sheaf added 4 commits May 3, 2024 20:09
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.
@alt-romes
Copy link
Collaborator

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.

@alt-romes alt-romes requested a review from jasagredo May 8, 2024 12:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
attention: needs-review re: --program-suffix Concerning option `--program-suffix`
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants