@@ -13,7 +13,7 @@ import Data.List (scanl')
1313import Data.Maybe (catMaybes)
1414import System.Console.GetOpt
1515 (OptDescr(..), ArgDescr(..), ArgOrder(..), getOpt')
16−import System.Environment (getArgs)
16+import System.Environment (getArgs, lookupEnv, setEnv)
1717import Text.Read (readMaybe)
1818
1919import Gauge
@@ -24,6 +24,12 @@ import Gauge
2424
2525data BenchOpts = StreamSize Int deriving Show
2626
27+getStreamSize :: String -> Int
28+getStreamSize size =
29+ case (readMaybe size :: Maybe Int) of
30+ Just x -> x
31+ Nothing -> error "Stream size must be numeric"
32+
2733options :: [OptDescr BenchOpts]
2834options =
2935 [
@@ -32,11 +38,7 @@ options =
3238
3339 where
3440
35− getSize :: String -> BenchOpts
36− getSize size =
37− case (readMaybe size :: Maybe Int) of
38− Just x -> StreamSize x
39− Nothing -> error "Stream size must be numeric"
41+ getSize = StreamSize . getStreamSize
4042
4143deleteOptArgs
4244 :: (Maybe String, Maybe String) -- (prev, yielded)
@@ -59,18 +61,29 @@ parseCLIOpts defaultStreamSize = do
5961 -- Parse custom options
6062 let (opts, _, _, errs) = getOpt' Permute options args
6163 when (not $ null errs) $ error $ concat errs
62− (streamSize, args') <- evaluate $
64+ (streamSize, args') <-
6365 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)
6571 -- Hack! remove the option and its argument from args
6672 -- getOpt should have a way to return the unconsumed args in
6773 -- correct order.
68− let newArgs =
69− catMaybes
74+ newArgs <-
75+ evaluate
76+ $ catMaybes
7077 $ map snd
7178 $ scanl' deleteOptArgs (Nothing, Nothing) args
72− in (x, newArgs)
73− _ -> (defaultStreamSize, args)
79+ return (x, newArgs)
80+ _ -> do
81+ r <- lookupEnv "STREAM_SIZE"
82+ case r of
83+ Just x -> do
84+ s <- evaluate $ getStreamSize x
85+ return (s, args)
86+ Nothing -> return (defaultStreamSize, args)
7487
7588 -- Parse gauge options
7689 let config = defaultConfig
@@ -79,4 +92,4 @@ parseCLIOpts defaultStreamSize = do
7992 , includeFirstIter = streamSize > defaultStreamSize
8093 }
8194 let (cfg, benches) = parseWith config args'
82− return (streamSize, cfg, benches)
95+ streamSize `seq` return (streamSize, cfg, benches)