RPM 4.5.90 (4.6 alpha)

This page is outdated, see 4.6.0 draft release notes for up-to-date information.

Download information

Summary of changes since RPM 4.4.x (INCOMPLETE DRAFT)

Package building

  • RPM now supports packages up to 64bit sizes (from previous ~2GB max). Individual files within packages are limited to 4GB each due to cpio format limitation (doubled from previous limit).
  • Support for LZMA payloads has been added.
  • Support for file checksums other than MD5 has been added.
  • Dependencies for pkg-config and libtool files are automatically generated by rpmbuild.
  • %{_topdir} defaults to $(HOME)/rpmbuild/ now, instead of former /usr/src/redhat/
  • BuildRoot tag in spec files is ignored.
  • !Group tag in spec files is not considered mandatory
  • Sub-packages of architecture dependant packages can now be noarch
  • %patch uses --fuzz=0 argument to "patch" command by default. This can be overridden by %_default_patch_fuzz macro.
  • Macros for helper binaries such as %{__tar} and %{__gzip} are now honored everywhere in rpmbuild.
  • New macros %{patches} and %{sources} have been added, these can be used to address spec defined patches and sources in regular for loops.
  • rpmbuild automatically adds new "arch specific" provides to packages to make it possible to correctly express dependencies such as dlopen()'ed plugins and development packages.
  • Various fixes to tar-build mode:
    • The specfile is extracted with sane permissions (RhBug:253648)
    • Attempting build on tarball with no spec included no longer causes ugly and bogus files to be created (RhBug:281391)
  • rpmbuild -bs and similar imply --nodeps automatically (RhBug:235507)
  • rpmbuild automatically creates the build directory structure if necessary.
  • Several whitespace-in-filenames fixes (RhBug:430428)
  • noarch sub-packages are permitted in otherwise arch-dependant packages (RhBug:???)
  • Various ancient hardcoded limits and defaults have been eliminated / moved to configurable macros.
  • SELinux contexts are no longer stored in package headers. The contexts vary wildly between different policies and policy-versions, whereas header data is static in nature. The contexts from headers were never used for anything anyway.

General bugfixes and enhancements

  • Automatic cleaning up of stale rpmdb locks on Berkeley DB >= 4.5.20
  • Don't check for termination signals while running transaction.
  • Lots of missing failure checks added all over the codebase.
  • Verification uses chroot() if --root is specified to get user/group names right (RhBug:434150)
  • Various memleaks have been fixed.
  • File conflicts on non-elf files are enforced on multilib systems too (RhBug:190209)
  • Several new and updated translations.
  • rpmdb selinux contexts are now restored after db rebuild (RhBug:442149)
  • Side-effect of NSS/NSPR for signal handling of --pipe has been corrected (RhBug:444389)
  • More informative error messages in many cases (RhBug:427064, RhBug:164743)
  • Cleanly handled errors instead of dying on assert (RhBug:448939, RhBug:456100)
  • Several exit-code corrections (RhBug:462631, RhBug:446202, ...)
  • --nodirtokens build option works again after several years
  • Several documentation updates
  • ...many many more, dig 'em out..

