Skip to content

Commit 2e35d4e

Browse files
committed
WIP: cabal-install integration of SetupHooks
1 parent 41d5864 commit 2e35d4e

File tree

45 files changed

+2233
-495
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+2233
-495
lines changed

Cabal/src/Distribution/Simple.hs

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,15 @@ defaultMainWithSetupHooksArgs setupHooks =
156156
, hscolourHook = setup_hscolourHook
157157
}
158158
where
159+
preBuildHook =
160+
case SetupHooks.preBuildComponentRules (SetupHooks.buildHooks setupHooks) of
161+
Nothing -> const $ return []
162+
Just pbcRules -> \pbci -> runPreBuildHooks pbci pbcRules
163+
postBuildHook =
164+
case SetupHooks.postBuildComponentHook (SetupHooks.buildHooks setupHooks) of
165+
Nothing -> const $ return ()
166+
Just hk -> hk
167+
159168
setup_confHook
160169
:: (GenericPackageDescription, HookedBuildInfo)
161170
-> ConfigFlags
@@ -171,12 +180,13 @@ defaultMainWithSetupHooksArgs setupHooks =
171180
-> BuildFlags
172181
-> IO ()
173182
setup_buildHook pkg_descr lbi hooks flags =
174-
build_setupHooks
175-
(SetupHooks.buildHooks setupHooks)
176-
pkg_descr
177-
lbi
178-
flags
179-
(allSuffixHandlers hooks)
183+
void $
184+
build_setupHooks
185+
(preBuildHook, postBuildHook)
186+
pkg_descr
187+
lbi
188+
flags
189+
(allSuffixHandlers hooks)
180190

181191
setup_copyHook
182192
:: PackageDescription
@@ -210,7 +220,7 @@ defaultMainWithSetupHooksArgs setupHooks =
210220
-> IO ()
211221
setup_replHook pkg_descr lbi hooks flags args =
212222
repl_setupHooks
213-
(SetupHooks.buildHooks setupHooks)
223+
preBuildHook
214224
pkg_descr
215225
lbi
216226
flags
@@ -224,12 +234,13 @@ defaultMainWithSetupHooksArgs setupHooks =
224234
-> HaddockFlags
225235
-> IO ()
226236
setup_haddockHook pkg_descr lbi hooks flags =
227-
haddock_setupHooks
228-
(SetupHooks.buildHooks setupHooks)
229-
pkg_descr
230-
lbi
231-
(allSuffixHandlers hooks)
232-
flags
237+
void $
238+
haddock_setupHooks
239+
preBuildHook
240+
pkg_descr
241+
lbi
242+
(allSuffixHandlers hooks)
243+
flags
233244

234245
setup_hscolourHook
235246
:: PackageDescription
@@ -239,7 +250,7 @@ defaultMainWithSetupHooksArgs setupHooks =
239250
-> IO ()
240251
setup_hscolourHook pkg_descr lbi hooks flags =
241252
hscolour_setupHooks
242-
(SetupHooks.buildHooks setupHooks)
253+
preBuildHook
243254
pkg_descr
244255
lbi
245256
(allSuffixHandlers hooks)

Cabal/src/Distribution/Simple/Build.hs

Lines changed: 66 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -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,6 +36,7 @@ module Distribution.Simple.Build
3436

3537
-- * Build preparation
3638
, preBuildComponent
39+
, runPreBuildHooks
3740
, AutogenFile (..)
3841
, AutogenFileContents
3942
, writeBuiltinAutogenFiles
@@ -93,6 +96,7 @@ import Distribution.Simple.BuildPaths
9396
import Distribution.Simple.BuildTarget
9497
import Distribution.Simple.BuildToolDepends
9598
import Distribution.Simple.Configure
99+
import Distribution.Simple.Errors
96100
import Distribution.Simple.Flag
97101
import Distribution.Simple.LocalBuildInfo
98102
import Distribution.Simple.PreProcess
@@ -107,9 +111,8 @@ import Distribution.Simple.Setup.Common
107111
import Distribution.Simple.Setup.Config
108112
import Distribution.Simple.Setup.Repl
109113
import Distribution.Simple.SetupHooks.Internal
110-
( BuildHooks (..)
111-
, BuildingWhat (..)
112-
, noBuildHooks
114+
( BuildingWhat (..)
115+
, buildingWhatVerbosity
113116
)
114117
import qualified Distribution.Simple.SetupHooks.Internal as SetupHooks
115118
import qualified Distribution.Simple.SetupHooks.Rule as SetupHooks
@@ -129,7 +132,6 @@ import Distribution.Compat.Graph (IsNode (..))
129132
import Control.Monad
130133
import qualified Data.ByteString.Lazy as LBS
131134
import qualified Data.Map as Map
132-
import Distribution.Simple.Errors
133135
import System.Directory (doesFileExist, removeFile)
134136
import System.FilePath (takeDirectory)
135137

@@ -146,10 +148,16 @@ build
146148
-> [PPSuffixHandler]
147149
-- ^ preprocessors to run before compiling
148150
-> 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 ())
150155

