@@ -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
@@ -86,6 +89,7 @@ import Distribution.Simple.BuildPaths
86
89
import Distribution.Simple.BuildTarget
87
90
import Distribution.Simple.BuildToolDepends
88
91
import Distribution.Simple.Configure
92
+ import Distribution.Simple.Errors
89
93
import Distribution.Simple.Flag
90
94
import Distribution.Simple.LocalBuildInfo
91
95
import Distribution.Simple.PreProcess
@@ -101,9 +105,11 @@ import Distribution.Simple.Setup.Repl
101
105
import Distribution.Simple.SetupHooks.Internal
102
106
( BuildHooks (.. )
103
107
, BuildingWhat (.. )
108
+ , buildingWhatVerbosity
104
109
, noBuildHooks
105
110
)
106
111
import qualified Distribution.Simple.SetupHooks.Internal as SetupHooks
112
+ import qualified Distribution.Simple.SetupHooks.Rule as SetupHooks
107
113
import Distribution.Simple.ShowBuildInfo
108
114
import Distribution.Simple.Test.LibV09
109
115
import Distribution.Simple.Utils
@@ -120,7 +126,6 @@ import Distribution.Compat.Graph (IsNode (..))
120
126
import Control.Monad
121
127
import qualified Data.ByteString.Lazy as LBS
122
128
import qualified Data.Map as Map
123
- import Distribution.Simple.Errors
124
129
import System.Directory (doesFileExist , removeFile )
125
130
import System.FilePath (takeDirectory )
126
131
@@ -137,7 +142,8 @@ build
137
142
-> [PPSuffixHandler ]
138
143
-- ^ preprocessors to run before compiling
139
144
-> IO ()
140
- build = build_setupHooks noBuildHooks
145
+ build pkg lbi flags suffixHandlers =
146
+ void $ build_setupHooks noBuildHooks pkg lbi flags suffixHandlers
141
147
142
148
build_setupHooks
143
149
:: BuildHooks
@@ -149,13 +155,15 @@ build_setupHooks
149
155
-- ^ Flags that the user passed to build
150
156
-> [PPSuffixHandler ]
151
157
-- ^ preprocessors to run before compiling
152
- -> IO ()
158
+ -> IO [ SetupHooks. MonitorFilePath ]
153
159
build_setupHooks
154
160
(BuildHooks {preBuildComponentRules = mbPbcRules, postBuildComponentHook = mbPostBuild})
155
161
pkg_descr
156
162
lbi
157
163
flags
158
164
suffixHandlers = do
165
+ let verbosity = fromFlag $ buildVerbosity flags
166
+ distPref = fromFlag $ buildDistPref flags
159
167
checkSemaphoreSupport verbosity (compiler lbi) flags
160
168
targets <- readTargetInfos verbosity pkg_descr lbi (buildTargets flags)
161
169
let componentsToBuild = neededTargetsInBuildOrder' pkg_descr lbi (map nodeKey targets)
@@ -180,7 +188,7 @@ build_setupHooks
180
188
dumpBuildInfo verbosity distPref (configDumpBuildInfo (configFlags lbi)) pkg_descr lbi flags
181
189
182
190
-- 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
184
192
let comp = targetComponent target
185
193
clbi = targetCLBI target
186
194
bi = componentBuildInfo comp
@@ -191,18 +199,13 @@ build_setupHooks
191
199
, withPackageDB = withPackageDB lbi ++ [internalPackageDB]
192
200
, installedPkgs = index
193
201
}
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
206
209
let numJobs = buildNumJobs flags
207
210
par_strat <-
208
211
toFlag <$> case buildUseSemaphore flags of
@@ -231,12 +234,41 @@ build_setupHooks
231
234
, SetupHooks. targetInfo = target
232
235
}
233
236
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
235
239
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
240
272
241
273
-- | Check for conditions that would prevent the build from succeeding.
242
274
checkSemaphoreSupport
@@ -378,24 +410,18 @@ repl_setupHooks
378
410
(componentBuildInfo comp)
379
411
(withPrograms lbi')
380
412
}
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
391
417
392
418
-- build any dependent components
393
419
sequence_
394
420
[ do
395
421
let clbi = targetCLBI subtarget
396
422
comp = targetComponent subtarget
397
423
lbi' = lbiForComponent comp lbi
398
- preBuildComponent runPreBuildHooks verbosity lbi' subtarget
424
+ preBuildComponent (runPreBuildHooksRepl subtarget) verbosity lbi subtarget
399
425
buildComponent
400
426
(mempty {buildCommonFlags = mempty {setupVerbosity = toFlag verbosity}})
401
427
NoFlag
@@ -412,7 +438,7 @@ repl_setupHooks
412
438
let clbi = targetCLBI target
413
439
comp = targetComponent target
414
440
lbi' = lbiForComponent comp lbi
415
- preBuildComponent runPreBuildHooks verbosity lbi' target
441
+ preBuildComponent (runPreBuildHooksRepl target) verbosity lbi target
416
442
replComponent flags verbosity pkg_descr lbi' suffixHandlers comp clbi distPref
417
443
418
444
-- | Start an interpreter without loading any package files.
@@ -1029,19 +1055,19 @@ replFLib flags pkg_descr lbi exe clbi =
1029
1055
-- | Creates the autogenerated files for a particular configured component,
1030
1056
-- and runs the pre-build hook.
1031
1057
preBuildComponent
1032
- :: ( LocalBuildInfo -> TargetInfo -> IO () )
1058
+ :: IO r
1033
1059
-- ^ pre-build hook
1034
1060
-> Verbosity
1035
1061
-> LocalBuildInfo
1036
1062
-- ^ Configuration information
1037
1063
-> TargetInfo
1038
- -> IO ()
1064
+ -> IO r
1039
1065
preBuildComponent preBuildHook verbosity lbi tgt = do
1040
1066
let pkg_descr = localPkgDescr lbi
1041
1067
clbi = targetCLBI tgt
1042
1068
createDirectoryIfMissingVerbose verbosity True (interpretSymbolicPathLBI lbi $ componentBuildDir lbi clbi)
1043
1069
writeBuiltinAutogenFiles verbosity pkg_descr lbi clbi
1044
- preBuildHook lbi tgt
1070
+ preBuildHook
1045
1071
1046
1072
-- | Generate and write to disk all built-in autogenerated files
1047
1073
-- for the specified component. These files will be put in the
0 commit comments