@@ -23,7 +23,7 @@ import Distribution.Simple.Command
23
23
import Distribution.Verbosity
24
24
( Verbosity , silent )
25
25
import Distribution.Simple.Utils
26
- ( wrapText , die' , withTempDirectory )
26
+ ( wrapText , die' )
27
27
import Distribution.Types.UnitId
28
28
( UnitId , mkUnitId )
29
29
import Distribution.Types.Version
@@ -36,13 +36,11 @@ import Distribution.Pretty
36
36
import qualified Data.Map as Map
37
37
import qualified Distribution.Simple.Setup as Cabal
38
38
import Distribution.Client.SetupWrapper
39
- import Distribution.Simple.Program
40
- ( defaultProgramDb )
41
39
import qualified Distribution.Client.InstallPlan as InstallPlan
42
40
import Distribution.Client.ProjectPlanning.Types
43
41
import Distribution.Client.ProjectPlanning
44
42
( setupHsConfigureFlags , setupHsConfigureArgs , setupHsBuildFlags
45
- , setupHsBuildArgs , setupHsScriptOptions )
43
+ , setupHsScriptOptions )
46
44
import Distribution.Client.NixStyleOptions
47
45
( NixStyleFlags (.. ), nixStyleOptions , defaultNixStyleFlags )
48
46
import Distribution.Client.DistDirLayout
@@ -52,12 +50,16 @@ import Distribution.Client.Types
52
50
import Distribution.Client.JobControl
53
51
( newLock , Lock )
54
52
import Distribution.Simple.Configure
55
- ( tryGetPersistBuildConfig )
53
+ (getPersistBuildConfig , tryGetPersistBuildConfig )
56
54
57
- import System.Directory
58
- ( getTemporaryDirectory )
59
- import System.FilePath
60
- ( (</>) )
55
+ import Distribution.Simple.ShowBuildInfo
56
+ import Distribution.Utils.Json
57
+
58
+ import Distribution.Simple.BuildTarget (readTargetInfos )
59
+ import Distribution.Types.LocalBuildInfo (neededTargetsInBuildOrder' )
60
+ import Distribution.Compat.Graph (IsNode (nodeKey ))
61
+ import Distribution.Simple.Setup (BuildFlags (buildArgs ))
62
+ import Distribution.Types.TargetInfo (TargetInfo (targetCLBI ))
61
63
62
64
showBuildInfoCommand :: CommandUI (NixStyleFlags ShowBuildInfoFlags )
63
65
showBuildInfoCommand = CommandUI {
@@ -137,51 +139,26 @@ showBuildInfoAction flags@NixStyleFlags { extraFlags = (ShowBuildInfoFlags fileO
137
139
cliConfig = commandLineFlagsToProjectConfig globalFlags flags
138
140
mempty -- ClientInstallFlags, not needed here
139
141
140
- -- Pretty nasty piecemeal out of json, but I can't see a way to retrieve output of the setupWrapper'd tasks
141
142
showTargets :: Maybe FilePath -> Maybe [String ] -> Verbosity -> ProjectBaseContext -> ProjectBuildContext -> Lock -> IO ()
142
143
showTargets fileOutput unitIds verbosity baseCtx buildCtx lock = do
143
- tempDir <- getTemporaryDirectory
144
- withTempDirectory verbosity tempDir " show-build-info" $ \ dir -> do
145
- mapM_ (doShowInfo dir) targets
146
- case fileOutput of
147
- Nothing -> outputResult dir putStr targets
148
- Just fp -> do
149
- writeFile fp " "
150
- outputResult dir (appendFile fp) targets
144
+ let configured = [p | InstallPlan. Configured p <- InstallPlan. toList (elaboratedPlanOriginal buildCtx)]
145
+ targets = maybe (fst <$> (Map. toList . targetsMap $ buildCtx)) (map mkUnitId) unitIds
146
+
147
+ components <- concat <$> mapM (getComponentInfo verbosity baseCtx buildCtx
148
+ lock configured) targets
151
149
152
- where configured = [p | InstallPlan. Configured p <- InstallPlan. toList (elaboratedPlanOriginal buildCtx)]
153
- targets = maybe (fst <$> (Map. toList . targetsMap $ buildCtx)) (map mkUnitId) unitIds
154
- doShowInfo :: FilePath -> UnitId -> IO ()
155
- doShowInfo dir unitId =
156
- showInfo
157
- (dir </> unitIdToFilePath unitId)
158
- verbosity
159
- baseCtx
160
- buildCtx
161
- lock
162
- configured
163
- unitId
150
+ let compilerInfo = mkCompilerInfo (pkgConfigCompilerProgs (elaboratedShared buildCtx))
151
+ (pkgConfigCompiler (elaboratedShared buildCtx))
164
152
165
- outputResult :: FilePath -> (String -> IO () ) -> [UnitId ] -> IO ()
166
- outputResult dir printer units = do
167
- let unroll [] = return ()
168
- unroll [x] = do
169
- content <- readFile (dir </> unitIdToFilePath x)
170
- printer content
171
- unroll (x: xs) = do
172
- content <- readFile (dir </> unitIdToFilePath x)
173
- printer content
174
- printer " ,"
175
- unroll xs
176
- printer " ["
177
- unroll units
178
- printer " ]"
153
+ json = mkBuildInfo' compilerInfo components
154
+ res = renderJson json " "
179
155
180
- unitIdToFilePath :: UnitId -> FilePath
181
- unitIdToFilePath unitId = " build-info-" ++ prettyShow unitId ++ " .json"
156
+ case fileOutput of
157
+ Nothing -> putStrLn res
158
+ Just fp -> writeFile fp res
182
159
183
- showInfo :: FilePath -> Verbosity -> ProjectBaseContext -> ProjectBuildContext -> Lock -> [ElaboratedConfiguredPackage ] -> UnitId -> IO ()
184
- showInfo fileOutput verbosity baseCtx buildCtx lock pkgs targetUnitId =
160
+ getComponentInfo :: Verbosity -> ProjectBaseContext -> ProjectBuildContext -> Lock -> [ElaboratedConfiguredPackage ] -> UnitId -> IO [ Json ]
161
+ getComponentInfo verbosity baseCtx buildCtx lock pkgs targetUnitId =
185
162
case mbPkg of
186
163
Nothing -> die' verbosity $ " No unit " ++ prettyShow targetUnitId
187
164
Just pkg -> do
@@ -191,7 +168,6 @@ showInfo fileOutput verbosity baseCtx buildCtx lock pkgs targetUnitId =
191
168
buildDir = distBuildDirectory dirLayout (elabDistDirParams shared pkg)
192
169
buildType' = buildType (elabPkgDescription pkg)
193
170
flags = setupHsBuildFlags pkg shared verbosity buildDir
194
- args = setupHsBuildArgs pkg
195
171
srcDir = case (elabPkgSourceLocation pkg) of
196
172
LocalUnpackedPackage fp -> fp
197
173
_ -> " "
@@ -216,29 +192,25 @@ showInfo fileOutput verbosity baseCtx buildCtx lock pkgs targetUnitId =
216
192
++ " For component: " ++ prettyShow targetUnitId
217
193
)
218
194
-- Configure the package if there's no existing config
219
- lbi <- tryGetPersistBuildConfig buildDir
220
- case lbi of
195
+ lbi' <- tryGetPersistBuildConfig buildDir
196
+ case lbi' of
221
197
Left _ -> setupWrapper
222
198
verbosity
223
199
scriptOptions
224
200
(Just $ elabPkgDescription pkg)
225
- (Cabal. configureCommand defaultProgramDb)
201
+ (Cabal. configureCommand
202
+ (pkgConfigCompilerProgs (elaboratedShared buildCtx)))
226
203
(const configureFlags)
227
204
(const configureArgs)
228
205
Right _ -> pure ()
229
206
230
- setupWrapper
231
- verbosity
232
- scriptOptions
233
- (Just $ elabPkgDescription pkg)
234
- (Cabal. showBuildInfoCommand defaultProgramDb)
235
- (const (Cabal. ShowBuildInfoFlags
236
- { Cabal. buildInfoBuildFlags = flags
237
- , Cabal. buildInfoOutputFile = Just fileOutput
238
- }
239
- )
240
- )
241
- (const args)
207
+ -- Do the bit the Cabal library would normally do here
208
+ lbi <- getPersistBuildConfig buildDir
209
+ let pkgDesc = elabPkgDescription pkg
210
+ targets <- readTargetInfos verbosity pkgDesc lbi (buildArgs flags)
211
+ let targetsToBuild = neededTargetsInBuildOrder' pkgDesc lbi (map nodeKey targets)
212
+ return $ map (mkComponentInfo pkgDesc lbi . targetCLBI) targetsToBuild
213
+
242
214
where
243
215
mbPkg :: Maybe ElaboratedConfiguredPackage
244
216
mbPkg = find ((targetUnitId == ) . elabUnitId) pkgs
@@ -247,9 +219,9 @@ showInfo fileOutput verbosity baseCtx buildCtx lock pkgs targetUnitId =
247
219
-- It selects the 'AvailableTarget's that the 'TargetSelector' refers to,
248
220
-- or otherwise classifies the problem.
249
221
--
250
- -- For the @show-build-info@ command select all components except non-buildable and disabled
251
- -- tests\/benchmarks, fail if there are no such components
252
- --
222
+ -- For the @show-build-info@ command select all components. Unlike the @build@
223
+ -- command, we want to show info for tests and benchmarks even without the
224
+ -- @--enable-tests@\/@--enable-benchmarks@ flag set.
253
225
selectPackageTargets :: TargetSelector
254
226
-> [AvailableTarget k ] -> Either TargetProblem' [k ]
255
227
selectPackageTargets targetSelector targets
@@ -267,16 +239,7 @@ selectPackageTargets targetSelector targets
267
239
= Left (TargetProblemNoTargets targetSelector)
268
240
where
269
241
targets' = forgetTargetsDetail targets
270
- targetsBuildable = selectBuildableTargetsWith
271
- (buildable targetSelector)
272
- targets
273
-
274
- -- When there's a target filter like "pkg:tests" then we do select tests,
275
- -- but if it's just a target like "pkg" then we don't build tests unless
276
- -- they are requested by default (i.e. by using --enable-tests)
277
- buildable (TargetPackage _ _ Nothing ) TargetNotRequestedByDefault = False
278
- buildable (TargetAllPackages Nothing ) TargetNotRequestedByDefault = False
279
- buildable _ _ = True
242
+ targetsBuildable = selectBuildableTargets targets
280
243
281
244
-- | For a 'TargetComponent' 'TargetSelector', check if the component can be
282
245
-- selected.
0 commit comments