@@ -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,13 +36,17 @@ module Distribution.Simple.Build
3436
3537 -- * Build preparation
3638 , preBuildComponent
39+ , runPreBuildHooks
3740 , AutogenFile (.. )
3841 , AutogenFileContents
3942 , writeBuiltinAutogenFiles
4043 , writeAutogenFiles
4144
4245 -- * Internal package database creation
4346 , createInternalPackageDB
47+
48+ -- * Internal function to bring internal build tools into scope
49+ , addInternalBuildTools
4450 ) where
4551
4652import Distribution.Compat.Prelude
@@ -86,6 +92,7 @@ import Distribution.Simple.BuildPaths
8692import Distribution.Simple.BuildTarget
8793import Distribution.Simple.BuildToolDepends
8894import Distribution.Simple.Configure
95+ import Distribution.Simple.Errors
8996import Distribution.Simple.Flag
9097import Distribution.Simple.LocalBuildInfo
9198import Distribution.Simple.PreProcess
@@ -99,9 +106,8 @@ import Distribution.Simple.Setup.Common
99106import Distribution.Simple.Setup.Config
100107import Distribution.Simple.Setup.Repl
101108import Distribution.Simple.SetupHooks.Internal
102- ( BuildHooks (.. )
103- , BuildingWhat (.. )
104- , noBuildHooks
109+ ( BuildingWhat (.. )
110+ , buildingWhatVerbosity
105111 )
106112import qualified Distribution.Simple.SetupHooks.Internal as SetupHooks
107113import qualified Distribution.Simple.SetupHooks.Rule as SetupHooks
@@ -121,7 +127,6 @@ import Distribution.Compat.Graph (IsNode (..))
121127import Control.Monad
122128import qualified Data.ByteString.Lazy as LBS
123129import qualified Data.Map as Map
124- import Distribution.Simple.Errors
125130import System.Directory (doesFileExist , removeFile )
126131import System.FilePath (takeDirectory )
127132
@@ -138,10 +143,16 @@ build
138143 -> [PPSuffixHandler ]
139144 -- ^ preprocessors to run before compiling
140145 -> IO ()
141- build = build_setupHooks noBuildHooks
146+ build pkg lbi flags suffixHandlers =
147+ void $ build_setupHooks noHooks pkg lbi flags suffixHandlers
148+ where
149+ noHooks = (const $ return [] , const $ return () )
142150
143151build_setupHooks
144- :: BuildHooks
152+ :: ( SetupHooks. PreBuildComponentInputs -> IO [SetupHooks. MonitorFilePath ]
153+ , SetupHooks. PostBuildComponentInputs -> IO ()
154+ )
155+ -- ^ build hooks
145156 -> PackageDescription
146157 -- ^ Mostly information from the .cabal file
147158 -> LocalBuildInfo
@@ -150,13 +161,15 @@ build_setupHooks
150161 -- ^ Flags that the user passed to build
151162 -> [PPSuffixHandler ]
152163 -- ^ preprocessors to run before compiling
153- -> IO ()
164+ -> IO [ SetupHooks. MonitorFilePath ]
154165build_setupHooks
155- (BuildHooks {preBuildComponentRules = mbPbcRules, postBuildComponentHook = mbPostBuild} )
166+ (preBuildHook, postBuildHook )
156167 pkg_descr
157168 lbi
158169 flags
159170 suffixHandlers = do
171+ let verbosity = fromFlag $ buildVerbosity flags
172+ distPref = fromFlag $ buildDistPref flags
160173 checkSemaphoreSupport verbosity (compiler lbi) flags
161174 targets <- readTargetInfos verbosity pkg_descr lbi (buildTargets flags)
162175 let componentsToBuild = neededTargetsInBuildOrder' pkg_descr lbi (map nodeKey targets)
@@ -181,7 +194,7 @@ build_setupHooks
181194 dumpBuildInfo verbosity distPref (configDumpBuildInfo (configFlags lbi)) pkg_descr lbi flags
182195
183196 -- Now do the actual building
184- (\ f -> foldM_ f (installedPkgs lbi) componentsToBuild) $ \ index target -> do
197+ (mons, _) <- ( \ f -> foldM f ([] , installedPkgs lbi) componentsToBuild) $ \ (monsAcc, index) target -> do
185198 let comp = targetComponent target
186199 clbi = targetCLBI target
187200 bi = componentBuildInfo comp
@@ -192,19 +205,8 @@ build_setupHooks
192205 , withPackageDB = withPackageDB lbi ++ [internalPackageDB]
193206 , installedPkgs = index
194207 }
195- runPreBuildHooks :: LocalBuildInfo -> TargetInfo -> IO ()
196- runPreBuildHooks lbi2 tgt =
197- let inputs =
198- SetupHooks. PreBuildComponentInputs
199- { SetupHooks. buildingWhat = BuildNormal flags
200- , SetupHooks. localBuildInfo = lbi2
201- , SetupHooks. targetInfo = tgt
202- }
203- in for_ mbPbcRules $ \ pbcRules -> do
204- (ruleFromId, _mons) <- SetupHooks. computeRules verbosity inputs pbcRules
205- SetupHooks. executeRules verbosity lbi2 tgt ruleFromId
206- preBuildComponent runPreBuildHooks verbosity lbi' target
207-
208+ pbci = SetupHooks. PreBuildComponentInputs (BuildNormal flags) lbi' target
209+ mons <- preBuildComponent (preBuildHook pbci) verbosity lbi target
208210 let numJobs = buildNumJobs flags
209211 par_strat <-
210212 toFlag <$> case buildUseSemaphore flags of
@@ -232,13 +234,40 @@ build_setupHooks
232234 , SetupHooks. localBuildInfo = lbi'
233235 , SetupHooks. targetInfo = target
234236 }
235- for_ mbPostBuild ($ postBuildInputs)
236- return (maybe index (Index. insert `flip` index) mb_ipi)
237+ postBuildHook postBuildInputs
238+ return (monsAcc ++ mons, maybe index (Index. insert `flip` index) mb_ipi)
239+ return mons
240+
241+ runPreBuildHooks
242+ :: SetupHooks. PreBuildComponentInputs
243+ -> SetupHooks. Rules SetupHooks. PreBuildComponentInputs
244+ -> IO [SetupHooks. MonitorFilePath ]
245+ runPreBuildHooks
246+ pbci@ SetupHooks. PreBuildComponentInputs
247+ { SetupHooks. buildingWhat = what
248+ , SetupHooks. localBuildInfo = lbi
249+ , SetupHooks. targetInfo = tgt
250+ }
251+ pbRules = do
252+ let verbosity = buildingWhatVerbosity what
253+ (rules, monitors) <- SetupHooks. computeRules verbosity pbci pbRules
254+ SetupHooks. executeRules verbosity lbi tgt rules
255+ return monitors
237256
238- return ()
239- where
240- distPref = fromFlag (buildDistPref flags)
241- verbosity = fromFlag (buildVerbosity flags)
257+ runPostBuildHooks
258+ :: BuildFlags
259+ -> LocalBuildInfo
260+ -> TargetInfo
261+ -> (SetupHooks. PostBuildComponentInputs -> IO () )
262+ -> IO ()
263+ runPostBuildHooks flags lbi tgt postBuild =
264+ let inputs =
265+ SetupHooks. PostBuildComponentInputs
266+ { SetupHooks. buildFlags = flags
267+ , SetupHooks. localBuildInfo = lbi
268+ , SetupHooks. targetInfo = tgt
269+ }
270+ in postBuild inputs
242271
243272-- | Check for conditions that would prevent the build from succeeding.
244273checkSemaphoreSupport
@@ -325,11 +354,11 @@ repl
325354 -- ^ preprocessors to run before compiling
326355 -> [String ]
327356 -> IO ()
328- repl = repl_setupHooks noBuildHooks
357+ repl = repl_setupHooks ( const $ return [] )
329358
330359repl_setupHooks
331- :: BuildHooks
332- -- ^ build hook
360+ :: ( SetupHooks. PreBuildComponentInputs -> IO [ SetupHooks. MonitorFilePath ])
361+ -- ^ pre- build hook
333362 -> PackageDescription
334363 -- ^ Mostly information from the .cabal file
335364 -> LocalBuildInfo
@@ -341,7 +370,7 @@ repl_setupHooks
341370 -> [String ]
342371 -> IO ()
343372repl_setupHooks
344- ( BuildHooks {preBuildComponentRules = mbPbcRules})
373+ preBuildHook
345374 pkg_descr
346375 lbi
347376 flags
@@ -380,25 +409,16 @@ repl_setupHooks
380409 (componentBuildInfo comp)
381410 (withPrograms lbi')
382411 }
383- runPreBuildHooks :: LocalBuildInfo -> TargetInfo -> IO ()
384- runPreBuildHooks lbi2 tgt =
385- let inputs =
386- SetupHooks. PreBuildComponentInputs
387- { SetupHooks. buildingWhat = BuildRepl flags
388- , SetupHooks. localBuildInfo = lbi2
389- , SetupHooks. targetInfo = tgt
390- }
391- in for_ mbPbcRules $ \ pbcRules -> do
392- (ruleFromId, _mons) <- SetupHooks. computeRules verbosity inputs pbcRules
393- SetupHooks. executeRules verbosity lbi2 tgt ruleFromId
412+ pbci lbi' tgt = SetupHooks. PreBuildComponentInputs (BuildRepl flags) lbi' tgt
394413
395414 -- build any dependent components
396415 sequence_
397416 [ do
398417 let clbi = targetCLBI subtarget
399418 comp = targetComponent subtarget
400419 lbi' = lbiForComponent comp lbi
401- preBuildComponent runPreBuildHooks verbosity lbi' subtarget
420+ _monitors <-
421+ preBuildComponent (preBuildHook (pbci lbi' subtarget)) verbosity lbi' subtarget
402422 buildComponent
403423 (mempty {buildCommonFlags = mempty {setupVerbosity = toFlag verbosity}})
404424 NoFlag
@@ -415,7 +435,8 @@ repl_setupHooks
415435 let clbi = targetCLBI target
416436 comp = targetComponent target
417437 lbi' = lbiForComponent comp lbi
418- preBuildComponent runPreBuildHooks verbosity lbi' target
438+ _monitors <-
439+ preBuildComponent (preBuildHook (pbci lbi' target)) verbosity lbi' target
419440 replComponent flags verbosity pkg_descr lbi' suffixHandlers comp clbi distPref
420441
421442-- | Start an interpreter without loading any package files.
@@ -1032,19 +1053,19 @@ replFLib flags pkg_descr lbi exe clbi =
10321053-- | Creates the autogenerated files for a particular configured component,
10331054-- and runs the pre-build hook.
10341055preBuildComponent
1035- :: ( LocalBuildInfo -> TargetInfo -> IO () )
1056+ :: IO r
10361057 -- ^ pre-build hook
10371058 -> Verbosity
10381059 -> LocalBuildInfo
10391060 -- ^ Configuration information
10401061 -> TargetInfo
1041- -> IO ()
1062+ -> IO r
10421063preBuildComponent preBuildHook verbosity lbi tgt = do
10431064 let pkg_descr = localPkgDescr lbi
10441065 clbi = targetCLBI tgt
10451066 createDirectoryIfMissingVerbose verbosity True (interpretSymbolicPathLBI lbi $ componentBuildDir lbi clbi)
10461067 writeBuiltinAutogenFiles verbosity pkg_descr lbi clbi
1047- preBuildHook lbi tgt
1068+ preBuildHook
10481069
10491070-- | Generate and write to disk all built-in autogenerated files
10501071-- for the specified component. These files will be put in the
0 commit comments