commit:     6d7865c16f4c2eebf5d66a401184324967033d23
Author:     Andreas Sturmlechner <asturm <AT> gentoo <DOT> org>
AuthorDate: Sun Oct 12 21:06:22 2025 +0000
Commit:     Andreas Sturmlechner <asturm <AT> gentoo <DOT> org>
CommitDate: Thu Oct 16 19:14:23 2025 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=6d7865c1

cmake.eclass: Provide a list of CMake files unsupported with CMake 4

Instead of only eqawarning that there is *some* file with a too low
cmake_minimum_required version, print a list of all the CMakeLists.txt
found to be unsupported, and the detected version next to it.

- _CMAKE_MINREQVER_CMAKE305 is either empty (package "passed") or
  contains a list of <file>:<version> tuples to print as eqawarn message
  This replaces _CMAKE_MINREQVER_UNSUPPORTED
- Rename _cmake4_callout() -> _cmake_minreqver-info()
  Provide upstream link with list of CMake policy changes per release
- Prepare for upcoming additional cmake_minimum_version checks
- Rename _cmake_minreqver-lt() -> _cmake_minreqver-check()
  Function now optionally takes one or two args:
  <file>: runs all version checks over <file>
  <file> <version>: only check <version> against <file>

Closes: https://bugs.gentoo.org/951350
Signed-off-by: Andreas Sturmlechner <asturm <AT> gentoo.org>

 eclass/cmake.eclass | 99 ++++++++++++++++++++++++++++++++++-------------------
 1 file changed, 64 insertions(+), 35 deletions(-)

diff --git a/eclass/cmake.eclass b/eclass/cmake.eclass
index e132b0b53deb..ebc78a333eef 100644
--- a/eclass/cmake.eclass
+++ b/eclass/cmake.eclass
@@ -124,11 +124,13 @@ fi
 # If set, skip detection of CMakeLists.txt unsupported in CMake 4 in case of
 # false positives (e.g. unused outdated bundled libs).
 
-# @ECLASS_VARIABLE: _CMAKE_MINREQVER_UNSUPPORTED
+# @ECLASS_VARIABLE: _CMAKE_MINREQVER_CMAKE305
 # @DEFAULT_UNSET
 # @DESCRIPTION:
-# Internal status set by _cmake_minreqver-lt(); is true if an unsupported
-# cmake_minimum_required value was detected.
+# Internal array containing <file>:<version> tuples detected by
+# _cmake_minreqver-check() for any CMakeLists.txt with cmake_minimum_required
+# version lower than 3.5.
+_CMAKE_MINREQVER_CMAKE305=()
 
 # @ECLASS_VARIABLE: CMAKE_QA_SRC_DIR_READONLY
 # @USER_VARIABLE
@@ -330,25 +332,69 @@ _cmake_check_build_dir() {
        mkdir -p "${BUILD_DIR}" || die
 }
 
-# @FUNCTION: _cmake_minreqver-lt
-# @USAGE: <lt-version> <path>
+# @FUNCTION: _cmake_minreqver-check
+# @USAGE: <path> or <path> <lt-version>
 # @INTERNAL
 # @DESCRIPTION:
-# Internal function for detecting occurrence of lower-than-specified
-# <lt-version> in cmake_minimum_required of a given CMake file <path>.
+# Internal function for flagging any deprecated or unsupported
+# cmake_minimum_required version in a given CMake file <path>.
+# If <lt-version> is specified as second arg, only check against that value.
 # Returns 0 if the regex matched (a lower-than-specified version found).
