Skip to content

Commit

Permalink
Fix predicate which determines whether to build a shared library
Browse files Browse the repository at this point in the history
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
  • Loading branch information
mpickering committed May 24, 2024
1 parent a6b99b8 commit 5d8fe98
Showing 1 changed file with 2 additions and 1 deletion.
3 changes: 2 additions & 1 deletion cabal-install/src/Distribution/Client/ProjectPlanning.hs
Original file line number Diff line number Diff line change
Expand Up @@ -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'.
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 5d8fe98

Please sign in to comment.