Skip to content

Commit 080e54d

Browse files
committed
Cabal: Expose --allow-{newer,older} for configure command
1 parent 83c9ac8 commit 080e54d

File tree

2 files changed

+61
-6
lines changed

2 files changed

+61
-6
lines changed

Cabal/src/Distribution/Simple/Configure.hs

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,9 @@ import Text.PrettyPrint
164164

165165
import qualified Data.Maybe as M
166166
import qualified Data.Set as Set
167+
import Distribution.AllowNewer (RelaxKind (..), relaxPackageDeps)
167168
import qualified Distribution.Compat.NonEmptySet as NES
169+
import Distribution.Types.AllowNewer (AllowNewer (..), AllowOlder (..))
168170
import Distribution.Types.AnnotatedId
169171

170172
type UseExternalInternalDeps = Bool
@@ -966,7 +968,8 @@ configure (pkg_descr0, pbi) cfg = do
966968
-- in scripts that *really* want ${pkgroot}. See haskell/cabal/#4872
967969
unless
968970
( isAbsolute (prefix dirs)
969-
|| "${pkgroot}" `isPrefixOf` prefix dirs
971+
|| "${pkgroot}"
972+
`isPrefixOf` prefix dirs
970973
)
971974
$ die' verbosity
972975
$ "expected an absolute directory name for --prefix: " ++ prefix dirs
@@ -1227,7 +1230,14 @@ configureFinalizedPackage
12271230
satisfies
12281231
comp
12291232
compPlatform
1230-
pkg_descr0 = do
1233+
pkg_descr_before_relaxed_bounds = do
1234+
let
1235+
AllowNewer relaxNewer = configAllowNewer cfg
1236+
AllowOlder relaxOlder = configAllowOlder cfg
1237+
pkg_descr0 =
1238+
relaxPackageDeps RelaxLower relaxOlder
1239+
. relaxPackageDeps RelaxUpper relaxNewer
1240+
$ pkg_descr_before_relaxed_bounds
12311241
(pkg_descr0', flags) <-
12321242
case finalizePD
12331243
(configConfigurationsFlags cfg)
@@ -2211,11 +2221,15 @@ checkForeignDeps pkg lbi verbosity =
22112221
let relIncDirs = filter (not . isAbsolute) (collectField includeDirs)
22122222
isHeader = isSuffixOf ".h"
22132223
genHeaders <- for relIncDirs $ \dir ->
2214-
fmap (dir </>) . filter isHeader
2215-
<$> listDirectory (buildDir lbi </> dir) `catchIO` (\_ -> return [])
2224+
fmap (dir </>)
2225+
. filter isHeader
2226+
<$> listDirectory (buildDir lbi </> dir)
2227+
`catchIO` (\_ -> return [])
22162228
srcHeaders <- for relIncDirs $ \dir ->
2217-
fmap (dir </>) . filter isHeader
2218-
<$> listDirectory (baseDir lbi </> dir) `catchIO` (\_ -> return [])
2229+
fmap (dir </>)
2230+
. filter isHeader
2231+
<$> listDirectory (baseDir lbi </> dir)
2232+
`catchIO` (\_ -> return [])
22192233
let commonHeaders = concat genHeaders `intersect` concat srcHeaders
22202234
for_ commonHeaders $ \hdr -> do
22212235
warn verbosity $

Cabal/src/Distribution/Simple/Setup/Config.hs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ import Distribution.Compat.Semigroup (Last' (..), Option' (..))
6262
import Distribution.Compat.Stack
6363

6464
import Distribution.Simple.Setup.Common
65+
import Distribution.Types.AllowNewer (AllowNewer (..), AllowOlder (..), RelaxDeps (..), isRelaxDeps)
6566

6667
-- ------------------------------------------------------------
6768

@@ -220,6 +221,10 @@ data ConfigFlags = ConfigFlags
220221
-- ^ Allow depending on private sublibraries. This is used by external
221222
-- tools (like cabal-install) so they can add multiple-public-libraries
222223
-- compatibility to older ghcs by checking visibility externally.
224+
, configAllowNewer :: AllowNewer
225+
-- ^ Ignore upper bounds on all or some dependencies.
226+
, configAllowOlder :: AllowOlder
227+
-- ^ Ignore lower bounds on all or some dependencies.
223228
}
224229
deriving (Generic, Read, Show, Typeable)
225230

@@ -288,6 +293,8 @@ instance Eq ConfigFlags where
288293
&& equal configDebugInfo
289294
&& equal configDumpBuildInfo
290295
&& equal configUseResponseFiles
296+
&& equal configAllowNewer
297+
&& equal configAllowOlder
291298
where
292299
equal f = on (==) f a b
293300

@@ -342,6 +349,8 @@ defaultConfigFlags progDb =
342349
, configDebugInfo = Flag NoDebugInfo
343350
, configDumpBuildInfo = NoFlag
344351
, configUseResponseFiles = NoFlag
352+
, configAllowNewer = AllowNewer mempty
353+
, configAllowOlder = AllowOlder mempty
345354
}
346355
{- FOURMOLU_ENABLE -}
347356

@@ -828,8 +837,40 @@ configureOptions showOrParseArgs =
828837
configAllowDependingOnPrivateLibs
829838
(\v flags -> flags{configAllowDependingOnPrivateLibs = v})
830839
trueArg
840+
, option
841+
""
842+
["allow-older"]
843+
"Allow older dependencies."
844+
configAllowOlder
845+
(\v flags -> flags{configAllowOlder = v})
846+
( optArg
847+
"PKG1:DEP1,PKG2:DEP2,..."
848+
(fmap AllowOlder parseRelaxDeps)
849+
(AllowOlder RelaxDepsAll)
850+
((: []) . Just . show . isRelaxDeps . unAllowOlder)
851+
)
852+
, option
853+
""
854+
["allow-newer"]
855+
"Allow newer dependencies."
856+
configAllowNewer
857+
(\v flags -> flags{configAllowNewer = v})
858+
( optArg
859+
"PKG1:DEP1,PKG2:DEP2,..."
860+
(fmap AllowNewer parseRelaxDeps)
861+
(AllowNewer RelaxDepsAll)
862+
((: []) . Just . show . isRelaxDeps . unAllowNewer)
863+
)
831864
]
832865
where
866+
toRelaxDeps True = RelaxDepsAll
867+
toRelaxDeps False = mempty
868+
869+
parseRelaxDeps =
870+
parsecToReadE ("Not a valid list of dependencies: " ++) $
871+
fmap toRelaxDeps parsec
872+
<|> fmap RelaxDepsSome (parsecOptCommaList parsec)
873+
833874
liftInstallDirs =
834875
liftOption configInstallDirs (\v flags -> flags{configInstallDirs = v})
835876

0 commit comments

Comments
 (0)