summaryrefslogtreecommitdiff
path: root/eclass
diff options
context:
space:
mode:
authorAndrew Ammerlaan <andrewammerlaan@gentoo.org>2024-08-05 21:13:06 +0200
committerAndrew Ammerlaan <andrewammerlaan@gentoo.org>2024-08-07 10:58:35 +0200
commitfacd2865e403fd295c955fff8d609bfc717aed24 (patch)
treeb7f9de30b57f08ba2de01f0d86107b871e3e19cb /eclass
parentwww-servers/tomcat: add 10.1.28 (diff)
downloadgentoo-facd2865e403fd295c955fff8d609bfc717aed24.tar.gz
gentoo-facd2865e403fd295c955fff8d609bfc717aed24.tar.bz2
gentoo-facd2865e403fd295c955fff8d609bfc717aed24.zip
dist-kernel-utils.eclass: fix module cleanup when using binpkgs
When installing a binpkg -nt is not a good check because the modules in the binpkg we are installing may actually be older then what we have in root. Instead introduce a new function dist-kernel_get_module_suffix to find the desired compression based on USE=modules-sign and the kernel config. Then, remove only those files that do not match our desired compression. Signed-off-by: Andrew Ammerlaan <andrewammerlaan@gentoo.org>
Diffstat (limited to 'eclass')
-rw-r--r--eclass/dist-kernel-utils.eclass59
1 files changed, 49 insertions, 10 deletions
diff --git a/eclass/dist-kernel-utils.eclass b/eclass/dist-kernel-utils.eclass
index 4bc3fab44aae..0b0eb0ec8818 100644
--- a/eclass/dist-kernel-utils.eclass
+++ b/eclass/dist-kernel-utils.eclass
@@ -1,4 +1,4 @@
-# Copyright 2020-2023 Gentoo Authors
+# Copyright 2020-2024 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
# @ECLASS: dist-kernel-utils.eclass
@@ -159,6 +159,35 @@ dist-kernel_PV_to_KV() {
echo "${kv}"
}
+# @FUNCTION: dist-kernel_get_module_suffix
+# @USAGE: <kernel_dir>
+# @DESCRIPTION:
+# Returns the suffix for kernel modules based on the CONFIG_MODULES_COMPESS_*
+# setting in the kernel config and USE=modules-compress.
+dist-kernel_get_module_suffix() {
+ debug-print-function ${FUNCNAME} "${@}"
+
+ [[ ${#} -eq 1 ]] || die "${FUNCNAME}: invalid arguments"
+
+ local config=${1}/.config
+
+ if ! in_iuse modules-compress || ! use modules-compress; then
+ echo .ko
+ elif [[ ! -r ${config} ]]; then
+ die "Cannot find kernel config ${config}"
+ elif grep -q "CONFIG_MODULE_COMPRESS_NONE=y" "${config}"; then
+ echo .ko
+ elif grep -q "CONFIG_MODULE_COMPRESS_GZIP=y" "${config}"; then
+ echo .ko.gz
+ elif grep -q "CONFIG_MODULE_COMPRESS_XZ=y" "${config}"; then
+ echo .ko.xz
+ elif grep -q "CONFIG_MODULE_COMPRESS_ZSTD=y" "${config}"; then
+ echo .ko.zst
+ else
+ die "Module compression is enabled, but compressor not known"
+ fi
+}
+
# @FUNCTION: dist-kernel_compressed_module_cleanup
# @USAGE: <path>
# @DESCRIPTION:
@@ -169,20 +198,29 @@ dist-kernel_compressed_module_cleanup() {
[[ ${#} -ne 1 ]] && die "${FUNCNAME}: invalid arguments"
local path=${1}
- local basename f
+ local preferred=$(dist-kernel_get_module_suffix "${path}/source")
+ local basename suffix
while read -r basename; do
local prev=
- for f in "${path}/${basename}"{,.gz,.xz,.zst}; do
- if [[ ! -e ${f} ]]; then
- continue
+ for suffix in .ko .ko.gz .ko.xz .ko.zst; do
+ [[ ${suffix} == ${preferred} ]] && continue
+ local current=${path}/${basename}${suffix}
+ [[ -f ${current} ]] || continue
+
+ if [[ -f ${path}/${basename}${preferred} ]]; then
+ # If the module with the desired compression exists, remove
+ # all other variations.
+ rm -v "${current}" || die
elif [[ -z ${prev} ]]; then
- prev=${f}
- elif [[ ${f} -nt ${prev} ]]; then
+ # If not, then keep whichever of the duplicate modules is the
+ # newest. Normally you should not end up here.
+ prev=${current}
+ elif [[ ${current} -nt ${prev} ]]; then
rm -v "${prev}" || die
- prev=${f}
+ prev=${current}
else
- rm -v "${f}" || die
+ rm -v "${current}" || die
fi
done
done < <(
@@ -192,7 +230,8 @@ dist-kernel_compressed_module_cleanup() {
-o -name '*.ko.gz' \
-o -name '*.ko.xz' \
-o -name '*.ko.zst' \
- \) | sed -e 's:[.]\(gz\|xz\|zst\)$::' | sort | uniq -d || die
+ \) | sed -e 's:[.]ko\(\|[.]gz\|[.]xz\|[.]zst\)$::' |
+ sort | uniq -d || die
)
}