From Fedora Project Wiki

NOTE: This is the a former draft proposal, the FPC has agreed up. It has been ratfied by FESCO and been merged into the FPG.

Motivation

Static libraries and statically linked applications introduce major problems to maintenance of a distro such as Fedora:

  • Packages being linked against shared libs automatically receive updates, fixes etc. when these libs are being updated without recompilation.

Packages being statically linked would require explicit recompilation.

  • Packages being linked against static libs are easy to miss to be updated when a library is being updated, because package dependencies on static libs are hidden from a package's dependencies.
  • Static linkage increases the size of the distro, because
  • Shipping static libraries consumes (disk-)space.
  • Each statically linked application contains private copies of parts of static libs, which consumes further (disk-)space.
  • Statically linked applications often consume more (run-time) memory than dynamically linked applications.
  • The rebuilds (package updates, avoidable if applications were dynamically linked) statically linked applications introduce, cause additional network traffic.
  • rpm/redhat-rpm-config (at least on Fedora 5) does not generate functional *-debuginfo*.rpms for static libs.

This prevents source-level debugging of static libs using *-debuginfo.rpms.

Proposal

  • In general, packagers are strongly encouraged not to ship static libs nor statically linked applications, unless the packager can provide sufficently satisfactory reasons why a package should contain static libs or contain statically linked applications.
  • Shipping static libs and static linkage should be considered special exceptions and should be decided upon case-by-case per package. Packager must provide rationale for a -static subpackage, including precedences where available, to the appropriate Steering Committee (FESCO for Fedora Extras, Secret Core Cabal for Fedora Core) for approval.
  • Require static libs to be packaged in packages named *-static, instead of *-devel.

This allows tracking of packages dependending on static libs based on these packages BuildRequire'ing *-static packages.