From d977fca9955ca699a520001384528cac70c48da0 Mon Sep 17 00:00:00 2001 From: Michael Sloan Date: Sun, 22 Oct 2017 17:03:19 -0700 Subject: [PATCH] Revert "Make --ghc-options and --ghcjs-boot-options take multiple args #3315" This reverts commit 9e2bd404dd46d043a9a3d289db23a878a911510a. --- ChangeLog.md | 3 --- src/Options/Applicative/Args.hs | 13 +------------ src/Stack/Options/BuildParser.hs | 11 ++++++----- src/Stack/Options/GhciParser.hs | 11 ++++++----- src/Stack/Options/NixParser.hs | 16 +++++++++------- src/Stack/SetupCmd.hs | 9 ++++----- src/main/Main.hs | 3 ++- 7 files changed, 28 insertions(+), 38 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 271ec55d04..0bba4bb228 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -75,9 +75,6 @@ Other enhancements: * `stack setup` for ghcjs will now install `alex` and `happy` if they are not present. See [#3109](https://github.com/commercialhaskell/stack/issues/3232). -* `--ghc-options` and `--ghcjs-boot-options` now parse their input, so - multiple arguments can be passed in one option. - See [#3315](https://github.com/commercialhaskell/stack/issues/3315) * Added `stack ghci --only-main` flag, to skip loading / importing all but main modules. See the ghci documentation page for further info. diff --git a/src/Options/Applicative/Args.hs b/src/Options/Applicative/Args.hs index c8cd4649e3..3799546540 100644 --- a/src/Options/Applicative/Args.hs +++ b/src/Options/Applicative/Args.hs @@ -5,8 +5,6 @@ module Options.Applicative.Args (argsArgument - ,manyArgsOptions - ,textArgsOption ,argsOption ,cmdOption) where @@ -16,22 +14,13 @@ import qualified Data.Text as T import qualified Options.Applicative as O import Stack.Prelude --- | An argument which accepts a list of arguments e.g. @"-X P.hs \"this\""@. +-- | An argument which accepts a list of arguments e.g. @--ghc-options="-X P.hs \"this\""@. argsArgument :: O.Mod O.ArgumentFields [String] -> O.Parser [String] argsArgument = O.argument (do string <- O.str either O.readerError return (parseArgsFromString Escaping string)) --- | Like 'textArgsOption', but allows the option to be used multiple --- times. The options get concatenated. -manyArgsOptions :: O.Mod O.OptionFields [String] -> O.Parser [Text] -manyArgsOptions = fmap concat . many . textArgsOption - --- | Like 'argsOption' but yields 'Text'. -textArgsOption :: O.Mod O.OptionFields [String] -> O.Parser [Text] -textArgsOption = fmap (map T.pack) . argsOption - -- | An option which accepts a list of arguments e.g. @--ghc-options="-X P.hs \"this\""@. argsOption :: O.Mod O.OptionFields [String] -> O.Parser [String] argsOption = diff --git a/src/Stack/Options/BuildParser.hs b/src/Stack/Options/BuildParser.hs index 1a1392678b..f0c1f4c788 100644 --- a/src/Stack/Options/BuildParser.hs +++ b/src/Stack/Options/BuildParser.hs @@ -37,11 +37,12 @@ buildOptsParser cmd = ["-O0"] (long "fast" <> help "Turn off optimizations (-O0)") <*> - manyArgsOptions - (long "ghc-options" <> - metavar "OPTIONS" <> - completer ghcOptsCompleter <> - help "Additional options passed to GHC")) <*> + many + (textOption + (long "ghc-options" <> + metavar "OPTIONS" <> + completer ghcOptsCompleter <> + help "Additional options passed to GHC"))) <*> flagsParser <*> (flag' BSOnlyDependencies diff --git a/src/Stack/Options/GhciParser.hs b/src/Stack/Options/GhciParser.hs index 6ebf8d6781..a142cca6f0 100644 --- a/src/Stack/Options/GhciParser.hs +++ b/src/Stack/Options/GhciParser.hs @@ -28,11 +28,12 @@ ghciOptsParser = GhciOpts metavar "OPTIONS" <> completer ghcOptsCompleter <> help "Additional options passed to GHCi"))) - <*> manyArgsOptions - (long "ghc-options" <> - metavar "OPTIONS" <> - completer ghcOptsCompleter <> - help "Additional options passed to both GHC and GHCi") + <*> many + (textOption + (long "ghc-options" <> + metavar "OPTIONS" <> + completer ghcOptsCompleter <> + help "Additional options passed to both GHC and GHCi")) <*> flagsParser <*> optional (strOption (long "with-ghc" <> diff --git a/src/Stack/Options/NixParser.hs b/src/Stack/Options/NixParser.hs index 8fab075bb7..7bffb10904 100644 --- a/src/Stack/Options/NixParser.hs +++ b/src/Stack/Options/NixParser.hs @@ -1,13 +1,14 @@ {-# LANGUAGE NoImplicitPrelude #-} module Stack.Options.NixParser where -import Options.Applicative -import Options.Applicative.Args -import Options.Applicative.Builder.Extra -import Stack.Nix -import Stack.Options.Utils -import Stack.Prelude -import Stack.Types.Nix +import qualified Data.Text as T +import Options.Applicative +import Options.Applicative.Args +import Options.Applicative.Builder.Extra +import Stack.Nix +import Stack.Options.Utils +import Stack.Prelude +import Stack.Types.Nix nixOptsParser :: Bool -> Parser NixOptsMonoid nixOptsParser hide0 = overrideActivation <$> @@ -55,3 +56,4 @@ nixOptsParser hide0 = overrideActivation <$> if fromFirst False (nixMonoidPureShell m) then m { nixMonoidEnable = (First . Just . fromFirst True) (nixMonoidEnable m) } else m + textArgsOption = fmap (map T.pack) . argsOption diff --git a/src/Stack/SetupCmd.hs b/src/Stack/SetupCmd.hs index 92b3f0b84d..0f1e036ce1 100644 --- a/src/Stack/SetupCmd.hs +++ b/src/Stack/SetupCmd.hs @@ -17,7 +17,6 @@ import Control.Monad.Logger () import Control.Monad.Reader import qualified Data.Text as T import qualified Options.Applicative as OA -import qualified Options.Applicative.Args as OA import qualified Options.Applicative.Builder.Extra as OA import qualified Options.Applicative.Types as OA import Path @@ -33,7 +32,7 @@ data SetupCmdOpts = SetupCmdOpts , scoUpgradeCabal :: !(Maybe UpgradeTo) , scoSetupInfoYaml :: !String , scoGHCBindistURL :: !(Maybe String) - , scoGHCJSBootOpts :: ![Text] + , scoGHCJSBootOpts :: ![String] , scoGHCJSBootClean :: !Bool } @@ -82,10 +81,10 @@ setupParser = SetupCmdOpts (OA.long "ghc-bindist" <> OA.metavar "URL" <> OA.help "Alternate GHC binary distribution (requires custom --ghc-variant)")) - <*> OA.manyArgsOptions + <*> OA.many (OA.strOption (OA.long "ghcjs-boot-options" <> OA.metavar "GHCJS_BOOT" - <> OA.help "Additional ghcjs-boot options") + <> OA.help "Additional ghcjs-boot options")) <*> OA.boolFlags True "ghcjs-boot-clean" "Control if ghcjs-boot should have --clean option present" @@ -123,7 +122,7 @@ setup SetupCmdOpts{..} wantedCompiler compilerCheck mstack = do , soptsResolveMissingGHC = Nothing , soptsSetupInfoYaml = scoSetupInfoYaml , soptsGHCBindistURL = scoGHCBindistURL - , soptsGHCJSBootOpts = map T.unpack scoGHCJSBootOpts ++ ["--clean" | scoGHCJSBootClean] + , soptsGHCJSBootOpts = scoGHCJSBootOpts ++ ["--clean" | scoGHCJSBootClean] } let compiler = case wantedCompiler of GhcVersion _ -> "GHC" diff --git a/src/main/Main.hs b/src/main/Main.hs index 52183a6711..76d1805c10 100644 --- a/src/main/Main.hs +++ b/src/main/Main.hs @@ -23,6 +23,7 @@ import Control.Monad.Logger (runNoLoggingT) import Control.Monad.Reader (local) import Control.Monad.Trans.Except (ExceptT) import Control.Monad.Writer.Lazy (Writer) +import Data.Attoparsec.Args (parseArgs, EscapingMode (Escaping)) import Data.Attoparsec.Interpreter (getInterpreterArgs) import qualified Data.ByteString.Lazy as L import Data.IORef.RunOnce (runOnce) @@ -591,7 +592,7 @@ cleanCmd opts go = -- | Helper for build and install commands buildCmd :: BuildOptsCLI -> GlobalOpts -> IO () buildCmd opts go = do - when ("-prof" `elem` boptsCLIGhcOptions opts) $ do + when (any (("-prof" `elem`) . either (const []) id . parseArgs Escaping) (boptsCLIGhcOptions opts)) $ do hPutStrLn stderr "Error: When building with stack, you should not use the -prof GHC option" hPutStrLn stderr "Instead, please use --library-profiling and --executable-profiling" hPutStrLn stderr "See: https://github.com/commercialhaskell/stack/issues/1015"