API changes, internal improvements and cleanups

  • The header tag data manipulation API has been revamped entirely.
    • Tag data (from headers and extensions) are now passed around in a container which knows how the memory was allocated, the data type of tag, supports iteration, type safe access methods, formatting to several styles and much more.
    • headerGet() can be used to retrieve extension data too.
    • headerSprintf() has been deprecated in favor of a simpler headerFormat() call.
    • headerSprintf/Format() is several magnitudes of order faster for array types.
    • Support for 64bit integer types has been added.
    • the old headerGetEntry() family of calls is deprecated but still supported if -D_RPM_4_4_COMPAT is specified when building librpm using software.
  • Signature checking has been mostly decoupled from the transaction set
    • A new abstract keyring API has been added and used by the low level signature checking routines. In other words, rpmdb access is not needed for signature checking of packages/headers.
    • Public keys can now live outside the rpm database (but the feature is incomplete as of this writing)
  • A proper callback has been added to rpmlog infrastructure.
  • Rpm problem sets have been made opaque, new methods for iterating over the sets and accessing the data have been added.
  • 64bit rpm_loff_t type is used internally and externally everywhere for handling package and file sizes.
  • librpmdb has been merged with librpm. The split was largely artificial and caused more entirely unnecessary problems than it solved.
  • Several new string- and file helper functions have been added to librpmio.
  • The internal network transports have been removed from librpmio. Transparent remote fetch capability is implemented via calling an external, macro-configurable helper application.
  • Use of the non-portable and unsafe alloca() call has been entirely eliminated in the source code.
  • All/most static-sized string-buffers have been eliminated from the source code and replaced with dynamically allocated buffers.
  • All/most static-sized string-buffers have been eliminated from the source code and replaced with dynamically allocated buffers.
  • Most static variables/buffers have been eliminated from the source code and replaced with dynamically allocated memory / parameter passing etc.
  • Loads of code-duplication has been eliminated.
  • Loads of code has been made more readable and simplified.
  • Exported API and ABI has been vastly cleaned up:
    • Lots of internal symbols (functions and global variables) have been eliminated from the public API/ABI.
    • Several previously exported internal structures have been made opaque.
    • Several headers have been made private.
    • Private vs public headers are now properly separated, public headers are always accessed in <rpm/header.h> style.
    • Various definitions (enums etc) have been moved to more logical places, rpmlib.h is no longer a catch-all for everything.
  • Splint annotations have been removed from the source code, they were seriously hurting readability.
  • Variable, function return and parameter types have been audited to large extent and made more consistent, both in internal use and exported API. Standard POSIX and C99 types are used where appropriate. Bogus const on allocated memory have been removed from exported API and mostly internally too.
  • rpmlog() is used for logging everywhere in the source code, rpmError() and rpmMessage() have been deprecated and only available in compatibility mode.
  • Improved scriptlet error reporting in the transaction callback.
  • All uses of mktemp() have been replaced by mkstemp() in the source code.

Python bindings

  • The in-rpm python bindings have been mostly left alone for maximum compatibility, the development focus is on creating a new (not entirely comppatible)) bindings.
  • Python code tracebacking in rpm transaction callback now aborts the entire transaction (RhBug:463447)
  • Return type of header data is now always list for list types.
  • rpmfi has new FDigest() method to replace old MD5() method (due to configurable file checksum algorithm)
  • rpmts.addInstall() no longer accepts "available" type packages
  • Header data access by tag names is likely to be faster due to bsearch() use instead of linear lookup
  • rpmds has two new methods: Rpmlib() to retrieve rpmlib provides, and Search() for searching in dependency sets.
  • rpmrc and rpmfts have been removed, both were incomplete, unused (and unusable)

Build process

  • RPM no longer ships with 3rd party libraries in the distribution tarballs, internal copies of Berkeley DB, Lua, popt and libmagic have been removed. Building with an internal Berkeley DB is however still supported, see INSTALL for instructions.
  • The build process has been cleaned up and auto-tool usage modernized.
  • RPM now uses NSS for low-level encryption, beecrypt is no longer supported.
  • A C99-compliant compiler is now required to build RPM.
  • A new automated testsuite (beginnings of) has been added.
  • Lua >= 5.1 is now required for internal Lua-script support.

Removed features

  • Support for repackage and rollback have been removed as they're seen too unreliable to be generally useful
  • Internal network transports have been removed. The remote fetch capability is minimally preserved by using an external helper (curl by default).
  • Solve database support has been removed as it hasn't been used by any major distro in years. Plans are to replace the suggestion mechanism by a more flexible plugin architecture at some point.
  • Support for automatic package relocation on IA-64 has been removed.

Features planned for RPM 4.6 but not yet in this alpha

  • Dependency filtering on package build
  • Support for soft dependencies (Suggests, Enhances etc). These will be from RPM POV purely informational and not used in dependency calculations in any way.
  • Enable symbol versioning for librpmio, librpm and librpmbuild