diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,7 @@
+# 0.4.9 (2022-08-XX)
+- Graph rpmspecDynBuildRequires: error if no srpm generated
+- Order: add depsPackages and factor out depsGraph to Graph
+
 # 0.4.8 (2022-06-14)
 - Graph createGraph4: prepend spec name to any rpmspec stderr
 - Graph optimization: filter out Provides ending in (x86-64)
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -11,11 +11,33 @@
 
 ## Usage
 
-    $ rpmbuild-order --help
-    :
-    $ rpmbuild-order sort mycore mylib myapp
-    mylib mycore myapp
+```
+$ rpmbuild-order --version
+0.4.9
+$ rpmbuild-order --help
+Order packages by build dependencies
 
+Usage: rpmbuild-order [--version] COMMAND
+  Sort package sources (spec files) in build dependency order
+
+Available options:
+  -h,--help                Show this help text
+  --version                Show version
+
+Available commands:
+  sort                     sort packages
+  deps                     sort dependencies in neighbouring package dirs
+  rdeps                    sort dependents in neighbouring package dirs
+  layers                   ordered output of dependency layers
+  chain                    ordered output suitable for a chain-build
+  leaves                   List of the top leaves of package graph
+  roots                    List lowest root packages
+  render                   Show graph with graphviz
+
+$ rpmbuild-order sort mycore mylib myapp
+mylib mycore myapp
+```
+
 The arguments passed can either be directories containing the package
 or spec files.
 
@@ -25,21 +47,25 @@
 Using the rpmbuild-order `deps` and `rdeps` commands the ordered
 dependencies and reverse dependencies of a package can be obtained
 within the current set of checked out package sources.
+ie If you have a directory with packages:
+`pkg1/ pkg2/ lib1/ lib2/ lib3/ misc1/`
+then the output of `rpmbuild-order deps pkg1` might be `lib1 lib3 pkg1`
+for example.
 
 The `render` command displays a graph of package dependencies
-using graphviz and X11 or optionally instead prints the dot format to stdout.
+using graphviz and X11 or can print the dot format to stdout.
 
 ## Library
 As of version 0.4, a library is also provided.
 
 There are two modules:
 
+- `Distribution.RPM.Build.Order` provides higher level functions for
+  sorting packages in build dependency orders and output. It is built on top of:
 - `Distribution.RPM.Build.Graph` provides lower level functions for generating
   RPM dependency graphs
-- `Distribution.RPM.Build.Order` provides higher level functions for
-  sorting packages in build dependency orders and output.
 
-Please see the documentation for more details.
+Please see their documentation for more details.
 
 ## Notes and known problems
 1. Given packages A, B, C, where C depends on B, and B depends on A,
@@ -74,4 +100,4 @@
 
 ## Building from source
 
-Use `cabal-rpm builddep && cabal-install` or `stack install`.
+Use `cabal-rpm builddep && cabal install` or `stack install`.
diff --git a/rpmbuild-order.1 b/rpmbuild-order.1
--- a/rpmbuild-order.1
+++ b/rpmbuild-order.1
@@ -1,7 +1,7 @@
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.49.2.
-.TH RPMBUILD-ORDER "1" "May 2022" "rpmbuild-order 0.4.7" "User Commands"
+.TH RPMBUILD-ORDER "1" "August 2022" "rpmbuild-order 0.4.9" "User Commands"
 .SH NAME
-rpmbuild-order \- manual page for rpmbuild-order 0.4.7
+rpmbuild-order \- manual page for rpmbuild-order 0.4.9
 .SH SYNOPSIS
 .B rpmbuild-order
 [\fI\,--version\/\fR] \fI\,COMMAND\/\fR
@@ -22,10 +22,10 @@
 sort packages
 .TP
 deps
-sort dependencies
+sort dependencies in neighbouring package dirs
 .TP
 rdeps
-sort dependents
+sort dependents in neighbouring package dirs
 .TP
 layers
 ordered output of dependency layers
diff --git a/rpmbuild-order.cabal b/rpmbuild-order.cabal
--- a/rpmbuild-order.cabal
+++ b/rpmbuild-order.cabal
@@ -1,5 +1,5 @@
 Name:             rpmbuild-order
-Version:          0.4.8
+Version:          0.4.9
 License:          BSD3
 License-File:     LICENSE
 Author:           Jens Petersen <petersen@redhat.com>,
@@ -18,11 +18,12 @@
   build dependencies. The code evolved from cabal-sort by Henning Thielemann.
   It can also order the dependencies or reverse depends of one or more packages
   among the packages checked out in neighboring directories (which can be
-  useful to see what packages are affected when a low-level package changes).
+  useful to see what packages are affected when a low-level package changes,
+  or which packages are dependents of one of more packages).
   It also has support for setting RPM options for bcond etc,
   which can affect dependencies. It can also output dependency graphs.
 
-  Since version 0.4, a library API is also provided.
+  Since version 0.4, a library API is provided.
 Tested-with:       GHC == 7.10.3, GHC == 8.0.2, GHC == 8.2.2,
                    GHC == 8.4.4, GHC == 8.6.5, GHC == 8.8.4,
                    GHC == 8.10.7, GHC == 9.0.2
