cli defaults override new-build cabal.project settings
- Dominant language
- Haskell
- Stars
- 1.7k
- Forks
- 750
- Avg merge
- 4d 3h
- Merged PRs (30d)
- 28
Description
It appears the fix in #4657 wasn't enough.
I was looking into why setting
```
allow-boot-library-installs: True
```
in a `cabal.project` file would have no effect, and it turns out it's because in `rebuildProjectConfig` the cli-flags have highest priority, due to
```hs
return (projectConfig <> cliConfig, localPackages)
```
however, in #4657 we deliberately injected `applyDefaults` so the `cliConfig` constructed via
```hs
cliConfig = commandLineFlagsToProjectConfig
globalFlags configFlags configExFlags
installFlags haddockFlags
```
already has those defaults.
And here's a dumped version of what `cliConfig` looks like for a simple invocation of `cabal new-build` w/o any CLI arguments:
```hs
ProjectConfig{projectPackages = [], projectPackagesOptional = [],
projectPackagesRepo = [], projectPackagesNamed = [],
projectConfigBuildOnly =
ProjectConfigBuildOnly{projectConfigVerbosity = NoFlag,
projectConfigDryRun = Flag False, projectConfigOnlyDeps = Flag False,
projectConfigSummaryFile = [], projectConfigLogFile = NoFlag,
projectConfigBuildReports = Flag NoReports,
projectConfigReportPlanningFailure = Flag False,
projectConfigSymlinkBinDir = NoFlag, projectConfigOneShot = Flag False,
projectConfigNumJobs = NoFlag, projectConfigKeepGoing = Flag False,
projectConfigOfflineMode = Flag False, projectConfigKeepTempFiles = Flag False,
projectConfigHttpTransport = NoFlag, projectConfigIgnoreExpiry = NoFlag,
projectConfigCacheDir = NoFlag, projectConfigLogsDir = NoFlag,
projectConfigStoreDir = NoFlag},
projectConfigShared =
ProjectConfigShared{projectConfigDistDir = NoFlag,
projectConfigConfigFile = NoFlag, projectConfigProjectFile = NoFlag,
projectConfigHcFlavor = NoFlag, projectConfigHcPath = NoFlag,
projectConfigHcPkg = NoFlag,
projectConfigHaddockIndex = Flag "$datadir/doc/$arch-$os-$compiler/index.html",
projectConfigRemoteRepos = [], projectConfigLocalRepos = [],
projectConfigIndexState = NoFlag, projectConfigConstraints = [],
projectConfigPreferences = [], projectConfigCabalVersion = NoFlag,
projectConfigSolver = Flag AlwaysModular, projectConfigAllowOlder = Nothing,
projectConfigAllowNewer = Nothing, projectConfigMaxBackjumps = Flag 2000,
projectConfigReorderGoals = Flag (ReorderGoals False),
projectConfigCountConflicts = Flag (CountConflicts True),
projectConfigStrongFlags = Flag (StrongFlags False),
projectConfigAllowBootLibInstalls = Flag (AllowBootLibInstalls False),
projectConfigPerComponent = Flag True,
projectConfigIndependentGoals = Flag (IndependentGoals False)},
projectConfigProvenance = fromList [],
projectConfigLocalPackages =
PackageConfig{packageConfigProgramPaths = MapLast{getMapLast = fromList []},
packageConfigProgramArgs = MapMappend{getMapMappend = fromList []},
packageConfigProgramPathExtra = [], packageConfigFlagAssignment = [],
packageConfigVanillaLib = NoFlag, packageConfigSharedLib = NoFlag,
packageConfigStaticLib = NoFlag, packageConfigDynExe = NoFlag,
packageConfigProf = NoFlag, packageConfigProfLib = NoFlag,
packageConfigProfExe = NoFlag, packageConfigProfDetail = NoFlag,
packageConfigProfLibDetail = NoFlag, packageConfigConfigureArgs = [],
packageConfigOptimization = NoFlag, packageConfigProgPrefix = NoFlag,
packageConfigProgSuffix = NoFlag, packageConfigExtraLibDirs = [],
packageConfigExtraFrameworkDirs = [], packageConfigExtraIncludeDirs = [],
packageConfigGHCiLib = NoFlag, packageConfigSplitObjs = NoFlag,
packageConfigStripExes = NoFlag, packageConfigStripLibs = NoFlag,
packageConfigTests = NoFlag, packageConfigBenchmarks = NoFlag,
packageConfigCoverage = NoFlag, packageConfigRelocatable = NoFlag,
packageConfigDebugInfo = NoFlag, packageConfigRunTests = NoFlag,
packageConfigDocumentation = Flag False,
packageConfigHaddockHoogle = Flag False, packageConfigHaddockHtml = Flag False,
packageConfigHaddockHtmlLocation = NoFlag,
packageConfigHaddockForeignLibs = Flag False,
packageConfigHaddockExecutables = Flag False,
packageConfigHaddockTestSuites = Flag False,
packageConfigHaddockBenchmarks = Flag False,
packageConfigHaddockInternal = Flag False, packageConfigHaddockCss = NoFlag,
packageConfigHaddockHscolour = Flag False,
packageConfigHaddockHscolourCss = NoFlag, packageConfigHaddockContents = NoFlag,
packageConfigHaddockForHackage = NoFlag},
projectConfigSpecificPackage = MapMappend{getMapMappend = fromList []}}
```
As can be seen, all flags which have a definitive `Flag ...` constructor will effectively override `cabal.project` settings, and specifically
```hs
projectConfigAllowBootLibInstalls = Flag (AllowBootLibInstalls False),
```
was the setting I was looking for...
and it appears to me, that the default injection should instead happen in `rebuildProjectConfig` (which is called by `establishProjectBaseContext`)
/cc @alexbiehl @23Skidoo
Contributor guide
Research direction
Start with rebuildProjectConfig, called by establishProjectBaseContext, and compare it with commandLineFlagsToProjectConfig and the default injection from #4657. Verify that a setting in cabal.project, such as allow-boot-library-installs, is not overridden when no corresponding CLI argument is supplied, while explicit CLI flags still take precedence.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- haskell
- Domain
- build-system, cli
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100