Skip to content

Commit a4271dc

Browse files
committed
Add flags for new-show-build-info
Add functioning flag `--buildinfo-json-output=FILE` Add custom flags to parse more flags. Dont write always to stdout but to a file if specified.
1 parent 50b62ed commit a4271dc

File tree

7 files changed

+136
-49
lines changed

7 files changed

+136
-49
lines changed

Cabal/Distribution/Simple.hs

+12-7
Original file line numberDiff line numberDiff line change
@@ -264,13 +264,16 @@ buildAction hooks flags args = do
264264
(return lbi { withPrograms = progs })
265265
hooks flags' { buildArgs = args } args
266266

267-
showBuildInfoAction :: UserHooks -> BuildFlags -> Args -> IO ()
268-
showBuildInfoAction hooks flags args = do
267+
showBuildInfoAction :: UserHooks -> ShowBuildInfoFlags -> Args -> IO ()
268+
showBuildInfoAction hooks a@(ShowBuildInfoFlags flags fileOutput _) args = do
269+
print a
269270
distPref <- findDistPrefOrDefault (buildDistPref flags)
270271
let verbosity = fromFlag $ buildVerbosity flags
271-
flags' = flags { buildDistPref = toFlag distPref }
272-
273272
lbi <- getBuildConfig hooks verbosity distPref
273+
let flags' = flags { buildDistPref = toFlag distPref
274+
, buildCabalFilePath = maybeToFlag (cabalFilePath lbi)
275+
}
276+
274277
progs <- reconfigurePrograms verbosity
275278
(buildProgramPaths flags')
276279
(buildProgramArgs flags')
@@ -280,9 +283,11 @@ showBuildInfoAction hooks flags args = do
280283
let lbi' = lbi { withPrograms = progs }
281284
pkg_descr0 = localPkgDescr lbi'
282285
pkg_descr = updatePackageDescription pbi pkg_descr0
283-
-- TODO: Somehow don't ignore build hook?
284-
showBuildInfo pkg_descr lbi' flags
285-
286+
-- TODO: Somehow don't ignore build hook?
287+
buildInfoString <- showBuildInfo pkg_descr lbi' flags
288+
289+
maybe (putStrLn buildInfoString) (\fp -> appendFile fp buildInfoString) (fileOutput)
290+
286291
postBuild hooks args flags' pkg_descr lbi'
287292

288293
replAction :: UserHooks -> ReplFlags -> Args -> IO ()

Cabal/Distribution/Simple/Build.hs

+2-2
Original file line numberDiff line numberDiff line change
@@ -133,13 +133,13 @@ build pkg_descr lbi flags suffixes = do
133133
showBuildInfo :: PackageDescription -- ^ Mostly information from the .cabal file
134134
-> LocalBuildInfo -- ^ Configuration information
135135
-> BuildFlags -- ^ Flags that the user passed to build
136-
-> IO ()
136+
-> IO String
137137
showBuildInfo pkg_descr lbi flags = do
138138
let verbosity = fromFlag (buildVerbosity flags)
139139
targets <- readTargetInfos verbosity pkg_descr lbi (buildArgs flags)
140140
let targetsToBuild = neededTargetsInBuildOrder' pkg_descr lbi (map nodeKey targets)
141141
doc = mkBuildInfo pkg_descr lbi flags targetsToBuild
142-
putStrLn $ renderJson doc ""
142+
return $ renderJson doc ""
143143

144144

145145
repl :: PackageDescription -- ^ Mostly information from the .cabal file

Cabal/Distribution/Simple/Setup.hs

+44-6
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ module Distribution.Simple.Setup (
4646
HscolourFlags(..), emptyHscolourFlags, defaultHscolourFlags, hscolourCommand,
4747
BuildFlags(..), emptyBuildFlags, defaultBuildFlags, buildCommand,
4848

49-
showBuildInfoCommand,
49+
showBuildInfoCommand, ShowBuildInfoFlags(..),
5050
buildVerbose,
5151
ReplFlags(..), defaultReplFlags, replCommand,
5252
CleanFlags(..), emptyCleanFlags, defaultCleanFlags, cleanCommand,
@@ -2219,7 +2219,21 @@ optionNumJobs get set =
22192219
-- * show-build-info command flags
22202220
-- ------------------------------------------------------------
22212221

2222-
showBuildInfoCommand :: ProgramDb -> CommandUI BuildFlags
2222+
data ShowBuildInfoFlags = ShowBuildInfoFlags
2223+
{ buildInfoBuildFlags :: BuildFlags
2224+
, buildInfoOutputFile :: Maybe FilePath
2225+
, buildInfoUnitIds :: Maybe [String]
2226+
} deriving Show
2227+
2228+
defaultShowBuildFlags :: ShowBuildInfoFlags
2229+
defaultShowBuildFlags =
2230+
ShowBuildInfoFlags
2231+
{ buildInfoBuildFlags = defaultBuildFlags
2232+
, buildInfoOutputFile = Nothing
2233+
, buildInfoUnitIds = Nothing
2234+
}
2235+
2236+
showBuildInfoCommand :: ProgramDb -> CommandUI ShowBuildInfoFlags
22232237
showBuildInfoCommand progDb = CommandUI
22242238
{ commandName = "show-build-info"
22252239
, commandSynopsis = "Emit details about how a package would be built."
@@ -2247,16 +2261,40 @@ showBuildInfoCommand progDb = CommandUI
22472261
[ "[FLAGS]"
22482262
, "COMPONENTS [FLAGS]"
22492263
]
2250-
, commandDefaultFlags = defaultBuildFlags
2251-
, commandOptions = \showOrParseArgs ->
2264+
, commandDefaultFlags = defaultShowBuildFlags
2265+
, commandOptions = \showOrParseArgs ->
2266+
parseBuildFlagsForShowBuildInfoFlags showOrParseArgs progDb
2267+
++
2268+
[ option [] ["buildinfo-json-output"]
2269+
"Write the result to the given file instead of stdout"
2270+
buildInfoOutputFile (\pf flags -> flags { buildInfoOutputFile = pf })
2271+
(reqArg' "FILE" Just (maybe [] pure)),
2272+
option [] ["unit-ids-json"]
2273+
"Show build-info only for selected unit-id's."
2274+
buildInfoUnitIds (\pf flags -> flags { buildInfoUnitIds = pf })
2275+
(reqArg' "UNIT-ID" (Just . words) (fromMaybe [] ))
2276+
]
2277+
2278+
}
2279+
2280+
parseBuildFlagsForShowBuildInfoFlags :: ShowOrParseArgs -> ProgramDb -> [OptionField ShowBuildInfoFlags]
2281+
parseBuildFlagsForShowBuildInfoFlags showOrParseArgs progDb =
2282+
map
2283+
(liftOption
2284+
buildInfoBuildFlags
2285+
(\bf flags -> flags { buildInfoBuildFlags = bf } )
2286+
)
2287+
buildFlags
2288+
where
2289+
buildFlags = buildOptions progDb showOrParseArgs
2290+
++
22522291
[ optionVerbosity
22532292
buildVerbosity (\v flags -> flags { buildVerbosity = v })
22542293

22552294
, optionDistPref
22562295
buildDistPref (\d flags -> flags { buildDistPref = d }) showOrParseArgs
22572296
]
2258-
++ buildOptions progDb showOrParseArgs
2259-
}
2297+
--
22602298

22612299
-- ------------------------------------------------------------
22622300
-- * Other Utils

cabal-install/Distribution/Client/CmdBuild.hs

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ module Distribution.Client.CmdBuild (
88
-- * Internals exposed for testing
99
TargetProblem(..),
1010
selectPackageTargets,
11-
selectComponentTarget
11+
selectComponentTarget,
12+
reportTargetProblems
1213
) where
1314

1415
import Distribution.Client.ProjectOrchestration

cabal-install/Distribution/Client/CmdShowBuildInfo.hs

+66-24
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,16 @@ import Distribution.Client.CmdErrorMessages
1111
import Distribution.Client.CmdInstall.ClientInstallFlags
1212

1313
import Distribution.Client.Setup
14-
( GlobalFlags, ConfigFlags(..), ConfigExFlags, InstallFlags )
14+
( GlobalFlags, ConfigFlags(..), ConfigExFlags, InstallFlags
15+
)
1516
import qualified Distribution.Client.Setup as Client
1617
import Distribution.Simple.Setup
17-
( HaddockFlags, fromFlagOrDefault, TestFlags )
18+
( HaddockFlags, TestFlags
19+
, fromFlagOrDefault
20+
)
1821
import Distribution.Simple.Command
19-
( CommandUI(..), usageAlternatives )
22+
( CommandUI(..), option, reqArg', usageAlternatives
23+
)
2024
import Distribution.Verbosity
2125
( Verbosity, silent )
2226
import Distribution.Simple.Utils
@@ -38,10 +42,12 @@ import Distribution.Client.DistDirLayout (distBuildDirectory)
3842
import Distribution.Client.Types ( PackageLocation(..), GenericReadyPackage(..) )
3943
import Distribution.Client.JobControl (newLock, Lock)
4044
import Distribution.Simple.Configure (tryGetPersistBuildConfig)
45+
import qualified Distribution.Client.CmdInstall as CmdInstall
4146
import Data.List (find)
47+
import Data.Maybe (fromMaybe)
4248

43-
showBuildInfoCommand :: CommandUI (ConfigFlags, ConfigExFlags, InstallFlags, HaddockFlags, TestFlags)
44-
showBuildInfoCommand = Client.installCommand {
49+
showBuildInfoCommand :: CommandUI ShowBuildInfoFlags
50+
showBuildInfoCommand = CmdInstall.installCommand {
4551
commandName = "new-show-build-info",
4652
commandSynopsis = "Show project build information",
4753
commandUsage = usageAlternatives "new-show-build-info" [ "[TARGETS] [FLAGS]" ],
@@ -56,9 +62,35 @@ showBuildInfoCommand = Client.installCommand {
5662
++ " Shows build information about the current package\n"
5763
++ " " ++ pname ++ " new-show-build-info ./pkgname \n"
5864
++ " Shows build information about the package located in './pkgname'\n"
59-
++ cmdCommonHelpTextNewBuildBeta
65+
++ cmdCommonHelpTextNewBuildBeta,
66+
commandOptions = \showOrParseArgs ->
67+
Client.liftOptions buildInfoInstallCommandFlags (\pf flags -> flags { buildInfoInstallCommandFlags = pf }) (commandOptions CmdInstall.installCommand showOrParseArgs)
68+
++
69+
[ option [] ["buildinfo-json-output"]
70+
"Write the result to the given file instead of stdout"
71+
buildInfoOutputFile (\pf flags -> flags { buildInfoOutputFile = pf })
72+
(reqArg' "FILE" Just (maybe [] pure)),
73+
option [] ["unit-ids-json"]
74+
"Show build-info only for selected unit-id's."
75+
buildInfoUnitIds (\pf flags -> flags { buildInfoUnitIds = pf })
76+
(reqArg' "UNIT-ID" (Just . words) (fromMaybe []))
77+
],
78+
commandDefaultFlags = defaultShowBuildInfoFlags
79+
6080
}
6181

82+
data ShowBuildInfoFlags = ShowBuildInfoFlags
83+
{ buildInfoInstallCommandFlags :: (ConfigFlags, ConfigExFlags, InstallFlags, HaddockFlags, TestFlags, ClientInstallFlags)
84+
, buildInfoOutputFile :: Maybe FilePath
85+
, buildInfoUnitIds :: Maybe [String]
86+
}
87+
88+
defaultShowBuildInfoFlags :: ShowBuildInfoFlags
89+
defaultShowBuildInfoFlags = ShowBuildInfoFlags
90+
{ buildInfoInstallCommandFlags = (mempty, mempty, mempty, mempty, mempty, mempty)
91+
, buildInfoOutputFile = Nothing
92+
, buildInfoUnitIds = Nothing
93+
}
6294

6395
-- | The @show-build-info@ command does a lot. It brings the install plan up to date,
6496
-- selects that part of the plan needed by the given or implicit targets and
@@ -67,11 +99,10 @@ showBuildInfoCommand = Client.installCommand {
6799
-- For more details on how this works, see the module
68100
-- "Distribution.Client.ProjectOrchestration"
69101
--
70-
showBuildInfoAction :: (ConfigFlags, ConfigExFlags, InstallFlags, HaddockFlags, TestFlags)
102+
showBuildInfoAction :: ShowBuildInfoFlags
71103
-> [String] -> GlobalFlags -> IO ()
72-
showBuildInfoAction (configFlags, configExFlags, installFlags, haddockFlags, testFlags)
104+
showBuildInfoAction (ShowBuildInfoFlags (configFlags, configExFlags, installFlags, haddockFlags, testFlags, clientInstallFlags) fileOutput unitIds)
73105
targetStrings globalFlags = do
74-
75106
baseCtx <- establishProjectBaseContext verbosity cliConfig
76107
let baseCtx' = baseCtx {
77108
buildSettings = (buildSettings baseCtx) {
@@ -99,32 +130,36 @@ showBuildInfoAction (configFlags, configExFlags, installFlags, haddockFlags, tes
99130
return (elaboratedPlan, targets)
100131

101132
scriptLock <- newLock
102-
showTargets verbosity baseCtx' buildCtx scriptLock
133+
showTargets fileOutput unitIds verbosity baseCtx' buildCtx scriptLock
103134

104135
where
105136
-- Default to silent verbosity otherwise it will pollute our json output
106137
verbosity = fromFlagOrDefault silent (configVerbosity configFlags)
107138
cliConfig = commandLineFlagsToProjectConfig
108139
globalFlags configFlags configExFlags
109-
installFlags mempty -- Not needed here
140+
installFlags clientInstallFlags
110141
haddockFlags
111142
testFlags
112143

113144
-- Pretty nasty piecemeal out of json, but I can't see a way to retrieve output of the setupWrapper'd tasks
114-
showTargets :: Verbosity -> ProjectBaseContext -> ProjectBuildContext -> Lock -> IO ()
115-
showTargets verbosity baseCtx buildCtx lock = do
116-
putStr "["
117-
mapM_ showSeparated (zip [0..] targets)
118-
putStrLn "]"
145+
showTargets :: Maybe FilePath -> Maybe [String] -> Verbosity -> ProjectBaseContext -> ProjectBuildContext -> Lock -> IO ()
146+
showTargets fileOutput unitIds verbosity baseCtx buildCtx lock = do
147+
case fileOutput of
148+
Nothing -> do
149+
putStr "["
150+
mapM_ doShowInfo targets
151+
putStrLn "]"
152+
Just fp -> do
153+
writeFile fp "["
154+
mapM_ doShowInfo targets
155+
appendFile fp "]"
156+
119157
where configured = [p | InstallPlan.Configured p <- InstallPlan.toList (elaboratedPlanOriginal buildCtx)]
120158
targets = fst <$> (Map.toList . targetsMap $ buildCtx)
121-
doShowInfo unitId = showInfo verbosity baseCtx buildCtx lock configured unitId
122-
showSeparated (idx, unitId)
123-
| idx == length targets - 1 = doShowInfo unitId
124-
| otherwise = doShowInfo unitId >> putStrLn ","
159+
doShowInfo unitId = showInfo fileOutput unitIds verbosity baseCtx buildCtx lock configured unitId
125160

126-
showInfo :: Verbosity -> ProjectBaseContext -> ProjectBuildContext -> Lock -> [ElaboratedConfiguredPackage] -> UnitId -> IO ()
127-
showInfo verbosity baseCtx buildCtx lock pkgs targetUnitId
161+
showInfo :: Maybe FilePath -> Maybe [String] -> Verbosity -> ProjectBaseContext -> ProjectBuildContext -> Lock -> [ElaboratedConfiguredPackage] -> UnitId -> IO ()
162+
showInfo fileOutput unitIds verbosity baseCtx buildCtx lock pkgs targetUnitId
128163
| Nothing <- mbPkg = die' verbosity $ "No unit " ++ show targetUnitId
129164
| Just pkg <- mbPkg = do
130165
let shared = elaboratedShared buildCtx
@@ -155,15 +190,22 @@ showInfo verbosity baseCtx buildCtx lock pkgs targetUnitId
155190
scriptOptions
156191
(Just $ elabPkgDescription pkg)
157192
(Cabal.configureCommand defaultProgramDb)
158-
(const $ configureFlags)
193+
(const configureFlags)
159194
(const configureArgs)
160195
Right _ -> pure ()
196+
161197
setupWrapper
162198
verbosity
163199
scriptOptions
164200
(Just $ elabPkgDescription pkg)
165201
(Cabal.showBuildInfoCommand defaultProgramDb)
166-
(const flags)
202+
(const (Cabal.ShowBuildInfoFlags
203+
{ Cabal.buildInfoBuildFlags = flags
204+
, Cabal.buildInfoOutputFile = fileOutput
205+
, Cabal.buildInfoUnitIds = unitIds
206+
}
207+
)
208+
)
167209
(const args)
168210
where mbPkg = find ((targetUnitId ==) . elabUnitId) pkgs
169211

cabal-install/Distribution/Client/Setup.hs

+2-2
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ module Distribution.Client.Setup
5555
, doctestCommand
5656
, copyCommand
5757
, registerCommand
58-
, showBuildInfoCommand
58+
--, showBuildInfoCommand
5959
, parsePackageArgs
6060
, liftOptions
6161
, yesNoOpt
@@ -2957,7 +2957,7 @@ relevantConfigValuesText vs =
29572957
-- * Commands to support show-build-info
29582958
-- ------------------------------------------------------------
29592959

2960-
showBuildInfoCommand :: CommandUI (BuildFlags, BuildExFlags)
2960+
showBuildInfoCommand :: CommandUI (Cabal.ShowBuildInfoFlags, BuildExFlags)
29612961
showBuildInfoCommand = parent {
29622962
commandDefaultFlags = (commandDefaultFlags parent, mempty),
29632963
commandOptions =

cabal-install/main/Main.hs

+8-7
Original file line numberDiff line numberDiff line change
@@ -454,13 +454,14 @@ buildAction flags@(buildFlags, _) = buildActionForCommand
454454
flags
455455
where verbosity = fromFlagOrDefault normal (buildVerbosity buildFlags)
456456

457-
showBuildInfoAction :: (BuildFlags, BuildExFlags) -> [String] -> Action
458-
showBuildInfoAction flags@(buildFlags, _) = buildActionForCommand
459-
(Cabal.showBuildInfoCommand defaultProgramDb)
460-
verbosity
461-
flags
462-
-- Default silent verbosity so as not to pollute json output
463-
where verbosity = fromFlagOrDefault silent (buildVerbosity buildFlags)
457+
-- showBuildInfoAction :: (Cabal.ShowBuildInfoFlags, BuildExFlags) -> [String] -> Action
458+
-- showBuildInfoAction (showBuildInfoFlags, buildEx) = buildActionForCommand
459+
-- (Cabal.showBuildInfoCommand defaultProgramDb)
460+
-- showBuildInfoFlags
461+
-- verbosity
462+
-- (Cabal.buildInfoBuildFlags showBuildInfoFlags, buildEx)
463+
-- -- Default silent verbosity so as not to pollute json output
464+
-- where verbosity = fromFlagOrDefault silent (buildVerbosity (Cabal.buildInfoBuildFlags showBuildInfoFlags ))
464465

465466
buildActionForCommand :: CommandUI BuildFlags
466467
-> Verbosity

0 commit comments

Comments
 (0)