diff --git a/src/Distribution/RPM/Build/Graph.hs b/src/Distribution/RPM/Build/Graph.hs
--- a/src/Distribution/RPM/Build/Graph.hs
+++ b/src/Distribution/RPM/Build/Graph.hs
@@ -31,7 +31,8 @@
    packageLeaves,
    separatePackages,
    printGraph,
-   renderGraph
+   renderGraph,
+   depsGraph
   ) where
 
 import qualified Data.CaseInsensitive as CI
@@ -43,26 +44,24 @@
 #if !MIN_VERSION_base(4,8,0)
 import Control.Applicative ((<$>))
 #endif
-import Control.Monad (forM_, guard, when, unless)
+import Control.Monad.Extra (forM_, guard, when, unless, unlessM)
 import Data.Maybe (catMaybes, fromMaybe, mapMaybe)
 import Data.List.Extra
 import Data.GraphViz
 import SimpleCmd
 import System.Directory (doesDirectoryExist, doesFileExist,
                          getCurrentDirectory, withCurrentDirectory,
-#if !MIN_VERSION_simple_cmd(0,2,4)
 #if MIN_VERSION_directory(1,2,5)
                          listDirectory
 #else
                          getDirectoryContents
 #endif
-#endif
                         )
 import System.Exit (exitFailure)
 import System.FilePath
 import System.IO.Extra (withTempDir)
 
-#if !MIN_VERSION_directory(1,2,5) && !MIN_VERSION_simple_cmd(0,2,4)
+#if !MIN_VERSION_directory(1,2,5)
 listDirectory :: FilePath -> IO [FilePath]
 listDirectory path =
   filter f <$> getDirectoryContents path
@@ -308,7 +307,13 @@
             filesWithExtension :: FilePath -> String -> IO [FilePath]
             filesWithExtension dir ext =
               filter (ext `isExtensionOf`) <$> listDirectory dir
+
+#if !MIN_VERSION_filepath(1,4,2)
+            isExtensionOf :: String -> FilePath -> Bool
+            isExtensionOf ext@('.':_) = isSuffixOf ext . takeExtensions
+            isExtensionOf ext         = isSuffixOf ('.':ext) . takeExtensions
 #endif
+#endif
 
         extractMetadata :: FilePath -> ([String],[String]) -> [String] -> ([String],[String])
         extractMetadata _ acc [] = acc
@@ -413,7 +418,9 @@
         (out,err) <- cmdStdErr "rpmbuild" ["-br", "--nodeps", "--define", "_srcrpmdir " ++ tmpdir, cwd </> spec]
         unless (null err) $ when verbose $ warning err
         -- Wrote: /current/dir/SRPMS/name-version-release.buildreqs.nosrc.rpm
-        cmdLines "rpm" ["-qp", "--requires", last (words out)]
+        case words out of
+          [] -> error' $ spec +-+ "could not generate source rpm for dynamic buildrequires"
+          ws -> cmdLines "rpm" ["-qp", "--requires", last ws]
 
     simplifyDep br =
       case (head . words) br of
@@ -502,8 +509,23 @@
     runGraphvizCanvas' (setDirectedness graphToDot quickParams g) Xlib
     else error' "please install graphviz first"
 
-#if !MIN_VERSION_filepath(1,4,2)
-isExtensionOf :: String -> FilePath -> Bool
-isExtensionOf ext@('.':_) = isSuffixOf ext . takeExtensions
-isExtensionOf ext         = isSuffixOf ('.':ext) . takeExtensions
-#endif
+-- | Given a list of one or more packages, look for dependencies
+-- in neighboring packages and return a package dependency graph
+--
+-- @since 0.4.9
+depsGraph :: Bool -- ^ whether to look for reverse dependencies
+          -> [String] -- ^ rpm options
+          -> Bool -- ^ verbose output
+          -> [String] -- ^ packages to exclude
+          -> [String] -- ^ buildrequires to ignore
+          -> Bool -- ^ allow rpmspec failures
+          -> Maybe FilePath -- ^ subdir for packages
+          -> [FilePath] -- ^ list of package paths
+          -> IO PackageGraph -- ^ dependency graph of the packages
+depsGraph rev rpmopts verbose excludedPkgs ignoredBRs lenient mdir pkgs = do
+  unlessM (and <$> mapM doesDirectoryExist pkgs) $
+    errorWithoutStackTrace "Please use package directory paths"
+  listDirectory "." >>=
+    -- filter out dotfiles
+    createGraph3 ignoredBRs rpmopts verbose lenient (not rev) mdir . filter ((/= '.') . head) . filter (`notElem` excludedPkgs) >>=
+    createGraph2 rpmopts verbose lenient True mdir . dependencyNodes pkgs
diff --git a/src/Distribution/RPM/Build/Order.hs b/src/Distribution/RPM/Build/Order.hs
--- a/src/Distribution/RPM/Build/Order.hs
+++ b/src/Distribution/RPM/Build/Order.hs
@@ -23,7 +23,8 @@
    leafPackages,
    independentPackages,
    Components (..),
