Skip to content

Commit 70fcfb3

Browse files
committed
WIP: cabal-install integration of SetupHooks
1 parent b0cd2fe commit 70fcfb3

File tree

38 files changed

+2394
-406
lines changed

38 files changed

+2394
-406
lines changed

Cabal/src/Distribution/Simple.hs

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,6 @@ import Distribution.Simple.SetupHooks.Internal
111111
)
112112
import Distribution.Simple.Test
113113
import Distribution.Simple.Utils
114-
import Distribution.Types.LocalBuildInfo (buildDirPBD)
115114
import qualified Distribution.Types.LocalBuildConfig as LBC
116115
import Distribution.Utils.Path
117116
import Distribution.Verbosity
@@ -156,6 +155,15 @@ defaultMainWithSetupHooksArgs setupHooks =
156155
, hscolourHook = setup_hscolourHook
157156
}
158157
where
158+
preBuildHook =
159+
case SetupHooks.preBuildComponentRules (SetupHooks.buildHooks setupHooks) of
160+
Nothing -> const $ return []
161+
Just pbcRules -> \ pbci -> runPreBuildHooks pbci pbcRules
162+
postBuildHook =
163+
case SetupHooks.postBuildComponentHook (SetupHooks.buildHooks setupHooks) of
164+
Nothing -> const $ return ()
165+
Just hk -> hk
166+
159167
setup_confHook
160168
:: (GenericPackageDescription, HookedBuildInfo)
161169
-> ConfigFlags
@@ -171,12 +179,13 @@ defaultMainWithSetupHooksArgs setupHooks =
171179
-> BuildFlags
172180
-> IO ()
173181
setup_buildHook pkg_descr lbi hooks flags =
174-
build_setupHooks
175-
(SetupHooks.buildHooks setupHooks)
176-
pkg_descr
177-
lbi
178-
flags
179-
(allSuffixHandlers hooks)
182+
void $
183+
build_setupHooks
184+
(preBuildHook, postBuildHook)
185+
pkg_descr
186+
lbi
187+
flags
188+
(allSuffixHandlers hooks)
180189

181190
setup_copyHook
182191
:: PackageDescription
@@ -210,7 +219,7 @@ defaultMainWithSetupHooksArgs setupHooks =
210219
-> IO ()
211220
setup_replHook pkg_descr lbi hooks flags args =
212221
repl_setupHooks
213-
(SetupHooks.buildHooks setupHooks)
222+
preBuildHook
214223
pkg_descr
215224
lbi
216225
flags
@@ -224,12 +233,13 @@ defaultMainWithSetupHooksArgs setupHooks =
224233
-> HaddockFlags
225234
-> IO ()
226235
setup_haddockHook pkg_descr lbi hooks flags =
227-
haddock_setupHooks
228-
(SetupHooks.buildHooks setupHooks)
229-
pkg_descr
230-
lbi
231-
(allSuffixHandlers hooks)
232-
flags
236+
void $
237+
haddock_setupHooks
238+
preBuildHook
239+
pkg_descr
240+
lbi
241+
(allSuffixHandlers hooks)
242+
flags
233243

234244
setup_hscolourHook
235245
:: PackageDescription
@@ -239,7 +249,7 @@ defaultMainWithSetupHooksArgs setupHooks =
239249
-> IO ()
240250
setup_hscolourHook pkg_descr lbi hooks flags =
241251
hscolour_setupHooks
242-
(SetupHooks.buildHooks setupHooks)
252+
preBuildHook
243253
pkg_descr
244254
lbi
245255
(allSuffixHandlers hooks)

Cabal/src/Distribution/Simple/Build.hs

Lines changed: 69 additions & 48 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,13 +36,17 @@ module Distribution.Simple.Build
3436

3537
-- * Build preparation
3638
, preBuildComponent
39+
, runPreBuildHooks
3740
, AutogenFile (..)
3841
, AutogenFileContents
3942
, writeBuiltinAutogenFiles
4043
, writeAutogenFiles
4144

4245
-- * Internal package database creation
4346
, createInternalPackageDB
47+
48+
-- * Internal function to bring internal build tools into scope
49+
, addInternalBuildTools
4450
) where
4551

4652
import Distribution.Compat.Prelude
@@ -86,6 +92,7 @@ import Distribution.Simple.BuildPaths
8692
import Distribution.Simple.BuildTarget
8793
import Distribution.Simple.BuildToolDepends
8894
import Distribution.Simple.Configure
95+
import Distribution.Simple.Errors
8996
import Distribution.Simple.Flag
9097
import Distribution.Simple.LocalBuildInfo
9198
import Distribution.Simple.PreProcess
@@ -99,9 +106,8 @@ import Distribution.Simple.Setup.Common
99106
import Distribution.Simple.Setup.Config
100107
import Distribution.Simple.Setup.Repl
101108
import Distribution.Simple.SetupHooks.Internal
102-
( BuildHooks (..)
103-
, BuildingWhat (..)
104-
, noBuildHooks
109+
( BuildingWhat (..)
110+
, buildingWhatVerbosity
105111
)
106112
import qualified Distribution.Simple.SetupHooks.Internal as SetupHooks
107113
import qualified Distribution.Simple.SetupHooks.Rule as SetupHooks
@@ -121,7 +127,6 @@ import Distribution.Compat.Graph (IsNode (..))
121127
import Control.Monad
122128
import qualified Data.ByteString.Lazy as LBS
123129
import qualified Data.Map as Map
124-
import Distribution.Simple.Errors
125130
import System.Directory (doesFileExist, removeFile)
126131
import System.FilePath (takeDirectory)
127132

@@ -138,10 +143,16 @@ build
138143
-> [PPSuffixHandler]
139144
-- ^ preprocessors to run before compiling
140145
-> 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 ())
142150