-_cmake_minreqver-lt() {
+_cmake_minreqver-check() {
        local ver chk=1
+       if [[ "$#" == 2 ]]; then
+               local file="${1}"
+               local lt_version="${2}"
+       elif [[ "$#" == 1 ]]; then
+               local file="${1}"
+       else
+               die "${FUNCNAME[0]} must be passed either one or two arguments"
+       fi
        ver=$(sed -ne 
"/^\s*cmake_minimum_required/I{s/.*\(\.\.\.*\|\s\)\([0-9][0-9.]*\)\([)]\|\s\).*$/\2/p;q}"
 \
-               "${2}" 2>/dev/null \
+               "${file}" 2>/dev/null \
        )
-       if [[ -n ${ver} ]] && ver_test "${ver}" -lt "${1}"; then
-               _CMAKE_MINREQVER_UNSUPPORTED=true
-               chk=0
+       if [[ -z ${ver} ]]; then
+               return 1 # no cmake_minimum_required found
+       fi
+       if [[ -n ${lt_version} ]]; then
+               chk=$(ver_test "${ver}" -lt "${lt_version}")
+       else
+               if ver_test "${ver}" -lt "3.5"; then
+                       _CMAKE_MINREQVER_CMAKE305+=( "${file}":"${ver}" )
+                       chk=0
+               fi
        fi
        return ${chk}
 }
 
+# @FUNCTION: _cmake_minreqver-info
+# @INTERNAL
+# @DESCRIPTION:
+# QA Notice and file listing for any CMakeLists.txt file unsupported w/ 
CMake-4.
+_cmake_minreqver-info() {
+       local info
+       if [[ -n ${_CMAKE_MINREQVER_CMAKE305[@]} ]]; then
+               eqawarn "QA Notice: Compatibility with CMake < 3.5 has been 
removed from CMake 4,"
+               eqawarn "${CATEGORY}/${PN} will fail to build w/o a fix."
+               eqawarn "See also tracker bug #951350; check existing bug or 
file a new one for"
+               eqawarn "this package, and take it upstream."
+               eqawarn
+               eqawarn "The following CMakeLists.txt files are causing errors:"
+               for info in ${_CMAKE_MINREQVER_CMAKE305[*]}; do
+                       eqawarn "  ${info}"
+               done
+               eqawarn
+               if has_version -b ">=dev-build/cmake-4"; then
+                       eqawarn "CMake 4 detected; building with 
-DCMAKE_POLICY_VERSION_MINIMUM=3.5"
+                       eqawarn "This is merely a workaround and *not* a 
permanent fix."
+                       eqawarn
+               fi
+               eqawarn "An upstreamable patch should take any resulting CMake 
policy changes"
+               eqawarn "into account. See also:"
+               eqawarn "  
https://cmake.org/cmake/help/latest/manual/cmake-policies.7.html";
+       fi
+}
+
 # @FUNCTION: _cmake_modify-cmakelists
 # @INTERNAL
 # @DESCRIPTION:
@@ -376,8 +422,8 @@ _cmake_modify-cmakelists() {
                        done
                fi
                # Detect unsupported minimum CMake versions unless 
CMAKE_QA_COMPAT_SKIP is set
-               if [[ -z ${_CMAKE_MINREQVER_UNSUPPORTED} ]] && ! [[ 
${CMAKE_QA_COMPAT_SKIP} ]]; then
-                       _cmake_minreqver-lt "3.5" "${file}"
+               if ! [[ ${CMAKE_QA_COMPAT_SKIP} ]]; then
+                       _cmake_minreqver-check "${file#"${CMAKE_USE_DIR}/"}"
                fi
        done < <(find "${CMAKE_USE_DIR}" -type f -iname "CMakeLists.txt" 
-print0 || die)
 
@@ -397,23 +443,6 @@ _cmake_modify-cmakelists() {
        _EOF_
 }
 
-# @FUNCTION: _cmake4_callout
-# @INTERNAL
-# @DESCRIPTION:
-# QA notice printout for build systems unsupported w/ CMake-4.
-_cmake4_callout() {
-       if [[ ${_CMAKE_MINREQVER_UNSUPPORTED} ]]; then
-               eqawarn "QA Notice: Compatibility with CMake < 3.5 has been 
removed from CMake 4,"
-               eqawarn "${CATEGORY}/${PN} will fail to build w/o a fix."
-               eqawarn "See also tracker bug #951350; check existing bug or 
file a new one for"
-               eqawarn "this package, and take it upstream."
-               if has_version -b ">=dev-build/cmake-4"; then
-                       eqawarn "CMake 4 detected; building with 
-DCMAKE_POLICY_VERSION_MINIMUM=3.5"
-                       eqawarn "This is merely a workaround and *not* a 
permanent fix."
-               fi
-       fi
-}
-
 # @FUNCTION: cmake_prepare
 # @DESCRIPTION:
 # Check existence of and sanitise CMake files, then make ${CMAKE_USE_DIR}
@@ -445,7 +474,7 @@ cmake_prepare() {
 
        # Remove dangerous things.
        _cmake_modify-cmakelists
-       _cmake4_callout
+       _cmake_minreqver-info
 
        # Make ${CMAKE_USE_DIR} read-only in order to detect broken build 
systems
        if [[ ${CMAKE_QA_SRC_DIR_READONLY} && ! ${CMAKE_IN_SOURCE_BUILD} ]]; 
then
@@ -486,7 +515,7 @@ cmake_src_prepare() {
                                find "${S}" -name "${name}.cmake" -exec rm -v 
{} + || die
                        done
                        _cmake_modify-cmakelists # Remove dangerous things.
-                       _cmake4_callout
+                       _cmake_minreqver-info
                popd > /dev/null || die
                # Make ${S} read-only in order to detect broken build systems
                if [[ ${CMAKE_QA_SRC_DIR_READONLY} && ! 
${CMAKE_IN_SOURCE_BUILD} ]]; then
@@ -719,7 +748,7 @@ cmake_src_configure() {
                cmakeargs+=( -C "${CMAKE_EXTRA_CACHE_FILE}" )
        fi
 
-       if [[ ${_CMAKE_MINREQVER_UNSUPPORTED} ]] && has_version -b 
">=dev-build/cmake-4"; then
+       if [[ -n ${_CMAKE_MINREQVER_CMAKE305[@]} ]] && has_version -b 
">=dev-build/cmake-4"; then
                cmakeargs+=( -DCMAKE_POLICY_VERSION_MINIMUM=3.5 )
        fi
 
@@ -855,7 +884,7 @@ cmake_src_install() {
        while read -d '' -r file ; do
                # Detect unsupported minimum CMake versions unless 
CMAKE_QA_COMPAT_SKIP is set
                if ! [[ ${CMAKE_QA_COMPAT_SKIP} ]]; then
-                       _cmake_minreqver-lt "3.5" "${file}" && files+=( 
"${file#"${D}"}" )
+                       _cmake_minreqver-check "3.5" "${file}" && files+=( 
"${file#"${D}"}" )
                fi
        done < <(find "${D}" -type f -iname "*.cmake" -print0 || die)
        if [[ ${#files[*]} -gt 0 ]]; then

Reply via email to