[](https://github.com/juhp/rpmbuild-order/actions)
[](http://hackage.haskell.org/package/rpmbuild-order)
[](https://opensource.org/licenses/BSD-3-Clause)
# rpmbuild-order
This is a tool to sort RPM source packages in build dependency order.
The code was originally derived from
[cabal-sort](http://hackage.haskell.org/package/cabal-sort)
by Henning Thielemann.
## Usage
```
$ 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.
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.
## 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
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.
## Installation
rpmbuild-order is packaged in Fedora Linux.
## Building from source
Use `cabal-rpm builddep && cabal install` or `stack install`.