@@ -26,6 +26,8 @@ module Distribution.Simple.Build
2626 ( -- * Build
2727 build
2828 , build_setupHooks
29+ , buildComponent
30+ , runPostBuildHooks
2931
3032 -- * Repl
3133 , repl
@@ -34,6 +36,7 @@ module Distribution.Simple.Build
3436
3537 -- * Build preparation
3638 , preBuildComponent
39+ , runPreBuildHooks
3740 , AutogenFile (.. )
3841 , AutogenFileContents
3942 , writeBuiltinAutogenFiles
@@ -93,6 +96,7 @@ import Distribution.Simple.BuildPaths
9396import Distribution.Simple.BuildTarget
9497import Distribution.Simple.BuildToolDepends
9598import Distribution.Simple.Configure
99+ import Distribution.Simple.Errors
96100import Distribution.Simple.Flag
97101import Distribution.Simple.LocalBuildInfo
98102import Distribution.Simple.PreProcess
@@ -107,9 +111,8 @@ import Distribution.Simple.Setup.Common
107111import Distribution.Simple.Setup.Config
108112import Distribution.Simple.Setup.Repl
109113import Distribution.Simple.SetupHooks.Internal
110- ( BuildHooks (.. )
111- , BuildingWhat (.. )
112- , noBuildHooks
114+ ( BuildingWhat (.. )
115+ , buildingWhatVerbosity
113116 )
114117import qualified Distribution.Simple.SetupHooks.Internal as SetupHooks
115118import qualified Distribution.Simple.SetupHooks.Rule as SetupHooks
@@ -129,7 +132,6 @@ import Distribution.Compat.Graph (IsNode (..))
129132import Control.Monad
130133import qualified Data.ByteString.Lazy as LBS
131134import qualified Data.Map as Map
132- import Distribution.Simple.Errors
133135import System.Directory (doesFileExist , removeFile )
134136import System.FilePath (takeDirectory )
135137
@@ -146,10 +148,16 @@ build
146148 -> [PPSuffixHandler ]
147149 -- ^ preprocessors to run before compiling
148150 -> IO ()
149- build = build_setupHooks noBuildHooks
151+ build pkg lbi flags suffixHandlers =
152+ void $ build_setupHooks noHooks pkg lbi flags suffixHandlers
153+ where
154+ noHooks = (const $ return [] , const $ return () )
150155
151156build_setupHooks
152- :: BuildHooks
157+ :: ( SetupHooks. PreBuildComponentInputs -> IO [SetupHooks. MonitorFilePath ]
158+ , SetupHooks. PostBuildComponentInputs -> IO ()
159+ )
160+ -- ^ build hooks
153161 -> PackageDescription
154162 -- ^ Mostly information from the .cabal file
155163 -> LocalBuildInfo
@@ -158,13 +166,15 @@ build_setupHooks
158166 -- ^ Flags that the user passed to build
159167 -> [PPSuffixHandler ]
160168 -- ^ preprocessors to run before compiling
161- -> IO ()
169+ -> IO [ SetupHooks. MonitorFilePath ]
162170build_setupHooks
163- (BuildHooks {preBuildComponentRules = mbPbcRules, postBuildComponentHook = mbPostBuild} )
171+ (preBuildHook, postBuildHook )
164172 pkg_descr
165173 lbi
166174 flags
167175 suffixHandlers = do
176+ let verbosity = fromFlag $ buildVerbosity flags
177+ distPref = fromFlag $ buildDistPref flags
168178 checkSemaphoreSupport verbosity (compiler lbi) flags
169179 targets <- readTargetInfos verbosity pkg_descr lbi (buildTargets flags)
170180 let componentsToBuild = neededTargetsInBuildOrder' pkg_descr lbi (map nodeKey targets)
@@ -189,7 +199,7 @@ build_setupHooks
189199 dumpBuildInfo verbosity distPref (configDumpBuildInfo (configFlags lbi)) pkg_descr lbi flags
190200
191201 -- Now do the actual building
192- (\ f -> foldM_ f (installedPkgs lbi) componentsToBuild) $ \ index target -> do
202+ (mons, _) <- ( \ f -> foldM f ([] , installedPkgs lbi) componentsToBuild) $ \ (monsAcc, index) target -> do
193203 let comp = targetComponent target
194204 clbi = targetCLBI target
195205 bi = componentBuildInfo comp
@@ -201,18 +211,8 @@ build_setupHooks
201211 , withPackageDB = withPackageDB lbi ++ [internalPackageDB]
202212 , installedPkgs = index
203213 }
204- runPreBuildHooks :: LocalBuildInfo -> TargetInfo -> IO ()
205- runPreBuildHooks lbi2 tgt =
206- let inputs =
207- SetupHooks. PreBuildComponentInputs
208- { SetupHooks. buildingWhat = BuildNormal flags
209- , SetupHooks. localBuildInfo = lbi2
210- , SetupHooks. targetInfo = tgt
211- }
212- in for_ mbPbcRules $ \ pbcRules -> do
213- (ruleFromId, _mons) <- SetupHooks. computeRules verbosity inputs pbcRules
214- SetupHooks. executeRules verbosity lbi2 tgt ruleFromId
215- preBuildComponent runPreBuildHooks verbosity lbi' target
214+ pbci = SetupHooks. PreBuildComponentInputs (BuildNormal flags) lbi' target
215+ mons <- preBuildComponent (preBuildHook pbci) verbosity lbi' target
216216 let numJobs = buildNumJobs flags
217217 par_strat <-
218218 toFlag <$> case buildUseSemaphore flags of
@@ -240,13 +240,40 @@ build_setupHooks
240240 , SetupHooks. localBuildInfo = lbi'
241241 , SetupHooks. targetInfo = target
242242 }
243- for_ mbPostBuild ($ postBuildInputs)
244- return (maybe index (Index. insert `flip` index) mb_ipi)
243+ postBuildHook postBuildInputs
244+ return (monsAcc ++ mons, maybe index (Index. insert `flip` index) mb_ipi)
245+ return mons
246+
247+ runPreBuildHooks
248+ :: SetupHooks. PreBuildComponentInputs
249+ -> SetupHooks. Rules SetupHooks. PreBuildComponentInputs
250+ -> IO [SetupHooks. MonitorFilePath ]
251+ runPreBuildHooks
252+ pbci@ SetupHooks. PreBuildComponentInputs
253+ { SetupHooks. buildingWhat = what
254+ , SetupHooks. localBuildInfo = lbi
255+ , SetupHooks. targetInfo = tgt
256+ }
257+ pbRules = do
258+ let verbosity = buildingWhatVerbosity what
259+ (rules, monitors) <- SetupHooks. computeRules verbosity pbci pbRules
260+ SetupHooks. executeRules verbosity lbi tgt rules
261+ return monitors
245262
246- return ()
247- where
248- distPref = fromFlag (buildDistPref flags)
249- verbosity = fromFlag (buildVerbosity flags)
263+ runPostBuildHooks
264+ :: BuildFlags
265+ -> LocalBuildInfo
266+ -> TargetInfo
267+ -> (SetupHooks. PostBuildComponentInputs -> IO () )
268+ -> IO ()
269+ runPostBuildHooks flags lbi tgt postBuild =
270+ let inputs =
271+ SetupHooks. PostBuildComponentInputs
272+ { SetupHooks. buildFlags = flags
273+ , SetupHooks. localBuildInfo = lbi
274+ , SetupHooks. targetInfo = tgt
275+ }
276+ in postBuild inputs
250277
251278-- | Check for conditions that would prevent the build from succeeding.
252279checkSemaphoreSupport
@@ -333,11 +360,11 @@ repl
333360 -- ^ preprocessors to run before compiling
334361 -> [String ]
335362 -> IO ()
336- repl = repl_setupHooks noBuildHooks
363+ repl = repl_setupHooks ( const $ return [] )
337364
338365repl_setupHooks
339- :: BuildHooks
340- -- ^ build hook
366+ :: ( SetupHooks. PreBuildComponentInputs -> IO [ SetupHooks. MonitorFilePath ])
367+ -- ^ pre- build hook
341368 -> PackageDescription
342369 -- ^ Mostly information from the .cabal file
343370 -> LocalBuildInfo
@@ -349,7 +376,7 @@ repl_setupHooks
349376 -> [String ]
350377 -> IO ()
351378repl_setupHooks
352- ( BuildHooks {preBuildComponentRules = mbPbcRules})
379+ preBuildHook
353380 pkg_descr
354381 lbi
355382 flags
@@ -389,25 +416,16 @@ repl_setupHooks
389416 (componentBuildInfo comp)
390417 (withPrograms lbi')
391418 }
392- runPreBuildHooks :: LocalBuildInfo -> TargetInfo -> IO ()
393- runPreBuildHooks lbi2 tgt =
394- let inputs =
395- SetupHooks. PreBuildComponentInputs
396- { SetupHooks. buildingWhat = BuildRepl flags
397- , SetupHooks. localBuildInfo = lbi2
398- , SetupHooks. targetInfo = tgt
399- }
400- in for_ mbPbcRules $ \ pbcRules -> do
401- (ruleFromId, _mons) <- SetupHooks. computeRules verbosity inputs pbcRules
402- SetupHooks. executeRules verbosity lbi2 tgt ruleFromId
419+ pbci lbi' tgt = SetupHooks. PreBuildComponentInputs (BuildRepl flags) lbi' tgt
403420
404421 -- build any dependent components
405422 sequence_
406423 [ do
407424 let clbi = targetCLBI subtarget
408425 comp = targetComponent subtarget
409426 lbi' = lbiForComponent comp lbi
410- preBuildComponent runPreBuildHooks verbosity lbi' subtarget
427+ _monitors <-
428+ preBuildComponent (preBuildHook (pbci lbi' subtarget)) verbosity lbi' subtarget
411429 buildComponent
412430 (mempty {buildCommonFlags = mempty {setupVerbosity = toFlag verbosity}})
413431 NoFlag
@@ -424,7 +442,8 @@ repl_setupHooks
424442 let clbi = targetCLBI target
425443 comp = targetComponent target
426444 lbi' = lbiForComponent comp lbi
427- preBuildComponent runPreBuildHooks verbosity lbi' target
445+ _monitors <-
446+ preBuildComponent (preBuildHook (pbci lbi' target)) verbosity lbi' target
428447 replComponent flags verbosity pkg_descr lbi' suffixHandlers comp clbi distPref
429448
430449-- | Start an interpreter without loading any package files.
@@ -1121,20 +1140,20 @@ componentInitialBuildSteps _distPref pkg_descr lbi clbi verbosity = do
11211140-- | Creates the autogenerated files for a particular configured component,
11221141-- and runs the pre-build hook.
11231142preBuildComponent
1124- :: ( LocalBuildInfo -> TargetInfo -> IO () )
1143+ :: IO r
11251144 -- ^ pre-build hook
11261145 -> Verbosity
11271146 -> LocalBuildInfo
11281147 -- ^ Configuration information
11291148 -> TargetInfo
1130- -> IO ()
1149+ -> IO r
11311150preBuildComponent preBuildHook verbosity lbi tgt = do
11321151 let pkg_descr = localPkgDescr lbi
11331152 clbi = targetCLBI tgt
11341153 compBuildDir = interpretSymbolicPathLBI lbi $ componentBuildDir lbi clbi
11351154 createDirectoryIfMissingVerbose verbosity True compBuildDir
11361155 writeBuiltinAutogenFiles verbosity pkg_descr lbi clbi
1137- preBuildHook lbi tgt
1156+ preBuildHook
11381157
11391158-- | Generate and write to disk all built-in autogenerated files
11401159-- for the specified component. These files will be put in the
0 commit comments