143151
build_setupHooks
144-
:: BuildHooks
152+
:: ( SetupHooks.PreBuildComponentInputs -> IO [SetupHooks.MonitorFilePath]
153+
, SetupHooks.PostBuildComponentInputs -> IO ()
154+
)
155+
-- ^ build hooks
145156
-> PackageDescription
146157
-- ^ Mostly information from the .cabal file
147158
-> LocalBuildInfo
@@ -150,13 +161,15 @@ build_setupHooks
150161
-- ^ Flags that the user passed to build
151162
-> [PPSuffixHandler]
152163
-- ^ preprocessors to run before compiling
153-
-> IO ()
164+
-> IO [SetupHooks.MonitorFilePath]
154165
build_setupHooks
155-
(BuildHooks{preBuildComponentRules = mbPbcRules, postBuildComponentHook = mbPostBuild})
166+
(preBuildHook, postBuildHook)
156167
pkg_descr
157168
lbi
158169
flags
159170
suffixHandlers = do
171+
let verbosity = fromFlag $ buildVerbosity flags
172+
distPref = fromFlag $ buildDistPref flags
160173
checkSemaphoreSupport verbosity (compiler lbi) flags
161174
targets <- readTargetInfos verbosity pkg_descr lbi (buildTargets flags)
162175
let componentsToBuild = neededTargetsInBuildOrder' pkg_descr lbi (map nodeKey targets)
@@ -181,7 +194,7 @@ build_setupHooks
181194
dumpBuildInfo verbosity distPref (configDumpBuildInfo (configFlags lbi)) pkg_descr lbi flags
182195

183196
-- 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
185198
let comp = targetComponent target
186199
clbi = targetCLBI target
187200
bi = componentBuildInfo comp
@@ -192,19 +205,8 @@ build_setupHooks
192205
, withPackageDB = withPackageDB lbi ++ [internalPackageDB]
193206
, installedPkgs = index
194207
}
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
208210
let numJobs = buildNumJobs flags
209211
par_strat <-
210212
toFlag <$> case buildUseSemaphore flags of
@@ -232,13 +234,40 @@ build_setupHooks
232234
, SetupHooks.localBuildInfo = lbi'
233235
, SetupHooks.targetInfo = target
234236
}
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
237256

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
242271

243272
-- | Check for conditions that would prevent the build from succeeding.
244273
checkSemaphoreSupport
@@ -325,11 +354,11 @@ repl
325354
-- ^ preprocessors to run before compiling
326355
-> [String]
327356
-> IO ()
328-
repl = repl_setupHooks noBuildHooks
357+
repl = repl_setupHooks (const $ return [])
329358

330359
repl_setupHooks
331-
:: BuildHooks
332-
-- ^ build hook
360+
:: (SetupHooks.PreBuildComponentInputs -> IO [SetupHooks.MonitorFilePath])
361+
-- ^ pre-build hook
333362
-> PackageDescription
334363
-- ^ Mostly information from the .cabal file
335364
-> LocalBuildInfo
@@ -341,7 +370,7 @@ repl_setupHooks
341370
-> [String]
342371
-> IO ()
343372
repl_setupHooks
344-
(BuildHooks{preBuildComponentRules = mbPbcRules})
373+
preBuildHook
345374
pkg_descr
346375
lbi
347376
flags
@@ -380,25 +409,16 @@ repl_setupHooks
380409
(componentBuildInfo comp)
381410
(withPrograms lbi')
382411
}
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
394413

395414
-- build any dependent components
396415
sequence_
397416
[ do
398417
let clbi = targetCLBI subtarget
399418
comp = targetComponent subtarget
400419
lbi' = lbiForComponent comp lbi
401-
preBuildComponent runPreBuildHooks verbosity lbi' subtarget
420+
_monitors <-
421+
preBuildComponent (preBuildHook (pbci lbi' subtarget)) verbosity lbi' subtarget
402422
buildComponent
403423
(mempty{buildCommonFlags = mempty{setupVerbosity = toFlag verbosity}})
404424
NoFlag
@@ -415,7 +435,8 @@ repl_setupHooks
415435
let clbi = targetCLBI target
416436
comp = targetComponent target
417437
lbi' = lbiForComponent comp lbi
418-
preBuildComponent runPreBuildHooks verbosity lbi' target
438+
_monitors <-
439+
preBuildComponent (preBuildHook (pbci lbi' target)) verbosity lbi' target
419440
replComponent flags verbosity pkg_descr lbi' suffixHandlers comp clbi distPref
420441

421442
-- | Start an interpreter without loading any package files.
@@ -1032,19 +1053,19 @@ replFLib flags pkg_descr lbi exe clbi =
10321053
-- | Creates the autogenerated files for a particular configured component,
10331054
-- and runs the pre-build hook.
10341055
preBuildComponent
1035-
:: (LocalBuildInfo -> TargetInfo -> IO ())
1056+
:: IO r
10361057
-- ^ pre-build hook
10371058
-> Verbosity
10381059
-> LocalBuildInfo
10391060
-- ^ Configuration information
10401061
-> TargetInfo
1041-
-> IO ()
1062+
-> IO r
10421063
preBuildComponent preBuildHook verbosity lbi tgt = do
10431064
let pkg_descr = localPkgDescr lbi
10441065
clbi = targetCLBI tgt
10451066
createDirectoryIfMissingVerbose verbosity True (interpretSymbolicPathLBI lbi $ componentBuildDir lbi clbi)
10461067
writeBuiltinAutogenFiles verbosity pkg_descr lbi clbi
1047-
preBuildHook lbi tgt
1068+
preBuildHook
10481069

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

0 commit comments

Comments
 (0)