Skip to content

Commit 2a5d7f0

Browse files
committed
cabal-install: call Cabal in-library
This commit modifies the SetupWrapper mechanism, adding a new way of building a package: directly calling Cabal library functions (e.g. 'build', 'configure' etc). This currently requires a bit of GADT trickery to accomodate the fact that configure returns a LocalBuildInfo which must then be passed to subsequent phases, while with the old Setup interface everything returns IO () and communication is done through the filesystem (the local build info file). To handle 'build-type: Hooks', this commit introduces the hooks-exe package, which contains: - the hooks-exe library, used to compile a set of SetupHooks into an external executable, - the hooks-cli library, which is used by cabal-install to communicate with an external hooks executable. This package depends on the new `CommunicationHandle` functionality from haskell/process#308.
1 parent 0bddf0e commit 2a5d7f0

File tree

44 files changed

+2243
-496
lines changed

Some content is hidden

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

44 files changed

+2243
-496
lines changed

Cabal/src/Distribution/Simple.hs

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,15 @@ defaultMainWithSetupHooksArgs setupHooks =
155155
, hscolourHook = setup_hscolourHook
156156
}
157157
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+
158167
setup_confHook
159168
:: (GenericPackageDescription, HookedBuildInfo)
160169
-> ConfigFlags
@@ -170,12 +179,13 @@ defaultMainWithSetupHooksArgs setupHooks =
170179
-> BuildFlags
171180
-> IO ()
172181
setup_buildHook pkg_descr lbi hooks flags =
173-
build_setupHooks
174-
(SetupHooks.buildHooks setupHooks)
175-
pkg_descr
176-
lbi
177-
flags
178-
(allSuffixHandlers hooks)
182+
void $
183+
build_setupHooks
184+
(preBuildHook, postBuildHook)
185+
pkg_descr
186+
lbi
187+
flags
188+
(allSuffixHandlers hooks)
179189

180190
setup_copyHook
181191
:: PackageDescription
@@ -209,7 +219,7 @@ defaultMainWithSetupHooksArgs setupHooks =
209219
-> IO ()
210220
setup_replHook pkg_descr lbi hooks flags args =
211221
repl_setupHooks
212-
(SetupHooks.buildHooks setupHooks)
222+
preBuildHook
213223
pkg_descr
214224
lbi
215225
flags
@@ -223,12 +233,13 @@ defaultMainWithSetupHooksArgs setupHooks =
223233
-> HaddockFlags
224234
-> IO ()
225235
setup_haddockHook pkg_descr lbi hooks flags =
226-
haddock_setupHooks
227-
(SetupHooks.buildHooks setupHooks)
228-
pkg_descr
229-
lbi
230-
(allSuffixHandlers hooks)
231-
flags
236+
void $
237+
haddock_setupHooks
238+
preBuildHook
239+
pkg_descr
240+
lbi
241+
(allSuffixHandlers hooks)
242+
flags
232243

233244
setup_hscolourHook
234245
:: PackageDescription
@@ -238,7 +249,7 @@ defaultMainWithSetupHooksArgs setupHooks =
238249
-> IO ()
239250
setup_hscolourHook pkg_descr lbi hooks flags =
240251
hscolour_setupHooks
241-
(SetupHooks.buildHooks setupHooks)
252+
preBuildHook
242253
pkg_descr
243254
lbi
244255
(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)