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

cabal-install: Be less eager to configure external programs #10731

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

Conversation

mpickering
Copy link
Collaborator

@mpickering mpickering commented Jan 9, 2025

In configureCompiler the call to configureAllKnownPrograms was too eager. When called it selected the version of tools from PATH (such as alex), and then when a package was configured these tools were passed using --with-alex options to configure, which meant that the build-tool-depends versions were not used. (See #10692)

Why was this call introduced in the first place? Because configureCompiler would a different result depending on whether:

  • It is run for the first time, the ProgramDb will contain unconfigured programs.
  • It is run subsequently, ProgramDb is read from disk, it does not contain unconfigured programs.

A surgical way to fix this is to avoid configuring the programs, and manually adding back the builtinPrograms to the ProgramDb, so the ProgramDb returned by configureCompiler always contains all the unconfigured programs.

The testcase is not so easy to write because

  • The bug only surfaces when the build-tool you are depending on is known (ie alex, happy etc)
  • But then it is tricky to write a test, as we can't depend on the known tools or bundle the source for them.
  • So we create a fake "alex", which cabal then invokes on a fake ".x" file. This is maybe a bit fragile if the way cabal invokes alex changes in future, but then the test can be modified as well.

Also see #2241 and #9840

Fixes #10692

Please read Github PR Conventions and then fill in one of these two templates.


Template Α: This PR modifies behaviour or interface

Include the following checklist in your PR:

@ulysses4ever
Copy link
Collaborator

Hey @mpickering! Any chance you could take a brief look at #2015? I believe it's closely related to the issue here. In particular, cabal repl runs with $PATH effective at the time of configuring, not at the time of running cabal repl. So, if you run cabal build on clean checkout, then change $PATH, then run cabal repl, inside the repl you won't see the change. This keeps blowing people's heads...

I tried to look into it, and it seems to stem, as you say, from storing the compiler's configuration on disk, and configuration includes $PATH. But I don't know what'd be the least intrusive way to fix it. E.g. should we just reconfigure from scratch inside cabal repl? Or should we treat $PATH in a special way, and maybe try to invalidate only it on every cabal repl run.

The code for cabal repl had a big update from your multi-repl patch. That's another reason I thought you may be a great candidate for guiding or, indeed, solving #2015.

@mpickering
Copy link
Collaborator Author

@ulysses4ever I've just been assigned to look at these two regressions, but I will comment on the issue about how I would begin with that problem.

@mpickering mpickering force-pushed the wip/t10692 branch 3 times, most recently from ea2f922 to 48c8638 Compare January 13, 2025 14:49
@mpickering
Copy link
Collaborator Author

@sheaf and I discussed this and for the backport, the have gone with a revert of the original patch.

I have added two new tests which check for regressions introduced in the original patch.

In the future we will work on a proper fix the original issue the reverted patch attempted to fix.

This reverts commit 8bdda9c.

In configureCompiler the call to configureAllKnownPrograms was too
eager. When called it selected the version of tools from PATH (such as
alex), and then when a package was configured these tools were passed
using `--with-alex` options to configure, which meant that the
build-tool-depends versions were not used. (See haskell#10692)

Why was this call introduced in the first place? Because
configureCompiler would a different result depending on whether:

* It is run for the first time, the `ProgramDb` will contain
  unconfigured programs.
* It is run subsequently, `ProgramDb` is read from disk, it does not
  contain unconfigured programs.

Reverting this commit rexposes the bug that the serialised ProgramDb
will not contain UnconfiguredPrograms (in the case where reconfiguring
is avoided).

However, there are no code paths which require this logic in
`cabal-install` currently. The configuration phase happens again each
time that `Cabal` is called, with a populated `ProgramDb`. We will
fix this before the next major `cabal-install` release, but it would not
be suitable to backport.

In the future we will fix this properly by refactoring
`configureCompiler` so that `ProgramDb` is not serialised. The general
approach will be to make `configCompilerEx` return a pair of configured
programs (`ghc` and `ghc-pkg`) and expose an additional function from
`Cabal` which uses these two programs to perform the modifications to
the `ProgramDb` which `configCompilerEx` performs.

Also see haskell#2238 and haskell#9840

Fixes haskell#10692
The testcase is not so easy to write because

* The bug only surfaces when the build-tool you are depending on is
  known (ie alex, happy etc)
* But then it is tricky to write a test, as we can't depend on the known
  tools or bundle the source for them.
* So we create a fake "alex", which cabal then invokes on a fake ".x"
  file. This is maybe a bit fragile if the way cabal invokes alex
  changes in future, but then the test can be modified as well.

Ticket haskell#10692
Whilst fixing haskell#10692, I realised there was also this bug where
extra-prog-path would not be honoured for specific packages.

The idea behind extra-prog-path is that each local package can use a
different version of a preprocessor if desired.
@sheaf
Copy link
Collaborator

sheaf commented Jan 15, 2025

This should be ready now if anyone wants to take a look? @ulysses4ever @jasagredo perhaps?

@mpickering
Copy link
Collaborator Author

Is there anyone available to provide the second review on this patch?

Copy link
Collaborator

@jasagredo jasagredo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is unfortunate that we have to revert back to the wasteful re-computation of the step, but at least this fixes my issue. Thanks!

@mpickering mpickering added the merge me Tell Mergify Bot to merge label Jan 22, 2025
@mergify mergify bot added the ready and waiting Mergify is waiting out the cooldown period label Jan 22, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
attention: needs-review merge me Tell Mergify Bot to merge ready and waiting Mergify is waiting out the cooldown period
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[3.14] Initial configuration of programs does not use build-tool-depends
4 participants