From Fedora Project Wiki

Perl: Replace versioned MODULE_COMPAT_ requires by macro

Summary

A perl(:MODULE_COMPAT_%(eval "%{__perl} -V:version"; echo $version)) run-time dependency will be replaced with a new %perl_require_compat macro in all Perl spec files.

The macro will expand differently based on architecture specificity of the binary packages. That will significantly shrink an amount of Perl packages required to be rebuilt with each perl upgrade.

Owner

Current status

  • Targeted release: Fedora Linux 38
  • Last updated: 2022-11-09
  • FESCo issue: <will be assigned by the Wrangler>
  • Tracker bug: <will be assigned by the Wrangler>
  • Release notes tracker: <will be assigned by the Wrangler>

Completed items

Items in progress

  • Add %perl_require_compat macro to perl-srpm-macros in F38
  • Add %perl_require_compat macro to perl-srpm-macros in F37
  • Add %perl_require_compat macro to perl-srpm-macros in F36
  • Add %perl_require_compat macro to perl-srpm-macros in F35
  • Update Fedora Packaging Guidelines for Perl
  • Replace perl(:MODULE_COMPAT_XXX) by %perl_require_compat run-time in all F38 spec files (3259)

Detailed Description

The list of packages that need to be rebuilt with the new major version of Perl is determined according to the dependency on perl(:MODULE_COMPAT_XXX) now.

In Fedora, all Perl modules run-requires the versioned perl(:MODULE_COMPAT_XXX) provided by perl-libs now.

However, only multi-arch packages need to have a dependency on the particular version of Perl it was built against, or on a newer version of Perl that provides backward compatibility with it. For those packages, we need to ensure that the packages will use the right version of libperl.so for the Perl used during the rebuild.

The noarch packages don't need to be rebuild against each new major version of Perl, they only have to require non-versioned perl-libs which includes all directories used by all Perl modules.

The macro %perl_require_compat will evaluate the run-require based on %{_target_cpu}. The macro will be defined in the rpm perl-srpm-macros and the definition is:

%perl_require_compat %[ "%{_target_cpu}" == "noarch" ? "perl-libs" : "%{!?perl_version:perl-libs}%{?perl_version:perl(:MODULE_COMPAT_%{perl_version})}" ]

The macro %perl_requires_compat will evaluate to the correct value. There is a known, yet harmless, imperfection: The macro will evaluate to perl(:MODULE_COMPAT_XXX) even in noarch subpackages of a multi-arch main package. In this case, I still recommend to use Requires: %perl_require_compat. The purpose of the change is a matter of simplifying the rebuild, where it depends if the source package produces at least one multi-arch binary package. Not on whether it makes a noarch subpackage next to it.

Benefit to Fedora

It will simplify the rebuild and reduce the number of packages which have to be rebuild. It should currently be enough to rebuild only multi-arch packages and those that are part of the Perl itself (dual-life packages). Here we need to ensure that the packages will use the right libperl.so for the Perl used.

Scope

  • Proposal owners:
    • Submit Fedora Packaging Guidelines for Perl update to Fedora Packaging Committee.
    • Update and rebuild perl-srpm-macros source package.
    • Add %perl_require_compat to perl-srpm-macros package in older Fedoras.
    • Replace Requires for perl(:MODULE_COMPAT_XXX) with %perl_require_compat in all spec files.
  • Other developers: Get familiar with new Fedora Packaging Guidelines for Perl.
  • Policies and guidelines: N/A (not needed for this Change)
  • Trademark approval: N/A (not needed for this Change)
  • Alignment with Objectives:

Upgrade/compatibility impact

N/A

How To Test

All multi-arch packages which use the macro should run-require perl(:MODULE_COMPAT_%{perl_version}) and the noarch packages should run-requires perl-libs except the case listed in Detailed Description.

User Experience

There should not be any remarkable change in user experience.

Dependencies

This change will affect 3259 source packages and all binary noarch packages. The rebuild of affected packages will be done by mass rebuild of Fedora 38. There is no dependency on other Fedora changes.

Contingency Plan

  • Contingency mechanism: The change will be reverted.
  • Contingency deadline: Before Mass Rebuild.
  • Blocks release? No.

Documentation

Release Notes