diff --git a/Cabal/src/Distribution/Simple.hs b/Cabal/src/Distribution/Simple.hs
index fc9153229682f119941a3a67cac372cac2c639ec..1eb958a0350706aa5a532b97b741a9ac50074bfe 100644
--- a/Cabal/src/Distribution/Simple.hs
+++ b/Cabal/src/Distribution/Simple.hs
@@ -265,31 +265,34 @@ buildAction hooks flags args = do
                hooks flags' { buildArgs = args } args
 
 showBuildInfoAction :: UserHooks -> ShowBuildInfoFlags -> Args -> IO ()
-showBuildInfoAction hooks (ShowBuildInfoFlags flags fileOutput) args = do
-  distPref <- findDistPrefOrDefault (buildDistPref flags)
-  let verbosity = fromFlag $ buildVerbosity flags
+showBuildInfoAction hooks flags args = do
+  let buildFlags = buildInfoBuildFlags flags
+  distPref <- findDistPrefOrDefault (buildDistPref buildFlags)
+  let verbosity = fromFlag $ buildVerbosity buildFlags
   lbi <- getBuildConfig hooks verbosity distPref
-  let flags' = flags { buildDistPref = toFlag distPref
-                     , buildCabalFilePath = maybeToFlag (cabalFilePath lbi)
-                     }
+  let buildFlags' =
+        buildFlags { buildDistPref = toFlag distPref
+                   , buildCabalFilePath = maybeToFlag (cabalFilePath lbi)
+                   }
 
   progs <- reconfigurePrograms verbosity
-             (buildProgramPaths flags')
-             (buildProgramArgs flags')
+             (buildProgramPaths buildFlags')
+             (buildProgramArgs buildFlags')
              (withPrograms lbi)
 
-  pbi <- preBuild hooks args flags'
+  pbi <- preBuild hooks args buildFlags'
   let lbi' = lbi { withPrograms = progs }
       pkg_descr0 = localPkgDescr lbi'
       pkg_descr = updatePackageDescription pbi pkg_descr0
       -- TODO: Somehow don't ignore build hook?
-  buildInfoString <- showBuildInfo pkg_descr lbi' flags
 
-  case fileOutput of
-    Nothing -> B.putStr buildInfoString
-    Just fp -> B.writeFile fp buildInfoString
+  buildInfoByteString <- showBuildInfo pkg_descr lbi' flags
+
+  case buildInfoOutputFile flags of
+    Nothing -> B.putStr buildInfoByteString
+    Just fp -> B.writeFile fp buildInfoByteString
 
-  postBuild hooks args flags' pkg_descr lbi'
+  postBuild hooks args buildFlags' pkg_descr lbi'
 
 replAction :: UserHooks -> ReplFlags -> Args -> IO ()
 replAction hooks flags args = do
diff --git a/Cabal/src/Distribution/Simple/Build.hs b/Cabal/src/Distribution/Simple/Build.hs
index 596a885b401ee793e42bef05a6d4d7d7d0cd7f83..7c5bd280d89a65bb3948bb6ebb4cd66c98178c13 100644
--- a/Cabal/src/Distribution/Simple/Build.hs
+++ b/Cabal/src/Distribution/Simple/Build.hs
@@ -88,6 +88,7 @@ import Distribution.Compat.Graph (IsNode(..))
 
 import Control.Monad
 import Data.ByteString.Lazy (ByteString)
+import qualified Data.ByteString.Lazy.Char8 as LBS
 import qualified Data.Set as Set
 import System.FilePath ( (</>), (<.>), takeDirectory )
 import System.Directory ( getCurrentDirectory )
@@ -135,16 +136,24 @@ build pkg_descr lbi flags suffixes = do
 
 
 showBuildInfo :: PackageDescription  -- ^ Mostly information from the .cabal file
-  -> LocalBuildInfo      -- ^ Configuration information
-  -> BuildFlags          -- ^ Flags that the user passed to build
+  -> LocalBuildInfo                  -- ^ Configuration information
+  -> ShowBuildInfoFlags              -- ^ Flags that the user passed to build
   -> IO ByteString
 showBuildInfo pkg_descr lbi flags = do
-  let verbosity = fromFlag (buildVerbosity flags)
-  targets <- readTargetInfos verbosity pkg_descr lbi (buildArgs flags)
+  let buildFlags = buildInfoBuildFlags flags
+      verbosity = fromFlag (buildVerbosity buildFlags)
+  targets <- readTargetInfos verbosity pkg_descr lbi (buildArgs buildFlags)
   pwd <- getCurrentDirectory
   let targetsToBuild = neededTargetsInBuildOrder' pkg_descr lbi (map nodeKey targets)
-      doc = mkBuildInfo pwd pkg_descr lbi flags targetsToBuild
-  return $ renderJson doc
+      result
+        | fromFlag (buildInfoComponentsOnly flags) =
+            let components = map (mkComponentInfo pwd pkg_descr lbi . targetCLBI)
+                                 targetsToBuild
+              in LBS.unlines $ map renderJson components
+        | otherwise =
+            let json = mkBuildInfo pwd pkg_descr lbi buildFlags targetsToBuild
+              in renderJson json
+  return result
 
 
 repl     :: PackageDescription  -- ^ Mostly information from the .cabal file
diff --git a/Cabal/src/Distribution/Simple/Setup.hs b/Cabal/src/Distribution/Simple/Setup.hs
index 195ef3e1eb70bc218a1a3b18972db4af1bbf3194..8f0ad64de1f74b7fac7057d38bb4b2a13df8f9ee 100644
--- a/Cabal/src/Distribution/Simple/Setup.hs
+++ b/Cabal/src/Distribution/Simple/Setup.hs
@@ -2189,15 +2189,18 @@ optionNumJobs get set =
 -- ------------------------------------------------------------
 
 data ShowBuildInfoFlags = ShowBuildInfoFlags
-  { buildInfoBuildFlags :: BuildFlags
-  , buildInfoOutputFile :: Maybe FilePath
+  { buildInfoBuildFlags     :: BuildFlags
+  , buildInfoOutputFile     :: Maybe FilePath
+  , buildInfoComponentsOnly :: Flag Bool
+  -- ^ If 'True' then only print components, each separated by a newline
   } deriving (Show, Typeable)
 
 defaultShowBuildFlags  :: ShowBuildInfoFlags
 defaultShowBuildFlags =
     ShowBuildInfoFlags
-      { buildInfoBuildFlags = defaultBuildFlags
-      , buildInfoOutputFile = Nothing
+      { buildInfoBuildFlags     = defaultBuildFlags
+      , buildInfoOutputFile     = Nothing
+      , buildInfoComponentsOnly = Flag False
       }
 
 showBuildInfoCommand :: ProgramDb -> CommandUI ShowBuildInfoFlags
@@ -2234,8 +2237,12 @@ showBuildInfoCommand progDb = CommandUI
       ++
       [ option [] ["buildinfo-json-output"]
                 "Write the result to the given file instead of stdout"
-                buildInfoOutputFile (\pf flags -> flags { buildInfoOutputFile = pf })
+                buildInfoOutputFile (\v flags -> flags { buildInfoOutputFile = v })
                 (reqArg' "FILE" Just (maybe [] pure))
+      , option [] ["buildinfo-components-only"]
+                  "Print out only the component info, each separated by a newline"
+                  buildInfoComponentsOnly (\v flags -> flags { buildInfoComponentsOnly = v})
+                  trueArg
       ]
 
   }