The rpmbuild-order tool sorts source RPM packages by build dependencies,
so that they can be built in a correct order. It does this by reading RPM
package spec files and then topologically sorts them according to their
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,
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 provided.
[
Skip to Readme]
Versions |
0.1, 0.2, 0.2.1, 0.3, 0.3.1, 0.4.0, 0.4.1, 0.4.2, 0.4.2.1, 0.4.3, 0.4.3.1, 0.4.3.2, 0.4.4, 0.4.4.1, 0.4.5, 0.4.6, 0.4.6.1, 0.4.7, 0.4.8, 0.4.9, 0.4.9, 0.4.10, 0.4.11 |
Change log |
ChangeLog.md |
Dependencies |
base (<5), case-insensitive, directory, extra (>=1.6.4), fgl (>=5.5.4), filepath, graphviz, optparse-applicative, rpmbuild-order, simple-cmd (>=0.2.3), simple-cmd-args [details] |
License |
BSD-3-Clause |
Copyright |
2010-2018 Henning Thielemann,
2018-2022 Jens Petersen <petersen@redhat.com> |
Author |
Jens Petersen <petersen@redhat.com>,
Henning Thielemann <haskell@henning-thielemann.de> |
Maintainer |
Jens Petersen <petersen@redhat.com> |
Category |
Distribution |
Home page |
https://github.com/juhp/rpmbuild-order
|
Bug tracker |
https://github.com/juhp/rpmbuild-order/issues
|
Source repo |
head: git clone https://github.com/juhp/rpmbuild-order |
Uploaded |
by JensPetersen at 2022-08-25T12:38:31Z |
rpmbuild-order
This is a tool to sort RPM source packages in build dependency order.
The code was originally derived from
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
-
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.
-
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.
-
rpmspec is used to parse spec files (for macro expansion etc):
so missing macros packages can lead to erroneous results in some cases.
-
Since version 0.4.6 there is some support now for packages using
dynamic buildrequires (in Fedora: golang, python, ruby, and rust packages).
-
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
.