151156
build_setupHooks
152-
:: BuildHooks
157+
:: ( SetupHooks.PreBuildComponentInputs -> IO [SetupHooks.MonitorFilePath]
158+
, SetupHooks.PostBuildComponentInputs -> IO ()
159+
)
160+
-- ^ build hooks
153161
-> PackageDescription
154162
-- ^ Mostly information from the .cabal file
155163
-> LocalBuildInfo
@@ -158,13 +166,15 @@ build_setupHooks
158166
-- ^ Flags that the user passed to build
159167
-> [PPSuffixHandler]
160168
-- ^ preprocessors to run before compiling
161-
-> IO ()
169+
-> IO [SetupHooks.MonitorFilePath]
162170
build_setupHooks
163-
(BuildHooks{preBuildComponentRules = mbPbcRules, postBuildComponentHook = mbPostBuild})
171+
(preBuildHook, postBuildHook)
164172
pkg_descr
165173
lbi
166174
flags
167175
suffixHandlers = do
176+
let verbosity = fromFlag $ buildVerbosity flags
177+
distPref = fromFlag $ buildDistPref flags
168178
checkSemaphoreSupport verbosity (compiler lbi) flags
169179
targets <- readTargetInfos verbosity pkg_descr lbi (buildTargets flags)
170180
let componentsToBuild = neededTargetsInBuildOrder' pkg_descr lbi (map nodeKey targets)
@@ -189,7 +199,7 @@ build_setupHooks
189199
dumpBuildInfo verbosity distPref (configDumpBuildInfo (configFlags lbi)) pkg_descr lbi flags
190200

191201
-- 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
193203
let comp = targetComponent target
194204
clbi = targetCLBI target
195205
bi = componentBuildInfo comp
@@ -201,18 +211,8 @@ build_setupHooks
201211
, withPackageDB = withPackageDB lbi ++ [internalPackageDB]
202212
, installedPkgs = index
203213
}
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
216216
let numJobs = buildNumJobs flags
217217
par_strat <-
218218
toFlag <$> case buildUseSemaphore flags of
@@ -240,13 +240,40 @@ build_setupHooks
240240
, SetupHooks.localBuildInfo = lbi'
241241
, SetupHooks.targetInfo = target
242242
}
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
245262

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
250277

251278
-- | Check for conditions that would prevent the build from succeeding.
252279
checkSemaphoreSupport
@@ -333,11 +360,11 @@ repl
333360
-- ^ preprocessors to run before compiling
334361
-> [String]
335362
-> IO ()
336-
repl = repl_setupHooks noBuildHooks
363+
repl = repl_setupHooks (const $ return [])
337364

338365
repl_setupHooks
339-
:: BuildHooks
340-
-- ^ build hook
366+
:: (SetupHooks.PreBuildComponentInputs -> IO [SetupHooks.MonitorFilePath])
367+
-- ^ pre-build hook
341368
-> PackageDescription
342369
-- ^ Mostly information from the .cabal file
343370
-> LocalBuildInfo
@@ -349,7 +376,7 @@ repl_setupHooks
349376
-> [String]
350377
-> IO ()
351378
repl_setupHooks
352-
(BuildHooks{preBuildComponentRules = mbPbcRules})
379+
preBuildHook
353380
pkg_descr
354381
lbi
355382
flags
@@ -389,25 +416,16 @@ repl_setupHooks
389416
(componentBuildInfo comp)
390417
(withPrograms lbi')
391418
}
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
403420

404421
-- build any dependent components
405422
sequence_
406423
[ do
407424
let clbi = targetCLBI subtarget
408425
comp = targetComponent subtarget
409426
lbi' = lbiForComponent comp lbi
410-
preBuildComponent runPreBuildHooks verbosity lbi' subtarget
427+
_monitors <-
428+
preBuildComponent (preBuildHook (pbci lbi' subtarget)) verbosity lbi' subtarget
411429
buildComponent
412430
(mempty{buildCommonFlags = mempty{setupVerbosity = toFlag verbosity}})
413431
NoFlag
@@ -424,7 +442,8 @@ repl_setupHooks
424442
let clbi = targetCLBI target
425443
comp = targetComponent target
426444
lbi' = lbiForComponent comp lbi
427-
preBuildComponent runPreBuildHooks verbosity lbi' target
445+
_monitors <-
446+
preBuildComponent (preBuildHook (pbci lbi' target)) verbosity lbi' target
428447
replComponent flags verbosity pkg_descr lbi' suffixHandlers comp clbi distPref
429448

430449
-- | Start an interpreter without loading any package files.
@@ -1121,20 +1140,20 @@ componentInitialBuildSteps _distPref pkg_descr lbi clbi verbosity = do
11211140
-- | Creates the autogenerated files for a particular configured component,
11221141
-- and runs the pre-build hook.
11231142
preBuildComponent
1124-
:: (LocalBuildInfo -> TargetInfo -> IO ())
1143+
:: IO r
11251144
-- ^ pre-build hook
11261145
-> Verbosity
11271146
-> LocalBuildInfo
11281147
-- ^ Configuration information
11291148
-> TargetInfo
1130-
-> IO ()
1149+
-> IO r
11311150
preBuildComponent preBuildHook verbosity lbi tgt = do
11321151
let pkg_descr = localPkgDescr lbi
11331152
clbi = targetCLBI tgt
11341153
compBuildDir = interpretSymbolicPathLBI lbi $ componentBuildDir lbi clbi
11351154
createDirectoryIfMissingVerbose verbosity True compBuildDir
11361155
writeBuiltinAutogenFiles verbosity pkg_descr lbi clbi
1137-
preBuildHook lbi tgt
1156+
preBuildHook
11381157

11391158
-- | Generate and write to disk all built-in autogenerated files
11401159
-- for the specified component. These files will be put in the

0 commit comments

Comments
 (0)