From 4ea2cb8ddd18ca78a91d799885f3ff8806fc8425 Mon Sep 17 00:00:00 2001 From: Ilya Baryshnikov Date: Mon, 24 Aug 2026 15:23:04 +0300 Subject: [PATCH 1/3] add test --- .../ConditionalFlagOverride/cabal.out | 8 ++++++++ .../ConditionalFlagOverride/cabal.project | 8 ++++++++ .../ConditionalFlagOverride/cabal.test.hs | 4 ++++ .../ConditionalFlagOverride/test.cabal | 14 ++++++++++++++ 4 files changed, 34 insertions(+) create mode 100644 cabal-testsuite/PackageTests/ProjectConfig/ConditionalFlagOverride/cabal.out create mode 100644 cabal-testsuite/PackageTests/ProjectConfig/ConditionalFlagOverride/cabal.project create mode 100644 cabal-testsuite/PackageTests/ProjectConfig/ConditionalFlagOverride/cabal.test.hs create mode 100644 cabal-testsuite/PackageTests/ProjectConfig/ConditionalFlagOverride/test.cabal diff --git a/cabal-testsuite/PackageTests/ProjectConfig/ConditionalFlagOverride/cabal.out b/cabal-testsuite/PackageTests/ProjectConfig/ConditionalFlagOverride/cabal.out new file mode 100644 index 00000000000..b9929ed847c --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectConfig/ConditionalFlagOverride/cabal.out @@ -0,0 +1,8 @@ +# cabal build +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following will be built: + - test-0.1 (lib) (first run) +Configuring library for test-0.1... +Preprocessing library for test-0.1... +Building library for test-0.1... diff --git a/cabal-testsuite/PackageTests/ProjectConfig/ConditionalFlagOverride/cabal.project b/cabal-testsuite/PackageTests/ProjectConfig/ConditionalFlagOverride/cabal.project new file mode 100644 index 00000000000..46c1945879c --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectConfig/ConditionalFlagOverride/cabal.project @@ -0,0 +1,8 @@ +packages: . + +if impl(ghc >= 9.0) + package test + flags: +bar + +package test + flags: -bar diff --git a/cabal-testsuite/PackageTests/ProjectConfig/ConditionalFlagOverride/cabal.test.hs b/cabal-testsuite/PackageTests/ProjectConfig/ConditionalFlagOverride/cabal.test.hs new file mode 100644 index 00000000000..db6203e6546 --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectConfig/ConditionalFlagOverride/cabal.test.hs @@ -0,0 +1,4 @@ +import Test.Cabal.Prelude + +main = cabalTest $ do + cabal "build" [] diff --git a/cabal-testsuite/PackageTests/ProjectConfig/ConditionalFlagOverride/test.cabal b/cabal-testsuite/PackageTests/ProjectConfig/ConditionalFlagOverride/test.cabal new file mode 100644 index 00000000000..e34eb303670 --- /dev/null +++ b/cabal-testsuite/PackageTests/ProjectConfig/ConditionalFlagOverride/test.cabal @@ -0,0 +1,14 @@ +cabal-version: 3.0 +name: test +version: 0.1 +license: BSD-3-Clause +build-type: Simple + +flag bar + default: True + manual: True + +library + default-language: Haskell2010 + if flag(bar) + buildable: False From 357d0fb2fee26b1c5a6b3110badcb1f7bf5ab607 Mon Sep 17 00:00:00 2001 From: Ilya Baryshnikov Date: Mon, 24 Aug 2026 15:23:24 +0300 Subject: [PATCH 2/3] reverse order --- cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs b/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs index a733d61fe4a..22a88019540 100644 --- a/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs +++ b/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs @@ -227,7 +227,7 @@ instantiateProjectConfigSkeletonWithCompiler os arch impl _flags skel = go $ map go :: CondTree FlagName ([(Maybe URI, ProjectConfigPath)], ProjectConfig) -> ProjectConfig go (CondNode (_, l) ts) = let branches = concatMap processBranch ts - in l <> mconcat branches + in mconcat branches <> l processBranch (CondBranch cnd t mf) = case cnd of (Lit True) -> [go t] (Lit False) -> maybe [] ((: []) . go) mf From faebf6b4b6feca06cad83fbea9e594bb87c98b24 Mon Sep 17 00:00:00 2001 From: Ilya Baryshnikov Date: Mon, 24 Aug 2026 15:24:19 +0300 Subject: [PATCH 3/3] add changelog --- changelog.d/12279.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 changelog.d/12279.md diff --git a/changelog.d/12279.md b/changelog.d/12279.md new file mode 100644 index 00000000000..72888a64efb --- /dev/null +++ b/changelog.d/12279.md @@ -0,0 +1,28 @@ +--- +synopsis: Unconditional project settings now override settings in conditional clauses +packages: [cabal-install] +prs: 12279 +issues: 9293 +--- + +Fix a bug where an unconditional setting in a project file (e.g. +`cabal.project` or an imported file such as `cabal.project.local`) was silently +ignored when an earlier setting for the same option appeared inside a +conditional clause. + +Previously the conditional clauses were always merged _after_ the unconditional +fields, so a conditional won regardless of where it appeared in the file: + +```cabal +if impl(ghc >= 9.0) + package foo + flags: +bar + +package foo + flags: -bar +``` + +This would build `foo` with `bar` enabled, because `+bar` was applied last. +The skeleton is now combined in the opposite order, applying the unconditional +fields last so they take precedence over the conditional ones. Overrides in +`cabal.project.local` are therefore no longer shadowed by conditionals.