@@ -52,10 +52,16 @@ import qualified Experiments.Types as E
5252import GHC.Generics (Generic )
5353import Numeric.Natural (Natural )
5454import Development.Shake.Classes
55+ import System.Console.GetOpt
56+ import Data.Maybe
57+ import Control.Monad.Extra
5558
5659
57- config :: FilePath
58- config = " bench/config.yaml"
60+ configPath :: FilePath
61+ configPath = " bench/config.yaml"
62+
63+ configOpt :: OptDescr (Either String FilePath )
64+ configOpt = Option [] [" config" ] (ReqArg Right configPath) " config file"
5965
6066-- | Read the config without dependency
6167readConfigIO :: FilePath -> IO (Config BuildSystem )
@@ -65,17 +71,17 @@ instance IsExample Example where getExampleName = E.getExampleName
6571type instance RuleResult GetExample = Maybe Example
6672type instance RuleResult GetExamples = [Example ]
6773
74+ shakeOpts :: ShakeOptions
75+ shakeOpts =
76+ shakeOptions{shakeChange = ChangeModtimeAndDigestInput , shakeThreads = 0 }
77+
6878main :: IO ()
69- main = shakeArgs shakeOptions {shakeChange = ChangeModtimeAndDigestInput , shakeThreads = 0 } $ do
70- createBuildSystem $ \ resource -> do
71- configStatic <- liftIO $ readConfigIO config
72- let build = outputFolder configStatic
73- buildRules build ghcideBuildRules
74- benchRules build resource (MkBenchRules (askOracle $ GetSamples () ) benchGhcide " ghcide" )
75- csvRules build
76- svgRules build
77- heapProfileRules build
78- action $ allTargets build
79+ main = shakeArgsWith shakeOpts [configOpt] $ \ configs wants -> pure $ Just $ do
80+ let config = fromMaybe configPath $ listToMaybe configs
81+ _configStatic <- createBuildSystem config
82+ case wants of
83+ [] -> want [" all" ]
84+ _ -> want wants
7985
8086ghcideBuildRules :: MkBuildRules BuildSystem
8187ghcideBuildRules = MkBuildRules findGhcForBuildSystem " ghcide" buildGhcide
@@ -89,13 +95,14 @@ data Config buildSystem = Config
8995 versions :: [GitCommit ],
9096 -- | Output folder ('foo' works, 'foo/bar' does not)
9197 outputFolder :: String ,
92- buildTool :: buildSystem
98+ buildTool :: buildSystem ,
99+ profileInterval :: Maybe Double
93100 }
94101 deriving (Generic , Show )
95102 deriving anyclass (FromJSON )
96103
97- createBuildSystem :: ( Resource -> Rules a ) -> Rules a
98- createBuildSystem userRules = do
104+ createBuildSystem :: FilePath -> Rules ( Config BuildSystem )
105+ createBuildSystem config = do
99106 readConfig <- newCache $ \ fp -> need [fp] >> liftIO (readConfigIO fp)
100107
101108 _ <- addOracle $ \ GetExperiments {} -> experiments <$> readConfig config
@@ -105,9 +112,20 @@ createBuildSystem userRules = do
105112 _ <- addOracle $ \ GetBuildSystem {} -> buildTool <$> readConfig config
106113 _ <- addOracle $ \ GetSamples {} -> samples <$> readConfig config
107114
108- benchResource <- newResource " ghcide-bench" 1
115+ configStatic <- liftIO $ readConfigIO config
116+ let build = outputFolder configStatic
117+
118+ buildRules build ghcideBuildRules
119+ benchRules build (MkBenchRules (askOracle $ GetSamples () ) benchGhcide " ghcide" )
120+ csvRules build
121+ svgRules build
122+ heapProfileRules build
123+ phonyRules " " " ghcide" NoProfiling build (examples configStatic)
124+
125+ whenJust (profileInterval configStatic) $ \ i -> do
126+ phonyRules " profiled-" " ghcide" (CheapHeapProfiling i) build (examples configStatic)
109127
110- userRules benchResource
128+ return configStatic
111129
112130newtype GetSamples = GetSamples () deriving newtype (Binary , Eq , Hashable , NFData , Show )
113131type instance RuleResult GetSamples = Natural
0 commit comments