@@ -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
@@ -86,6 +89,7 @@ import Distribution.Simple.BuildPaths
8689import Distribution.Simple.BuildTarget
8790import Distribution.Simple.BuildToolDepends
8891import Distribution.Simple.Configure
92+ import Distribution.Simple.Errors
8993import Distribution.Simple.Flag
9094import Distribution.Simple.LocalBuildInfo
9195import Distribution.Simple.PreProcess
@@ -101,9 +105,11 @@ import Distribution.Simple.Setup.Repl
101105import Distribution.Simple.SetupHooks.Internal
102106 ( BuildHooks (.. )
103107 , BuildingWhat (.. )
108+ , buildingWhatVerbosity
104109 , noBuildHooks
105110 )
106111import qualified Distribution.Simple.SetupHooks.Internal as SetupHooks
112+ import qualified Distribution.Simple.SetupHooks.Rule as SetupHooks
107113import Distribution.Simple.ShowBuildInfo
108114import Distribution.Simple.Test.LibV09
109115import Distribution.Simple.Utils
@@ -120,7 +126,6 @@ import Distribution.Compat.Graph (IsNode (..))
120126import Control.Monad
121127import qualified Data.ByteString.Lazy as LBS
122128import qualified Data.Map as Map
123- import Distribution.Simple.Errors
124129import System.Directory (doesFileExist , removeFile )
125130import System.FilePath (takeDirectory )
126131
@@ -137,7 +142,8 @@ build
137142 -> [PPSuffixHandler ]
138143 -- ^ preprocessors to run before compiling
139144 -> IO ()
140- build = build_setupHooks noBuildHooks
145+ build pkg lbi flags suffixHandlers =
146+ void $ build_setupHooks noBuildHooks pkg lbi flags suffixHandlers
141147
142148build_setupHooks
143149 :: BuildHooks
@@ -149,13 +155,15 @@ build_setupHooks
149155 -- ^ Flags that the user passed to build
150156 -> [PPSuffixHandler ]
151157 -- ^ preprocessors to run before compiling
152- -> IO ()
158+ -> IO [ SetupHooks. MonitorFilePath ]
153159build_setupHooks
154160 (BuildHooks {preBuildComponentRules = mbPbcRules, postBuildComponentHook = mbPostBuild})
155161 pkg_descr
156162 lbi
157163 flags
158164 suffixHandlers = do
165+ let verbosity = fromFlag $ buildVerbosity flags
166+ distPref = fromFlag $ buildDistPref flags
159167 checkSemaphoreSupport verbosity (compiler lbi) flags
160168 targets <- readTargetInfos verbosity pkg_descr lbi (buildTargets flags)
161169 let componentsToBuild = neededTargetsInBuildOrder' pkg_descr lbi (map nodeKey targets)
@@ -180,7 +188,7 @@ build_setupHooks
180188 dumpBuildInfo verbosity distPref (configDumpBuildInfo (configFlags lbi)) pkg_descr lbi flags
181189
182190 -- Now do the actual building
183- (\ f -> foldM_ f (installedPkgs lbi) componentsToBuild) $ \ index target -> do
191+ (mons, _) <- ( \ f -> foldM f ([] , installedPkgs lbi) componentsToBuild) $ \ (monsAcc, index) target -> do
184192 let comp = targetComponent target
185193 clbi = targetCLBI target
186194 bi = componentBuildInfo comp
@@ -191,18 +199,13 @@ build_setupHooks
191199 , withPackageDB = withPackageDB lbi ++ [internalPackageDB]
192200 , installedPkgs = index
193201 }
194- runPreBuildHooks :: LocalBuildInfo -> TargetInfo -> IO ()
195- runPreBuildHooks lbi2 tgt =
196- let inputs =
197- SetupHooks. PreBuildComponentInputs
198- { SetupHooks. buildingWhat = BuildNormal flags
199- , SetupHooks. localBuildInfo = lbi2
200- , SetupHooks. targetInfo = tgt
201- }
202- in for_ mbPbcRules $ \ pbcRules ->
203- SetupHooks. executeRules verbosity lbi2 tgt pbcRules inputs
204- preBuildComponent runPreBuildHooks verbosity lbi' target
205-
202+ runPreBuildHooksNormal :: IO [SetupHooks. MonitorFilePath ]
203+ runPreBuildHooksNormal =
204+ case mbPbcRules of
205+ Nothing -> return []
206+ Just pbcRules ->
207+ runPreBuildHooks (BuildNormal flags) lbi target pbcRules
208+ mons <- preBuildComponent runPreBuildHooksNormal verbosity lbi target
206209 let numJobs = buildNumJobs flags
207210 par_strat <-
208211 toFlag <$> case buildUseSemaphore flags of
@@ -231,12 +234,41 @@ build_setupHooks
231234 , SetupHooks. targetInfo = target
232235 }
233236 for_ mbPostBuild ($ postBuildInputs)
234- return (maybe index (Index. insert `flip` index) mb_ipi)
237+ return (monsAcc ++ mons, maybe index (Index. insert `flip` index) mb_ipi)
238+ return mons
235239
236- return ()
237- where
238- distPref = fromFlag (buildDistPref flags)
239- verbosity = fromFlag (buildVerbosity flags)
240+ runPreBuildHooks
241+ :: BuildingWhat
242+ -> LocalBuildInfo
243+ -> TargetInfo
244+ -> SetupHooks. Rules SetupHooks. PreBuildComponentInputs
245+ -> IO [SetupHooks. MonitorFilePath ]
246+ runPreBuildHooks what lbi tgt pbRules = do
247+ let inputs =
248+ SetupHooks. PreBuildComponentInputs
249+ { SetupHooks. buildingWhat = what
250+ , SetupHooks. localBuildInfo = lbi
251+ , SetupHooks. targetInfo = tgt
252+ }
253+ verbosity = buildingWhatVerbosity what
254+ (rules, monitors) <- SetupHooks. computeRules verbosity inputs pbRules
255+ SetupHooks. executeRules verbosity lbi tgt rules
256+ return monitors
257+
258+ runPostBuildHooks
259+ :: BuildFlags
260+ -> LocalBuildInfo
261+ -> TargetInfo
262+ -> (SetupHooks. PostBuildComponentInputs -> IO () )
263+ -> IO ()
264+ runPostBuildHooks flags lbi tgt postBuild =
265+ let inputs =
266+ SetupHooks. PostBuildComponentInputs
267+ { SetupHooks. buildFlags = flags
268+ , SetupHooks. localBuildInfo = lbi
269+ , SetupHooks. targetInfo = tgt
270+ }
271+ in postBuild inputs
240272
241273-- | Check for conditions that would prevent the build from succeeding.
242274checkSemaphoreSupport
@@ -378,24 +410,18 @@ repl_setupHooks
378410 (componentBuildInfo comp)
379411 (withPrograms lbi')
380412 }
381- runPreBuildHooks :: LocalBuildInfo -> TargetInfo -> IO ()
382- runPreBuildHooks lbi2 tgt =
383- let inputs =
384- SetupHooks. PreBuildComponentInputs
385- { SetupHooks. buildingWhat = BuildRepl flags
386- , SetupHooks. localBuildInfo = lbi2
387- , SetupHooks. targetInfo = tgt
388- }
389- in for_ mbPbcRules $ \ pbcRules ->
390- SetupHooks. executeRules verbosity lbi2 tgt pbcRules inputs
413+ runPreBuildHooksRepl :: TargetInfo -> IO ()
414+ runPreBuildHooksRepl tgt =
415+ for_ mbPbcRules $
416+ void . runPreBuildHooks (BuildRepl flags) lbi tgt
391417
392418 -- build any dependent components
393419 sequence_
394420 [ do
395421 let clbi = targetCLBI subtarget
396422 comp = targetComponent subtarget
397423 lbi' = lbiForComponent comp lbi
398- preBuildComponent runPreBuildHooks verbosity lbi' subtarget
424+ preBuildComponent (runPreBuildHooksRepl subtarget) verbosity lbi subtarget
399425 buildComponent
400426 (mempty {buildCommonFlags = mempty {setupVerbosity = toFlag verbosity}})
401427 NoFlag
@@ -412,7 +438,7 @@ repl_setupHooks
412438 let clbi = targetCLBI target
413439 comp = targetComponent target
414440 lbi' = lbiForComponent comp lbi
415- preBuildComponent runPreBuildHooks verbosity lbi' target
441+ preBuildComponent (runPreBuildHooksRepl target) verbosity lbi target
416442 replComponent flags verbosity pkg_descr lbi' suffixHandlers comp clbi distPref
417443
418444-- | Start an interpreter without loading any package files.
@@ -1029,19 +1055,19 @@ replFLib flags pkg_descr lbi exe clbi =
10291055-- | Creates the autogenerated files for a particular configured component,
10301056-- and runs the pre-build hook.
10311057preBuildComponent
1032- :: ( LocalBuildInfo -> TargetInfo -> IO () )
1058+ :: IO r
10331059 -- ^ pre-build hook
10341060 -> Verbosity
10351061 -> LocalBuildInfo
10361062 -- ^ Configuration information
10371063 -> TargetInfo
1038- -> IO ()
1064+ -> IO r
10391065preBuildComponent preBuildHook verbosity lbi tgt = do
10401066 let pkg_descr = localPkgDescr lbi
10411067 clbi = targetCLBI tgt
10421068 createDirectoryIfMissingVerbose verbosity True (interpretSymbolicPathLBI lbi $ componentBuildDir lbi clbi)
10431069 writeBuiltinAutogenFiles verbosity pkg_descr lbi clbi
1044- preBuildHook lbi tgt
1070+ preBuildHook
10451071
10461072-- | Generate and write to disk all built-in autogenerated files
10471073-- for the specified component. These files will be put in the
0 commit comments