11{-# LANGUAGE CPP #-}
2-
32module Cabal where
43
54import Development.Shake
6- import Development.Shake.Command
75import Development.Shake.FilePath
86import Control.Monad
9- import Data.Maybe ( isNothing
10- , isJust
11- )
12- import Control.Monad.Extra ( whenMaybe )
13- import System.Directory ( findExecutable
14- , copyFile
15- )
7+ import System.Directory ( copyFile )
168
179import Version
1810import Print
1911import Env
20- import Data.Functor.Identity
2112#if RUN_FROM_STACK
2213import Control.Exception ( throwIO )
2314#else
2415import Cabal.Config
16+ import Data.Functor.Identity
2517#endif
2618
2719getInstallDir :: IO FilePath
@@ -38,10 +30,10 @@ execCabal = command [] "cabal"
3830execCabal_ :: [String ] -> Action ()
3931execCabal_ = execCabal
4032
41- cabalBuildData :: Action ()
42- cabalBuildData = do
43- execCabal_ [" v2-build" , " hoogle" ]
44- execCabal_ [" v2-exec" , " hoogle" , " generate" ]
33+ cabalBuildData :: [ String ] -> Action ()
34+ cabalBuildData args = do
35+ execCabal_ $ [" v2-build" , " hoogle" ] ++ args
36+ execCabal_ $ [" v2-exec" , " hoogle" , " generate" ] ++ args
4537
4638getGhcPathOfOrThrowError :: VersionNumber -> Action GhcPath
4739getGhcPathOfOrThrowError versionNumber =
@@ -51,17 +43,20 @@ getGhcPathOfOrThrowError versionNumber =
5143 error (ghcVersionNotFoundFailMsg versionNumber)
5244 Just p -> return p
5345
54- cabalInstallHie :: VersionNumber -> Action ()
55- cabalInstallHie versionNumber = do
46+ cabalInstallHie :: VersionNumber -> [ String ] -> Action ()
47+ cabalInstallHie versionNumber args = do
5648 localBin <- liftIO $ getInstallDir
57- cabalVersion <- getCabalVersion
49+ cabalVersion <- getCabalVersion args
5850 ghcPath <- getGhcPathOfOrThrowError versionNumber
5951
6052 let isCabal3 = checkVersion [3 ,0 ,0 ,0 ] cabalVersion
6153 installDirOpt | isCabal3 = " --installdir"
6254 | otherwise = " --symlink-bindir"
6355 installMethod | isWindowsSystem && isCabal3 = [" --install-method=copy" ]
6456 | otherwise = []
57+
58+ projectFile <- getProjectFile versionNumber
59+
6560 execCabal_ $
6661 [ " v2-install"
6762 , " exe:haskell-language-server"
@@ -71,8 +66,10 @@ cabalInstallHie versionNumber = do
7166 , installDirOpt, localBin
7267 , " --max-backjumps=5000"
7368 , " --overwrite-policy=always"
69+ , " --project-file=" ++ projectFile
7470 ]
7571 ++ installMethod
72+ ++ args
7673
7774 let minorVerExe = " haskell-language-server-" ++ versionNumber <.> exe
7875 majorVerExe = " haskell-language-server-" ++ dropExtension versionNumber <.> exe
@@ -88,20 +85,27 @@ cabalInstallHie versionNumber = do
8885 ++ minorVerExe
8986 ++ " to " ++ localBin
9087
91- checkCabal_ :: Action ()
92- checkCabal_ = checkCabal >> return ()
88+ getProjectFile :: VersionNumber -> Action FilePath
89+ getProjectFile ver = do
90+ existFile <- doesFileExist $ " cabal.project-" ++ ver
91+ return $ if existFile
92+ then " cabal.project-" ++ ver
93+ else " cabal.project"
94+
95+ checkCabal_ :: [String ] -> Action ()
96+ checkCabal_ args = checkCabal args >> return ()
9397
9498-- | check `cabal` has the required version
95- checkCabal :: Action String
96- checkCabal = do
97- cabalVersion <- getCabalVersion
99+ checkCabal :: [ String ] -> Action String
100+ checkCabal args = do
101+ cabalVersion <- getCabalVersion args
98102 unless (checkVersion requiredCabalVersion cabalVersion) $ do
99103 printInStars $ cabalInstallIsOldFailMsg cabalVersion
100104 error $ cabalInstallIsOldFailMsg cabalVersion
101105 return cabalVersion
102106
103- getCabalVersion :: Action String
104- getCabalVersion = trimmedStdout <$> execCabal [" --numeric-version" ]
107+ getCabalVersion :: [ String ] -> Action String
108+ getCabalVersion args = trimmedStdout <$> ( execCabal $ [" --numeric-version" ] ++ args)
105109
106110-- | Error message when the `cabal` binary is an older version
107111cabalInstallIsOldFailMsg :: String -> String
@@ -120,3 +124,21 @@ requiredCabalVersion | isWindowsSystem = requiredCabalVersionForWindows
120124
121125requiredCabalVersionForWindows :: RequiredVersion
122126requiredCabalVersionForWindows = [3 , 0 , 0 , 0 ]
127+
128+ getVerbosityArg :: Verbosity -> String
129+ getVerbosityArg v = " -v" ++ cabalVerbosity
130+ where cabalVerbosity = case v of
131+ Silent -> " 0"
132+ #if MIN_VERSION_shake(0,18,4)
133+ Error -> " 0"
134+ Warn -> " 1"
135+ Info -> " 1"
136+ Verbose -> " 2"
137+ #else
138+ Quiet -> " 0"
139+ Normal -> " 1"
140+ Loud -> " 2"
141+ Chatty -> " 2"
142+ #endif
143+ Diagnostic -> " 3"
144+
0 commit comments