@@ -13,7 +13,7 @@ import Data.List (scanl')
13import Data.Maybe (catMaybes)
13import Data.Maybe (catMaybes)
14import System.Console.GetOpt
14import System.Console.GetOpt
15 (OptDescr(..), ArgDescr(..), ArgOrder(..), getOpt')
15 (OptDescr(..), ArgDescr(..), ArgOrder(..), getOpt')
16−import System.Environment (getArgs)
16+import System.Environment (getArgs, lookupEnv, setEnv)
17import Text.Read (readMaybe)
17import Text.Read (readMaybe)
19import Gauge
19import Gauge
@@ -24,6 +24,12 @@ import Gauge
25data BenchOpts = StreamSize Int deriving Show
25data BenchOpts = StreamSize Int deriving Show
27+getStreamSize :: String -> Int
29+ case (readMaybe size :: Maybe Int) of
31+ Nothing -> error "Stream size must be numeric"
27options :: [OptDescr BenchOpts]
33options :: [OptDescr BenchOpts]
@@ -32,11 +38,7 @@ options =
35− getSize :: String -> BenchOpts
37− case (readMaybe size :: Maybe Int) of
38− Just x -> StreamSize x
41+ getSize = StreamSize . getStreamSize
39− Nothing -> error "Stream size must be numeric"
41deleteOptArgs
43deleteOptArgs
42 :: (Maybe String, Maybe String) -- (prev, yielded)
44 :: (Maybe String, Maybe String) -- (prev, yielded)
@@ -59,18 +61,29 @@ parseCLIOpts defaultStreamSize = do
59 -- Parse custom options
61 -- Parse custom options
60 let (opts, _, _, errs) = getOpt' Permute options args
62 let (opts, _, _, errs) = getOpt' Permute options args
61 when (not $ null errs) $ error $ concat errs
63 when (not $ null errs) $ error $ concat errs
62− (streamSize, args') <- evaluate $
64+ (streamSize, args') <-
63 case opts of
65 case opts of
64− StreamSize x : _ ->
66+ StreamSize x : _ -> do
67+ -- When using the gauge "--measure-with" option we need to make
68+ -- sure that we pass the stream size to child process forked by
69+ -- gauge. So we use this env var for that purpose.
70+ setEnv "STREAM_SIZE" (show x)
65 -- Hack! remove the option and its argument from args
71 -- Hack! remove the option and its argument from args
66 -- getOpt should have a way to return the unconsumed args in
72 -- getOpt should have a way to return the unconsumed args in
67 -- correct order.
73 -- correct order.
68− let newArgs =
74+ newArgs <-
69− catMaybes
76+ $ catMaybes
71 $ scanl' deleteOptArgs (Nothing, Nothing) args
78 $ scanl' deleteOptArgs (Nothing, Nothing) args
72− in (x, newArgs)
79+ return (x, newArgs)
81+ r <- lookupEnv "STREAM_SIZE"
84+ s <- evaluate $ getStreamSize x
73− _ -> (defaultStreamSize, args)
86+ Nothing -> return (defaultStreamSize, args)
75 -- Parse gauge options
88 -- Parse gauge options
76 let config = defaultConfig
89 let config = defaultConfig
@@ -79,4 +92,4 @@ parseCLIOpts defaultStreamSize = do
79 , includeFirstIter = streamSize > defaultStreamSize
92 , includeFirstIter = streamSize > defaultStreamSize
81 let (cfg, benches) = parseWith config args'
94 let (cfg, benches) = parseWith config args'
82− return (streamSize, cfg, benches)
95+ streamSize `seq` return (streamSize, cfg, benches)