-   sortGraph)
+   sortGraph,
+   depsPackages)
 where
 
 #if !MIN_VERSION_base(4,8,0)
@@ -72,7 +73,7 @@
 -- | Used to control the output from sortGraph
 data Components = Parallel -- ^ separate independent stacks
                 | Combine -- ^ combine indepdendent stacks together
-                | Connected -- ^ only stack of pacakges
+                | Connected -- ^ only stack of packages
                 | Separate -- ^ only independent packages in the package set
 
 -- | output sorted packages from a PackageGraph arrange by Components
@@ -87,3 +88,21 @@
     Connected ->
       intercalate "\n\n" $ map (unwords . topsort' . subgraph' graph) $ filter ((>1) . length) (components graph)
     Separate -> unlines $ separatePackages graph
+
+-- | Given a list of one or more packages, look for dependencies
+-- in neighboring packages and output them in a topological order
+--
+-- @since 0.4.9
+depsPackages :: Bool -- ^ whether to look for reverse dependencies
+             -> [String] -- ^ rpm options
+             -> Bool -- ^ verbose output
+             -> [String] -- ^ packages to exclude
+             -> [String] -- ^ buildrequires to ignore
+             -> Bool -- ^ allow rpmspec failures
+             -> Bool -- ^ parallel output
+             -> Maybe FilePath -- ^ subdir for packages
+             -> [FilePath] -- ^ list of package paths
+             -> IO ()
+depsPackages rev rpmopts verbose excludedPkgs ignoredBRs lenient parallel mdir pkgs =
+  depsGraph rev rpmopts verbose excludedPkgs ignoredBRs lenient mdir pkgs >>=
+  sortGraph (if parallel then Parallel else Combine)
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -13,19 +13,11 @@
                             (<$>), (<*>)
 #endif
                            )
-import Control.Monad.Extra
 import Data.Graph.Inductive.Query.DFS (components)
 import Data.List (intercalate)
 import Data.List.Extra (dropSuffix)
 
 import SimpleCmdArgs
-import System.Directory (doesDirectoryExist,
-#if MIN_VERSION_directory(1,2,5)
-                         listDirectory
-#else
-                         getDirectoryContents
-#endif
-  )
 
 import Distribution.RPM.Build.Graph
 import Distribution.RPM.Build.Order
@@ -38,9 +30,9 @@
   subcommands
   [ Subcommand "sort" "sort packages" $
     sortPackages <$> rpmOpts <*> verboseOpt <*> lenientOpt <*> componentsOpt <*> subdirOpt <*> pkgArgs
-  , Subcommand "deps" "sort dependencies" $
+  , Subcommand "deps" "sort dependencies in neighbouring package dirs" $
     depsPackages False <$> rpmOpts <*> verboseOpt <*> excludeOpts <*> ignoredBRopts <*> lenientOpt <*> combineOpt <*> subdirOpt <*> pkgArgs
-  , Subcommand "rdeps" "sort dependents" $
+  , Subcommand "rdeps" "sort dependents in neighbouring package dirs" $
     depsPackages True <$> rpmOpts <*> verboseOpt <*> excludeOpts <*> ignoredBRopts <*> lenientOpt <*> combineOpt <*> subdirOpt <*> pkgArgs
   , Subcommand "layers" "ordered output of dependency layers" $
     layerPackages <$> rpmOpts <*> verboseOpt <*> lenientOpt <*> combineOpt <*> subdirOpt <*> pkgArgs
@@ -70,24 +62,6 @@
 sortPackages :: [String] -> Bool -> Bool -> Components -> Maybe FilePath -> [FilePath] -> IO ()
 sortPackages rpmopts verbose lenient opts mdir pkgs = do
   createGraph2 rpmopts verbose lenient True mdir pkgs >>= sortGraph opts
-
-depsPackages :: Bool -> [String] -> Bool-> [String] -> [String] -> Bool ->  Bool -> Maybe FilePath -> [FilePath] -> IO ()
-depsPackages rev rpmopts verbose excludedPkgs ignoredBRs lenient parallel mdir pkgs = do
-  unlessM (and <$> mapM doesDirectoryExist pkgs) $
-    errorWithoutStackTrace "Please use package directory paths"
-  listDirectory "." >>=
-    -- filter out dotfiles
-    createGraph3 ignoredBRs rpmopts verbose lenient (not rev) mdir . filter ((/= '.') . head) . filter (`notElem` excludedPkgs) >>=
-    createGraph2 rpmopts verbose lenient True mdir . dependencyNodes pkgs >>=
-    sortGraph (if parallel then Parallel else Combine)
-
-#if (defined(MIN_VERSION_directory) && MIN_VERSION_directory(1,2,5))
-#else
-listDirectory :: FilePath -> IO [FilePath]
-listDirectory path =
-  filter f <$> getDirectoryContents path
-  where f filename = filename /= "." && filename /= ".."
-#endif
 
 layerPackages :: [String] -> Bool -> Bool -> Bool -> Maybe FilePath -> [FilePath] -> IO ()
 layerPackages rpmopts verbose lenient combine mdir pkgs = do
