@@ -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,13 +36,17 @@ module Distribution.Simple.Build
34
36
35
37
-- * Build preparation
36
38
, preBuildComponent
39
+ , runPreBuildHooks
37
40
, AutogenFile (.. )
38
41
, AutogenFileContents
39
42
, writeBuiltinAutogenFiles
40
43
, writeAutogenFiles
41
44
42
45
-- * Internal package database creation
43
46
, createInternalPackageDB
47
+
48
+ -- * Internal function to bring internal build tools into scope
49
+ , addInternalBuildTools
44
50
) where
45
51
46
52
import Distribution.Compat.Prelude
@@ -86,6 +92,7 @@ import Distribution.Simple.BuildPaths
86
92
import Distribution.Simple.BuildTarget
87
93
import Distribution.Simple.BuildToolDepends
88
94
import Distribution.Simple.Configure
95
+ import Distribution.Simple.Errors
89
96
import Distribution.Simple.Flag
90
97
import Distribution.Simple.LocalBuildInfo
91
98
import Distribution.Simple.PreProcess
@@ -99,9 +106,8 @@ import Distribution.Simple.Setup.Common
99
106
import Distribution.Simple.Setup.Config
100
107
import Distribution.Simple.Setup.Repl
101
108
import Distribution.Simple.SetupHooks.Internal
102
- ( BuildHooks (.. )
103
- , BuildingWhat (.. )
104
- , noBuildHooks
109
+ ( BuildingWhat (.. )
110
+ , buildingWhatVerbosity
105
111
)
106
112
import qualified Distribution.Simple.SetupHooks.Internal as SetupHooks
107
113
import qualified Distribution.Simple.SetupHooks.Rule as SetupHooks
@@ -121,7 +127,6 @@ import Distribution.Compat.Graph (IsNode (..))
121
127
import Control.Monad
122
128
import qualified Data.ByteString.Lazy as LBS
123
129
import qualified Data.Map as Map
124
- import Distribution.Simple.Errors
125
130
import System.Directory (doesFileExist , removeFile )
126
131
import System.FilePath (takeDirectory )
127
132
@@ -138,10 +143,16 @@ build
138
143
-> [PPSuffixHandler ]
139
144
-- ^ preprocessors to run before compiling
140
145
-> 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 () )
142
150
143
151
build_setupHooks
144
- :: BuildHooks
152
+ :: ( SetupHooks. PreBuildComponentInputs -> IO [SetupHooks. MonitorFilePath ]
153
+ , SetupHooks. PostBuildComponentInputs -> IO ()
154
+ )
155
+ -- ^ build hooks
145
156
-> PackageDescription
146
157
-- ^ Mostly information from the .cabal file
147
158
-> LocalBuildInfo
@@ -150,13 +161,15 @@ build_setupHooks
150
161
-- ^ Flags that the user passed to build
151
162
-> [PPSuffixHandler ]
152
163
-- ^ preprocessors to run before compiling
153
- -> IO ()
164
+ -> IO [ SetupHooks. MonitorFilePath ]
154
165
build_setupHooks
155
- (BuildHooks {preBuildComponentRules = mbPbcRules, postBuildComponentHook = mbPostBuild} )
166
+ (preBuildHook, postBuildHook )
156
167
pkg_descr
157
168
lbi
158
169
flags
159
170
suffixHandlers = do
171
+ let verbosity = fromFlag $ buildVerbosity flags
172
+ distPref = fromFlag $ buildDistPref flags
160
173
checkSemaphoreSupport verbosity (compiler lbi) flags
161
174
targets <- readTargetInfos verbosity pkg_descr lbi (buildTargets flags)
162
175
let componentsToBuild = neededTargetsInBuildOrder' pkg_descr lbi (map nodeKey targets)
@@ -181,7 +194,7 @@ build_setupHooks
181
194
dumpBuildInfo verbosity distPref (configDumpBuildInfo (configFlags lbi)) pkg_descr lbi flags
182
195
183
196
-- 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
185
198
let comp = targetComponent target
186
199
clbi = targetCLBI target
187
200
bi = componentBuildInfo comp
@@ -192,19 +205,8 @@ build_setupHooks
192
205
, withPackageDB = withPackageDB lbi ++ [internalPackageDB]
193
206
, installedPkgs = index
194
207
}
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
208
210
let numJobs = buildNumJobs flags
209
211
par_strat <-
210
212
toFlag <$> case buildUseSemaphore flags of
@@ -232,13 +234,40 @@ build_setupHooks
232
234
, SetupHooks. localBuildInfo = lbi'
233
235
, SetupHooks. targetInfo = target
234
236
}
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
237
256
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
242
271
243
272
-- | Check for conditions that would prevent the build from succeeding.
244
273
checkSemaphoreSupport
@@ -325,11 +354,11 @@ repl
325
354
-- ^ preprocessors to run before compiling
326
355
-> [String ]
327
356
-> IO ()
328
- repl = repl_setupHooks noBuildHooks
357
+ repl = repl_setupHooks ( const $ return [] )
329
358
330
359
repl_setupHooks
331
- :: BuildHooks
332
- -- ^ build hook
360
+ :: ( SetupHooks. PreBuildComponentInputs -> IO [ SetupHooks. MonitorFilePath ])
361
+ -- ^ pre- build hook
333
362
-> PackageDescription
334
363
-- ^ Mostly information from the .cabal file
335
364
-> LocalBuildInfo
@@ -341,7 +370,7 @@ repl_setupHooks
341
370
-> [String ]
342
371
-> IO ()
343
372
repl_setupHooks
344
- ( BuildHooks {preBuildComponentRules = mbPbcRules})
373
+ preBuildHook
345
374
pkg_descr
346
375
lbi
347
376
flags
@@ -380,25 +409,16 @@ repl_setupHooks
380
409
(componentBuildInfo comp)
381
410
(withPrograms lbi')
382
411
}
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
394
413
395
414
-- build any dependent components
396
415
sequence_
397
416
[ do
398
417
let clbi = targetCLBI subtarget
399
418
comp = targetComponent subtarget
400
419
lbi' = lbiForComponent comp lbi
401
- preBuildComponent runPreBuildHooks verbosity lbi' subtarget
420
+ _monitors <-
421
+ preBuildComponent (preBuildHook (pbci lbi' subtarget)) verbosity lbi' subtarget
402
422
buildComponent
403
423
(mempty {buildCommonFlags = mempty {setupVerbosity = toFlag verbosity}})
404
424
NoFlag
@@ -415,7 +435,8 @@ repl_setupHooks
415
435
let clbi = targetCLBI target
416
436
comp = targetComponent target
417
437
lbi' = lbiForComponent comp lbi
418
- preBuildComponent runPreBuildHooks verbosity lbi' target
438
+ _monitors <-
439
+ preBuildComponent (preBuildHook (pbci lbi' target)) verbosity lbi' target
419
440
replComponent flags verbosity pkg_descr lbi' suffixHandlers comp clbi distPref
420
441
421
442
-- | Start an interpreter without loading any package files.
@@ -1032,19 +1053,19 @@ replFLib flags pkg_descr lbi exe clbi =
1032
1053
-- | Creates the autogenerated files for a particular configured component,
1033
1054
-- and runs the pre-build hook.
1034
1055
preBuildComponent
1035
- :: ( LocalBuildInfo -> TargetInfo -> IO () )
1056
+ :: IO r
1036
1057
-- ^ pre-build hook
1037
1058
-> Verbosity
1038
1059
-> LocalBuildInfo
1039
1060
-- ^ Configuration information
1040
1061
-> TargetInfo
1041
- -> IO ()
1062
+ -> IO r
1042
1063
preBuildComponent preBuildHook verbosity lbi tgt = do
1043
1064
let pkg_descr = localPkgDescr lbi
1044
1065
clbi = targetCLBI tgt
1045
1066
createDirectoryIfMissingVerbose verbosity True (interpretSymbolicPathLBI lbi $ componentBuildDir lbi clbi)
1046
1067
writeBuiltinAutogenFiles verbosity pkg_descr lbi clbi
1047
- preBuildHook lbi tgt
1068
+ preBuildHook
1048
1069
1049
1070
-- | Generate and write to disk all built-in autogenerated files
1050
1071
-- for the specified component. These files will be put in the
0 commit comments