From Fedora Project Wiki

Revision as of 23:01, 18 March 2022 by Decathorpe (talk | contribs) (add list of packages that are required for common multilib use cases)

Encourage Dropping Unused / Leaf Packages on i686

Summary

Package maintainers are empowered to stop building their packages for i686 — especially if supporting this architecture requires significant investment of time or resources. This will not apply to packages which are still depended on by other i686 packages, or which get used in a "multilib" context (i.e. for running 32-bit applications on x86_64). Dropping i686 architecture support from a leaf package will no longer be considered a breaking change, will not require any announcements, or tracker bugs.

Owner

Current status

  • Targeted release: Fedora Linux 37
  • Last updated: 2022-03-18
  • devel thread
  • FESCo issue: #2773
  • Tracker bug: <will be assigned by the Wrangler>
  • Release notes tracker: <will be assigned by the Wrangler>

Detailed Description

Fedora does no longer ship any deliverables for i686, not even RPM repositories for i686 are published any longer. The kernel package itself also dropped support for i686 in Fedora 31, so there has not been any way to run Fedora on 32-bit x86 systems for years. Only a tiny fraction of all packages that are built on i686 are actually used (i.e. "multilib" support for Wine, Steam, etc. on x86_64).

Package maintainers who no longer wish to build their packages for i686 will be able to drop support for this architecture — if the package is unused there — without the requirement for an announcement or a tracker bug.

For packages that still have dependent packages on i686, package maintainers can coordinate with maintainers of the packages in their dependency trees to start removing support for i686, starting from the leaf packages, similar to how other breaking changes, like SONAME bumps, are handled.

The list of (source) packages that are required to still be built for i686 for common "multilib" use cases (i.e. installing the Steam client steam.i686, or wine on an x86_64 system) is included below. Note that this list only reflects runtime dependencies, and not recursive build dependencies, but can serve as a "base line" of packages that should not be considered "leaf packages":

