Skip to content

Commit d4a6532

Browse files
committed
WIP: cabal-install integration of SetupHooks
1 parent cd6d1c6 commit d4a6532

File tree

26 files changed

+1728
-355
lines changed

26 files changed

+1728
-355
lines changed

Cabal/src/Distribution/Simple.hs

Lines changed: 14 additions & 13 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
@@ -171,12 +170,13 @@ defaultMainWithSetupHooksArgs setupHooks =
171170
-> BuildFlags
172171
-> IO ()
173172
setup_buildHook pkg_descr lbi hooks flags =
174-
build_setupHooks
175-
(SetupHooks.buildHooks setupHooks)
176-
pkg_descr
177-
lbi
178-
flags
179-
(allSuffixHandlers hooks)
173+
void $
174+
build_setupHooks
175+
(SetupHooks.buildHooks setupHooks)
176+
pkg_descr
177+
lbi
178+
flags
179+
(allSuffixHandlers hooks)
180180

181181
setup_copyHook
182182
:: PackageDescription
@@ -224,12 +224,13 @@ defaultMainWithSetupHooksArgs setupHooks =
224224
-> HaddockFlags
225225
-> IO ()
226226
setup_haddockHook pkg_descr lbi hooks flags =
227-
haddock_setupHooks
228-
(SetupHooks.buildHooks setupHooks)
229-
pkg_descr
230-
lbi
231-
(allSuffixHandlers hooks)
232-
flags
227+
void $
228+
haddock_setupHooks
229+
(SetupHooks.buildHooks setupHooks)
230+
pkg_descr
231+
lbi
232+
(allSuffixHandlers hooks)
233+
flags
233234

234235
setup_hscolourHook
235236
:: PackageDescription

Cabal/src/Distribution/Simple/Build.hs

Lines changed: 62 additions & 36 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
@@ -86,6 +89,7 @@ import Distribution.Simple.BuildPaths
8689
import Distribution.Simple.BuildTarget
8790
import Distribution.Simple.BuildToolDepends
8891
import Distribution.Simple.Configure
92+
import Distribution.Simple.Errors
8993
import Distribution.Simple.Flag
9094
import Distribution.Simple.LocalBuildInfo
9195
import Distribution.Simple.PreProcess
@@ -101,9 +105,11 @@ import Distribution.Simple.Setup.Repl
101105
import Distribution.Simple.SetupHooks.Internal
102106
( BuildHooks (..)
103107
, BuildingWhat (..)
108+
, buildingWhatVerbosity
104109
, noBuildHooks
105110
)
106111
import qualified Distribution.Simple.SetupHooks.Internal as SetupHooks
112+
import qualified Distribution.Simple.SetupHooks.Rule as SetupHooks
107113
import Distribution.Simple.ShowBuildInfo
108114
import Distribution.Simple.Test.LibV09
109115
import Distribution.Simple.Utils
@@ -120,7 +126,6 @@ import Distribution.Compat.Graph (IsNode (..))
120126
import Control.Monad
121127
import qualified Data.ByteString.Lazy as LBS
122128
import qualified Data.Map as Map
123-
import Distribution.Simple.Errors
124129
import System.Directory (doesFileExist, removeFile)
125130
import System.FilePath (takeDirectory)
126131

@@ -137,7 +142,8 @@ build
137142
-> [PPSuffixHandler]
138143
-- ^ preprocessors to run before compiling
139144
-> IO ()
140-
build = build_setupHooks noBuildHooks
145+
build pkg lbi flags suffixHandlers =
146+
void $ build_setupHooks noBuildHooks pkg lbi flags suffixHandlers
141147

