From 5d8fe98c4426365d1728faf323eaaf7b8945b559 Mon Sep 17 00:00:00 2001 From: Matthew Pickering Date: Fri, 24 May 2024 13:30:20 +0100 Subject: [PATCH] Fix predicate which determines whether to build a shared library Consider the which determines whether we should build shared libraries. pkgsUseSharedLibrary :: Set PackageId pkgsUseSharedLibrary = packagesWithLibDepsDownwardClosedProperty needsSharedLib where needsSharedLib pkg = fromMaybe compilerShouldUseSharedLibByDefault (liftM2 (||) pkgSharedLib pkgDynExe) where pkgid = packageId pkg pkgSharedLib = perPkgOptionMaybe pkgid packageConfigSharedLib pkgDynExe = perPkgOptionMaybe pkgid packageConfigDynExe In English the intended logic is: If we have enabled shared libraries or dynamic executables then we need to build a shared libary. but, a common mistake: (liftM2 (||) pkgSharedLib pkgDynExe) instead says, if we explicitly request shared libraries and also explicitly configure whether we want dynamic executables then build a shared library. It should instead use the monoid instance: getMax <$> ((Max <$> pkgSharedLib) <> (Max <$> pkgDynExe)) which captures the original logic. This failure is currently manifested in the way that if you write --disable-shared then --enable-shared is still passed to ./Setup. If you pass both --disable-shared and --disable-executable-dynamic then you don't build a shared object. Fixes #10050 --- cabal-install/src/Distribution/Client/ProjectPlanning.hs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cabal-install/src/Distribution/Client/ProjectPlanning.hs b/cabal-install/src/Distribution/Client/ProjectPlanning.hs index ea4fae8ab8c..92b6f0fbdcf 100644 --- a/cabal-install/src/Distribution/Client/ProjectPlanning.hs +++ b/cabal-install/src/Distribution/Client/ProjectPlanning.hs @@ -219,6 +219,7 @@ import Distribution.Solver.Types.ProjectConfigPath import System.FilePath import Text.PrettyPrint (colon, comma, fsep, hang, punctuate, quotes, text, vcat, ($$)) import qualified Text.PrettyPrint as Disp +import Data.Semigroup -- | Check that an 'ElaboratedConfiguredPackage' actually makes -- sense under some 'ElaboratedSharedConfig'. @@ -2365,7 +2366,7 @@ elaborateInstallPlan needsSharedLib pkg = fromMaybe compilerShouldUseSharedLibByDefault - (liftM2 (||) pkgSharedLib pkgDynExe) + (getMax <$> ((Max <$> pkgSharedLib) <> (Max <$> pkgDynExe))) where pkgid = packageId pkg pkgSharedLib = perPkgOptionMaybe pkgid packageConfigSharedLib