@@ -26,6 +26,8 @@ module Distribution.Simple.Build
26
26
( -- * Build
27
27
build
28
28
, build_setupHooks
29
+ , buildComponent
30
+ , runPostBuildHooks
29
31
30
32
-- * Repl
31
33
, repl
@@ -34,6 +36,7 @@ module Distribution.Simple.Build
34
36
35
37
-- * Build preparation
36
38
, preBuildComponent
39
+ , runPreBuildHooks
37
40
, AutogenFile (.. )
38
41
, AutogenFileContents
39
42
, writeBuiltinAutogenFiles
@@ -93,6 +96,7 @@ import Distribution.Simple.BuildPaths
93
96
import Distribution.Simple.BuildTarget
94
97
import Distribution.Simple.BuildToolDepends
95
98
import Distribution.Simple.Configure
99
+ import Distribution.Simple.Errors
96
100
import Distribution.Simple.Flag
97
101
import Distribution.Simple.LocalBuildInfo
98
102
import Distribution.Simple.PreProcess
@@ -107,9 +111,8 @@ import Distribution.Simple.Setup.Common
107
111
import Distribution.Simple.Setup.Config
108
112
import Distribution.Simple.Setup.Repl
109
113
import Distribution.Simple.SetupHooks.Internal
110
- ( BuildHooks (.. )
111
- , BuildingWhat (.. )
112
- , noBuildHooks
114
+ ( BuildingWhat (.. )
115
+ , buildingWhatVerbosity
113
116
)
114
117
import qualified Distribution.Simple.SetupHooks.Internal as SetupHooks
115
118
import qualified Distribution.Simple.SetupHooks.Rule as SetupHooks
@@ -129,7 +132,6 @@ import Distribution.Compat.Graph (IsNode (..))
129
132
import Control.Monad
130
133
import qualified Data.ByteString.Lazy as LBS
131
134
import qualified Data.Map as Map
132
- import Distribution.Simple.Errors
133
135
import System.Directory (doesFileExist , removeFile )
134
136
import System.FilePath (takeDirectory )
135
137
@@ -146,10 +148,16 @@ build
146
148
-> [PPSuffixHandler ]
147
149
-- ^ preprocessors to run before compiling
148
150
-> 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 () )
150
155
151
156
build_setupHooks
152
- :: BuildHooks
157
+ :: ( SetupHooks. PreBuildComponentInputs -> IO [SetupHooks. MonitorFilePath ]
158
+ , SetupHooks. PostBuildComponentInputs -> IO ()
159
+ )
160
+ -- ^ build hooks
153
161
-> PackageDescription
154
162
-- ^ Mostly information from the .cabal file
155
163
-> LocalBuildInfo
@@ -158,13 +166,15 @@ build_setupHooks
158
166
-- ^ Flags that the user passed to build
159
167
-> [PPSuffixHandler ]
160
168
-- ^ preprocessors to run before compiling
161
- -> IO ()
169
+ -> IO [ SetupHooks. MonitorFilePath ]
162
170
build_setupHooks
163
- (BuildHooks {preBuildComponentRules = mbPbcRules, postBuildComponentHook = mbPostBuild} )
171
+ (preBuildHook, postBuildHook )
164
172
pkg_descr
165
173
lbi
166
174
flags
167
175
suffixHandlers = do
176
+ let verbosity = fromFlag $ buildVerbosity flags
177
+ distPref = fromFlag $ buildDistPref flags
168
178
checkSemaphoreSupport verbosity (compiler lbi) flags
169
179
targets <- readTargetInfos verbosity pkg_descr lbi (buildTargets flags)
170
180
let componentsToBuild = neededTargetsInBuildOrder' pkg_descr lbi (map nodeKey targets)
@@ -189,7 +199,7 @@ build_setupHooks
189
199
dumpBuildInfo verbosity distPref (configDumpBuildInfo (configFlags lbi)) pkg_descr lbi flags
190
200
191
201
-- 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
193
203
let comp = targetComponent target
194
204
clbi = targetCLBI target
195
205
bi = componentBuildInfo comp
@@ -201,18 +211,8 @@ build_setupHooks
201
211
, withPackageDB = withPackageDB lbi ++ [internalPackageDB]
202
212
, installedPkgs = index
203
213
}
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
216
216
let numJobs = buildNumJobs flags
217
217
par_strat <-
218
218
toFlag <$> case buildUseSemaphore flags of
@@ -240,13 +240,40 @@ build_setupHooks
240
240
, SetupHooks. localBuildInfo = lbi'
241
241
, SetupHooks. targetInfo = target
242
242
}
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
245
262
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
250
277
251
278
-- | Check for conditions that would prevent the build from succeeding.
252
279
checkSemaphoreSupport
@@ -333,11 +360,11 @@ repl
333
360
-- ^ preprocessors to run before compiling
334
361
-> [String ]
335
362
-> IO ()
336
- repl = repl_setupHooks noBuildHooks
363
+ repl = repl_setupHooks ( const $ return [] )
337
364
338
365
repl_setupHooks
339
- :: BuildHooks
340
- -- ^ build hook
366
+ :: ( SetupHooks. PreBuildComponentInputs -> IO [ SetupHooks. MonitorFilePath ])
367
+ -- ^ pre- build hook
341
368
-> PackageDescription
342
369
-- ^ Mostly information from the .cabal file
343
370
-> LocalBuildInfo
@@ -349,7 +376,7 @@ repl_setupHooks
349
376
-> [String ]
350
377
-> IO ()
351
378
repl_setupHooks
352
- ( BuildHooks {preBuildComponentRules = mbPbcRules})
379
+ preBuildHook
353
380
pkg_descr
354
381
lbi
355
382
flags
@@ -389,25 +416,16 @@ repl_setupHooks
389
416
(componentBuildInfo comp)
390
417
(withPrograms lbi')
391
418
}
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
403
420
404
421
-- build any dependent components
405
422
sequence_
406
423
[ do
407
424
let clbi = targetCLBI subtarget
408
425
comp = targetComponent subtarget
409
426
lbi' = lbiForComponent comp lbi
410
- preBuildComponent runPreBuildHooks verbosity lbi' subtarget
427
+ _monitors <-
428
+ preBuildComponent (preBuildHook (pbci lbi' subtarget)) verbosity lbi' subtarget
411
429
buildComponent
412
430
(mempty {buildCommonFlags = mempty {setupVerbosity = toFlag verbosity}})
413
431
NoFlag
@@ -424,7 +442,8 @@ repl_setupHooks
424
442
let clbi = targetCLBI target
425
443
comp = targetComponent target
426
444
lbi' = lbiForComponent comp lbi
427
- preBuildComponent runPreBuildHooks verbosity lbi' target
445
+ _monitors <-
446
+ preBuildComponent (preBuildHook (pbci lbi' target)) verbosity lbi' target
428
447
replComponent flags verbosity pkg_descr lbi' suffixHandlers comp clbi distPref
429
448
430
449
-- | Start an interpreter without loading any package files.
@@ -1121,20 +1140,20 @@ componentInitialBuildSteps _distPref pkg_descr lbi clbi verbosity = do
1121
1140
-- | Creates the autogenerated files for a particular configured component,
1122
1141
-- and runs the pre-build hook.
1123
1142
preBuildComponent
1124
- :: ( LocalBuildInfo -> TargetInfo -> IO () )
1143
+ :: IO r
1125
1144
-- ^ pre-build hook
1126
1145
-> Verbosity
1127
1146
-> LocalBuildInfo
1128
1147
-- ^ Configuration information
1129
1148
-> TargetInfo
1130
- -> IO ()
1149
+ -> IO r
1131
1150
preBuildComponent preBuildHook verbosity lbi tgt = do
1132
1151
let pkg_descr = localPkgDescr lbi
1133
1152
clbi = targetCLBI tgt
1134
1153
compBuildDir = interpretSymbolicPathLBI lbi $ componentBuildDir lbi clbi
1135
1154
createDirectoryIfMissingVerbose verbosity True compBuildDir
1136
1155
writeBuiltinAutogenFiles verbosity pkg_descr lbi clbi
1137
- preBuildHook lbi tgt
1156
+ preBuildHook
1138
1157
1139
1158
-- | Generate and write to disk all built-in autogenerated files
1140
1159
-- for the specified component. These files will be put in the
0 commit comments