@@ -25,6 +25,8 @@ module Distribution.Simple.Build
25
25
( -- * Build
26
26
build
27
27
, build_setupHooks
28
+ , buildComponent
29
+ , runPostBuildHooks
28
30
29
31
-- * Repl
30
32
, repl
@@ -33,6 +35,7 @@ module Distribution.Simple.Build
33
35
34
36
-- * Build preparation
35
37
, preBuildComponent
38
+ , runPreBuildHooks
36
39
, AutogenFile (.. )
37
40
, AutogenFileContents
38
41
, writeBuiltinAutogenFiles
@@ -91,6 +94,7 @@ import Distribution.Simple.BuildPaths
91
94
import Distribution.Simple.BuildTarget
92
95
import Distribution.Simple.BuildToolDepends
93
96
import Distribution.Simple.Configure
97
+ import Distribution.Simple.Errors
94
98
import Distribution.Simple.Flag
95
99
import Distribution.Simple.LocalBuildInfo
96
100
import Distribution.Simple.PreProcess
@@ -104,9 +108,8 @@ import Distribution.Simple.Setup.Common
104
108
import Distribution.Simple.Setup.Config
105
109
import Distribution.Simple.Setup.Repl
106
110
import Distribution.Simple.SetupHooks.Internal
107
- ( BuildHooks (.. )
108
- , BuildingWhat (.. )
109
- , noBuildHooks
111
+ ( BuildingWhat (.. )
112
+ , buildingWhatVerbosity
110
113
)
111
114
import qualified Distribution.Simple.SetupHooks.Internal as SetupHooks
112
115
import qualified Distribution.Simple.SetupHooks.Rule as SetupHooks
@@ -126,7 +129,6 @@ import Distribution.Compat.Graph (IsNode (..))
126
129
import Control.Monad
127
130
import qualified Data.ByteString.Lazy as LBS
128
131
import qualified Data.Map as Map
129
- import Distribution.Simple.Errors
130
132
import System.Directory (doesFileExist , removeFile )
131
133
import System.FilePath (takeDirectory )
132
134
@@ -143,10 +145,16 @@ build
143
145
-> [PPSuffixHandler ]
144
146
-- ^ preprocessors to run before compiling
145
147
-> IO ()
146
- build = build_setupHooks noBuildHooks
148
+ build pkg lbi flags suffixHandlers =
149
+ void $ build_setupHooks noHooks pkg lbi flags suffixHandlers
150
+ where
151
+ noHooks = (const $ return [] , const $ return () )
147
152
148
153
build_setupHooks
149
- :: BuildHooks
154
+ :: ( SetupHooks. PreBuildComponentInputs -> IO [SetupHooks. MonitorFilePath ]
155
+ , SetupHooks. PostBuildComponentInputs -> IO ()
156
+ )
157
+ -- ^ build hooks
150
158
-> PackageDescription
151
159
-- ^ Mostly information from the .cabal file
152
160
-> LocalBuildInfo
@@ -155,13 +163,15 @@ build_setupHooks
155
163
-- ^ Flags that the user passed to build
156
164
-> [PPSuffixHandler ]
157
165
-- ^ preprocessors to run before compiling
158
- -> IO ()
166
+ -> IO [ SetupHooks. MonitorFilePath ]
159
167
build_setupHooks
160
- (BuildHooks {preBuildComponentRules = mbPbcRules, postBuildComponentHook = mbPostBuild} )
168
+ (preBuildHook, postBuildHook )
161
169
pkg_descr
162
170
lbi
163
171
flags
164
172
suffixHandlers = do
173
+ let verbosity = fromFlag $ buildVerbosity flags
174
+ distPref = fromFlag $ buildDistPref flags
165
175
checkSemaphoreSupport verbosity (compiler lbi) flags
166
176
targets <- readTargetInfos verbosity pkg_descr lbi (buildTargets flags)
167
177
let componentsToBuild = neededTargetsInBuildOrder' pkg_descr lbi (map nodeKey targets)
@@ -188,7 +198,7 @@ build_setupHooks
188
198
curDir <- absoluteWorkingDirLBI lbi
189
199
190
200
-- Now do the actual building
191
- (\ f -> foldM_ f (installedPkgs lbi) componentsToBuild) $ \ index target -> do
201
+ (mons, _) <- ( \ f -> foldM f ([] , installedPkgs lbi) componentsToBuild) $ \ (monsAcc, index) target -> do
192
202
let comp = targetComponent target
193
203
clbi = targetCLBI target
194
204
bi = componentBuildInfo comp
@@ -200,18 +210,8 @@ build_setupHooks
200
210
, withPackageDB = withPackageDB lbi ++ [internalPackageDB]
201
211
, installedPkgs = index
202
212
}
203
- runPreBuildHooks :: LocalBuildInfo -> TargetInfo -> IO ()
204
- runPreBuildHooks lbi2 tgt =
205
- let inputs =
206
- SetupHooks. PreBuildComponentInputs
207
- { SetupHooks. buildingWhat = BuildNormal flags
208
- , SetupHooks. localBuildInfo = lbi2
209
- , SetupHooks. targetInfo = tgt
210
- }
211
- in for_ mbPbcRules $ \ pbcRules -> do
212
- (ruleFromId, _mons) <- SetupHooks. computeRules verbosity inputs pbcRules
213
- SetupHooks. executeRules verbosity lbi2 tgt ruleFromId
214
- preBuildComponent runPreBuildHooks verbosity lbi' target
213
+ pbci = SetupHooks. PreBuildComponentInputs (BuildNormal flags) lbi' target
214
+ mons <- preBuildComponent (preBuildHook pbci) verbosity lbi' target
215
215
let numJobs = buildNumJobs flags
216
216
par_strat <-
217
217
toFlag <$> case buildUseSemaphore flags of
@@ -239,13 +239,40 @@ build_setupHooks
239
239
, SetupHooks. localBuildInfo = lbi'
240
240
, SetupHooks. targetInfo = target
241
241
}
242
- for_ mbPostBuild ($ postBuildInputs)
243
- return (maybe index (Index. insert `flip` index) mb_ipi)
242
+ postBuildHook postBuildInputs
243
+ return (monsAcc ++ mons, maybe index (Index. insert `flip` index) mb_ipi)
244
+ return mons
245
+
246
+ runPreBuildHooks
247
+ :: SetupHooks. PreBuildComponentInputs
248
+ -> SetupHooks. Rules SetupHooks. PreBuildComponentInputs
249
+ -> IO [SetupHooks. MonitorFilePath ]
250
+ runPreBuildHooks
251
+ pbci@ SetupHooks. PreBuildComponentInputs
252
+ { SetupHooks. buildingWhat = what
253
+ , SetupHooks. localBuildInfo = lbi
254
+ , SetupHooks. targetInfo = tgt
255
+ }
256
+ pbRules = do
257
+ let verbosity = buildingWhatVerbosity what
258
+ (rules, monitors) <- SetupHooks. computeRules verbosity pbci pbRules
259
+ SetupHooks. executeRules verbosity lbi tgt rules
260
+ return monitors
244
261
245
- return ()
246
- where
247
- distPref = fromFlag (buildDistPref flags)
248
- verbosity = fromFlag (buildVerbosity flags)
262
+ runPostBuildHooks
263
+ :: BuildFlags
264
+ -> LocalBuildInfo
265
+ -> TargetInfo
266
+ -> (SetupHooks. PostBuildComponentInputs -> IO () )
267
+ -> IO ()
268
+ runPostBuildHooks flags lbi tgt postBuild =
269
+ let inputs =
270
+ SetupHooks. PostBuildComponentInputs
271
+ { SetupHooks. buildFlags = flags
272
+ , SetupHooks. localBuildInfo = lbi
273
+ , SetupHooks. targetInfo = tgt
274
+ }
275
+ in postBuild inputs
249
276
250
277
-- | Check for conditions that would prevent the build from succeeding.
251
278
checkSemaphoreSupport
@@ -329,11 +356,11 @@ repl
329
356
-- ^ preprocessors to run before compiling
330
357
-> [String ]
331
358
-> IO ()
332
- repl = repl_setupHooks noBuildHooks
359
+ repl = repl_setupHooks ( const $ return [] )
333
360
334
361
repl_setupHooks
335
- :: BuildHooks
336
- -- ^ build hook
362
+ :: ( SetupHooks. PreBuildComponentInputs -> IO [ SetupHooks. MonitorFilePath ])
363
+ -- ^ pre- build hook
337
364
-> PackageDescription
338
365
-- ^ Mostly information from the .cabal file
339
366
-> LocalBuildInfo
@@ -345,7 +372,7 @@ repl_setupHooks
345
372
-> [String ]
346
373
-> IO ()
347
374
repl_setupHooks
348
- ( BuildHooks {preBuildComponentRules = mbPbcRules})
375
+ preBuildHook
349
376
pkg_descr
350
377
lbi
351
378
flags
@@ -388,25 +415,16 @@ repl_setupHooks
388
415
(componentBuildInfo comp)
389
416
(withPrograms lbi')
390
417
}
391
- runPreBuildHooks :: LocalBuildInfo -> TargetInfo -> IO ()
392
- runPreBuildHooks lbi2 tgt =
393
- let inputs =
394
- SetupHooks. PreBuildComponentInputs
395
- { SetupHooks. buildingWhat = BuildRepl flags
396
- , SetupHooks. localBuildInfo = lbi2
397
- , SetupHooks. targetInfo = tgt
398
- }
399
- in for_ mbPbcRules $ \ pbcRules -> do
400
- (ruleFromId, _mons) <- SetupHooks. computeRules verbosity inputs pbcRules
401
- SetupHooks. executeRules verbosity lbi2 tgt ruleFromId
418
+ pbci lbi' tgt = SetupHooks. PreBuildComponentInputs (BuildRepl flags) lbi' tgt
402
419
403
420
-- build any dependent components
404
421
sequence_
405
422
[ do
406
423
let clbi = targetCLBI subtarget
407
424
comp = targetComponent subtarget
408
425
lbi' <- lbiForComponent comp lbi
409
- preBuildComponent runPreBuildHooks verbosity lbi' subtarget
426
+ _monitors <-
427
+ preBuildComponent (preBuildHook (pbci lbi' subtarget)) verbosity lbi' subtarget
410
428
buildComponent
411
429
(mempty {buildCommonFlags = mempty {setupVerbosity = toFlag verbosity}})
412
430
NoFlag
@@ -423,7 +441,8 @@ repl_setupHooks
423
441
let clbi = targetCLBI target
424
442
comp = targetComponent target
425
443
lbi' <- lbiForComponent comp lbi
426
- preBuildComponent runPreBuildHooks verbosity lbi' target
444
+ _monitors <-
445
+ preBuildComponent (preBuildHook (pbci lbi' target)) verbosity lbi' target
427
446
replComponent flags verbosity pkg_descr lbi' suffixHandlers comp clbi distPref
428
447
429
448
-- | Start an interpreter without loading any package files.
@@ -1118,20 +1137,20 @@ componentInitialBuildSteps _distPref pkg_descr lbi clbi verbosity = do
1118
1137
-- | Creates the autogenerated files for a particular configured component,
1119
1138
-- and runs the pre-build hook.
1120
1139
preBuildComponent
1121
- :: ( LocalBuildInfo -> TargetInfo -> IO () )
1140
+ :: IO r
1122
1141
-- ^ pre-build hook
1123
1142
-> Verbosity
1124
1143
-> LocalBuildInfo
1125
1144
-- ^ Configuration information
1126
1145
-> TargetInfo
1127
- -> IO ()
1146
+ -> IO r
1128
1147
preBuildComponent preBuildHook verbosity lbi tgt = do
1129
1148
let pkg_descr = localPkgDescr lbi
1130
1149
clbi = targetCLBI tgt
1131
1150
compBuildDir = interpretSymbolicPathLBI lbi $ componentBuildDir lbi clbi
1132
1151
createDirectoryIfMissingVerbose verbosity True compBuildDir
1133
1152
writeBuiltinAutogenFiles verbosity pkg_descr lbi clbi
1134
- preBuildHook lbi tgt
1153
+ preBuildHook
1135
1154
1136
1155
-- | Generate and write to disk all built-in autogenerated files
1137
1156
-- for the specified component. These files will be put in the
0 commit comments