RPM 6.1.0 Release Notes
August 20, 2026
This is a stable update that introduces a number of features and bug fixes.
Download
- Source: rpm-6.1.0.tar.bz2
- SHA256SUM: f520810d27c74bf1c5d8b8885845c61e0c845f62d33e68b02e020633a8b62fe3
Changes since 6.0.2
Overview
- Improved keystore locking mechanism
- Restored NSS-based user/group lookups by default
- Support for literal and one-shot macros through a new macro modifier syntax
- New
%defineoptions for expansion at definition and global context - Improved and fixed build and verification error handling
- Improved usability of rpm-plugin-syslog(8) with systemd journal
- Fixed Clang compilation errors and warnings
- New release model, inspired by the Linux kernel
- New man pages
Transactions
-
The keystore now uses a separate lock instead of the transaction lock. This fixes a regression in 6.0.0 where all rpmdb queries would be blocked during transactions. (#4110)
-
User and group lookups are now done through Name Service Switch (NSS) again by default, after being somewhat eagerly disabled in 4.19.0. This can still be disabled manually by defining the
%_passwd_pathand%_group_pathmacros (both are now undefined in the stock configuration). NSS lookups remain disabled unconditionally in--rootoperations. (#3994) (#882) -
In addition to packages, users and groups can now also be provided by the system runtime environment (NSS). (#4057)
-
File descriptors are now closed in a more efficient way on Linux 5.11+ with glibc 2.34+. This can reduce installation time by about 26% in some circumstances. (#4149)
Macro Processor
-
Macro behavior can now be altered by supplying modifiers at definition time. This new syntax consists of a list of arguments enclosed in
<and>that follows the macro name. Currently, two modifiers are supported: literal (l) and one-shot (o) expansion. See rpm-macros(7) for details. (#4145) (#1155) -
%definenow accepts the new-eand-goptions for expanding the macro body at the time of definition and placing the macro in the global context, respectively. Combining them together is equivalent to using%global. (#4163) -
rpm --undefineand Luarpm.undefine()have been fixed to no longer bypass sanity checks. (#4133)
Building Packages
-
The build script environment is now exported to the
rpmbuild.envfile in the%{builddir}. This shell-sourceable file makes it easier for other programs to mimic, and work with, the build script environment. (#3147) -
The rpmuncompress(1) utility now honors the rpm-common(8) options and has support for CAR files.
-
Both rpmuncompress(1) and rpm-setup-autosign(1) have been moved to the standard
$PATHto make them easier to use as standalone tools. Symlinks for both are now installed in/usr/lib/rpmfor backwards compatiblity. -
When trying to package binaries that don’t match the package’s architecture (such as in a noarch package), the error message now includes the actual (sub-)package name and a list of filenames (including their type) that caused the error, for easier troubleshooting. (#3600)
-
rpmbuild(1) now understands the
kbuild stage argument for running the%checkscriptlet. This is particularly useful in combination with the--short-circuitoption. (#3015)
Signing & Verifying Packages
-
rpmsign(1) can now sign files with PKCS11 tokens. (#4124)
-
The excessive, misleading and/or wrong output in various verification scenarios has been fixed. (#3303) (#4036)
Plugins
- rpm-plugin-syslog(8) has been fixed to no longer show misleading operation
names or emit duplicate messages. Additionally, the identity string has been
changed from
[RPM]torpmfor easier greppability. With these tweaks, thejournalctl -t rpmcommand now serves as an easy way to look at the transaction history. (#4172) (#1254)
Manuals
- A number of new man pages have been added, some written from scratch while others based on the older (and often outdated) reference manual (#3612):
-
The rpmbuild(1) man page now has a section describing the build process in more detail.
- The rpmkeys(8) man page now also covers the overall verification policy.
API
-
Lua scriptlets now honor the
rpmtsSetScriptFd()function call which makes it possible to redirect their standard output and error to a file descriptor. (#3328) -
The plugin hooks
psm_preandpsm_postare now only executed for the main package operations (install, erase and restore). (#1254) -
New
rpmKeyringVerifySig3()function that also returns lints. (#4069) -
New
rpm.ds.Ti()Python binding for retrieving the current trigger index. -
Tag extensions can now be used in rpmdb pattern matching. (#4077)
-
rpmtxnImportPubkey()now reflects the error code frompgpPubKeyLint()in its own return code. (#4096) -
The mode string specified in
Fdopen()is now validated. (#3058) -
Various
rpm.dsfixes in Python bindings. (#3943)
Building RPM
-
All Clang compilation errors and warnings have been fixed. This achieves a clean build when using the Clang toolchain. (#4105)
-
Some handy CMake configuration presets have been added. (#4118)