- FAudio (wine)
- SDL2 (wine)
- acl (steam, wine)
- alsa-lib (steam, wine)
- alsa-plugins (steam)
- aom (wine)
- argon2 (steam, wine)
- at-spi2-atk (steam)
- at-spi2-core (steam)
- atk (steam, wine)
- attr (steam, wine)
- audit (steam, wine)
- avahi (steam, wine)
- bluez (steam)
- brotli (steam, wine)
- bzip2 (steam, wine)
- cairo (steam, wine)
- cdparanoia (wine)
- cmake (steam, wine)
- colord (steam)
- cracklib (steam, wine)
- cryptsetup (steam, wine)
- cups (steam, wine)
- curl (steam, wine)
- cyrus-sasl (steam, wine)
- dav1d (wine)
- dbus (steam, wine)
- dconf (steam, wine)
- e2fsprogs (steam, wine)
- elfutils (steam, wine)
- expat (steam, wine)
- fdk-aac-free (steam)
- flac (steam, wine)
- flatpak (steam, wine)
- fontconfig (steam, wine)
- freetype (steam, wine)
- fribidi (steam, wine)
- fuse (steam, wine)
- gawk (steam, wine)
- gcc (steam, wine)
- gd (wine)
- gdbm (steam, wine)
- gdk-pixbuf2 (steam, wine)
- glib-networking (steam, wine)
- glib2 (steam, wine)
- glibc (steam, wine)
- gmp (steam, wine)
- gnutls (steam, wine)
- gpgme (steam, wine)
- graphene (wine)
- graphite2 (steam, wine)
- gsettings-desktop-schemas (steam, wine)
- gsm (steam, wine)
- gstreamer1 (steam, wine)
- gstreamer1-plugins-base (wine)
- gtk2 (steam)
- gtk3 (steam)
- harfbuzz (steam, wine)
- icu (steam, wine)
- iptables (steam, wine)
- jansson (wine)
- jbigkit (steam, wine)
- jpegxl (wine)
- json-c (steam, wine)
- json-glib (steam, wine)
- jsoncpp (steam, wine)
- keyutils (steam, wine)
- kmod (steam, wine)
- krb5 (steam, wine)
- lcms2 (steam, wine)
- libICE (steam)
- libX11 (steam, wine)
- libXScrnSaver (steam)
- libXau (steam, wine)
- libXcomposite (steam, wine)
- libXcursor (steam, wine)
- libXdamage (steam)
- libXext (steam, wine)
- libXfixes (steam, wine)
- libXft (steam, wine)
- libXi (steam)
- libXinerama (steam, wine)
- libXpm (wine)
- libXrandr (steam, wine)
- libXrender (steam, wine)
- libXtst (steam)
- libXv (wine)
- libXxf86vm (steam, wine)
- libappstream-glib (steam, wine)
- libarchive (steam, wine)
- libassuan (steam, wine)
- libasyncns (steam, wine)
- libavif (wine)
- libcanberra (steam)
- libcap (steam, wine)
- libcap-ng (steam, wine)
- libcloudproviders (steam)
- libdaemon (wine)
- libdatrie (steam, wine)
- libdb (steam, wine)
- libdbusmenu (steam)
- libdecor (wine)
- libdrm (steam, wine)
- libeconf (steam, wine)
- libedit (steam, wine)
- libepoxy (steam)
- libevent (steam, wine)
- libexif (wine)
- libffi (steam, wine)
- libgcrypt (steam, wine)
- libglvnd (steam, wine)
- libgpg-error (steam, wine)
- libgphoto2 (wine)
- libgusb (steam)
- libidn2 (steam, wine)
- libimagequant (wine)
- libjpeg-turbo (steam, wine)
- libldac (steam)
- libldb (wine)
- libnl3 (steam, wine)
- libnsl2 (steam, wine)
- libogg (steam, wine)
- libpcap (steam, wine)
- libpciaccess (steam, wine)
- libpng (steam, wine)
- libpng12 (steam)
- libproxy (steam, wine)
- libpsl (steam, wine)
- libpwquality (steam, wine)
- libraqm (wine)
- librsvg2 (steam, wine)
- libseccomp (steam, wine)
- libselinux (steam, wine)
- libsepol (steam, wine)
- libsigsegv (steam, wine)
- libsndfile (steam, wine)
- libsoup (steam, wine)
- libssh (steam, wine)
- libstemmer (steam, wine)
- libtalloc (wine)
- libtasn1 (steam, wine)
- libtdb (steam, wine)
- libtevent (wine)
- libthai (steam, wine)
- libtheora (wine)
- libtiff (steam, wine)
- libtirpc (steam, wine)
- libtool (steam, wine)
- libunistring (steam, wine)
- libunwind (steam, wine)
- libusb1 (steam, wine)
- libusbx (steam, wine)
- libutempter (steam, wine)
- libuv (steam, wine)
- libva (steam, wine)
- libvdpau (steam)
- libverto (steam, wine)
- libvisual (wine)
- libvorbis (steam, wine)
- libwebp (steam, wine)
- libxcb (steam, wine)
- libxcrypt (steam, wine)
- libxkbcommon (steam)
- libxml2 (steam, wine)
- libxshmfence (steam, wine)
- lilv (steam)
- llvm (steam, wine)
- lmdb (wine)
- lockdev (wine)
- lua (steam, wine)
- lv2 (steam)
- lvm2 (steam, wine)
- lz4 (steam, wine)
- mesa (steam, wine)
- mozjs78 (steam)
- mpdecimal (steam, wine)
- mpfr (steam, wine)
- mpg123 (wine)
- ncurses (steam, wine)
- nettle (steam, wine)
- nghttp2 (steam, wine)
- nss (steam, wine)
- nss-mdns (wine)
- ocl-icd (wine)
- openal-soft (wine)
- openldap (steam, wine)
- openssl (steam, wine)
- openssl1.1 (steam, wine)
- opus (steam, wine)
- orc (wine)
- ostree (steam, wine)
- p11-kit (steam, wine)
- pam (steam, wine)
- pango (steam, wine)
- pcre (steam, wine)
- pcre2 (steam, wine)
- perl (wine)
- perl-Encode (wine)
- pipewire (steam)
- pixman (steam, wine)
- pkgconf (steam, wine)
- polkit (steam, wine)
- popt (steam, wine)
- pulseaudio (steam, wine)
- python3.10 (steam, wine)
- rdma-core (steam, wine)
- readline (steam, wine)
- rhash (steam, wine)
- rpm (steam, wine)
- rust-rav1e (wine)
- samba (wine)
- sane-backends (wine)
- sbc (steam)
- serd (steam)
- shared-mime-info (steam, wine)
- sord (steam)
- spirv-tools (wine)
- sqlite (steam, wine)
- sratom (steam)
- steam (steam)
- systemd (steam, wine)
- tracker (steam)
- unixODBC (wine)
- util-linux (steam, wine)
- uuid (steam, wine)
- v4l-utils (wine)
- vkd3d (wine)
- vulkan-loader (steam, wine)
- wayland (steam, wine)
- webrtc-audio-processing (steam)
- xdg-desktop-portal (steam)
- xz (steam, wine)
- zenity (steam)
- zlib (steam, wine)
- zstd (steam, wine)


