Skip to content

Commit

Permalink
Make --ghc-options and --ghcjs-bot-options take multiple args #3315
Browse files Browse the repository at this point in the history
  • Loading branch information
mgsloan committed Aug 6, 2017
1 parent c64a366 commit 8c76ccc
Show file tree
Hide file tree
Showing 7 changed files with 30 additions and 20 deletions.
2 changes: 2 additions & 0 deletions ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ Other enhancements:
[#3232](https://github.com/commercialhaskell/stack/issues/3232).
* Introduce the `Stack.StaticBytes` module for more efficiently
holding statically-known byte sizes.
* `--ghc-options` and `--ghcjs-boot-options` now parse their input, so
multiple arguments can be passed in one option.

Bug fixes:

Expand Down
13 changes: 12 additions & 1 deletion src/Options/Applicative/Args.hs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

module Options.Applicative.Args
(argsArgument
,manyArgsOptions
,textArgsOption
,argsOption
,cmdOption
,parseArgsFromString)
Expand All @@ -16,13 +18,22 @@ 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. @--ghc-options="-X P.hs \"this\""@.
-- | An argument which accepts a list of arguments e.g. @"-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 string))

-- | Like 'textArgsOption', but allows the option to be used multiple
-- time. 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 =
Expand Down
11 changes: 5 additions & 6 deletions src/Stack/Options/BuildParser.hs
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,11 @@ buildOptsParser cmd =
["-O0"]
(long "fast" <>
help "Turn off optimizations (-O0)") <*>
many
(textOption
(long "ghc-options" <>
metavar "OPTIONS" <>
completer ghcOptsCompleter <>
help "Additional options passed to GHC"))) <*>
manyArgsOptions
(long "ghc-options" <>
metavar "OPTIONS" <>
completer ghcOptsCompleter <>
help "Additional options passed to GHC")) <*>
flagsParser <*>
(flag'
BSOnlyDependencies
Expand Down
11 changes: 5 additions & 6 deletions src/Stack/Options/GhciParser.hs
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,11 @@ ghciOptsParser = GhciOpts
metavar "OPTIONS" <>
completer ghcOptsCompleter <>
help "Additional options passed to GHCi")))
<*> many
(textOption
(long "ghc-options" <>
metavar "OPTIONS" <>
completer ghcOptsCompleter <>
help "Additional options passed to both GHC and GHCi"))
<*> manyArgsOptions
(long "ghc-options" <>
metavar "OPTIONS" <>
completer ghcOptsCompleter <>
help "Additional options passed to both GHC and GHCi")
<*> flagsParser
<*> optional
(strOption (long "with-ghc" <>
Expand Down
1 change: 0 additions & 1 deletion src/Stack/Options/NixParser.hs
Original file line number Diff line number Diff line change
Expand Up @@ -56,4 +56,3 @@ 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
9 changes: 5 additions & 4 deletions src/Stack/SetupCmd.hs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ 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
Expand All @@ -33,7 +34,7 @@ data SetupCmdOpts = SetupCmdOpts
, scoUpgradeCabal :: !(Maybe UpgradeTo)
, scoSetupInfoYaml :: !String
, scoGHCBindistURL :: !(Maybe String)
, scoGHCJSBootOpts :: ![String]
, scoGHCJSBootOpts :: ![Text]
, scoGHCJSBootClean :: !Bool
}

Expand Down Expand Up @@ -82,10 +83,10 @@ setupParser = SetupCmdOpts
(OA.long "ghc-bindist"
<> OA.metavar "URL"
<> OA.help "Alternate GHC binary distribution (requires custom --ghc-variant)"))
<*> OA.many (OA.strOption
<*> OA.manyArgsOptions
(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"
Expand Down Expand Up @@ -123,7 +124,7 @@ setup SetupCmdOpts{..} wantedCompiler compilerCheck mstack = do
, soptsResolveMissingGHC = Nothing
, soptsSetupInfoYaml = scoSetupInfoYaml
, soptsGHCBindistURL = scoGHCBindistURL
, soptsGHCJSBootOpts = scoGHCJSBootOpts ++ ["--clean" | scoGHCJSBootClean]
, soptsGHCJSBootOpts = map T.unpack scoGHCJSBootOpts ++ ["--clean" | scoGHCJSBootClean]
}
let compiler = case wantedCompiler of
GhcVersion _ -> "GHC"
Expand Down
3 changes: 1 addition & 2 deletions src/main/Main.hs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ 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)
Expand Down Expand Up @@ -584,7 +583,7 @@ cleanCmd opts go = withBuildConfigAndLockNoDocker go (const (clean opts))
-- | Helper for build and install commands
buildCmd :: BuildOptsCLI -> GlobalOpts -> IO ()
buildCmd opts go = do
when (any (("-prof" `elem`) . either (const []) id . parseArgs Escaping) (boptsCLIGhcOptions opts)) $ do
when ("-prof" `elem` 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"
Expand Down

0 comments on commit 8c76ccc

Please sign in to comment.