Wiki - https://fedoraproject.org/wiki/Changes/CMake4.0
Discussion thread -
https://discussion.fedoraproject.org/t/f43-change-propopsal-cmake-4-0-system-wide/148875

This is a proposed Change for Fedora Linux.
This document represents a proposed Change. As part of the Changes
process, proposals are publicly announced in order to receive
community feedback. This proposal will only be implemented if approved
by the Fedora Engineering Steering Committee.


== Summary ==

Update CMake to version 4.0. This version breaks compatibility with
projects that specify `cmake_minimum_required` with ''only'' a lower
bound less than `3.5`. Affected projects are tracked in
[https://copr.fedorainfracloud.org/coprs/lecris/cmake-4.0/ this copr
repo], please check if your packages are failing there.


== Owner ==

* Name: [[User:lecris| Cristian Le]]
* Email: fed...@lecris.me


== Detailed Description ==

Projects built with different major versions of CMake are generally
compatible with each other due to the use of `cmake_minimum_required`
and CMake policies that define how the build will behave, `OLD` or
`NEW` behavior, with the minimum version given to
`cmake_minimum_required` specifying that policies defined up to that
version should use the `NEW` behavior and policies defined from that
version onward use the `OLD` behavior.

Every so often a new CMake version drops support for `OLD` policies,
and in CMake 4.0 all policies before 3.5 are dropped (this is actually
the first time the `OLD` policies are being dropped). This requires
various projects to check if their build will be affected by a
rebuild, and adjust the CMake files accordingly.

Other changes:
* Various compatibility layers have been provided during the CMake 3.x
packaging, but as the technologies improved and since CMake maintains
general compatibility across major versions, these compatibility
layers have become unnecessary and will be gradually removed.
** The `%cmake4*` macros are not provided and `%cmake3` macros still
alias the `%cmake` macros.
** `/usr/bin/cmake3` is no longer provided and for the time being
`/usr/bin/cmake4` is an additional symlink to `/usr/bin/cmake`.
Dropping `/usr/bin/cmake4` will be raised in a future change proposal.
** The `cmake.spec` file will continue to have `Provides: cmake3`, but
there will '''NOT''' be a `Provides: cmake4`.

=== Migration ===

{{admon/tip | Compatibility with fedora releases | Any proposed
changes here are compatible with any CMake versions and can be
included at any point and backported to any Fedora release.
<br> The corresponding
[https://src.fedoraproject.org/rpms/cmake/pull-request/49 cmake PR]
will not be merged until the affected packages are patched
}}

Quick solution: Adding an environment variable or `-D` option
`CMAKE_POLICY_VERSION_MINIMUM=3.5` would unblock the builds in 90% of
the cases, but this is not 'generally' recommended because it is not
upstream friendly, and can hide build failures if the
`cmake_minimum_required` is hard-coded in the files distributed in the
`-devel` package.

In most cases the required change is very minimal, just requiring to
update '''all''' occurrences of `cmake_minimum_required` e.g.

  cmake_minimum_required(VERSION 3.12...4.0)

It is ''highly'' recommended to include a higher-bound which '''does
not''' mean that building with any higher CMake version will break,
instead if the project is built with any version in between these
bounds, it will automatically use the `NEW` policy. This will help in
the future when needing to bump the minimum version again since it
will be safe to update the minimum up to the current higher-bound.

The versions to be used are up to upstream's discretion for which
versions they want to test and support, and technically the following
is also acceptable:

  cmake_minimum_required(VERSION 2.8...4.0)

There may be unforeseen consequences due to the change in the policy,
for example with `CMP0028` change, builds can fail if the library or
other target have `::` in their name. These however are generally very
specialized edge-cases, so for the most parts, a simple change of
`cmake_minimum_required` is sufficient. Still it is best to consult
with upstream's testing infrastructure.

== Benefit to Fedora ==

Availability of CMake 4.0 for the user to develop, and upstreaming
CMake 4.0 compatibility patches.


== Scope ==
* Proposal owners:
** Build CMake 4.0 and impact-check affected projects
** Try to propose appropriate fixes as much as possible
** Assist the more complicated migrations and be a point of contact
for upstream issue

* Other developers:
** Adjust the package to update the `cmake_minimum_required`. See [[Migration]].
** Contact upstream to request/suggest the more long-term solution
described in [[Migration]]. Change owner is available if upstream
requires more specialized CMake discussions.


* Release engineering: [https://pagure.io/releng/issues #Releng issue number]

* Policies and guidelines: N/A (not needed for this Change)

== Upgrade/compatibility impact ==

Affected packages would be FTBFS (in the tracked
[https://copr.fedorainfracloud.org/coprs/lecris/cmake-4.0/ copr repo])
and would require patching before the corresponding
[https://src.fedoraproject.org/rpms/cmake/pull-request/49 cmake PR]
can be merged.


== How To Test ==

A copr repo will be provided with CMake 4.0 rebuilds. Use it to try
local builds, e.g. using:

  copr mock-config lecris/cmake-4.0 fedora-rawhide-x86_64

If the build is successful, that should be sufficient, but check your
reverse dependencies to see if the `-devel` package files are also
built correctly.

Most of the policies should result in build/test failures if the
package was relying on an outdated `OLD` behavior, but there are some
that may have more subtle behavior change. The recommendation is to
forward this list to upstream for more thorough investigation:
* [https://cmake.org/cmake/help/latest/policy/CMP0054.html CMP0054]
`if("var" STREQUAL "check_value")` used to be equivalent with `if(var
STREQUAL "check_value")`.


== Dependencies ==

There are currently 776/2359 packages that dependent on `cmake` which
are affected, gathered and built using mass-pre-build in
[https://copr.fedorainfracloud.org/coprs/lecris/cmake-4.0/ copr].

Not all build failures are due to CMake updates, and most of them
would be fixed by a bump of `cmake_minimum_required`.


== Contingency Plan ==

* Contingency mechanism: N/A (no deadline set)

* Contingency deadline: No deadline necessary yet

* Blocks release? No


== Documentation ==

* CMake 4.0 Release Notes: https://cmake.org/cmake/help/latest/release/4.0.html
* List of policies dropped:
https://cmake.org/cmake/help/latest/manual/cmake-policies.7.html#unsupported-policies



== Release Notes ==


-- 
Aoife Moloney

Fedora Operations Architect

Fedora Project

Matrix: @amoloney:fedora.im

IRC: amoloney

-- 
_______________________________________________
devel-announce mailing list -- devel-annou...@lists.fedoraproject.org
To unsubscribe send an email to devel-announce-le...@lists.fedoraproject.org
Fedora Code of Conduct: 
https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: 
https://lists.fedoraproject.org/archives/list/devel-annou...@lists.fedoraproject.org
Do not reply to spam, report it: 
https://pagure.io/fedora-infrastructure/new_issue
-- 
_______________________________________________
devel mailing list -- devel@lists.fedoraproject.org
To unsubscribe send an email to devel-le...@lists.fedoraproject.org
Fedora Code of Conduct: 
https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: 
https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org
Do not reply to spam, report it: 
https://pagure.io/fedora-infrastructure/new_issue

Reply via email to