RPM 4.20.0 RC2 Release Notes (DRAFT)
Last update: 2024-09-10
Download
- Source: rpm-4.19.94.tar.bz2
- SHA256SUM: e2581eb934ff2584a683f0042edd3d033fa1e47bcfc1da4a7a5bb0565a25f5d6
Enhancements
UI & Performance
- New
--list
and--delete
commands torpmkeys(8)
- New
--json
query format, as a more readable alternative to--xml
- A new low-level package dump utility, installed as
/usr/lib/rpm/rpmdump
- The
rpm2archive(8)
utility now supports cpio file format, replacing the implementation ofrpm2cpio(8)
which is now installed as a symlink to the former - The
${XDG_CONFIG_HOME}/rpm
directory is now the preferred location when loading per-user macro configuration (#2153) - Support package signing with ECDSA keys
- Improved error messages on URL helper failures (#2683)
- A new plugin
rpm-plugin-unshare(8)
that allows for using various Linux-specific namespace-related technologies inside transactions, such as to harden and limit scriptlet access to resources (#2632, #2665) - The plugin API is now public (#1536)
Spec & Package Building
- Support for declarative buildsystems (#1087)
- A per-package build directory that’s fully RPM-controlled is now used and exposed as the new
%builddir
macro at build time (#2078) - Support for spec-local file attributes and generators (#782)
- The
%prep
section is now implemented as a regular build scriptlet (instead of being treated specially by the spec parser). This fixes #1870 as well as makes the behavior consistent with the other spec sections. - Build scriptlets (such as
%build
,%install
or%check
) can now be augmented arbitrary number of times by appending or prepending to them with the new-a
and-p
options - A new
-C
option in%autosetup
which ensures that the sources will be extracted in the root of the build directory (#2664) --build-in-place
mode now has clearer, less ambiguous semantics. Please see the Compatibility Notes below as well as the option’s updated description inrpmbuild(8)
for more details.- File trigger scripts now receive package count arguments, much like regular triggers (#2755)
- Comments (starting with a
#
) after spec conditionals are now legal syntax. These were originally allowed due to a spec parser bug but in recent versions triggered a build warning. (#829) - Indentation is now allowed for spec tags (#2927)
- Group membership lines are now supported in
sysusers.d(5)
files - Distributions can now override build conditionals (
%bcond
) system-wide with the new%{bcond_override_default NAME VALUE}
macro - A new multi-file protocol allowing for much faster dependency generation
- Better support for reproducible builds. It’s now possible to set a timestamp handling policy via the new macro
%build_mtime_policy
. Two policies are currently available; one for clamping the timestamps to$SOURCE_DATE_EPOCH
(which deprecates and replaces the%clamp_mtime_to_source_date_epoch
macro) and one for clamping them to the build time (this is a new feature). Set the macro toclamp_to_source_date_epoch
orclamp_to_buildtime
to use the respective policy. Additionally, build time is now exposed to build scriptlets via the new$RPM_BUILD_TIME
environment variable and can also be overridden manually via the new%_buildtime
macro. - Proper distribution-agnostic debuginfo enablement logic (#2204). Distributions no longer need to override the
%install
section with a macro in order to inject the%debug_package
boilerplate themselves. Debuginfo generation is now handled automatically and properly using Dynamic Specs, and is enabled on Linux by default. brp-strip
no longer attempts to process Ruby, Python or Javascript files, making it more efficient and faster, especially where I/O is expensive (such as in container builds)- A warning is now issued if the number range given to an
%autopatch
macro doesn’t match any patches (use-q
to suppress) (#3093)
Bug & Regression Fixes
- Regression: Packages with unsupported usage of the
%config
flag (e.g. with directories), such as those made with the gradle plugin, no longer fail to install (#2890) - Regression: Ensure binary and source headers are identified as such in rpmspec queries (#2819)
- Regression: Fix dependency generators sometimes dying with
SIGPIPE
(#2949) - Regression: Allow for manual debuginfo packaging again (an ancient regression) (#3057)
- Never use current user info or file ownership during build (#2604)
- Ignore non-scriptlet weak dependencies in ordering (#1346)
- Ensure rpmbuild’s cleanup doesn’t fail due to permissions (#2519)
- Let eBPF ELF files be packaged in noarch packages (#2875)
- Really allow qualifiers like pre/post/meta for weak dependencies (#624)
- Set git commit dates in
%autosetup -S git
based on$SOURCE_DATE_EPOCH
(#9) - Use UTC timezone when uncompressing zip archives for consistency (#2955)
- Issue a warning when passing arguments to non-parametric macros (#2932)
- Fix multiply defined local macros escaping scope (#3056)
- Fix
%quote
macro special characters leaking to the outside - Fix
%shescape
macro to escape all arguments - Fix
%transfiletriggerpostun
only matching on the first prefix, ignoring the rest (#3048) - Make
%dirname
and%basename
behave likedirname(3)
andbasename(3)
(#2928) - Run build scriptlets with closed stdin to enforce unattended builds
- Automatically load proper platform configuration on
BuildArch
when--target
is not used (#3049) - Always create
%specpartsdir
on build (#3063) - Multiple fixes to the archives created by
rpm2archive(8)
- Eliminate hardcoded assumptions about
gpg(1)
in error messages (#3274)
Development & Build System
- Include dirs are now exported in lib targets as well (#3222)
- An
.editorconfig
file is now provided in the repository (seeCONTRIBUTING.md
for details) - Python API examples are now provided and installed into
${CMAKE_INSTALL_DOCDIR}
- Lua API has a new
rpm.spawn()
function that supersedesrpm.execute()
and provides more fine-grained control, currently for redirecting stdin, stdout and stderr to given paths (#3192)
API changes
- Added rpmdsIsSysuser() for determining sysusers-dependencies
- Added rpmPushMacroAux(), rpmMacroEntryPriv(), rpmMacroBufAppend(), rpmMacroBufAppendStr() and rpmMacroBufErr() to support auxiliary macros implemented in C
- Added rpmPluginName(), rpmPluginOpts(), rpmPluginSetData(), rpmPluginGetData() and various type definitions and other symbols to support rpm plugin creation (details in rpmplugin.h)
- Added new tag format symbol RPMTD_FORMAT_JSON
- Removed several unused type and struct definitions related to the OpenPGP standard (details in rpmpgp.h)
Internal Cleanup
- The internal OpenPGP parser has been removed. RPM can now also be built completely without OpenPGP support (i.e. without Sequoia) to allow for easier bootstrapping, see the INSTALL file for details. (#2414)
- The Python bindings have been ported to the stable Python ABI (#2345)
- The Perl dependency generators have been split out of the main repository (#2873)
Compatibility Notes
- The
%patchN
macro syntax (whereN
is a patch number) is now obsolete and will produce a build error. Use%patch N
(or for maximum compatibility,%patch -P N
) instead. -
Since
%prep
is now a regular build scriptlet,%setup
and%patch
are now real macros as well, and are therefore expanded even inside comments. This can lead to unexpected build failures for specs that have these macros commented out but not escaped, for example:#%setup -n foobar
This will result in the following error:
cd: foobar: No such file or directory
To fix this, you must escape the macro properly as documented here, for example:
%dnl %setup -n foobar
-
In order to enable debuginfo generation during package builds, distributions have historically been using a hack that overrides the
%install
section with a macro that injects the%debug_package
boilerplate into it. With RPM now gaining native support for debuginfo enablement, this hack is no longer supported (see #2204 for details). Distributions carrying such a macro are now kindly asked to remove it. As an example of what the (now obsoleted) macro might look like, here’s a definition shipped by the redhat-rpm-config package in Fedora 40:%install %{?_enable_debug_packages:%{?buildsubdir:%{debug_package}}}\ %%install\ %{nil}
Note that the
%__debug_package
macro continues to be automatically set to1
when debuginfo generation is enabled and thus can be relied upon without any changes. - As a result of the clarified semantics of
--build-in-place
, the%prep
stage is now skipped entirely in this mode. This may break existing specs that rely on%prep
still applying patches or making additional tweaks to the source tree. To make such specs compatible with 4.20, these post-preparation steps should be moved to the%conf
or%build
sections. - The
%clamp_mtime_to_source_date_epoch
macro is now deprecated in favor of%build_mtime_policy
set toclamp_to_source_date_epoch
. - Non-comment text (i.e. not starting with a
#
) after spec conditionals is now a build error. - Lua functions
posix.fork()
,posix.exec()
,posix.wait()
andrpm.redirect2null()
are deprecated. Userpm.spawn()
orrpm.execute()
instead. - Python 3.7 (when enabled) is now the minimum build requirement.