Sort RPM packages in dependency order


Version on this page:0.4.10
LTS Haskell 22.29:0.4.11
Stackage Nightly 2024-07-13:0.4.11
Latest on Hackage:0.4.11

See all snapshots rpmbuild-order appears in

BSD-3-Clause licensed by Jens Petersen, Henning Thielemann
Maintained by Jens Petersen
This version can be pinned in stack with:rpmbuild-order-0.4.10@sha256:3e2083f3e0c7713fc0477bdfae45e681d48efc5c2e4d0854dc7078cc0e3d7b64,4154

Module documentation for 0.4.10

GitHub CI Hackage license


This is a tool to sort RPM source packages in build dependency order. The code was originally derived from cabal-sort by Henning Thielemann.


$ rpmbuild-order --version
$ 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.

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

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 can print the dot format to stdout.


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

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

  2. 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 uncommon for BuildRequires compared to Requires.

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

  4. Since version 0.4.6 there is some support now for packages using dynamic buildrequires (in Fedora: golang, python, ruby, and rust packages).

  5. Since version 0.4.8 %{_isa} suffixed Provides are filtered out for x86_64.


rpmbuild-order is packaged in Fedora Linux.

Building from source

Use cabal-rpm builddep && cabal install or stack install.


0.4.10 (2022-10-28)

  • Graph: add depsGraphDeps which takes a list of possible deps
  • Graph: add topsortGraph (factored out of sortGraph)
  • tests: add testcase for deps command

0.4.9 (2022-08-25)

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

0.4.7 (2022-05-31)

  • Graph rpmspecDynBuildRequires: generate .buildreqs.nosrc.rpm in a tmpdir

0.4.6 (2022-05-30)

  • handle Dynamic BuildRequires (#3) with special support for golang Provs and rust & ruby BRs
  • Graph: new aliases createGraph1 for createGraph’, createGraph2 for createGraph’’, createGraph3 for createGraph’’’, and createGraph4 for createGraph’’’’ (deprecating the primed names)
  • Graph: use simple-cmd

0.4.5 (2021-05-29)

  • ‘render’: do not reverse arrows
  • ‘render’: rename -o/–output option to -g/–gv-output (2021-05-19)

  • ‘render’: friendly error message if graphviz is not installed

0.4.4 (2021-05-16)

  • add ‘render’ command to display graph graphically with graphviz with an option to output dot format
  • fix subcycle algorithm: now lists correct shortest path subcycles
  • improve cycles output (#2)
  • library Graph: add printGraph, renderGraph, createGraph’’’’ (2021-02-03)

  • intercalate newlines between cycles
  • only list subcycles with over 2 packages (2020-09-24)

  • ‘deps’ and ‘rdeps’: –exclude option to ignore a “broken” neighboring package

0.4.3 (2020-09-18)

  • ‘deps’ and ‘rdeps’ can now take –ignore-BR options (provided through depsPackages and new createGraph’’’)
  • ‘sort’ no longer outputs a leading newline (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