Order RPM packages by dependencies https://github.com/juhp/rpmbuild-order

Version on this page:
LTS Haskell 16.15:0.3.1
Stackage Nightly 2020-09-23:0.4.3
Latest on Hackage:0.4.3

See all snapshots rpmbuild-order appears in

BSD-3-Clause licensed by Henning Thielemann, Jens Petersen
Maintained by Jens Petersen

Module documentation for

This version can be pinned in stack with:rpmbuild-order-,3863

Build Status Hackage license


This package originally based on code from cabal-sort, sorts rpm package spec files by build order.

$ rpmbuild-order --help
$ rpmbuild-order sort mycore mylib myapp

mylib mycore myapp

The arguments passed can either be directories containing the package, or spec files.

If the dependency graph has cycles then an error will be output with a list of cycles and any subcycles.

Using the rpmbuild-order deps and rdeps commands the ordered dependencies and reverse dependencies of a package can be obtained from the current set of checked out package sources.


As of version 0.4, a library is also provided.

There are two modules:

  • 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.

Notes and known problems

  1. Given packages A, B, C, where C depends on B, and B depends on A, and you call

    rpmbuild-order sort C.spec A.spec

then the output may be wrong if C does not have a direct dependency on A. Even if the order is correct, B is missing in the output and thus in this case the list of packages cannot be reliably used for a sequence of builds.

However the deps and rdeps commands take other neighbouring package directories into account.

  1. repoquery is not used to resolve meta-dependencies or files to packages. So if a package BuildRequires a file, it will not be resolved to a package. This may get addressed some day, but file dependencies seem less common for BuildRequires than Requires.

  2. rpmspec is used to parse spec files (for macro expansion etc): so missing macros packages can lead to erroneous results in some cases.

Changes (2020-09-10)

  • ‘sort’: fix arg handled which was causing reverse ordering!
  • add a sort test for the installed rpmbuild-order
  • drop the erroneous dependency on Cabal

0.4.2 (2020-08-04)

  • support options for rpmspec (suggested by QuLogic) eg rpmbuild-order sort --rpmopt --with=bootstrap ...
  • Graph: add createGraphRpmOpts and createGraph’’
  • Order: add dependencySortRpmOpts
  • add a newline between cycles

0.4.1 (2020-08-03)

  • no longer assume pkg dir = pkg name (though still optimize for it)
  • output any subcycles for cyclic graph (suggested by QuLogic)

0.4.0 (2020-07-29)

  • performance: rework just to use String and only parse spec files once and also use faster PatriciaTree.Gr On about 500 packages roughly twice as fast as 0.3.1
  • sort now defaults to outputting separate dependency stacks, with options for combined, connected, and independent packages only
  • new ‘layers’ command outputs packages in ordered dependency independent layers
  • new ‘chain’ command outputs Fedora chain-build format
  • new ‘leaves’ commands to list outer leaf packages
  • new ‘roots’ commands lists lowest dependencies
  • new library exposed with 2 modules: low-level Graph and high-level Order:
    • Distribution.RPM.Build.Order provides: dependencySort, dependencySortParallel, dependencyLayers, sortGraph output
    • Distribution.RPM.Build.Graph provides: createGraph, dependencyNodes, subgraph’, packageLayers, etc
  • graph Nodes are now only labelled by package/spec filepath and no longer carry redundant dependency lists
  • add a basic testsuite for the library

0.3.1 (2020-07-04)

  • fix detection of circular dependencies (bug introduced in 0.3)

0.3 (2019-10-10)

  • check package provides instead of rpms
  • use ByteString for packages (provides)
  • move to simple-cmd-args (optparse-applicative)
  • add –lenient for rpmspec failures

0.2 (2018-08-17)

  • error if no spec file
  • filter out hidden files from deps search
  • add –version
  • generate manpage with help2man

0.1 (2018-07-18)

  • initial release with sort, deps and rdeps (reverse dependencies) commands