haskell / haskell/cabal

cli defaults override new-build cabal.project settings

Open
#4,737 6 comments 0 reactions 0 assignees View on GitHub
cabal-install: v2-build system status: consider closing type: bug
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.