diff --git a/app/ghcup/GHCup/OptParse/Common.hs b/app/ghcup/GHCup/OptParse/Common.hs index 2d8abd2..8fd50c9 100644 --- a/app/ghcup/GHCup/OptParse/Common.hs +++ b/app/ghcup/GHCup/OptParse/Common.hs @@ -89,6 +89,18 @@ toolVersionArgument criteria tool = mv _ = "VERSION|TAG" +toolVersionOption :: Maybe ListCriteria -> Maybe Tool -> Parser ToolVersion +toolVersionOption criteria tool = + option (eitherReader toolVersionEither) + ( sh tool + <> completer (tagCompleter (fromMaybe GHC tool) []) + <> foldMap (completer . versionCompleter criteria) tool) + where + sh (Just GHC) = long "ghc" <> metavar "GHC_VERSION|TAG" + sh (Just HLS) = long "hls" <> metavar "HLS_VERSION|TAG" + sh _ = long "version" <> metavar "VERSION|TAG" + + versionParser :: Parser GHCTargetVersion versionParser = option (eitherReader tVersionEither) @@ -246,18 +258,6 @@ criteriaParser s' | t == T.pack "installed" = Right ListInstalled where t = T.toLower (T.pack s') -toolVersionParser :: Parser ToolVersion -toolVersionParser = verP' <|> toolP - where - verP' = ToolVersion <$> versionParser - toolP = - ToolTag - <$> option - (eitherReader tagEither) - (short 't' <> long "tag" <> metavar "TAG" <> help "The target tag") - - - keepOnParser :: String -> Either String KeepDirs keepOnParser s' | t == T.pack "always" = Right Always diff --git a/app/ghcup/GHCup/OptParse/Compile.hs b/app/ghcup/GHCup/OptParse/Compile.hs index fa89c1b..65fee42 100644 --- a/app/ghcup/GHCup/OptParse/Compile.hs +++ b/app/ghcup/GHCup/OptParse/Compile.hs @@ -88,6 +88,7 @@ data HLSCompileOptions = HLSCompileOptions , cabalProjectLocal :: Maybe FilePath , patchDir :: Maybe FilePath , targetGHCs :: [ToolVersion] + , cabalArgs :: [Text] } @@ -148,7 +149,10 @@ Examples: These need to be available in PATH prior to compilation. Examples: - ghcup compile hls -v 1.4.0 -j 12 8.10.5 8.10.7 9.0.1|] + # compile 1.4.0 for ghc 8.10.5 and 8.10.7 + ghcup compile hls -v 1.4.0 -j 12 --ghc 8.10.5 --ghc 8.10.7 + # compile from master for ghc 8.10.7, linking everything dynamically + ghcup compile hls -g master -j 12 --ghc 8.10.7 -- --ghc-options='-dynamic'|] ghcCompileOpts :: Parser GHCCompileOptions @@ -315,7 +319,8 @@ hlsCompileOpts = "Absolute path to patch directory (applies all .patch and .diff files in order using -p1)" ) ) - <*> some (toolVersionArgument Nothing (Just GHC)) + <*> some (toolVersionOption Nothing (Just GHC)) + <*> many (argument str (metavar "CABAL_ARGS" <> help "Additional arguments to cabal install, prefix with '-- ' (longopts)")) @@ -431,6 +436,7 @@ compile compileCommand settings runAppState runLogger = do cabalProject cabalProjectLocal patchDir + cabalArgs GHCupInfo { _ghcupDownloads = dls } <- lift getGHCupInfo let vi = getVersionInfo targetVer HLS dls when setCompile $ void $ liftE $ diff --git a/lib/GHCup.hs b/lib/GHCup.hs index 8881029..f5715dc 100644 --- a/lib/GHCup.hs +++ b/lib/GHCup.hs @@ -753,6 +753,7 @@ compileHLS :: ( MonadMask m -> Maybe FilePath -> Maybe FilePath -> Maybe FilePath + -> [Text] -- ^ additional args to cabal install -> Excepts '[ NoDownload , GPGError , DownloadFailed @@ -763,11 +764,12 @@ compileHLS :: ( MonadMask m , BuildFailed , NotInstalled ] m Version -compileHLS targetHLS ghcs jobs ov isolateDir cabalProject cabalProjectLocal patchdir = do +compileHLS targetHLS ghcs jobs ov isolateDir cabalProject cabalProjectLocal patchdir cabalArgs = do PlatformRequest { .. } <- lift getPlatformReq GHCupInfo { _ghcupDownloads = dls } <- lift getGHCupInfo Dirs { .. } <- lift getDirs + (workdir, tver) <- case targetHLS of -- unpack from version tarball Left tver -> do @@ -867,7 +869,8 @@ compileHLS targetHLS ghcs jobs ov isolateDir cabalProject cabalProjectLocal patc , "--disable-tests" , "--installdir=" <> ghcInstallDir , "--project-file=" <> cp - , "exe:haskell-language-server" + ] ++ fmap T.unpack cabalArgs ++ [ + "exe:haskell-language-server" , "exe:haskell-language-server-wrapper"] ) (Just workdir) "cabal" Nothing