RPM 4.19.0 Release Notes

Download information

  • Source: rpm-4.19.0.tar.bz2
  • SHA256SUM: b30916dc148cbeab077797e9fc365702931e3a9a7eacf70add84153b549b3f77

Summary of changes from RPM 4.18.x

General bugfixes and enhancements

Command line

  • Allow piping from rpm2archive(8) (#2208)
  • Add rpmsort(8) utility for sorting RPM versions
  • Add --nopreuntrans and --nopostuntrans scriptlet disablers (#2119)
  • Add --nosysusers to disable automatic user/group creation at install time (#1032)
  • Conditionally display VCS tag in --info query
  • Show the tag number for unknown tags in --xml output
  • Check inside --root when querying for files (#2576)
  • Add aliases for weak dependency queries to rpmspec(8)


  • Remove obscure check for package build time from --rebuilddb (#2527)
  • Don’t muck with per-process global sqlite configuration from the db backend

Package building


  • Add support for .specpart files for dynamic spec generation
  • Add --generate-subpackages to find_lang.sh (utilizes .specpart)
  • Add sysusers.d(5) integration for automated user and group handling (#1032)
  • Bundle custom sysusers.sh script implementing systemd-sysusers(8) interface
  • Generate user/group requires from %files (#1032)
  • Improve shell-like globbing and escaping in %files (#1749)
  • Expand %doc and %license globs only once (#1294)
  • Add support for %preuntrans and %postuntrans scriptlets (#2119)
  • Turn %patch lines without arguments and options into an error
  • Fix misleading error message on some invalid filetrigger conditions (#2584)


  • Add %specpartsdir to macros.in (#2532)
  • Add optional total/proc/thread arguments to %{getncpus} macro (#804)
  • Add shorthand macros for some convenient Lua string operations: %{gsub:...}, %{len:...}, %{lower:...}, %{rep:...}, %{reverse:...}, %{sub:...} and %{upper:...}
  • Add %{rpmversion} builtin macro for getting the running rpm version (#2523)
  • Calculate number of threads to use during build, not spec parse

Buildroot policies

  • Fix a race condition in brp-strip (RhBug:1959049)
  • Hardening fixes in check-buildroot


  • Generate user/group provides from packaged /etc/passwd, /etc/group and sysusers.d(5) files (#1032)

Package format

  • Populate user and group data in cpio payload again (ancient regression)

Architecture handling

  • Add x86-64 architecture levels (v2-v4) as architectures
  • Fix how x86 models are derived in rpmrc (#2535)
  • Use __builtin_cpu_supports in x86-64 CPU feature level detection (#2463)
  • Allow setting platform macro settings externally (#2578)
  • Behave more consistently when target arch %optflags are not defined (RhBug:2231727)

Signatures and keys


  • Fix per-file plugin hook regression introduced in 4.18 (#2543)
  • Suppress inhibition lock warning message when DBus service is not available

Python bindings

  • Add some Python binding examples (#2075)

Lua interface

  • Export rpmGlobPath() as rpm.glob()
  • Fix error handling of rpm.execute() and rpm.redirect2null() (#2528)

API changes

Added APIs

  • rpmGlobPath(), like rpmGlob() but also takes flags
  • rpmEscape() and rpmUnescape() for prepending and removing backslashes to and from special chars in a string, respectively
  • Add pgpVerifySignature2() and pgpPrtParams2(), like their original variants but also return descriptive error messages (on failure) or lints (on success)

Changed APIs

  • rpmGlob() now only accepts one pattern in the input string, not a space separated list

Removed APIs

  • Directory index related empty stubs rpmfiSetDX(), rpmfiNextD() and rpmfiInitD()
  • File iterator related deprecated function rpmteFI() and Python’s te.FI()
  • Epoch promote empty stubs rpmdsNoPromote(), rpmdsSetNoPromote(), global variable _rpmds_nopromote and Python’s ds.SetNoPromote()
  • Keyring related deprecated functions rpmKeyringLookup() and rpmPubkeyDig()
  • PGP related deprecated struct pgpDig and functions pgpPrtPkts(), pgpNewDig(), pgpCleanDig(), pgpFreeDig(), pgpDigGetParams(), pgpVerifySig(), pgpHexStr() and Python’s ts.pgpPrtPkts()
  • Header related deprecated functions headerUnload(), headerLoad() and headerCopyLoad()
  • File classifier related deprecated function rpmfcNew()
  • Signal related type rpmsqAction_t, defines RPMSQ_DFL, RPMSQ_IGN, RPMSQ_ERR and functions rpmsqIsCaught(), rpmsqActivate(), rpmsqSetAction(), rpmsqPoll(), rpmsqSetInterruptSafety() and Python’s signalCaught(), checkSignals(), setInterruptSafety()
  • File util function rpmIsGlob()

Internal improvements and cleanups

  • Make build parallelism memory and address-space aware (#804)
  • Make user/group info reliable operation across chroot (#882, #1789)
  • Make rpmscript machinery chroot-aware
  • Fix ignoring exit code of child scripts in case of EINTR
  • Axe our internal and buggy glob() and fnmatch() copies
  • Drop now redundant bundled copies of stpcpy() and stpncpy()
  • Rely on POSIX.1-2008 realpath() semantics
  • Simplify and clean up rpmio thread enablement code
  • Header internals type cleanup
  • rpmds related cleanups and sanity fixes
  • Eliminate signedness mismatch from RPMTAG_NOT_FOUND
  • Fix a segfault on a non-stringable argument to macro call from Lua
  • Remove some unused logging defines
  • Rewrite --last to just use sed(1) for formatting

Build process

  • New CMake build system, replaces Autotools
  • Replace fakechroot(1) with proper container technology in test-suite (#1580)
  • Default to Sequoia crypto as per roadmap
  • Fix missing includes on macOS
  • Drop support for buggy and problematic alternative Python build method (#130, #2230)
  • Drop support for openssl < 1.1
  • Drop some other redundant and ancient configure-time checks
  • Split off translations to a separate project
  • Default to C.UTF-8 locale, allow fallback to C (#2587)
  • Export our libraries as a cmake find_package() config (#2471)


Compatibility notes

  • Any non-root ownership in the %files section (through %attr() or %defattr()) now generates an automatic dependency on the named user and/or group. This dependency can be satisfied by another package shipping a sysusers.d(5) file or the /etc/passwd and /etc/group files themselves. Existing packages shipping any of these files will have to be rebuilt with RPM 4.19 in order for them to carry the respective user and/or group provides. This may require distro-level coordination to ensure proper installation of all the affected packages. For more information, please consult the manual.
  • %patch without arguments (previously an alias to %patch 0) is now a build error (use %patch N instead)