@@ -62,6 +62,7 @@ import Data.List.Extra (trimEnd, nubOrd)
62
62
import Data.Ord (Down (.. ))
63
63
import qualified Data.Text as T
64
64
import qualified Data.Text.Encoding as T
65
+ import Data.Traversable (for )
65
66
import System.Environment
66
67
import System.FilePath
67
68
import System.PosixCompat.Files
@@ -237,8 +238,9 @@ resolvedCradlesToCradle logger buildCustomCradle root cs = mdo
237
238
act
238
239
args
239
240
versions <- makeVersions logger root run_ghc_cmd
240
- let rcs = ResolvedCradles root cs versions
241
- cradleActions = [ (c, resolveCradleAction logger buildCustomCradle rcs root c) | c <- cs ]
241
+ cradleActions <- for cs $ \ c ->
242
+ fmap (c,) $ resolveCradleAction logger buildCustomCradle (ResolvedCradles root cs versions) root c
243
+ let
242
244
err_msg fp
243
245
= [" Multi Cradle: No prefixes matched"
244
246
, " pwd: " ++ root
@@ -296,15 +298,15 @@ resolvedCradlesToCradle logger buildCustomCradle root cs = mdo
296
298
notNoneType _ = True
297
299
298
300
299
- resolveCradleAction :: Show a => LogAction IO (WithSeverity Log ) -> (b -> CradleAction a ) -> ResolvedCradles b -> FilePath -> ResolvedCradle b -> CradleAction a
300
- resolveCradleAction l buildCustomCradle cs root cradle = addLoadStyleLogToCradleAction $
301
+ resolveCradleAction :: Show a => LogAction IO (WithSeverity Log ) -> (b -> CradleAction a ) -> ResolvedCradles b -> FilePath -> ResolvedCradle b -> IO ( CradleAction a )
302
+ resolveCradleAction l buildCustomCradle cs root cradle = fmap addLoadStyleLogToCradleAction $
301
303
case concreteCradle cradle of
302
304
ConcreteCabal t -> cabalCradle l cs root (cabalComponent t) (projectConfigFromMaybe root (cabalProjectFile t))
303
- ConcreteStack t -> stackCradle l root (stackComponent t) (projectConfigFromMaybe root (stackYaml t))
304
- ConcreteBios bios deps mbGhc -> biosCradle l cs root bios deps mbGhc
305
- ConcreteDirect xs -> directCradle l root xs
306
- ConcreteNone -> noneCradle
307
- ConcreteOther a -> buildCustomCradle a
305
+ ConcreteStack t -> pure $ stackCradle l root (stackComponent t) (projectConfigFromMaybe root (stackYaml t))
306
+ ConcreteBios bios deps mbGhc -> pure $ biosCradle l cs root bios deps mbGhc
307
+ ConcreteDirect xs -> pure $ directCradle l root xs
308
+ ConcreteNone -> pure $ noneCradle
309
+ ConcreteOther a -> pure $ buildCustomCradle a
308
310
where
309
311
-- Add a log message to each loading operation.
310
312
addLoadStyleLogToCradleAction crdlAct = crdlAct
@@ -574,7 +576,7 @@ withCallableToProcess (Program path) files = ContT $ \action -> do
574
576
old_env <- getEnvironment
575
577
case files of
576
578
[] -> action $ (proc canon_path [] ){env = Nothing }
577
- (x : _) ->
579
+ (x : _) ->
578
580
runContT (withHieBiosMultiArg files) $ \ multi_file -> do
579
581
let updated_env = Just $
580
582
(hie_bios_multi_arg, multi_file) : old_env
@@ -604,22 +606,27 @@ projectLocationOrDefault = \case
604
606
605
607
-- | Cabal Cradle
606
608
-- Works for new-build by invoking `v2-repl`.
607
- cabalCradle :: LogAction IO (WithSeverity Log ) -> ResolvedCradles b -> FilePath -> Maybe String -> CradleProjectConfig -> CradleAction a
608
- cabalCradle l cs wdir mc projectFile
609
- = CradleAction
609
+ cabalCradle :: LogAction IO (WithSeverity Log ) -> ResolvedCradles b -> FilePath -> Maybe String -> CradleProjectConfig -> IO (CradleAction a )
610
+ cabalCradle l cs wdir mc projectFile = do
611
+ res <- runCradleResultT $ callCabalPathForCompilerPath l (cradleProgramVersions cs) wdir projectFile
612
+ let
613
+ ghcPath = case res of
614
+ CradleSuccess path -> path
615
+ _ -> Nothing
616
+
617
+ pure $ CradleAction
610
618
{ actionName = Types. Cabal
611
- , runCradle = \ fp -> runCradleResultT . cabalAction cs wdir mc l projectFile fp
619
+ , runCradle = \ fp -> runCradleResultT . cabalAction cs wdir ghcPath mc l projectFile fp
612
620
, runGhcCmd = \ args -> runCradleResultT $ do
613
- let vs = cradleProgramVersions cs
614
- callCabalPathForCompilerPath l vs wdir projectFile >>= \ case
621
+ case ghcPath of
615
622
Just p -> readProcessWithCwd_ l wdir p args " "
616
623
Nothing -> do
617
624
buildDir <- liftIO $ cabalBuildDir wdir
618
625
-- Workaround for a cabal-install bug on 3.0.0.0:
619
626
-- ./dist-newstyle/tmp/environment.-24811: createDirectory: does not exist (No such file or directory)
620
627
liftIO $ createDirectoryIfMissing True (buildDir </> " tmp" )
621
628
-- Need to pass -v0 otherwise we get "resolving dependencies..."
622
- cabalProc <- cabalProcess l vs projectFile wdir " v2-exec" $ [" ghc" , " -v0" , " --" ] ++ args
629
+ cabalProc <- cabalProcess l projectFile wdir Nothing " v2-exec" $ [" ghc" , " -v0" , " --" ] ++ args
623
630
readProcessWithCwd' l cabalProc " "
624
631
}
625
632
@@ -633,9 +640,9 @@ cabalCradle l cs wdir mc projectFile
633
640
-- to the custom ghc wrapper via 'hie_bios_ghc' environment variable which
634
641
-- the custom ghc wrapper may use as a fallback if it can not respond to certain
635
642
-- queries, such as ghc version or location of the libdir.
636
- cabalProcess :: LogAction IO (WithSeverity Log ) -> ProgramVersions -> CradleProjectConfig -> FilePath -> String -> [String ] -> CradleLoadResultT IO CreateProcess
637
- cabalProcess l vs cabalProject workDir command args = do
638
- ghcDirs@ (ghcBin, libdir) <- callCabalPathForCompilerPath l vs workDir cabalProject >>= \ case
643
+ cabalProcess :: LogAction IO (WithSeverity Log ) -> CradleProjectConfig -> FilePath -> Maybe FilePath -> String -> [String ] -> CradleLoadResultT IO CreateProcess
644
+ cabalProcess l cabalProject workDir ghcPath command args = do
645
+ ghcDirs@ (ghcBin, libdir) <- case ghcPath of
639
646
Just p -> do
640
647
libdir <- readProcessWithCwd_ l workDir p [" --print-libdir" ] " "
641
648
pure (p, trimEnd libdir)
@@ -895,13 +902,14 @@ isCabalMultipleCompSupported vs = do
895
902
cabalAction
896
903
:: ResolvedCradles a
897
904
-> FilePath
905
+ -> Maybe FilePath
898
906
-> Maybe String
899
907
-> LogAction IO (WithSeverity Log )
900
908
-> CradleProjectConfig
901
909
-> FilePath
902
910
-> LoadStyle
903
911
-> CradleLoadResultT IO ComponentOptions
904
- cabalAction (ResolvedCradles root cs vs) workDir mc l projectFile fp loadStyle = do
912
+ cabalAction (ResolvedCradles root cs vs) workDir ghcPath mc l projectFile fp loadStyle = do
905
913
multiCompSupport <- isCabalMultipleCompSupported vs
906
914
-- determine which load style is supported by this cabal cradle.
907
915
determinedLoadStyle <- case loadStyle of
@@ -932,7 +940,7 @@ cabalAction (ResolvedCradles root cs vs) workDir mc l projectFile fp loadStyle =
932
940
let cabalCommand = " v2-repl"
933
941
934
942
cabalProc <-
935
- cabalProcess l vs projectFile workDir cabalCommand cabalArgs `modCradleError` \ err -> do
943
+ cabalProcess l projectFile workDir ghcPath cabalCommand cabalArgs `modCradleError` \ err -> do
936
944
deps <- cabalCradleDependencies projectFile workDir workDir
937
945
pure $ err {cradleErrorDependencies = cradleErrorDependencies err ++ deps}
938
946
0 commit comments