142148
build_setupHooks
143149
:: BuildHooks
@@ -149,13 +155,15 @@ build_setupHooks
149155
-- ^ Flags that the user passed to build
150156
-> [PPSuffixHandler]
151157
-- ^ preprocessors to run before compiling
152-
-> IO ()
158+
-> IO [SetupHooks.MonitorFilePath]
153159
build_setupHooks
154160
(BuildHooks{preBuildComponentRules = mbPbcRules, postBuildComponentHook = mbPostBuild})
155161
pkg_descr
156162
lbi
157163
flags
158164
suffixHandlers = do
165+
let verbosity = fromFlag $ buildVerbosity flags
166+
distPref = fromFlag $ buildDistPref flags
159167
checkSemaphoreSupport verbosity (compiler lbi) flags
160168
targets <- readTargetInfos verbosity pkg_descr lbi (buildTargets flags)
161169
let componentsToBuild = neededTargetsInBuildOrder' pkg_descr lbi (map nodeKey targets)
@@ -180,7 +188,7 @@ build_setupHooks
180188
dumpBuildInfo verbosity distPref (configDumpBuildInfo (configFlags lbi)) pkg_descr lbi flags
181189

182190
-- 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
184192
let comp = targetComponent target
185193
clbi = targetCLBI target
186194
bi = componentBuildInfo comp
@@ -191,18 +199,13 @@ build_setupHooks
191199
, withPackageDB = withPackageDB lbi ++ [internalPackageDB]
192200
, installedPkgs = index
193201
}
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
206209
let numJobs = buildNumJobs flags
207210
par_strat <-
208211
toFlag <$> case buildUseSemaphore flags of
@@ -231,12 +234,41 @@ build_setupHooks
231234
, SetupHooks.targetInfo = target
232235
}
233236
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
235239

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
240272

241273
-- | Check for conditions that would prevent the build from succeeding.
242274
checkSemaphoreSupport
@@ -378,24 +410,18 @@ repl_setupHooks
378410
(componentBuildInfo comp)
379411
(withPrograms lbi')
380412
}
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
391417

392418
-- build any dependent components
393419
sequence_
394420
[ do
395421
let clbi = targetCLBI subtarget
396422
comp = targetComponent subtarget
397423
lbi' = lbiForComponent comp lbi
398-
preBuildComponent runPreBuildHooks verbosity lbi' subtarget
424+
preBuildComponent (runPreBuildHooksRepl subtarget) verbosity lbi subtarget
399425
buildComponent
400426
(mempty{buildCommonFlags = mempty{setupVerbosity = toFlag verbosity}})
401427
NoFlag
@@ -412,7 +438,7 @@ repl_setupHooks
412438
let clbi = targetCLBI target
413439
comp = targetComponent target
414440
lbi' = lbiForComponent comp lbi
415-
preBuildComponent runPreBuildHooks verbosity lbi' target
441+
preBuildComponent (runPreBuildHooksRepl target) verbosity lbi target
416442
replComponent flags verbosity pkg_descr lbi' suffixHandlers comp clbi distPref
417443

418444
-- | Start an interpreter without loading any package files.
@@ -1029,19 +1055,19 @@ replFLib flags pkg_descr lbi exe clbi =
10291055
-- | Creates the autogenerated files for a particular configured component,
10301056
-- and runs the pre-build hook.
10311057
preBuildComponent
1032-
:: (LocalBuildInfo -> TargetInfo -> IO ())
1058+
:: IO r
10331059
-- ^ pre-build hook
10341060
-> Verbosity
10351061
-> LocalBuildInfo
10361062
-- ^ Configuration information
10371063
-> TargetInfo
1038-
-> IO ()
1064+
-> IO r
10391065
preBuildComponent preBuildHook verbosity lbi tgt = do
10401066
let pkg_descr = localPkgDescr lbi
10411067
clbi = targetCLBI tgt
10421068
createDirectoryIfMissingVerbose verbosity True (interpretSymbolicPathLBI lbi $ componentBuildDir lbi clbi)
10431069
writeBuiltinAutogenFiles verbosity pkg_descr lbi clbi
1044-
preBuildHook lbi tgt
1070+
preBuildHook
10451071

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

0 commit comments

Comments
 (0)