cabal icon indicating copy to clipboard operation
cabal copied to clipboard

Fix predicate which determines whether to build a shared library

Open mpickering opened this issue 1 year ago • 0 comments
trafficstars

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

Please read Github PR Conventions and then fill in one of these two templates.


Template Α: This PR modifies behaviour or interface

Include the following checklist in your PR:

  • [x] Patches conform to the coding conventions.
  • [x] Any changes that could be relevant to users have been recorded in the changelog.
  • [x] The documentation has been updated, if necessary.
  • [ ] Manual QA notes have been included.
  • [ ] Tests have been added. (Ask for help if you don’t know how to write them! Ask for an exemption if tests are too complex for too little coverage!)

mpickering avatar May 24 '24 12:05 mpickering