summaryrefslogtreecommitdiff
path: root/eclass
diff options
context:
space:
mode:
authorAndreas Sturmlechner <asturm@gentoo.org>2025-10-12 23:06:22 +0200
committerAndreas Sturmlechner <asturm@gentoo.org>2025-10-16 21:14:23 +0200
commit6d7865c16f4c2eebf5d66a401184324967033d23 (patch)
treeff84999fd00718b3aac8c66bd68bcdb17282c328 /eclass
parent5579f4902a1d69f99115789f4c7bd89e07e58fc8 (diff)
downloadgentoo-6d7865c16f4c2eebf5d66a401184324967033d23.tar.gz
gentoo-6d7865c16f4c2eebf5d66a401184324967033d23.tar.bz2
gentoo-6d7865c16f4c2eebf5d66a401184324967033d23.zip
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@gentoo.org>
Diffstat (limited to 'eclass')
-rw-r--r--eclass/cmake.eclass99
1 files 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