Skip to content

Commit

Permalink
Make --ghc-options and --ghcjs-boot-options take multiple args commer…
Browse files Browse the repository at this point in the history
  • Loading branch information
mgsloan authored and decentral1se committed Aug 7, 2017
1 parent 7ff5bd1 commit 9e2bd40
Show file tree
Hide file tree
Showing 7 changed files with 38 additions and 28 deletions.
3 changes: 3 additions & 0 deletions ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ 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.
See [#3315](https://github.com/commercialhaskell/stack/issues/3315)

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
-- 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 =
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
16 changes: 7 additions & 9 deletions src/Stack/Options/NixParser.hs
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
{-# LANGUAGE NoImplicitPrelude #-}
module Stack.Options.NixParser where

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
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 <$>
Expand Down Expand Up @@ -56,4 +55,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 9e2bd40

Please sign in to comment.