The list was generated from the output of commands similar to these (with all necessary repositories enabled) on Fedora 35 Workstation on x86_64:

for i in $(dnf --quiet repoquery --requires steam.i686 --resolve --recursive | grep i686); do dnf --quiet repoquery $i --qf "%{source_name}"; done | sort | uniq
for i in $(dnf --quiet repoquery --requires wine.x86_64 --resolve --recursive | grep i686); do dnf --quiet repoquery $i --qf "%{source_name}"; done | sort | uniq

Feedback

The Proposal owner has expanded the detailed description and clarified some parts of the proposal based on feedback from the devel list. Additionally, a list of the packages that are required to keep common "multilib" use cases working (steam, wine) has been included.

Benefit to Fedora

Stopping to run package builds on i686 for packages that are unused will free up koji builder resources. Additionally, support for building on 32-bit targets is starting to get dropped by upstream projects, and resource constraints of 32-bit architectures (i.e. per-process and total memory limits) also make building large libraries or applications increasingly difficult. With ARMv7 support having been removed from Fedora 37 already, i686 is the only remaining supported 32-bit architecture.

Allowing package maintainers to drop i686 support from their packages (if possible), without the requirement for announcements or tracker bugs, instead of requiring them to work around those resource constraints or missing upstream support, will significantly lower the maintenance burden, especially for some problematic packages.

Scope

  • Proposal owners:

Proposal owners will provide convenience scripts for checking whether a given package is a leaf package on i686, and will help with identifying potential candidate packages.

  • Other developers:

Package maintainers who are affected by 32-bit architecture / i686 specific problems are encouraged to investigate dropping support for i686 entirely by adding ExcludeArch: %{ix86} to the package's spec file, instead of having to invest time to fix or work around those issues, for very little benefit to Fedora. This can be done incrementally, as dropping support for i686 from some packages will in turn make other packages leaves on i686.

  • Release engineering: N/A

There are already no deliverables for i686, so there should be no impact on Release engineering.

  • Policies and guidelines:

Packages that drop support for i686 will no longer need to file a tracking bug and block the 32-bit x86 ExcludeArch tracker bug.

  • Trademark approval: N/A (not needed for this Change)
  • Alignment with Objectives: N/A

Upgrade/compatibility impact

This Change only affects unused / leaf packages that are never installed on user systems (particularly because it has not been possible to install i686-based Fedora for years).

How To Test

The remaining use cases of i686 packages (i.e. "multilib") for popular 32-bit applications should continue to work. For example, installing the Steam client (steam.i686), Wine, or other applications that require 32-bit compatibility libraries should still be possible, and not fail due to broken dependencies.

User Experience

N/A

Dependencies

N/A

Contingency Plan

This Change is supposed to only affect unused components / leaf packages. However, if a package maintainer accidentally stops building a package on i686 despite it still being required for something else, this should be easy to revert — by adding back i686 architecture support to the affected packages, in reverse order. Since removal of support for i686 will happen slowly and incrementally, this should be relatively straightforward.

  • Contingency deadline: N/A (not a System Wide Change)
  • Blocks release? N/A (not a System Wide Change)

Documentation

N/A (not a System Wide Change)

Release Notes

Fedora packages will incrementally drop support for the i686 architecture (32-bit x86), where this support is no longer required. This is intended to help reduce needless resource consumption of build servers, and make package maintenance for Fedora easier, because a growing number of projects already either no longer provide support for — or fail to build due to resource constraints on — 32-bit architectures.