Skip to content

Commit 4b8fe70

Browse files
committed
Only call 'cabal path' once when resolving a cradle
1 parent e38adde commit 4b8fe70

File tree

1 file changed

+30
-22
lines changed

1 file changed

+30
-22
lines changed

src/HIE/Bios/Cradle.hs

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ import Data.List.Extra (trimEnd, nubOrd)
6262
import Data.Ord (Down(..))
6363
import qualified Data.Text as T
6464
import qualified Data.Text.Encoding as T
65+
import Data.Traversable (for)
6566
import System.Environment
6667
import System.FilePath
6768
import System.PosixCompat.Files
@@ -237,8 +238,9 @@ resolvedCradlesToCradle logger buildCustomCradle root cs = mdo
237238
act
238239
args
239240
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
242244
err_msg fp
243245
= ["Multi Cradle: No prefixes matched"
244246
, "pwd: " ++ root
@@ -296,15 +298,15 @@ resolvedCradlesToCradle logger buildCustomCradle root cs = mdo
296298
notNoneType _ = True
297299

298300

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 $
301303
case concreteCradle cradle of
302304
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
308310
where
309311
-- Add a log message to each loading operation.
310312
addLoadStyleLogToCradleAction crdlAct = crdlAct
@@ -574,7 +576,7 @@ withCallableToProcess (Program path) files = ContT $ \action -> do
574576
old_env <- getEnvironment
575577
case files of
576578
[] -> action $ (proc canon_path []){env = Nothing}
577-
(x : _) ->
579+
(x : _) ->
578580
runContT (withHieBiosMultiArg files) $ \multi_file -> do
579581
let updated_env = Just $
580582
(hie_bios_multi_arg, multi_file) : old_env
@@ -604,22 +606,27 @@ projectLocationOrDefault = \case
604606

605607
-- |Cabal Cradle
606608
-- 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
610618
{ 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
612620
, runGhcCmd = \args -> runCradleResultT $ do
613-
let vs = cradleProgramVersions cs
614-
callCabalPathForCompilerPath l vs wdir projectFile >>= \case
621+
case ghcPath of
615622
Just p -> readProcessWithCwd_ l wdir p args ""
616623
Nothing -> do
617624
buildDir <- liftIO $ cabalBuildDir wdir
618625
-- Workaround for a cabal-install bug on 3.0.0.0:
619626
-- ./dist-newstyle/tmp/environment.-24811: createDirectory: does not exist (No such file or directory)
620627
liftIO $ createDirectoryIfMissing True (buildDir </> "tmp")
621628
-- 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
623630
readProcessWithCwd' l cabalProc ""
624631
}
625632

@@ -633,9 +640,9 @@ cabalCradle l cs wdir mc projectFile
633640
-- to the custom ghc wrapper via 'hie_bios_ghc' environment variable which
634641
-- the custom ghc wrapper may use as a fallback if it can not respond to certain
635642
-- 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
639646
Just p -> do
640647
libdir <- readProcessWithCwd_ l workDir p ["--print-libdir"] ""
641648
pure (p, trimEnd libdir)
@@ -895,13 +902,14 @@ isCabalMultipleCompSupported vs = do
895902
cabalAction
896903
:: ResolvedCradles a
897904
-> FilePath
905+
-> Maybe FilePath
898906
-> Maybe String
899907
-> LogAction IO (WithSeverity Log)
900908
-> CradleProjectConfig
901909
-> FilePath
902910
-> LoadStyle
903911
-> 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
905913
multiCompSupport <- isCabalMultipleCompSupported vs
906914
-- determine which load style is supported by this cabal cradle.
907915
determinedLoadStyle <- case loadStyle of
@@ -932,7 +940,7 @@ cabalAction (ResolvedCradles root cs vs) workDir mc l projectFile fp loadStyle =
932940
let cabalCommand = "v2-repl"
933941

934942
cabalProc <-
935-
cabalProcess l vs projectFile workDir cabalCommand cabalArgs `modCradleError` \err -> do
943+
cabalProcess l projectFile workDir ghcPath cabalCommand cabalArgs `modCradleError` \err -> do
936944
deps <- cabalCradleDependencies projectFile workDir workDir
937945
pure $ err {cradleErrorDependencies = cradleErrorDependencies err ++ deps}
938946

0 commit comments

Comments
 (0)