* update dkms to 3.0.3-1

This commit is contained in:
Alexander Baldeck 2022-01-30 15:27:09 +01:00
parent 4eaaef2016
commit c0e37d6a55
5 changed files with 142 additions and 90 deletions

View File

@ -3,13 +3,13 @@
# Contributor: Balwinder S "bsd" Dheeman (bdheeman AT gmail.com) # Contributor: Balwinder S "bsd" Dheeman (bdheeman AT gmail.com)
pkgname=dkms pkgname=dkms
pkgver=2.8.6 pkgver=3.0.3
pkgrel=2 pkgrel=1
pkgdesc='Dynamic Kernel Modules System' pkgdesc='Dynamic Kernel Modules System'
arch=('any') arch=('any')
url='https://github.com/dell/dkms' url='https://github.com/dell/dkms'
license=('GPL2') license=('GPL2')
depends=('bash' 'kmod' 'gcc' 'make' 'patch') depends=('coreutils' 'bash' 'gawk' 'sed' 'kmod' 'gcc' 'make' 'patch')
makedepends=('git') makedepends=('git')
optdepends=('linux-headers: build modules against the Arch kernel' optdepends=('linux-headers: build modules against the Arch kernel'
'linux-lts-headers: build modules against the LTS kernel' 'linux-lts-headers: build modules against the LTS kernel'
@ -21,14 +21,12 @@ source=("git+https://github.com/dell/dkms.git#tag=v$pkgver"
'hook.install' 'hook.install'
'hook.remove' 'hook.remove'
'hook.upgrade' 'hook.upgrade'
'hook.sh' 'hook.sh')
'0001-Revert-Make-newly-installed-modules-available-immedi.patch')
sha256sums=('SKIP' sha256sums=('SKIP'
'047e0e46967e98fbf3ff8860a80f259c28693d5989373d5a5395714495b59844' 'acdc5b45cc018cea04ee1aec56fd8fc3a2de62cf7bc41acf53b3790872120998'
'ae5483980db914d52bff981ed83356c85679dd7e6e8f73bdd94265f065014c73' '326515cc7d00f93760beb844434ca7442caf7a9424614aa95a8f6d1ab79e15df'
'd61d94532789928085a8494ba039c59244cfb3bfd47deaf21bcbe54a2243dc45' '4f8dff7716e73a8bba885638f12e3cdc9e87daec1896f75e700b981527e43870'
'55209947f6266dc7f29b82f3d2635a6b92f6e175d59571dca4d2fd435dffab4a' 'c1b4a4e2e4e0e0e59ee0887403e79d60b209f3878dbbec6612573f13b90cce01')
'124b821b1b44ba365d915945825bcf32c1077655c3a98eb1644de56b6abfcd09')
prepare() { prepare() {
cd dkms cd dkms
@ -44,7 +42,7 @@ prepare() {
# /usr move # /usr move
msg2 '/usr move patching' msg2 '/usr move patching'
for i in dkms{,_framework.conf,.bash-completion,.8,_common.postinst}; do for i in dkms{.in,.8.in,_framework.conf,.bash-completion,_common.postinst} sign_helper.sh; do
sed -ri 's,/lib/modules,/usr/lib/modules,g' "$i" sed -ri 's,/lib/modules,/usr/lib/modules,g' "$i"
done done
} }
@ -59,15 +57,17 @@ package() {
install -D -m 644 hook.upgrade "$pkgdir/usr/share/libalpm/hooks/70-dkms-upgrade.hook" install -D -m 644 hook.upgrade "$pkgdir/usr/share/libalpm/hooks/70-dkms-upgrade.hook"
install -D -m 644 hook.remove "$pkgdir/usr/share/libalpm/hooks/71-dkms-remove.hook" install -D -m 644 hook.remove "$pkgdir/usr/share/libalpm/hooks/71-dkms-remove.hook"
# hook helper # hook helper
install -D -m 755 hook.sh "$pkgdir/usr/lib/dkms/alpm-hook" install -D -m 755 hook.sh "$pkgdir/usr/share/libalpm/scripts/dkms"
# upstream installer # upstream installer
cd dkms cd dkms
# we don't need kconf files, so we install them outside $pkgdir # we don't need kconf files and libdir is only for debian stuff, so
# we install them outside of $pkgdir
make \ make \
DESTDIR="$pkgdir" \ DESTDIR="$pkgdir" \
SBIN="$pkgdir/usr/bin" \ SBIN="$pkgdir/usr/bin" \
BASHDIR="$pkgdir/usr/share/bash-completion/completions" \ BASHDIR="$pkgdir/usr/share/bash-completion/completions" \
KCONF="$srcdir"/kconf \ KCONF="$srcdir"/trash \
LIBDIR="$srcdir"/trash \
install install
} }

View File

@ -10,5 +10,5 @@ Target = usr/lib/modules/*/modules.alias
Description = Install DKMS modules Description = Install DKMS modules
Depends = dkms Depends = dkms
When = PostTransaction When = PostTransaction
Exec = /usr/lib/dkms/alpm-hook install Exec = /usr/share/libalpm/scripts/dkms install
NeedsTargets NeedsTargets

View File

@ -9,5 +9,5 @@ Target = usr/lib/modules/*/modules.alias
Description = Remove DKMS modules Description = Remove DKMS modules
Depends = dkms Depends = dkms
When = PreTransaction When = PreTransaction
Exec = /usr/lib/dkms/alpm-hook remove Exec = /usr/share/libalpm/scripts/dkms remove
NeedsTargets NeedsTargets

View File

@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# #
# Copyright © 2018-2020, Sébastien Luttringer # Copyright © 2018-2021, Sébastien Luttringer
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -22,7 +22,7 @@ run() {
echo "==> $*" echo "==> $*"
"$@" > /dev/null "$@" > /dev/null
local ret=$? local ret=$?
(( $ret )) && echo "==> Warning, \`$*' returned $ret" (( $ret )) && echo "==> WARNING: \`$*' exited $ret"
return $ret return $ret
} }
@ -52,129 +52,168 @@ check_buildexclusive() {
[[ "$3" =~ $BUILD_EXCLUSIVE_KERNEL ]] [[ "$3" =~ $BUILD_EXCLUSIVE_KERNEL ]]
} }
# handle actions on module addition/upgrade/removal # list all kernel versions
# $1: module name all_kver() {
# $2: module version
parse_module() {
pushd "$install_tree" >/dev/null pushd "$install_tree" >/dev/null
local path local path
for path in */build/; do for path in */build/; do
local kver="${path%%/*}" echo "${path%%/*}"
dkms_register "$1" "$2" "$kver"
done done
popd >/dev/null popd >/dev/null
} }
# handle actions on kernel addition/upgrade/removal # list all module name/version for a specific kernel version
# $1: kernel version # $1: kernel version
parse_kernel() { all_nv_from_kver() {
local path local path
for path in "$source_tree"/*-*/dkms.conf; do for path in "$source_tree"/*-*/dkms.conf; do
if [[ -f "$path" && "$path" =~ ^$source_tree/([^/]+)-([^/]+)/dkms\.conf$ ]]; then if [[ -f "$path" && "$path" =~ ^$source_tree/([^/]+)-([^/]+)/dkms\.conf$ ]]; then
dkms_register "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "$1" echo "${BASH_REMATCH[1]}/${BASH_REMATCH[2]}"
fi fi
done done
} }
# register a dkms module to install/remove # list of modules/version for installed/built kernel version
# this function suppress echo call for a module # $1: kernel version
# $1: module name, $2: module version, $3: kernel version built_nv_from_kver() {
dkms_register() { local line
DKMS_MODULES["$1/$2/$3"]='' dkms status -k "$1" | while read -r line; do
if [[ "$line" =~ ^([^/]+/[^,]+)", $1, "[^:]+": "(built|installed) ]]; then
echo "${BASH_REMATCH[1]}"
fi
done
}
# list installed or built kernel version for a specific module version
# $1 : module name/module version
built_kver_from_nv() {
local line
dkms status "$1" | while read -r line; do
if [[ "$line" =~ ^"$1, "([^,]+)", "[^:]+": "(built|installed) ]]; then
echo "${BASH_REMATCH[1]}"
fi
done
} }
# install registered modules # install registered modules
dkms_install() { dkms_install() {
local nvk mod mver kver # list of modules to build for a specific kernel
local -i retry=1 local -A tobuild=()
local -A dmods=()
# add new/updated modules for all kernels to the build list
local nv kver
for nv in "${!DKMS_MODULES[@]}"; do
for kver in $(all_kver); do
tobuild["$nv/$kver"]=''
done
done
# add modules for new/updated kernels to the build list
for kver in "${!KERNEL_VERSIONS[@]}"; do
for nv in $(all_nv_from_kver "$kver"); do
tobuild["$nv/$kver"]=''
done
done
# list of kver which requires depmod refresh
local -A depmods=()
# let's build and install
local nvk mod mver
local -i retry=1
while (( $retry > 0 )); do while (( $retry > 0 )); do
retry=0 retry=0
for nvk in "${!DKMS_MODULES[@]}"; do for nvk in "${!tobuild[@]}"; do
[[ "$nvk" =~ ([^/]+)/([^/]+)/(.+) ]] [[ "$nvk" =~ ([^/]+)/([^/]+)/(.+) ]] || continue
mod="${BASH_REMATCH[1]}" mod="${BASH_REMATCH[1]}"
mver="${BASH_REMATCH[2]}" mver="${BASH_REMATCH[2]}"
kver="${BASH_REMATCH[3]}" kver="${BASH_REMATCH[3]}"
# do not build excluded modules # do not build excluded modules
if ! check_buildexclusive "$mod" "$mver" "$kver"; then if ! check_buildexclusive "$mod" "$mver" "$kver"; then
unset DKMS_MODULES[$nvk] unset tobuild[$nvk]
continue continue
# skip modules with missing kernel headers # skip modules with missing kernel headers
elif [[ ! -d "$install_tree/$kver/build/include" ]]; then elif [[ ! -d "$install_tree/$kver/build/include" ]]; then
DKMS_MODULES[$nvk]='Missing kernel headers' ERROR_MESSAGES+=("Missing $kver kernel headers for module $mod/$mver.")
unset tobuild[$nvk]
continue continue
# skip modules with missing kernel package # skip modules with missing kernel package
elif [[ ! -d "$install_tree/$kver/kernel" ]]; then elif [[ ! -d "$install_tree/$kver/kernel" ]]; then
DKMS_MODULES[$nvk]='Missing kernel modules tree' ERROR_MESSAGES+=("Missing $kver kernel modules tree for module $mod/$mver.")
unset tobuild[$nvk]
continue continue
# postpone modules with missing dependencies # postpone modules with missing dependencies
elif ! check_dependency "$mod" "$mver" "$kver"; then elif ! check_dependency "$mod" "$mver" "$kver"; then
DKMS_MODULES[$nvk]='Missing dependency'
continue continue
fi fi
# give it a try dkms # give it a try dkms
run dkms install --no-depmod -m "$mod" -v "$mver" -k "$kver" run dkms install --no-depmod "$mod/$mver" -k "$kver"
dmods[$kver]='' if (( $? == 0 )); then
unset DKMS_MODULES[$nvk] # register kernel version for later depmod
depmods[$kver]=''
fi
unset tobuild[$nvk]
# maybe this module was a dep of another, so we retry # maybe this module was a dep of another, so we retry
retry=1 retry=1
done done
done done
# run depmod later for performance improvments # run depmod later for performance improvments
if (( $DKMS_DEPMOD )); then if (( $DKMS_DEPMOD )); then
for kver in "${!dmods[@]}"; do for kver in "${!depmods[@]}"; do
run depmod "$kver" run depmod "$kver"
done done
fi fi
# add errors messages for missing dependencies modules
for nvk in "${!tobuild[@]}"; do
[[ "$nvk" =~ ([^/]+/[^/]+)/(.+) ]] || continue
nv="${BASH_REMATCH[1]}"
kver="${BASH_REMATCH[2]}"
ERROR_MESSAGES+=("Missing dependencies to install module $nv for kernel $kver.")
done
} }
# remove registered modules when built/installed # remove registered modules
# run depmod later for performance improvments # run depmod once per kernel for performance improvments
dkms_remove() { dkms_remove() {
local nvk mod mver kver state local nv kver
local -A dmods=() local -A depmods=()
for nvk in "${!DKMS_MODULES[@]}"; do # remove full modules first
[[ "$nvk" =~ ([^/]+)/([^/]+)/(.+) ]] for nv in "${!DKMS_MODULES[@]}"; do
mod="${BASH_REMATCH[1]}" # try to remove modules one by one to keep the depmod optimization
mver="${BASH_REMATCH[2]}" for kver in $(built_kver_from_nv "$nv"); do
kver="${BASH_REMATCH[3]}" run dkms remove --no-depmod "$nv" -k "$kver"
# do not remove excluded modules (n.b. display not found errors)
if ! check_buildexclusive "$mod" "$mver" "$kver"; then
unset DKMS_MODULES[$nvk]
continue
fi
state=$(dkms status -m "$mod" -v "$mver" -k "$kver")
if [[ "$state" =~ "$mod/$mver, $kver, "[^:]+": "(added|built|installed) ]]; then
dmods[$kver]=''
run dkms remove --no-depmod -m "$mod" -v "$mver" -k "$kver"
if (( $? == 0 )); then if (( $? == 0 )); then
unset DKMS_MODULES[$nvk] # register kernel version for later depmod
depmods[$kver]=''
else else
DKMS_MODULES[$nvk]='dkms remove failed' ERROR_MESSAGES+=("Failed to remove module $nv for kernel $kver.")
fi fi
else done
DKMS_MODULES[$nvk]='Not found in dkms status output' # ensure module removal (even if only added)
if [[ $(dkms status "$nv") ]]; then
run dkms remove "$nv"
(( $? == 0 )) || ERROR_MESSAGES+=("Failed to remove module $nv.")
fi fi
done done
# remove modules for a specific kernel version
for kver in "${!KERNEL_VERSIONS[@]}"; do
for nv in $(built_nv_from_kver "$kver"); do
run dkms remove --no-depmod "$nv" -k "$kver"
if (( $? == 0 )); then
# register kernel version for later depmod
depmods[$kver]=''
else
ERROR_MESSAGES+=("Failed to remove module $nv for kernel $kver.")
fi
done
done
# run depmod later for performance improvments # run depmod later for performance improvments
if (( $DKMS_DEPMOD )); then if (( $DKMS_DEPMOD )); then
for kver in "${!dmods[@]}"; do for kver in "${!depmods[@]}"; do
run depmod "$kver" run depmod "$kver"
done done
fi fi
} }
# show information about failed modules
show_errors() {
local nvk mod kver
for nvk in "${!DKMS_MODULES[@]}"; do
mod=${nvk%/*}
kver=${nvk##*/}
echo "==> Unable to $DKMS_ACTION module $mod for kernel $kver: ${DKMS_MODULES[$nvk]}."
done
}
# display hook usage and exit $1 (default 1) # display hook usage and exit $1 (default 1)
usage() { usage() {
cat << EOF >&2 cat << EOF >&2
@ -191,7 +230,7 @@ main() {
# prevent each dkms call from failing with authorization errors # prevent each dkms call from failing with authorization errors
if (( EUID )); then if (( EUID )); then
echo 'You must be root to use this hook' >&2 echo 'You must be root to use this hook' >&2
exit 1 return 1
fi fi
# parse command line options # parse command line options
@ -206,10 +245,9 @@ main() {
shift $((OPTIND - 1)) shift $((OPTIND - 1))
(( $# != 1 )) && usage (( $# != 1 )) && usage
# register DKMS action # parse command action to early exit
case "$1" in case "$1" in
install|remove) install|remove) declare -r DKMS_ACTION="$1";;
declare -r DKMS_ACTION="$1";;
*) usage;; *) usage;;
esac esac
@ -223,27 +261,41 @@ main() {
local path local path
for path in "$source_tree" "$install_tree"; do for path in "$source_tree" "$install_tree"; do
if [[ ! -d "$path" ]]; then if [[ ! -d "$path" ]]; then
echo "==> Missing mandatory directory: $path. Exiting!" echo "==> Missing mandatory directory: $path. Exiting!" >&2
return 1 return 1
fi fi
done done
# storage for DKMS modules to install/remove # global storage for changed DKMS modules
# we use associate arrays to prevent duplicate # we use associate arrays to prevent duplication
# the key is <module name>/<module version>/<kernel version>
declare -A DKMS_MODULES declare -A DKMS_MODULES
# parse stdin paths to guess what do do # global storage for changed linux kernels
# we use associate arrays to prevent duplication
declare -A KERNEL_VERSIONS
# global storage for error messages
declare -a ERROR_MESSAGES
# parse stdin paths to guess what we should install/remove
while read -r path; do while read -r path; do
if [[ "/$path" =~ ^$source_tree/([^/]+)-([^/]+)/dkms\.conf$ ]]; then if [[ "/$path" =~ ^$source_tree/([^/]+)-([^/]+)/dkms\.conf$ ]]; then
parse_module "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" # we match file updates on dkms modules sources
DKMS_MODULES["${BASH_REMATCH[1]}/${BASH_REMATCH[2]}"]=''
elif [[ "/$path" =~ ^$install_tree/([^/]+)/ ]]; then elif [[ "/$path" =~ ^$install_tree/([^/]+)/ ]]; then
parse_kernel "${BASH_REMATCH[1]}" # we match file updates on kernels install/removal
KERNEL_VERSIONS["${BASH_REMATCH[1]}"]=''
fi fi
done done
dkms_$DKMS_ACTION dkms_$DKMS_ACTION
show_errors # display errors at the end, to maximize readers
local msg
for msg in "${ERROR_MESSAGES[@]}"; do
echo "==> ERROR: $msg" >&2
done
return 0 return 0
} }

View File

@ -9,5 +9,5 @@ Target = usr/lib/modules/*/modules.alias
Description = Remove upgraded DKMS modules Description = Remove upgraded DKMS modules
Depends = dkms Depends = dkms
When = PreTransaction When = PreTransaction
Exec = /usr/lib/dkms/alpm-hook -D remove Exec = /usr/share/libalpm/scripts/dkms -D remove
NeedsTargets NeedsTargets