Compare commits
92 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1af058e32f | ||
|
|
6e2e136a06 | ||
|
|
6b9840e4cb | ||
|
|
4b3dba68e8 | ||
|
|
a2453a1952 | ||
|
|
b3edcbf9d6 | ||
|
|
cf850ea1cf | ||
|
|
0f81ee97a5 | ||
|
|
c61b1e942a | ||
|
|
240db1cd7b | ||
|
|
66ea9d2986 | ||
|
|
eaea3e58bc | ||
|
|
39f5c4ac3d | ||
|
|
148ee639b5 | ||
|
|
28c1a86a0c | ||
|
|
a9123f8dde | ||
|
|
2264680063 | ||
|
|
df57f906eb | ||
|
|
72be62cfea | ||
|
|
2cb3604727 | ||
|
|
5910d31329 | ||
|
|
0f60c336b4 | ||
|
|
30b19c9d63 | ||
|
|
459cc0478d | ||
|
|
0a8324122a | ||
|
|
027d626014 | ||
|
|
96aa636698 | ||
|
|
9008a32c7d | ||
|
|
efa36b601a | ||
|
|
f46d3e8522 | ||
|
|
5683c50270 | ||
|
|
35e1f2fc73 | ||
|
|
c39c0162a0 | ||
|
|
7cd7d838cf | ||
|
|
c2b1f3e458 | ||
|
|
653ec7d086 | ||
|
|
510e0c8261 | ||
|
|
6a6920aed2 | ||
|
|
0c336570df | ||
|
|
e9cc0440fd | ||
|
|
5df3d6d58b | ||
|
|
491a3411df | ||
|
|
9d75b962fc | ||
|
|
0c32043719 | ||
|
|
05ce41491c | ||
|
|
9e9dc09cda | ||
|
|
891b09a028 | ||
|
|
90757faf53 | ||
|
|
cd7e9e8a2f | ||
|
|
297a5b711f | ||
|
|
4eeb063077 | ||
|
|
7945a35005 | ||
|
|
c8c9d28cff | ||
|
|
d3674971b2 | ||
|
|
5964ba5c17 | ||
|
|
29c8ac1bcc | ||
|
|
e9f4351c7f | ||
|
|
94d61f4448 | ||
|
|
e7874d56d5 | ||
|
|
a844ef825b | ||
|
|
fbb2188fca | ||
|
|
5785e58c40 | ||
|
|
06b9df7abc | ||
|
|
87a94493b5 | ||
|
|
f218d75450 | ||
|
|
52ba5a74f2 | ||
|
|
1208dd48a6 | ||
|
|
39342dd4d2 | ||
|
|
75651f97bb | ||
|
|
4fcfdefddb | ||
|
|
54f4c6637e | ||
|
|
94c911bd0a | ||
|
|
ce2a205fbd | ||
|
|
956da198f9 | ||
|
|
cfaf1a56f7 | ||
|
|
bbee85c732 | ||
|
|
2571351ab3 | ||
|
|
ff35c47e25 | ||
|
|
a83ea7823d | ||
|
|
6a73d7992a | ||
|
|
b4645cd8aa | ||
|
|
a4aed2feef | ||
|
|
9d55967f9e | ||
|
|
ae5f1cd645 | ||
|
|
97ccf1649f | ||
|
|
2a946ba85a | ||
|
|
581680855a | ||
|
|
40474999ce | ||
|
|
6b98812de6 | ||
|
|
1ecae1d45e | ||
|
|
cc5344c96d | ||
|
|
38767e4902 |
21 changed files with 971 additions and 207 deletions
78
README.md
78
README.md
|
|
@ -1,3 +1,79 @@
|
|||
# kernel-srpm-macros
|
||||
|
||||
The kernel-srpm-macros package
|
||||
The kernel-srpm-macros package
|
||||
|
||||
This source package results in two "binary" packages, kernel-rpm-macros
|
||||
and kernel-srpm-macros. The role and locations of files is as follows:
|
||||
|
||||
kernel-srpm-macros:
|
||||
|
||||
/usr/lib/rpm/fileattrs/kmod.attr
|
||||
For /lib/modules/XYZ/modules.builtin and .../MODULE.ko.XYZ
|
||||
specifies a Lua script to generate kmod(MODULE.ko)
|
||||
"Provides:" deps
|
||||
/usr/lib/rpm/macros.d/macros.kernel-srpm
|
||||
Automatically included by all rpm invocations.
|
||||
Defines %kernel_arches (try rpm --eval '%kernel_arches')
|
||||
Question: what uses this macro? I didn't find any users.
|
||||
|
||||
kernel-rpm-macros:
|
||||
|
||||
/usr/lib/rpm/redhat/find-provides.ksyms
|
||||
Runs from rpmbuild at the end of kernel builds and 3rd party module
|
||||
builds, to extract
|
||||
kernel(SYMBOL)=0xHASH "Provides:" deps from modules in kernel packages,
|
||||
and ksym(SYMBOL)=0xHASH for 3rd party modules.
|
||||
Takes input list of files on stdin.
|
||||
/usr/lib/rpm/fileattrs/provided_ksyms.attr
|
||||
For newer rpmbuild with "internal dependency generators",
|
||||
this file specifies that find-provides.ksyms should be run
|
||||
only on .ko.XYZ files
|
||||
(with "external dependency generators", the script needs to
|
||||
filter out the files by itself).
|
||||
|
||||
/usr/lib/rpm/redhat/find-requires.ksyms
|
||||
?
|
||||
/usr/lib/rpm/fileattrs/required_ksyms.attr
|
||||
For newer rpmbuild with "internal dependency generators",
|
||||
this file specifies that find-requires.ksyms should be run
|
||||
only on .ko.XYZ files, and not for /lib/modules/XYZ/kernel/*
|
||||
(IOW: only for building 3rd-party modules)
|
||||
|
||||
/usr/lib/rpm/redhat/find-provides.d/modalias.prov
|
||||
Runs from rpmbuild at the end of kernel builds and 3rd party module
|
||||
builds, to extract
|
||||
modalias(pci:SOMETHING)=OPTIONALLY_VERSION "Provides:" deps from modules
|
||||
in kernel and 3rd party modules packages.
|
||||
Takes input list of files on stdin.
|
||||
Question: what uses these deps?
|
||||
/usr/lib/rpm/fileattrs/modalias.attr
|
||||
For newer rpmbuild with "internal dependency generators",
|
||||
this file specifies that modalias.prov should be run
|
||||
only on .ko.XYZ files
|
||||
|
||||
/usr/lib/rpm/redhat/find-provides.d/firmware.prov
|
||||
?
|
||||
|
||||
/usr/lib/rpm/kabi.sh
|
||||
Runs from rpmbuild at the end of kernel build to extract
|
||||
kernel(SYMBOL)=0xHASH "Provides:" deps.
|
||||
/usr/lib/rpm/fileattrs/kabi.attr
|
||||
For newer rpmbuild with "internal dependency generators",
|
||||
this file specifies that kabi.sh should be run on
|
||||
/boot/symvers-* and /lib/modules/XYZ/symvers.gz
|
||||
|
||||
/usr/lib/rpm/macros.d/macros.kmp
|
||||
Automatically included by all rpm invocations.
|
||||
Defines a number of macros.
|
||||
|
||||
/usr/lib/rpm/redhat/brp-kmod-restore-perms
|
||||
?
|
||||
/usr/lib/rpm/redhat/brp-kmod-set-exec-bit
|
||||
?
|
||||
|
||||
/usr/lib/rpm/redhat/kmodtool
|
||||
?
|
||||
/usr/lib/rpm/redhat/rpmsort
|
||||
?
|
||||
/usr/lib/rpm/redhat/symset-table
|
||||
?
|
||||
|
|
|
|||
28
brp-kmod-restore-perms
Executable file
28
brp-kmod-restore-perms
Executable file
|
|
@ -0,0 +1,28 @@
|
|||
#! /bin/bash -efu
|
||||
|
||||
## A counterpart of brp-kmod-set-exec-bits that restores original kmod
|
||||
## file permissions
|
||||
|
||||
# If using normal root, avoid changing anything.
|
||||
[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != "/" ] || exit 0
|
||||
|
||||
# Checking for required programs
|
||||
which chmod >/dev/null || exit 0
|
||||
|
||||
[ -r "$RPM_BUILD_ROOT/kmod-permissions.list" ] || exit 0
|
||||
|
||||
while read perm path; do
|
||||
[ -n "$perm" ] || continue
|
||||
|
||||
# Account for possible kernel module compression
|
||||
[ -e "$RPM_BUILD_ROOT/$path" ] || {
|
||||
[ \! -e "$RPM_BUILD_ROOT/$path.gz" ] || path="$path.gz"
|
||||
[ \! -e "$RPM_BUILD_ROOT/$path.bz2" ] || path="$path.bz2"
|
||||
[ \! -e "$RPM_BUILD_ROOT/$path.xz" ] || path="$path.xz"
|
||||
[ \! -e "$RPM_BUILD_ROOT/$path.zst" ] || path="$path.zst"
|
||||
}
|
||||
|
||||
chmod "$perm" "$RPM_BUILD_ROOT/$path"
|
||||
done < "$RPM_BUILD_ROOT/kmod-permissions.list"
|
||||
|
||||
rm -f "$RPM_BUILD_ROOT/kmod-permissions.list"
|
||||
14
brp-kmod-set-exec-bit
Executable file
14
brp-kmod-set-exec-bit
Executable file
|
|
@ -0,0 +1,14 @@
|
|||
#! /bin/bash -efux
|
||||
|
||||
## A hack for making brp-strip taking into account kmod files
|
||||
|
||||
# If using normal root, avoid changing anything.
|
||||
[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != "/" ] || exit 0
|
||||
|
||||
# Checking for required programs
|
||||
which find chmod >/dev/null || exit 0
|
||||
|
||||
find "$RPM_BUILD_ROOT" \
|
||||
-name '*.ko' \
|
||||
-printf '%#m %P\n' \
|
||||
-exec chmod u+x '{}' \; > "$RPM_BUILD_ROOT/kmod-permissions.list"
|
||||
|
|
@ -1,24 +1,138 @@
|
|||
#! /bin/bash
|
||||
|
||||
IFS=$'\n'
|
||||
export LC_ALL=C
|
||||
|
||||
for module in $(grep -E '/lib/modules/.+\.ko$'); do
|
||||
if [[ -n $(nm $module | sed -r -ne 's:^0*([0-9a-f]+) A __crc_(.+):0x\1 \2:p') ]]; then
|
||||
nm $module \
|
||||
| sed -r -ne 's:^0*([0-9a-f]+) A __crc_(.+):0x\1 \2:p' \
|
||||
| awk --non-decimal-data '{printf("ksym(%s) = 0x%08x\n", $2, $1)}' \
|
||||
| LC_ALL=C sort -u
|
||||
else
|
||||
ELFRODATA=$(readelf -R .rodata $module | awk '/0x/{printf $2$3$4$5}')
|
||||
if [[ -n $(readelf -h $module | grep "little endian") ]]; then
|
||||
RODATA=$(echo $ELFRODATA | sed 's/\(..\)\(..\)\(..\)\(..\)/\4\3\2\1/g')
|
||||
else
|
||||
RODATA=$ELFRODATA
|
||||
fi
|
||||
for sym in $(nm $module | sed -r -ne 's:^0*([0-9a-f]+) R __crc_(.+):0x\1 \2:p'); do
|
||||
echo $sym $RODATA
|
||||
done \
|
||||
| awk --non-decimal-data '{printf("ksym(%s) = 0x%08s\n", $2, substr($3,($1*2)+1,8))}' \
|
||||
| LC_ALL=C sort -u
|
||||
# Prevent elfutils from trying to download debuginfos
|
||||
unset DEBUGINFOD_URLS
|
||||
|
||||
for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do
|
||||
dep_pfx="ksym"
|
||||
# For built-in kmods, "kernel()" syntax is used instead of "ksym()"
|
||||
printf "%s" "$module" | grep -v "^${RPM_BUILD_ROOT}/\?lib/modules/[1-9][^/]*/kernel" > /dev/null \
|
||||
|| dep_pfx="kernel"
|
||||
|
||||
tmpfile=""
|
||||
if [ "x${module%.ko}" = "x${module}" ]; then
|
||||
tmpfile=$(mktemp -t ${0##*/}.XXXXXX.ko)
|
||||
proc_bin=
|
||||
case "${module##*.}" in
|
||||
zst)
|
||||
proc_bin=zstd
|
||||
;;
|
||||
xz)
|
||||
proc_bin=xz
|
||||
;;
|
||||
bz2)
|
||||
proc_bin=bzip2
|
||||
;;
|
||||
gz)
|
||||
proc_bin=gzip
|
||||
;;
|
||||
esac
|
||||
|
||||
[ -n "$proc_bin" ] || continue
|
||||
|
||||
"$proc_bin" -d -c - < "$module" > "$tmpfile" || continue
|
||||
module="$tmpfile"
|
||||
fi
|
||||
done
|
||||
|
||||
# A modversion can be stored as an ELF symbol in various ways:
|
||||
# - An immediate symbol whose value is available directly; it shows up
|
||||
# in the nm or objdump -t output, for example:
|
||||
# $ nm mlx5_core_5.14.x86_64.ko | grep '__crc_' | head -n 3
|
||||
# 0000000092f175ca A __crc_mlx5_access_reg
|
||||
# 000000005b88c9f1 A __crc_mlx5_add_flow_rules
|
||||
# 00000000e7c0ec8a A __crc_mlx5_alloc_bfreg
|
||||
# $ objdump -t lib/modules/mlx5_core_5.14.x86_64.ko | grep __crc_ | sort -k 5,5 | head -n 3
|
||||
# 0000000092f175ca g *ABS* 0000000000000000 __crc_mlx5_access_reg
|
||||
# 000000005b88c9f1 g *ABS* 0000000000000000 __crc_mlx5_add_flow_rules
|
||||
# 00000000e7c0ec8a g *ABS* 0000000000000000 __crc_mlx5_alloc_bfreg
|
||||
# $ zgrep mlx5_access_reg ./lib/modules/5.14.0-284.15.1.el9_2.x86_64/symvers.gz
|
||||
# 0x92f175ca mlx5_access_reg drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL_GPL
|
||||
# This approach was being used on x86 and arm before Linux 5.19,
|
||||
# for example.
|
||||
#
|
||||
# - A globally or locally visible symbol in a read-only (or not;
|
||||
# sometimes .rodata is not a read-only section, after all, as binutils
|
||||
# commit binutils-2_33~1385 has revealed (and binutils-2_35~1768 hasn't
|
||||
# concealed back)) section (historically .rodata, __kcrctab/__kcrctab_gpl
|
||||
# since Linux v5.19-rc1~139^2~2):
|
||||
# $ nm mlx5_core_5.14.s390x.ko | grep '__crc_' | head -n 3
|
||||
# 0000000000002f7c R __crc_mlx5_access_reg
|
||||
# 0000000000003304 R __crc_mlx5_add_flow_rules
|
||||
# 0000000000002d2c R __crc_mlx5_alloc_bfreg
|
||||
# This layout is used on ppc since Linux v4.10-rc7~15^2~1, for example,
|
||||
# and on all architectures since Linux 5.19. To extract the symbol
|
||||
# versions in this case, we get the offset and the section name
|
||||
# from the "objdump -t" output:
|
||||
# $ objdump -t lib/modules/mlx5_core_5.14.s390x.ko | grep '__crc_' | sort -k 5,5 | head -n 2
|
||||
# 0000000000002f7c g .rodata 0000000000000000 __crc_mlx5_access_reg
|
||||
# 0000000000003304 g .rodata 0000000000000000 __crc_mlx5_add_flow_rules
|
||||
# and the section contents from the "readelf -R" call:
|
||||
# $ readelf -R .rodata mlx5_core_5.14.s390x.ko
|
||||
# [... skipped output ...]
|
||||
# 0x00002f70 6c6f635f 6e6f6465 00000000 ed6560a8 loc_node.....e`.
|
||||
# ^^^^^^^^
|
||||
# comparison with the contents
|
||||
# of lib/modules/5.14.0-284.15.1.el9_2.s390x/symvers.gz corroborates
|
||||
# its correctness:
|
||||
# 0xed6560a8 mlx5_access_reg drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL_GPL
|
||||
# As mentioned earlier, for the later kernel versions, __kcrctab{,_gpl}
|
||||
# sections are used:
|
||||
# $ objdump -t lib/modules/mlx5_core_6.4.x86_64.ko | grep '__crc_' | sort -k 5,5 | head -n 2
|
||||
# 0000000000000000 l __kcrctab_gpl 0000000000000000 __crc_mlx5_access_reg
|
||||
# 0000000000000090 l __kcrctab 0000000000000000 __crc_mlx5_add_flow_rules
|
||||
# $ readelf -R __kcrctab_gpl mlx5_core_6.4.x86_64.ko
|
||||
# 0x00000000 38b0d3c3 1840ce35 b99babc7 70b4700c 8....@.5....p.p.
|
||||
# ^^^^^^^^
|
||||
# and in lib/modules/6.4.0-0.rc1.20230511git80e62bc8487b.19.eln126.x86_64/symvers.xz
|
||||
# we see that it is correct (when accounted for the little endianness):
|
||||
# 0xc3d3b038 mlx5_access_reg drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL_GPL
|
||||
# This data, after some post-processing, can be used in the awk script
|
||||
# that extracts parts of the section according to the offsets got
|
||||
# from the "objdump -t" output.
|
||||
objdump -t "$module" \
|
||||
| awk \
|
||||
-v 'dep_pfx='"$dep_pfx" \
|
||||
-v 'module='"$module" \
|
||||
--non-decimal-data \
|
||||
'BEGIN { revbytes = 0 }
|
||||
|
||||
function check_endianness( t) {
|
||||
if (revbytes) return revbytes;
|
||||
|
||||
revbytes = -1;
|
||||
while (("readelf -h \"" module "\"" | getline t) > 0) {
|
||||
if (match(t, /^ Data: *2\047s complement, little endian$/)) {
|
||||
revbytes = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return revbytes;
|
||||
}
|
||||
|
||||
function readsect(name, a, t) {
|
||||
a = "";
|
||||
while (("readelf -R \"" name "\" \"" module "\"" | getline t) > 0) {
|
||||
if (match(t, /^ 0x[0-9a-f]{8}/))
|
||||
a = a substr(t, 14, 8) substr(t, 23, 8) substr(t, 32, 8) substr(t, 41, 8);
|
||||
}
|
||||
if (check_endianness() == 1)
|
||||
a = gensub(/(..)(..)(..)(..)/, "\\4\\3\\2\\1", "g", a);
|
||||
sectdata[name] = a;
|
||||
}
|
||||
|
||||
match($0, /^([0-9a-f]+) [gl]...... (.*) [0-9a-f]+ __crc_(.*)$/, a) {
|
||||
if (a[2] == "*ABS*") {
|
||||
printf("%s(%s) = 0x%08x\n", dep_pfx, a[3], strtonum("0x" a[1]));
|
||||
} else {
|
||||
if (!(a[2] in sectdata)) { readsect(a[2]) }
|
||||
printf("%s(%s) = 0x%08s\n", dep_pfx, a[3], substr(sectdata[a[2]], (strtonum("0x" a[1]) * 2) + 1, 8))
|
||||
}
|
||||
}'
|
||||
|
||||
[ -z "$tmpfile" ] || rm -f -- "$tmpfile"
|
||||
done \
|
||||
| sort -k1,1 -u
|
||||
|
|
|
|||
|
|
@ -1,27 +1,87 @@
|
|||
#! /bin/bash
|
||||
#
|
||||
# This script is called during external module building to create dependencies
|
||||
# both upon the RHEL kernel, and on additional external modules. Symbols that
|
||||
# cannot be reconciled against those provided by the kernel are assumed to be
|
||||
# provided by an external module and "ksym" replaces th regular "kernel" dep.
|
||||
|
||||
IFS=$'\n'
|
||||
export LC_ALL=C
|
||||
|
||||
# Prevent elfutils from trying to download debuginfos
|
||||
unset DEBUGINFOD_URLS
|
||||
|
||||
# Extract all of the symbols provided by this module.
|
||||
all_provides() {
|
||||
if [[ -n $(nm "$@" | sed -r -ne 's:^0*([0-9a-f]+) A __crc_(.+):0x\1 \2:p') ]]; then
|
||||
nm "$@" \
|
||||
| sed -r -ne 's:^0*([0-9a-f]+) A __crc_(.+):0x\1 \2:p' \
|
||||
| awk --non-decimal-data '{printf("0x%08x\t%s\n", $1, $2)}' \
|
||||
| LC_ALL=C sort -k2,2 -u
|
||||
else
|
||||
ELFRODATA=$(readelf -R .rodata "$@" | awk '/0x/{printf $2$3$4$5}')
|
||||
if [[ -n $(readelf -h "$@" | grep "little endian") ]]; then
|
||||
RODATA=$(echo $ELFRODATA | sed 's/\(..\)\(..\)\(..\)\(..\)/\4\3\2\1/g')
|
||||
else
|
||||
RODATA=$ELFRODATA
|
||||
for module in "$@"; do
|
||||
tmpfile=""
|
||||
if [ "x${module%.ko}" = "x${module}" ]; then
|
||||
tmpfile=$(mktemp -t ${0##*/}.XXXXXX.ko)
|
||||
proc_bin=
|
||||
case "${module##*.}" in
|
||||
zst)
|
||||
proc_bin=zstd
|
||||
;;
|
||||
xz)
|
||||
proc_bin=xz
|
||||
;;
|
||||
bz2)
|
||||
proc_bin=bzip2
|
||||
;;
|
||||
gz)
|
||||
proc_bin=gzip
|
||||
;;
|
||||
esac
|
||||
|
||||
[ -n "$proc_bin" ] || continue
|
||||
|
||||
"$proc_bin" -d -c - < "$module" > "$tmpfile" || continue
|
||||
module="$tmpfile"
|
||||
fi
|
||||
for sym in $(nm "$@" | sed -r -ne 's:^0*([0-9a-f]+) R __crc_(.+):0x\1 \2:p'); do
|
||||
echo $sym $RODATA
|
||||
done \
|
||||
| awk --non-decimal-data '{printf("0x%08s\t%s\n", substr($3,($1*2)+1,8), $2)}' \
|
||||
| LC_ALL=C sort -k2,2 -u
|
||||
fi
|
||||
|
||||
objdump -t "$module" \
|
||||
| awk \
|
||||
-v 'dep_pfx='"$dep_pfx" \
|
||||
-v 'module='"$module" \
|
||||
--non-decimal-data \
|
||||
'BEGIN { revbytes = 0 }
|
||||
|
||||
function check_endianness( t) {
|
||||
if (revbytes) return revbytes;
|
||||
|
||||
revbytes = -1;
|
||||
while (("readelf -h \"" module "\"" | getline t) > 0) {
|
||||
if (match(t, /^ Data: *2\047s complement, little endian$/)) {
|
||||
revbytes = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return revbytes;
|
||||
}
|
||||
|
||||
function readsect(name, a, t) {
|
||||
a = "";
|
||||
while (("readelf -R \"" name "\" \"" module "\"" | getline t) > 0) {
|
||||
if (match(t, /^ 0x[0-9a-f]{8}/))
|
||||
a = a substr(t, 14, 8) substr(t, 23, 8) substr(t, 32, 8) substr(t, 41, 8);
|
||||
}
|
||||
if (revbytes) { a = gensub(/(..)(..)(..)(..)/, "\\4\\3\\2\\1", "g", a); }
|
||||
sectdata[name] = a;
|
||||
}
|
||||
|
||||
match($0, /^([0-9a-f]+) [gl]...... (.*) [0-9a-f]+ __crc_(.*)$/, a) {
|
||||
if (a[2] == "*ABS*") {
|
||||
printf("%s(%s) = 0x%08x\n", dep_pfx, a[3], strtonum("0x" a[1]));
|
||||
} else {
|
||||
if (!(a[2] in sectdata)) { readsect(a[2]) }
|
||||
printf("%s(%s) = 0x%08s\n", dep_pfx, a[3], substr(sectdata[a[2]], (strtonum("0x" a[1]) * 2) + 1, 8))
|
||||
}
|
||||
}'
|
||||
|
||||
[ -z "$tmpfile" ] || rm -f -- "$tmpfile"
|
||||
done \
|
||||
| sort -k1,1 -u
|
||||
}
|
||||
|
||||
# Extract all of the requirements of this module.
|
||||
|
|
@ -31,18 +91,18 @@ all_requires() {
|
|||
/sbin/modprobe --dump-modversions "$module" \
|
||||
| awk --non-decimal-data '
|
||||
BEGIN { FS = "\t" ; OFS = "\t" }
|
||||
{printf("0x%08x\t%s\n", $1, $2)}' \
|
||||
{printf("%s:0x%08x\n", $2, $1)}' \
|
||||
| sed -r -e 's:$:\t'"$1"':'
|
||||
done \
|
||||
| LC_ALL=C sort -k2,2 -u
|
||||
| sort -k1,1 -u
|
||||
}
|
||||
|
||||
# Filter out requirements fulfilled by the module itself.
|
||||
mod_requires() {
|
||||
LC_ALL=C join -t $'\t' -j 2 -v 1 \
|
||||
join -t $'\t' -j 1 -v 1 \
|
||||
<(all_requires "$@") \
|
||||
<(all_provides "$@") \
|
||||
| LC_ALL=C sort -k1,1 -u
|
||||
| sort -k1,1 -u
|
||||
}
|
||||
|
||||
if ! [ -e /sbin/modinfo -a -e /sbin/modprobe ]; then
|
||||
|
|
@ -50,7 +110,50 @@ if ! [ -e /sbin/modinfo -a -e /sbin/modprobe ]; then
|
|||
exit 0
|
||||
fi
|
||||
|
||||
modules=($(grep -E '/lib/modules/.+\.ko$'))
|
||||
check_kabi() {
|
||||
arch=$(uname -m)
|
||||
kabi_file="/lib/modules/kabi-current/kabi_stablelist_$arch"
|
||||
|
||||
# If not installed, output a warning and return (continue)
|
||||
if [ ! -f "$kabi_file" ]; then
|
||||
echo "" >&2
|
||||
echo "********************************************************************************" >&2
|
||||
echo "*********************** KERNEL ABI COMPATIBILITY WARNING ***********************" >&2
|
||||
echo "********************************************************************************" >&2
|
||||
echo "The kernel ABI reference files (provided by "kabi-stablelists") were not found." >&2
|
||||
echo "No compatibility check was performed. Please install the kABI reference files" >&2
|
||||
echo "and rebuild if you would like to verify compatibility with kernel ABI." >&2
|
||||
echo "" >&2
|
||||
return
|
||||
fi
|
||||
|
||||
unset non_kabi
|
||||
for symbol in "$@"; do
|
||||
if ! egrep "^[[:space:]]$symbol\$" $kabi_file >/dev/null; then
|
||||
non_kabi=("${non_kabi[@]}" "$symbol")
|
||||
fi
|
||||
done
|
||||
|
||||
if [ ${#non_kabi[@]} -gt 0 ]; then
|
||||
echo "" >&2
|
||||
echo "********************************************************************************" >&2
|
||||
echo "*********************** KERNEL ABI COMPATIBILITY WARNING ***********************" >&2
|
||||
echo "********************************************************************************" >&2
|
||||
echo "The following kernel symbols are not guaranteed to remain compatible with" >&2
|
||||
echo "future kernel updates to this RHEL release:" >&2
|
||||
echo "" >&2
|
||||
for symbol in "${non_kabi[@]}"; do
|
||||
printf "\t$symbol\n" >&2
|
||||
done
|
||||
echo "" >&2
|
||||
echo "Red Hat recommends that you consider using only official kernel ABI symbols" >&2
|
||||
echo "where possible. Requests for additions to the kernel ABI can be filed with" >&2
|
||||
echo "your partner or customer representative (component: driver-update-program)." >&2
|
||||
echo "" >&2
|
||||
fi
|
||||
}
|
||||
|
||||
modules=($(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@")
|
||||
if [ ${#modules[@]} -gt 0 ]; then
|
||||
kernel=$(/sbin/modinfo -F vermagic "${modules[0]}" | sed -e 's: .*::' -e q)
|
||||
|
||||
|
|
@ -59,16 +162,27 @@ if [ ${#modules[@]} -gt 0 ]; then
|
|||
|
||||
cat /usr/src/kernels/$kernel/Module.symvers | awk '
|
||||
BEGIN { FS = "\t" ; OFS = "\t" }
|
||||
{ print $2 "\t" $1 }
|
||||
{ print $2 ":" $1 }
|
||||
' \
|
||||
| sed -r -e 's:$:\t'"$kernel"':' \
|
||||
| LC_ALL=C sort -k1,1 -u > $symvers
|
||||
| sort -k1,1 -u > $symvers
|
||||
|
||||
# Symbols matching with the kernel get a "kernel" dependency
|
||||
LC_ALL=C join -t $'\t' -j 1 $symvers <(mod_requires "${modules[@]}") | LC_ALL=C sort -u \
|
||||
| awk '{ FS = "\t" ; OFS = "\t" } { print "kernel(" $1 ") = " $2 }'
|
||||
mod_req=$(mktemp -t mod_req.XXXXX)
|
||||
mod_requires "${modules[@]}" > "$mod_req"
|
||||
join -t $'\t' -j 1 $symvers "$mod_req" | sort -u \
|
||||
| awk 'BEGIN { FS = "[\t:]" ; OFS = "\t" } { print "kernel(" $1 ") = " $2 }'
|
||||
|
||||
# Symbols from elsewhere get a "ksym" dependency
|
||||
LC_ALL=C join -t $'\t' -j 1 -v 2 $symvers <(mod_requires "${modules[@]}") | LC_ALL=C sort -u \
|
||||
| awk '{ FS = "\t" ; OFS = "\t" } { print "ksym(" $1 ") = " $2 }'
|
||||
join -t $'\t' -j 1 -v 2 $symvers "$mod_req" | sort -u \
|
||||
| awk 'BEGIN { FS = "[\t:]" ; OFS = "\t" } { print "ksym(" $1 ") = " $2 }'
|
||||
|
||||
os_id=$(sed -nr '/^ID[[:space:]]*=/{ s/ID[[:space:]]*=[[:space:]]*//; s/^"(.*)"$/\1/; p }' /etc/os-release)
|
||||
if [ "rhel" = "$os_id" ]; then
|
||||
# Check kABI if the kabi-stablelists package is installed
|
||||
# Do this last so we can try to output this error at the end
|
||||
kabi_check_symbols=($(join -t $'\t' -j 1 $symvers "$mod_req" | sort -u \
|
||||
| awk 'BEGIN { FS = "[\t:]" ; OFS = "\t" } { print $1 }'))
|
||||
check_kabi "${kabi_check_symbols[@]}"
|
||||
fi
|
||||
fi
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
IFS=$'\n'
|
||||
|
||||
for module in $(grep -E '/lib/modules/.+\.ko$') $*;
|
||||
for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') $*;
|
||||
do
|
||||
for firmware in `/sbin/modinfo -F firmware $module`;
|
||||
do
|
||||
|
|
|
|||
2
kabi.attr
Normal file
2
kabi.attr
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
%__kabi_provides %{_rpmconfigdir}/kabi.sh
|
||||
%__kabi_path ^(/boot/symvers-.*|/lib/modules/[1-9].*/symvers)\.(gz|xz)$
|
||||
22
kabi.sh
Normal file
22
kabi.sh
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
#!/bin/bash +x
|
||||
#
|
||||
# kabi.sh - Automatically extract any kernel symbol checksum from the
|
||||
# symvers file and add to RPM deps. This is used to move the
|
||||
# checksum checking from modprobe to rpm install for 3rd party
|
||||
# modules (so they can fail during install and not at load).
|
||||
|
||||
IFS=$'\n'
|
||||
|
||||
for symvers in $(grep -E '(/boot/symvers-.*|/lib/modules/[1-9].*/symvers)\.(gz|xz)') "$@";
|
||||
do
|
||||
cat_prog="cat"
|
||||
case "$symvers" in
|
||||
*.gz) cat_prog="zcat" ;;
|
||||
*.xz) cat_prog="xzcat" ;;
|
||||
esac
|
||||
|
||||
# We generate dependencies only for symbols exported by vmlinux itself
|
||||
# and not for kmods here as they are spread across subpackages,
|
||||
# so Provides: generation for kmods is handled by find-provides.ksyms.
|
||||
"$cat_prog" "$symvers" | awk '/[^ ]* [^ ]* vmlinux .*/ { print "kernel(" $2 ") = " $1 }'
|
||||
done
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
Name: kernel-srpm-macros
|
||||
Version: 1.0
|
||||
Release: 6%{?dist}
|
||||
# when bumping version and resetting release, don't forget to bump version of kernel-rpm-macros as well
|
||||
Release: 27%{?dist}
|
||||
Summary: RPM macros that list arches the full kernel is built on
|
||||
# This package only exist in Fedora repositories
|
||||
# The license is the standard (MIT) specified in
|
||||
|
|
@ -10,17 +11,23 @@ License: MIT
|
|||
URL: https://src.fedoraproject.org/rpms/kernel-srpm-macros
|
||||
BuildArch: noarch
|
||||
# We are now the ones shipping kmod.attr
|
||||
Conflicts: redhat-rpm-config <= 186
|
||||
Conflicts: redhat-rpm-config < 205
|
||||
# macros.kmp, kmodtool and rpmsort were moved from kernel-rpm-macros
|
||||
# to kernel-srpm-macros in 1.0-9/185-9
|
||||
Conflicts: kernel-rpm-macros < 205
|
||||
|
||||
# Macros
|
||||
Source0: macros.kernel-srpm
|
||||
Source1: macros.kmp
|
||||
|
||||
# Dependency generator scripts (deprecated)
|
||||
# Dependency generator scripts
|
||||
Source100: find-provides.ksyms
|
||||
Source101: find-requires.ksyms
|
||||
Source102: firmware.prov
|
||||
Source103: modalias.prov
|
||||
Source104: provided_ksyms.attr
|
||||
Source105: required_ksyms.attr
|
||||
Source106: modalias.attr
|
||||
|
||||
# Dependency generators & their rules
|
||||
Source200: kmod.attr
|
||||
|
|
@ -30,6 +37,14 @@ Source300: kmodtool
|
|||
Source301: rpmsort
|
||||
Source302: symset-table
|
||||
|
||||
# kabi provides generator
|
||||
Source400: kabi.attr
|
||||
Source401: kabi.sh
|
||||
|
||||
# BRPs
|
||||
Source500: brp-kmod-set-exec-bit
|
||||
Source501: brp-kmod-restore-perms
|
||||
|
||||
%global rrcdir /usr/lib/rpm/redhat
|
||||
|
||||
|
||||
|
|
@ -39,10 +54,27 @@ the full kernel is built on.
|
|||
The variable to use is kernel_arches.
|
||||
|
||||
%package -n kernel-rpm-macros
|
||||
Version: 185
|
||||
Release: %{release}%{?dist}.1
|
||||
Version: 205
|
||||
Summary: Macros and scripts for building kernel module packages
|
||||
Requires: redhat-rpm-config >= 13
|
||||
# rpmsort is GPL-2.0-or-later
|
||||
License: MIT AND GPL-2.0-or-later
|
||||
Requires: redhat-rpm-config >= 205
|
||||
|
||||
# for brp-kmod-compress
|
||||
Requires: %{_bindir}/xz
|
||||
# for brp-kmod-compress, brp-kmod-set-exec-bit
|
||||
Requires: %{_bindir}/find
|
||||
# for find-provides.ksyms, find-requires.ksyms, kmodtool
|
||||
Requires: %{_bindir}/sed
|
||||
# for find-provides.ksyms, find-requires.ksyms
|
||||
Requires: %{_bindir}/awk
|
||||
Requires: %{_bindir}/grep
|
||||
Requires: %{_bindir}/nm
|
||||
Requires: %{_bindir}/objdump
|
||||
Requires: %{_bindir}/readelf
|
||||
# for find-requires.ksyms
|
||||
Requires: %{_sbindir}/modinfo
|
||||
Requires: %{_sbindir}/modprobe
|
||||
|
||||
%description -n kernel-rpm-macros
|
||||
Macros and scripts for building kernel module packages.
|
||||
|
|
@ -62,7 +94,7 @@ cp -p %{sources} .
|
|||
mkdir -p %{buildroot}/%{_rpmconfigdir}/macros.d
|
||||
install -p -m 0644 -t %{buildroot}/%{_rpmconfigdir}/macros.d macros.kernel-srpm
|
||||
%if 0%{?rhel} >= 8
|
||||
sed -i 's/^%%kernel_arches.*/%%kernel_arches x86_64 s390x ppc64le aarch64/' \
|
||||
sed -i 's/^%%kernel_arches.*/%%kernel_arches x86_64 s390x ppc64le aarch64 riscv64/' \
|
||||
%{buildroot}/%{_rpmconfigdir}/macros.d/macros.kernel-srpm
|
||||
%endif
|
||||
|
||||
|
|
@ -71,9 +103,15 @@ mkdir -p %{buildroot}%{_fileattrsdir}
|
|||
install -p -m 755 -t %{buildroot}%{rrcdir} kmodtool rpmsort symset-table
|
||||
install -p -m 755 -t %{buildroot}%{rrcdir} find-provides.ksyms find-requires.ksyms
|
||||
install -p -m 755 -t %{buildroot}%{rrcdir}/find-provides.d firmware.prov modalias.prov
|
||||
install -p -m 755 -t %{buildroot}%{rrcdir} brp-kmod-restore-perms brp-kmod-set-exec-bit
|
||||
install -p -m 644 -t %{buildroot}%{_rpmconfigdir}/macros.d macros.kmp
|
||||
install -p -m 644 -t %{buildroot}%{_fileattrsdir} kmod.attr
|
||||
|
||||
install -p -m 644 -t "%{buildroot}%{_fileattrsdir}" kabi.attr
|
||||
install -p -m 755 -t "%{buildroot}%{_rpmconfigdir}" kabi.sh
|
||||
|
||||
install -p -m 644 -t "%{buildroot}%{_fileattrsdir}" provided_ksyms.attr required_ksyms.attr
|
||||
install -p -m 644 -t "%{buildroot}%{_fileattrsdir}" modalias.attr
|
||||
|
||||
%files
|
||||
%{_rpmconfigdir}/macros.d/macros.kernel-srpm
|
||||
|
|
@ -81,16 +119,96 @@ install -p -m 644 -t %{buildroot}%{_fileattrsdir} kmod.attr
|
|||
|
||||
%files -n kernel-rpm-macros
|
||||
%{_rpmconfigdir}/macros.d/macros.kmp
|
||||
%{_rpmconfigdir}/kabi.sh
|
||||
%{_fileattrsdir}/kabi.attr
|
||||
%{_fileattrsdir}/modalias.attr
|
||||
%{_fileattrsdir}/provided_ksyms.attr
|
||||
%{_fileattrsdir}/required_ksyms.attr
|
||||
%dir %{rrcdir}/find-provides.d
|
||||
%{rrcdir}/kmodtool
|
||||
%{rrcdir}/rpmsort
|
||||
%{rrcdir}/brp-kmod-restore-perms
|
||||
%{rrcdir}/brp-kmod-set-exec-bit
|
||||
%{rrcdir}/symset-table
|
||||
%{rrcdir}/find-provides.ksyms
|
||||
%{rrcdir}/find-requires.ksyms
|
||||
%{rrcdir}/find-provides.d/firmware.prov
|
||||
%{rrcdir}/find-provides.d/modalias.prov
|
||||
%{rrcdir}/kmodtool
|
||||
%{rrcdir}/rpmsort
|
||||
|
||||
%changelog
|
||||
* Thu Jul 24 2025 Fedora Release Engineering <releng@fedoraproject.org> - 1.0-27
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild
|
||||
|
||||
* Tue Apr 01 2025 Andrea Bolognani <abologna@redhat.com> - 1.0-26
|
||||
- Finish adding riscv64 (thanks Zhengyu He)
|
||||
|
||||
* Fri Jan 17 2025 Fedora Release Engineering <releng@fedoraproject.org> - 1.0-25
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild
|
||||
|
||||
* Thu Jul 18 2024 Fedora Release Engineering <releng@fedoraproject.org> - 1.0-24
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild
|
||||
|
||||
* Wed Mar 06 2024 David Abdurachmanov <davidlt@rivosinc.com> - 1.0-23
|
||||
- Add riscv64
|
||||
|
||||
* Wed Jan 24 2024 Fedora Release Engineering <releng@fedoraproject.org> - 1.0-22
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
|
||||
|
||||
* Sun Jan 21 2024 Fedora Release Engineering <releng@fedoraproject.org> - 1.0-21
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
|
||||
|
||||
* Thu Jul 20 2023 Fedora Release Engineering <releng@fedoraproject.org> - 1.0-20
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
|
||||
|
||||
* Tue May 09 2023 Eugene Syromiatnikov <esyr@redhat.com> - 1.0-19
|
||||
- Capture local __crc_* symbols for "Provides: kernel()".
|
||||
- Add support for XZ compression for the symvers file.
|
||||
- Fix "Provides: kernel()" generation when both __kcrctab and __kcrctab_gpl
|
||||
are present.
|
||||
- Fix regression for "Provides:" generation in cases when modversions are stored
|
||||
in a section that is over 64K in size.
|
||||
- Speedup and cleanup changes in find-provides.ksyms and find-requires.ksyms.
|
||||
- Fix regex usage in kmod.attr. (Denys Vlasenko)
|
||||
- Implement modalias "Provides:" grouping. (Denys Vlasenko)
|
||||
- Speedup and cleanup changes in modalias.prov and kmod.attr. (Denys Vlasenko)
|
||||
|
||||
* Tue Mar 30 2023 Eugene Syromiatnikov <esyr@redhat.com> - 1.0-18
|
||||
- Avoid triggering debuginfod during elfutils tools usage.
|
||||
|
||||
* Tue Jan 31 2023 Eugene Syromiatnikov <esyr@redhat.com> - 1.0-17
|
||||
- Support storing of __crc_* symbols in sections other than .rodata.
|
||||
- Work around a change in type of __crc_* symbols for some kmods printed by nm
|
||||
on ppc64le and s390x.
|
||||
|
||||
* Thu Jan 19 2023 Fedora Release Engineering <releng@fedoraproject.org> - 1.0-16
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
|
||||
|
||||
* Thu Jul 21 2022 Fedora Release Engineering <releng@fedoraproject.org> - 1.0-15
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
|
||||
|
||||
* Thu Jan 20 2022 Fedora Release Engineering <releng@fedoraproject.org> - 1.0-14
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
|
||||
|
||||
* Thu Nov 18 2021 Miro Hrončok <mhroncok@redhat.com> - 1.0-13
|
||||
- Bump kernel-rpm-macros to 205 to provide clear upgrade path
|
||||
|
||||
* Thu Nov 18 2021 Miro Hrončok <mhroncok@redhat.com> - 1.0-12
|
||||
- Correct conflicts to redhat-rpm-macros < 205
|
||||
- Move Perl scripts back to kernel-rpm-macros to avoid Perl in the default buildroot
|
||||
|
||||
* Thu Nov 18 2021 Eugene Syromiatnikov <esyr@redhat.com> - 1.0-11
|
||||
- Add conflicts of redhat-rpm-macros < 204 as macros.kmp, kmodtool,
|
||||
and rpmsort were moved from the latter to the former.
|
||||
- Remove RHEL-specific kABI bits from find-requires.ksyms and macros.kmp.
|
||||
|
||||
* Thu Nov 18 2021 Eugene Syromiatnikov <esyr@redhat.com> - 1.0-10
|
||||
- Add conflicts of kernel-srpm-macros with kernel-rpm-macros < 185-9
|
||||
as macros.kmp, kmodtool, and rpmsort were moved from the latter
|
||||
to the former.
|
||||
|
||||
* Thu Nov 18 2021 Eugene Syromiatnikov <esyr@redhat.com> - 1.0-9
|
||||
- Update scripts with RHEL-specific changes.
|
||||
|
||||
* Thu Jul 22 2021 Fedora Release Engineering <releng@fedoraproject.org> - 1.0-6
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
|
||||
|
||||
|
|
|
|||
47
kmod.attr
47
kmod.attr
|
|
@ -1,21 +1,54 @@
|
|||
%__kmod_path ^/lib/modules/.*/(modules.builtin|.*ko)
|
||||
%__kmod_path ^/lib/modules/.*/(modules.builtin|.*\.ko|.*\.ko\.gz|.*\.ko\.bz2|.*\.ko\.xz|.*\.ko\.zst)$
|
||||
|
||||
# Notes on Lua:
|
||||
# The backslash in strings (like "\n" newline) needs to be doubled
|
||||
# because we are inside rpm macro. Single backslashes before most chars
|
||||
# disappear (removed by rpm's parser), so "\n" turns into just "n".
|
||||
# In string.gsub patterns, unlike regexps, backslash has no special meaning.
|
||||
# It can't escape . and such. (Use one-character set [.] to represent
|
||||
# literal period, or lua's percent escape: %.)
|
||||
# Pipe (|) has no special meaning too.
|
||||
|
||||
%__kmod_provides() %{lua:
|
||||
function basename(fn)
|
||||
return string.gsub(fn, "(.*/)(.*)", "%2")
|
||||
local b = string.gsub(fn, ".*/", "")
|
||||
-- the above adjusts gsub() result to 1 value
|
||||
-- "return f()" construct would return _all_ values, two in case of gsub()
|
||||
return b
|
||||
end
|
||||
function strip_compress_sfx(fn)
|
||||
local cnt
|
||||
fn, cnt = string.gsub(fn, "%.gz$", "")
|
||||
if cnt == 1 then return fn; end
|
||||
fn, cnt = string.gsub(fn, "%.bz2$", "")
|
||||
if cnt == 1 then return fn; end
|
||||
fn, cnt = string.gsub(fn, "%.xz$", "")
|
||||
if cnt == 1 then return fn; end
|
||||
fn, cnt = string.gsub(fn, "%.zst$", "")
|
||||
return fn
|
||||
end
|
||||
function printdep(mod)
|
||||
print("kmod("..mod..")")
|
||||
print("kmod("..mod..") ")
|
||||
end
|
||||
local fn = rpm.expand("%{1}")
|
||||
local fn = rpm.expand("%1")
|
||||
local bn = basename(fn)
|
||||
if bn == "modules.builtin" then
|
||||
for l in io.lines(fn) do
|
||||
printdep(basename(l))
|
||||
local builtin_mod = basename(l)
|
||||
printdep(builtin_mod)
|
||||
local nocompr = strip_compress_sfx(builtin_mod)
|
||||
if nocompr ~= builtin_mod then
|
||||
printdep(nocompr)
|
||||
end
|
||||
end
|
||||
else
|
||||
local mod = string.match(bn, "%g+.ko")
|
||||
local mod = string.match(bn, "%g+%.ko")
|
||||
if mod then
|
||||
printdep(mod)
|
||||
printdep(mod)
|
||||
local nocompr = strip_compress_sfx(mod)
|
||||
if nocompr ~= mod then
|
||||
printdep(nocompr)
|
||||
end
|
||||
end
|
||||
end
|
||||
}
|
||||
|
|
|
|||
247
kmodtool
247
kmodtool
|
|
@ -1,7 +1,12 @@
|
|||
#!/bin/bash
|
||||
|
||||
# kmodtool - Helper script for building kernel module RPMs
|
||||
# Copyright (c) 2003-2006 Ville Skyttä <ville.skytta@iki.fi>,
|
||||
# An original version appeared in Fedora. This version is
|
||||
# generally called only by the %kernel_module_package RPM macro
|
||||
# during the process of building Driver Update Packages (which
|
||||
# are also known as "kmods" in the Fedora community).
|
||||
#
|
||||
# Copyright (c) 2003-2010 Ville Skyttä <ville.skytta@iki.fi>,
|
||||
# Thorsten Leemhuis <fedora@leemhuis.info>
|
||||
# Jon Masters <jcm@redhat.com>
|
||||
#
|
||||
|
|
@ -24,34 +29,43 @@
|
|||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
# Changelog:
|
||||
#
|
||||
# 2010/07/28 - Add fixes for filelists in line with LF standard
|
||||
# - Remove now defunct "framepointer" kernel variant
|
||||
# - Change version to "rhel6-rh2" as a consequence.
|
||||
#
|
||||
# 2010/01/10 - Simplified for RHEL6. We are working on upstream
|
||||
# moving to a newer format and in any case do not
|
||||
# need to retain support for really old systems.
|
||||
|
||||
shopt -s extglob
|
||||
|
||||
myprog="kmodtool"
|
||||
myver="0.10.10_kmp2"
|
||||
knownvariants=@(BOOT|PAE|@(big|huge)mem|debug|enterprise|kdump|?(large)smp|uml|xen[0U]?(-PAE)|xen)
|
||||
myver="0.10.10_rhel9"
|
||||
knownvariants=@(debug|kdump|zfcpdump)
|
||||
kmod_name=
|
||||
kver=
|
||||
verrel=
|
||||
variant=
|
||||
kmp=
|
||||
|
||||
get_verrel ()
|
||||
{
|
||||
verrel=${1:-$(uname -r)}
|
||||
verrel=${verrel%%$knownvariants}
|
||||
verrel=${verrel/%[.+]$knownvariants/}
|
||||
}
|
||||
|
||||
print_verrel ()
|
||||
{
|
||||
get_verrel $@
|
||||
get_verrel "$@"
|
||||
echo "${verrel}"
|
||||
}
|
||||
|
||||
get_variant ()
|
||||
{
|
||||
get_verrel $@
|
||||
get_verrel "$@"
|
||||
variant=${1:-$(uname -r)}
|
||||
variant=${variant##$verrel}
|
||||
variant=${variant/#$verrel?(.+)/}
|
||||
variant=${variant:-'""'}
|
||||
}
|
||||
|
||||
|
|
@ -61,117 +75,176 @@ print_variant ()
|
|||
echo "${variant}"
|
||||
}
|
||||
|
||||
# Detect flavor separator character. We have to do that due to
|
||||
# a systemd-tailored patch for kernel spec[1][2] introduced in Fedora and then
|
||||
# imported in RHEL 8 that broke all OOT kmod infrastructure for the flavored
|
||||
# kernels.
|
||||
#
|
||||
# [1] https://lists.fedoraproject.org/pipermail/kernel/2013-June/004262.html
|
||||
# [2] https://src.fedoraproject.org/rpms/kernel/c/faf25207dc86666a611c45ae3ffaf385c170bd2a
|
||||
#
|
||||
# $1 - kver
|
||||
# $2 - variant
|
||||
get_variant_char ()
|
||||
{
|
||||
variant="$2"
|
||||
[ "$variant" != "default" ] || variant=""
|
||||
|
||||
get_verrel "$1"
|
||||
|
||||
variant_char=""
|
||||
[ -n "$variant" ] || return 0
|
||||
|
||||
# We expect that the flavored kernel is already installed in the buildroot
|
||||
variant_char="+"
|
||||
[ -e "/usr/src/kernels/${verrel}+${variant}" ] && return 0
|
||||
|
||||
variant_char="."
|
||||
}
|
||||
|
||||
print_variant_char ()
|
||||
{
|
||||
get_variant_char "$@"
|
||||
echo "${variant_char}"
|
||||
}
|
||||
|
||||
print_kernel_source ()
|
||||
{
|
||||
get_variant_char "$@"
|
||||
echo "/usr/src/kernels/${verrel}${variant_char}${variant}"
|
||||
}
|
||||
|
||||
get_filelist() {
|
||||
local IFS=$'\n'
|
||||
filelist=($(cat))
|
||||
|
||||
if [ ${#filelist[@]} -gt 0 ];
|
||||
then
|
||||
for ((n = 0; n < ${#filelist[@]}; n++));
|
||||
do
|
||||
line="${filelist[n]}"
|
||||
line=$(echo "$line" \
|
||||
| sed -e "s/%verrel/$verrel/g" \
|
||||
| sed -e "s/%variant/$variant/g" \
|
||||
| sed -e "s/%dashvariant/$dashvariant/g" \
|
||||
| sed -e "s/%dotvariant/$dotvariant/g" \
|
||||
| sed -e "s/\+%1/$dotvariant/g" \
|
||||
| sed -e "s/\.%1/$dotvariant/g" \
|
||||
| sed -e "s/\-%1/$dotvariant/g" \
|
||||
| sed -e "s/%2/$verrel/g")
|
||||
echo "$line"
|
||||
done
|
||||
else
|
||||
echo "%defattr(644,root,root,755)"
|
||||
echo "/lib/modules/${verrel}${dotvariant}"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
get_rpmtemplate ()
|
||||
{
|
||||
local variant="${1}"
|
||||
|
||||
get_variant_char "${verrel}" "${variant}"
|
||||
|
||||
local dashvariant="${variant:+-${variant}}"
|
||||
case "$verrel" in
|
||||
*.el*) kdep="kernel${dashvariant}-%{_target_cpu} = ${verrel}" ;;
|
||||
*.EL*) kdep="kernel${dashvariant}-%{_target_cpu} = ${verrel}" ;;
|
||||
*) kdep="kernel-%{_target_cpu} = ${verrel}${variant}" ;;
|
||||
esac
|
||||
local dotvariant="${variant:+${variant_char}${variant}}"
|
||||
|
||||
echo "%package -n kmod-${kmod_name}${dashvariant}"
|
||||
|
||||
if [ -z "$kmp_provides_summary" ]; then
|
||||
if [ -z "$kmod_provides_summary" ]; then
|
||||
echo "Summary: ${kmod_name} kernel module(s)"
|
||||
fi
|
||||
|
||||
if [ -z "$kmp_provides_group" ]; then
|
||||
if [ -z "$kmod_provides_group" ]; then
|
||||
echo "Group: System Environment/Kernel"
|
||||
fi
|
||||
|
||||
if [ ! -z "$kmp_version" ]; then
|
||||
echo "Version: %{kmp_version}"
|
||||
if [ ! -z "$kmod_version" ]; then
|
||||
echo "Version: %{kmod_version}"
|
||||
fi
|
||||
|
||||
if [ ! -z "$kmp_release" ]; then
|
||||
echo "Release: %{kmp_release}"
|
||||
fi
|
||||
|
||||
if [ ! -z "$kmp" ]; then
|
||||
echo "%global _use_internal_dependency_generator 0"
|
||||
if [ ! -z "$kmod_release" ]; then
|
||||
echo "Release: %{kmod_release}"
|
||||
fi
|
||||
|
||||
cat <<EOF
|
||||
Provides: kernel-modules = ${verrel}${variant}
|
||||
Provides: kernel-modules >= ${verrel}${dotvariant}
|
||||
Provides: kernel${dashvariant}-modules >= ${verrel}
|
||||
Provides: ${kmod_name}-kmod = %{?epoch:%{epoch}:}%{version}-%{release}
|
||||
Requires(post): /usr/sbin/depmod
|
||||
Requires(postun): /usr/sbin/depmod
|
||||
Requires(post): /usr/sbin/weak-modules
|
||||
Requires(postun): /usr/sbin/weak-modules
|
||||
EOF
|
||||
|
||||
if [ -z "$kmp" ]; then
|
||||
echo "Requires: ${kdep}"
|
||||
if [ "yes" != "$nobuildreqs" ]
|
||||
then
|
||||
cat <<EOF
|
||||
BuildRequires: kernel${dashvariant}-devel
|
||||
BuildRequires: kernel-abi-stablelists
|
||||
BuildRequires: redhat-rpm-config kernel-rpm-macros
|
||||
BuildRequires: elfutils-libelf-devel kmod
|
||||
EOF
|
||||
fi
|
||||
|
||||
#
|
||||
# RHEL5 - Remove common package requirement on general kmod packages.
|
||||
# Requires: ${kmod_name}-kmod-common >= %{?epoch:%{epoch}:}%{version}
|
||||
#
|
||||
|
||||
cat <<EOF
|
||||
Requires(post): /sbin/depmod
|
||||
Requires(postun): /sbin/depmod
|
||||
EOF
|
||||
|
||||
if [ "no" != "$kmp_nobuildreqs" ]
|
||||
then
|
||||
echo "BuildRequires: kernel${dashvariant}-devel-%{_target_cpu} = ${verrel}"
|
||||
fi
|
||||
|
||||
if [ "" != "$kmp_override_preamble" ]
|
||||
then
|
||||
cat "$kmp_override_preamble"
|
||||
fi
|
||||
if [ "" != "$override_preamble" ]
|
||||
then
|
||||
cat "$override_preamble"
|
||||
fi
|
||||
|
||||
cat <<EOF
|
||||
%description -n kmod-${kmod_name}${dashvariant}
|
||||
This package provides the ${kmod_name} kernel modules built for the Linux
|
||||
kernel ${verrel}${variant} for the %{_target_cpu} family of processors.
|
||||
This package provides the ${kmod_name} kernel modules built for
|
||||
the Linux kernel ${verrel}${dotvariant} for the %{_target_cpu}
|
||||
family of processors.
|
||||
EOF
|
||||
|
||||
##############################################################################
|
||||
## The following are not part of this script directly, they are scripts ##
|
||||
## that will be executed by RPM during various stages of package processing ##
|
||||
##############################################################################
|
||||
|
||||
cat <<EOF
|
||||
%post -n kmod-${kmod_name}${dashvariant}
|
||||
if [ -e "/boot/System.map-${verrel}${variant}" ]; then
|
||||
/sbin/depmod -aeF "/boot/System.map-${verrel}${variant}" "${verrel}${variant}" > /dev/null || :
|
||||
if [ -e "/boot/System.map-${verrel}${dotvariant}" ]; then
|
||||
/usr/sbin/depmod -aeF "/boot/System.map-${verrel}${dotvariant}" "${verrel}${dotvariant}" > /dev/null || :
|
||||
fi
|
||||
|
||||
modules=( \$(find /lib/modules/${verrel}${dotvariant}/extra/${kmod_name} | grep -E '\.ko(\.gz|\.bz2|\.xz|\.zst)?$') )
|
||||
if [ -x "/usr/sbin/weak-modules" ]; then
|
||||
printf '%s\n' "\${modules[@]}" \
|
||||
| /usr/sbin/weak-modules --add-modules
|
||||
fi
|
||||
EOF
|
||||
|
||||
if [ ! -z "$kmp" ]; then
|
||||
cat <<EOF
|
||||
|
||||
modules=( \$(find /lib/modules/${verrel}${variant}/extra/${kmod_name}) )
|
||||
if [ -x "/sbin/weak-modules" ]; then
|
||||
printf '%s\n' "\${modules[@]}" \
|
||||
| /sbin/weak-modules --add-modules
|
||||
fi
|
||||
cat <<EOF
|
||||
%preun -n kmod-${kmod_name}${dashvariant}
|
||||
rpm -ql kmod-${kmod_name}${dashvariant} | grep '\.ko$' \
|
||||
> /var/run/rpm-kmod-${kmod_name}${dashvariant}-modules
|
||||
rpm -ql kmod-${kmod_name}${dashvariant}-%{kmod_version}-%{kmod_release}.$(arch) | grep -E '\.ko(\.gz|\.bz2|\.xz|\.zst)?$' > /var/run/rpm-kmod-${kmod_name}${dashvariant}-modules
|
||||
EOF
|
||||
|
||||
fi
|
||||
|
||||
cat <<EOF
|
||||
cat <<EOF
|
||||
%postun -n kmod-${kmod_name}${dashvariant}
|
||||
/sbin/depmod -aF /boot/System.map-${verrel}${variant} ${verrel}${variant} &> /dev/null || :
|
||||
EOF
|
||||
if [ -e "/boot/System.map-${verrel}${dotvariant}" ]; then
|
||||
/usr/sbin/depmod -aeF "/boot/System.map-${verrel}${dotvariant}" "${verrel}${dotvariant}" > /dev/null || :
|
||||
fi
|
||||
|
||||
if [ ! -z "$kmp" ]; then
|
||||
cat <<EOF
|
||||
modules=( \$(cat /var/run/rpm-kmod-${kmod_name}${dashvariant}-modules) )
|
||||
#rm /var/run/rpm-kmod-${kmod_name}${dashvariant}-modules
|
||||
if [ -x "/sbin/weak-modules" ]; then
|
||||
rm /var/run/rpm-kmod-${kmod_name}${dashvariant}-modules
|
||||
if [ -x "/usr/sbin/weak-modules" ]; then
|
||||
printf '%s\n' "\${modules[@]}" \
|
||||
| /sbin/weak-modules --remove-modules
|
||||
| /usr/sbin/weak-modules --remove-modules
|
||||
fi
|
||||
EOF
|
||||
fi
|
||||
|
||||
echo "%files -n kmod-${kmod_name}${dashvariant}"
|
||||
|
||||
if [ "" == "$kmp_override_filelist" ];
|
||||
if [ "" == "$override_filelist" ];
|
||||
then
|
||||
echo "%defattr(644,root,root,755)"
|
||||
echo "/lib/modules/${verrel}${variant}/"
|
||||
echo "/lib/firmware/"
|
||||
echo "/lib/modules/${verrel}${dotvariant}"
|
||||
else
|
||||
cat "$kmp_override_filelist"
|
||||
cat "$override_filelist" | get_filelist
|
||||
fi
|
||||
}
|
||||
|
||||
|
|
@ -214,10 +287,12 @@ Usage: ${myprog} <command> <option>+
|
|||
- Get "base" version-release.
|
||||
variant <uname>
|
||||
- Get variant from uname.
|
||||
variant_char <uname> <variant>
|
||||
- Get kernel variant separator character.
|
||||
kernel_source <uname> <variant>
|
||||
- Get path to kernel source directory.
|
||||
rpmtemplate <mainpgkname> <uname> <variants>
|
||||
- Return a template for use in a source RPM
|
||||
rpmtemplate_kmp <mainpgkname> <uname> <variants>
|
||||
- Return a template for use in a source RPM with KMP dependencies
|
||||
version
|
||||
- Output version number and exit.
|
||||
EOF
|
||||
|
|
@ -228,12 +303,22 @@ while [ "${1}" ] ; do
|
|||
case "${1}" in
|
||||
verrel)
|
||||
shift
|
||||
print_verrel $@
|
||||
print_verrel "$@"
|
||||
exit $?
|
||||
;;
|
||||
variant)
|
||||
shift
|
||||
print_variant $@
|
||||
print_variant "$@"
|
||||
exit $?
|
||||
;;
|
||||
variant_char)
|
||||
shift
|
||||
print_variant_char "$@"
|
||||
exit $?
|
||||
;;
|
||||
kernel_source)
|
||||
shift
|
||||
print_kernel_source "$@"
|
||||
exit $?
|
||||
;;
|
||||
rpmtemplate)
|
||||
|
|
@ -241,12 +326,6 @@ while [ "${1}" ] ; do
|
|||
print_rpmtemplate "$@"
|
||||
exit $?
|
||||
;;
|
||||
rpmtemplate_kmp)
|
||||
shift
|
||||
kmp=1
|
||||
print_rpmtemplate "$@"
|
||||
exit $?
|
||||
;;
|
||||
version)
|
||||
echo "${myprog} ${myver}"
|
||||
exit 0
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
# kernel_arches lists what arches the full kernel is built for.
|
||||
|
||||
%kernel_arches x86_64 s390x ppc64le aarch64 %{arm}
|
||||
%kernel_arches x86_64 s390x ppc64le aarch64 %{arm} riscv64
|
||||
|
|
|
|||
77
macros.kmp
77
macros.kmp
|
|
@ -2,50 +2,81 @@
|
|||
redhat_kernel_module_package 1
|
||||
kernel_module_package_release 1
|
||||
|
||||
%__find_provides /usr/lib/rpm/redhat/find-provides
|
||||
%__find_requires /usr/lib/rpm/redhat/find-requires
|
||||
redhat_kmp_has_post_hooks 1
|
||||
|
||||
%__brp_kmod_set_exec_bit /usr/lib/rpm/redhat/brp-kmod-set-exec-bit
|
||||
%__brp_kmod_restore_perms /usr/lib/rpm/redhat/brp-kmod-restore-perms
|
||||
|
||||
%__kmod_brps_added 0
|
||||
|
||||
#kernel_module_package [ -n name ] [ -v version ] [ -r release ] [ -s script ]
|
||||
# [ -f filelist] [ -x ] [ -p preamble ] flavor flavor ...
|
||||
|
||||
%kernel_module_package_buildreqs %global kmodtool_generate_buildreqs 1 \
|
||||
kernel-devel
|
||||
kernel-devel redhat-rpm-config kernel-rpm-macros elfutils-libelf-devel kmod
|
||||
|
||||
%kernel_module_package(n:v:r:s:f:xp:) %{expand:%( \
|
||||
%define kmodtool %{-s*}%{!-s:/usr/lib/rpm/redhat/kmodtool} \
|
||||
%define kmp_version %{-v*}%{!-v:%{version}} \
|
||||
%define kmp_release %{-r*}%{!-r:%{release}} \
|
||||
%define latest_kernel %(rpm -q --qf '%{VERSION}-%{RELEASE}\\\\n' `rpm -q kernel-devel | /usr/lib/rpm/redhat/rpmsort -r | head -n 1` | head -n 1) \
|
||||
## An ugly hack: we want kmods to be processed by find-debuginfo,
|
||||
## but it processes only files with executable permission set.
|
||||
## It is important now since, as of now, if debuginfo package
|
||||
## is enabled (and it is enabled), there's an RPM build error
|
||||
## as a result of lack of ether absence or emptiness of
|
||||
## debugsourcefiles.list (which is likely a bug in RPM, but it looks
|
||||
## like that there's no obvious fix and apparently no one have
|
||||
## any issues with this).
|
||||
## In order to minimise intrusiveness, usually (in Red Hat-built kmod
|
||||
## RPMs) *.ko files just have executable permission being set as a part
|
||||
## of %build section. There are two caveats with kmp, however:
|
||||
## * We have no control over %build section itself (and it wasn't
|
||||
## required previously)
|
||||
## * Changing the criteria used in find-debuginfo.sh/brp-strip
|
||||
## for selecting files that have to undergo debug section separation
|
||||
## may introduce regression.
|
||||
## As a result, we insert additional hooks in __spec_install_post
|
||||
## (__brp_kmod_set_exec_bit in the beginning and
|
||||
## __brp_kmod_restore_perms in the end) that (temporarily) set
|
||||
## executable permission for *.ko files so find-debuginfo.sh will pick
|
||||
## them up.
|
||||
## Unfortunately, __spec_install_post's body is copied here since
|
||||
## we want that __debug_package macro expansion has been performed
|
||||
## lazily and it looks like RPM has no ability to provide a body
|
||||
## of a macro verbatim.
|
||||
if [ 0 = "%{__kmod_brps_added}" ]; then \
|
||||
echo "%%global __spec_install_post \\\\" \
|
||||
echo " %%{?__brp_kmod_set_exec_bit} \\\\" \
|
||||
echo " %%%%{?__debug_package:%%%%{__debug_install_post}} \\\\" \
|
||||
echo " %%{__arch_install_post} \\\\" \
|
||||
echo " %%{__os_install_post} \\\\" \
|
||||
echo " %%{?__brp_kmod_pre_sign_process} \\\\" \
|
||||
echo " %%{?__brp_kmod_sign} \\\\" \
|
||||
echo " %%{?__brp_kmod_post_sign_process} \\\\" \
|
||||
echo " %%{?__brp_kmod_compress} \\\\" \
|
||||
echo " %%{?__brp_kmod_post_compress_process} \\\\" \
|
||||
echo " %%{?__brp_kmod_restore_perms} \\\\" \
|
||||
echo "%%{nil}" \
|
||||
fi \
|
||||
%global __kmod_brps_added 1 \
|
||||
%global kmodtool %{-s*}%{!-s:/usr/lib/rpm/redhat/kmodtool} \
|
||||
%global kmod_version %{-v*}%{!-v:%{version}} \
|
||||
%global kmod_release %{-r*}%{!-r:%{release}} \
|
||||
%global latest_kernel %({ rpm -q --qf '%%{VERSION}-%%{RELEASE}.%%{ARCH}\\\\n' kernel-rt-devel kernel-aarch64-devel kernel-devel | grep -v 'is not installed' | /usr/lib/rpm/redhat/rpmsort -r | head -n 1; echo '%%%%{nil}'; } | head -n 1) \
|
||||
%{!?kernel_version:%{expand:%%global kernel_version %{latest_kernel}}} \
|
||||
%global kverrel %(%{kmodtool} verrel %{?kernel_version} 2>/dev/null) \
|
||||
flavors="default" \
|
||||
if [ "i686" == "%{_target_cpu}" ] || [ "x86_64" == "%{_target_cpu}" ] \
|
||||
then \
|
||||
xenver=$(rpm -q kernel-xen-devel-%{kverrel}|head -n 1)\
|
||||
kdver=$(rpm -q kernel-kdump-devel-%{kverrel}|head -n 1)\
|
||||
if [ "kernel-xen-devel-%{kverrel}" == "$xenver" ] \
|
||||
then \
|
||||
flavors="$flavors xen" \
|
||||
fi \
|
||||
if [ "kernel-kdump-devel-%{kverrel}" == "$kdver" ] \
|
||||
then \
|
||||
flavors="$flavors kdump" \
|
||||
fi \
|
||||
fi \
|
||||
if [ -z "%*" ]; then \
|
||||
flavors_to_build=$flavors \
|
||||
elif [ -z "%{-x}" ]; then \
|
||||
flavors_to_build="%*" \
|
||||
else \
|
||||
flavors_to_build=" $flavors "\
|
||||
echo "[$flavors_to_build]" >/tmp/tmp.txt
|
||||
for i in %* \
|
||||
do \
|
||||
flavors_to_build=${flavors_to_build//$i /}
|
||||
done \
|
||||
fi \
|
||||
echo "%%global flavors_to_build ${flavors_to_build:-%%nil}" \
|
||||
echo "%%global kernel_source() /usr/src/kernels/%kverrel.\\\$([ %%%%{1} = default ] || echo "%%%%{1}.")%_target_cpu" \
|
||||
echo "%%global kernel_source() \\\$([ default = \"%%%%{1}\" ] && echo \"/usr/src/kernels//%%%%kverrel\" || %{kmodtool} kernel_source \"%%%%{kverrel}\" \"%%%%{1}\" 2>/dev/null || { ls -Ud \"/usr/src/kernels///%%%%{kverrel}\"[.+]\"%%%%{1}\" | sort -V | tail -n 1; } || echo \"/usr/src/kernels////%%%%kverrel.%%%%1\")" \
|
||||
echo "%%global kernel_module_package_moddir() extra" \
|
||||
if [ ! -z "%{-f*}" ] \
|
||||
then \
|
||||
filelist="%{-f*}" \
|
||||
|
|
@ -59,5 +90,5 @@ kernel_module_package_release 1
|
|||
then \
|
||||
nobuildreqs="no" \
|
||||
fi \
|
||||
kmp_override_filelist="$filelist" kmp_override_preamble="$preamble" kmp_nobuildreqs="$nobuildreqs" %{kmodtool} rpmtemplate_kmp %{-n*}%{!-n:%name} %{kverrel} $flavors_to_build 2>/dev/null \
|
||||
override_filelist="$filelist" override_preamble="$preamble" nobuildreqs="$nobuildreqs" kmod_version=%kmod_version kmod_release=%kmod_release %{kmodtool} rpmtemplate %{-n*}%{!-n:%name} %{kverrel} $flavors_to_build 2>/dev/null \
|
||||
)}
|
||||
|
|
|
|||
2
modalias.attr
Normal file
2
modalias.attr
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
%__modalias_provides /usr/lib/rpm/redhat/find-provides.d/modalias.prov
|
||||
%__modalias_path .*\.(ko|ko\.gz|ko\.bz2|ko\.xz|ko\.zst)$
|
||||
116
modalias.prov
Normal file → Executable file
116
modalias.prov
Normal file → Executable file
|
|
@ -1,4 +1,4 @@
|
|||
#! /bin/sh
|
||||
#! /bin/bash -efu
|
||||
|
||||
# heavily based upon find-suggests.ksyms by Andreas Gruenbacher <agruen@suse.de>.
|
||||
# with modifications by Michael Brown <Michael_E_Brown@dell.com>
|
||||
|
|
@ -14,7 +14,8 @@ IFS=$'\n'
|
|||
# completeness, so that we can determine when drivers are folded into
|
||||
# mainline kernel.
|
||||
#
|
||||
case "$1" in
|
||||
is_kernel_package=""
|
||||
case "${1:-}" in
|
||||
kernel-module-*) ;; # Fedora kernel module package names start with
|
||||
# kernel-module.
|
||||
kernel*) is_kernel_package=1 ;;
|
||||
|
|
@ -25,8 +26,15 @@ if ! [ -z "$is_kernel_package" ]; then
|
|||
exit 0
|
||||
fi
|
||||
|
||||
# Check for presence of the commands used.
|
||||
# "command" is a builtin, faster to use than fork+execing "which" - see
|
||||
# https://pubs.opengroup.org/onlinepubs/9699919799/utilities/command.html
|
||||
command -v /sbin/modinfo >/dev/null || exit 1
|
||||
command -v sed >/dev/null || exit 1
|
||||
command -v sort >/dev/null || exit 1
|
||||
|
||||
print_modaliases() {
|
||||
declare class=$1 variants=$2 pos=$3
|
||||
local class="$1" variants="$2" pos="$3"
|
||||
if [ -n "$variants" ]; then
|
||||
echo "${class:0:pos}[$variants]${class:pos+1}"
|
||||
else
|
||||
|
|
@ -34,43 +42,87 @@ print_modaliases() {
|
|||
fi
|
||||
}
|
||||
|
||||
# Try to make "provides" list a bit smaller:
|
||||
# find "mergeable" strings a-la
|
||||
# modalias(pci:v0000168Cd00000023sv*sd*bc*sc*i*)
|
||||
# modalias(pci:v0000168Cd00000024sv*sd*bc*sc*i*)
|
||||
# modalias(pci:v0000168Cd00000027sv*sd*bc*sc*i*)
|
||||
# modalias(pci:v0000168Cd00000029sv*sd*bc*sc*i*)
|
||||
# replace with
|
||||
# modalias(pci:v0000168Cd0000002[3479]sv*sd*bc*sc*i*)
|
||||
combine_modaliases() {
|
||||
declare tag class variants pos n
|
||||
read class
|
||||
while read tag; do
|
||||
for ((n=0; n<${#class}; n++)); do
|
||||
if [ "*" != "${class:n:1}" -a \
|
||||
"${class:0:n}" = "${tag:0:n}" -a \
|
||||
"${class:n+1}" = "${tag:n+1}" ] &&
|
||||
( [ -z "$pos" ] || [ $n = $pos ] ); then
|
||||
variants="${variants:-${class:n:1}}${tag:n:1}"
|
||||
pos=$n
|
||||
local unused_len next prev variants="" pos="" n end xc
|
||||
|
||||
# Due to set -e, we can exit with exitcode 1 on read EOF
|
||||
# and this makes our caller think we failed. "|| return 0" prevents this:
|
||||
IFS=' ' read unused_len prev || return 0
|
||||
|
||||
# For each line after the first...
|
||||
while IFS=' ' read unused_len next; do
|
||||
if [ -z "$pos" ]; then
|
||||
# 2nd line: after "modalias(" prefix, for each char in prev line...
|
||||
n=9
|
||||
end=${#prev}
|
||||
# TODO speedup? if [ $end != ${#next} ]; then line is not mergeable
|
||||
else
|
||||
# 3rd+ lines: only check the char at the same position
|
||||
n=$pos
|
||||
end=$((pos + 1))
|
||||
fi
|
||||
# Search for aaaNbbb,aaaMbbb line pair, where N and M chars differ.
|
||||
# sort -u guarantees there are no identical line pairs.
|
||||
# We assume that lines will not differ only in " = version" suffix.
|
||||
for ((; n < $end; n++)); do
|
||||
if [ "${prev:0:n}" != "${next:0:n}" ]; then
|
||||
# the prefixes already aren't the same: break
|
||||
n=$end
|
||||
break
|
||||
fi
|
||||
# If suffixes differ, go to next char
|
||||
[ x"${prev:n+1}" != x"${next:n+1}" ] && continue
|
||||
# Found aaaNbbb,aaaMbbb. If N and M aren't special...
|
||||
xc=x"${prev:n:1}"
|
||||
[ x"[" = "$xc" -o x"]" = "$xc" ] && continue
|
||||
[ x"?" = "$xc" -o x"*" = "$xc" ] && continue
|
||||
xc=x"${next:n:1}"
|
||||
[ x"[" = "$xc" -o x"]" = "$xc" ] && continue
|
||||
[ x"?" = "$xc" -o x"*" = "$xc" ] && continue
|
||||
# Add M (and maybe N) to $variants, go to next line
|
||||
variants="${variants:-${prev:n:1}}${next:n:1}"
|
||||
pos=$n
|
||||
break
|
||||
done
|
||||
if [ $n -eq ${#class} ]; then
|
||||
print_modaliases "$class" "$variants" "$pos"
|
||||
variants=
|
||||
pos=
|
||||
class=$tag
|
||||
if [ $n -eq $end ]; then
|
||||
# This line is not mergeable with the previous one(s),
|
||||
# print collected merged line and reset the state
|
||||
print_modaliases "$prev" "$variants" "$pos"
|
||||
variants=""
|
||||
pos=""
|
||||
prev=$next
|
||||
fi
|
||||
done
|
||||
print_modaliases "$class" "$variants" "$pos"
|
||||
# Print last collected merged line
|
||||
print_modaliases "$prev" "$variants" "$pos"
|
||||
}
|
||||
|
||||
for module in $(grep -E '/lib/modules/.+\.ko$') $*; do
|
||||
# | head -n1 because some modules have *two* version tags. *cough*b44*cough*
|
||||
modver=$(/sbin/modinfo -F version "$module"| head -n1)
|
||||
modver=${modver// /_}
|
||||
for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do
|
||||
modver=$(/sbin/modinfo -F version "$module")
|
||||
# delete possible extra lines because some modules have *two* version tags. *cough*b44*cough*
|
||||
modver=${modver%%$'\n'*} # using $'' bashism, avoid running "head -n1" process
|
||||
# replace any strange chars with underscores.
|
||||
# [!...] is glob's "match any char not in set" pattern
|
||||
# (although bash supports [^...] too, it is not standard)
|
||||
modver=${modver//[!0-9a-zA-Z._]/_}
|
||||
# only add version tag if it indeed has a version
|
||||
[ -z "$modver" ] || modver=" = $modver"
|
||||
|
||||
# only add version tag if it has a version
|
||||
if [ -n "$modver" ]; then
|
||||
/sbin/modinfo -F alias "$module" \
|
||||
| sed -nre "s,(.+),modalias(\\1) = $modver,p"
|
||||
else
|
||||
/sbin/modinfo -F alias "$module" \
|
||||
| sed -nre "s,(.+),modalias(\\1),p"
|
||||
fi
|
||||
/sbin/modinfo -F alias "$module" \
|
||||
| sed -E "s,[^][0-9a-zA-Z._:*?/-],_,g; s,(.+),modalias(\\1)$modver,"
|
||||
|
||||
# Below: combining code can only possibly combine lines of equal length.
|
||||
# Prepend line lengths before sort, so that same-length lines end up next
|
||||
# to each other. (The lengths are discarded by combine_modaliases).
|
||||
done \
|
||||
| sort -u \
|
||||
| { while read line; do echo "${#line} $line"; done } \
|
||||
| LC_ALL=C sort -u \
|
||||
| combine_modaliases
|
||||
|
|
|
|||
2
provided_ksyms.attr
Normal file
2
provided_ksyms.attr
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
%__provided_ksyms_provides /usr/lib/rpm/redhat/find-provides.ksyms
|
||||
%__provided_ksyms_path .*\.(ko|ko\.gz|ko\.bz2|ko\.xz|ko\.zst)$
|
||||
4
required_ksyms.attr
Normal file
4
required_ksyms.attr
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
%__required_ksyms_requires /usr/lib/rpm/redhat/find-requires.ksyms
|
||||
%__required_ksyms_path .*\.(ko|ko\.gz|ko\.bz2|ko\.xz|ko\.zst)$
|
||||
# Exclude built-in kernel modules
|
||||
%__required_ksyms_exclude_path ^/lib/modules/[1-9][^/]*/kernel/.*
|
||||
4
rpmsort
4
rpmsort
|
|
@ -12,8 +12,8 @@
|
|||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
# USA.
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
# MA 02110-1301 USA.
|
||||
|
||||
use Getopt::Long qw(:config gnu_getopt);
|
||||
|
||||
|
|
|
|||
31
tests/modalias.prov.collect
Executable file
31
tests/modalias.prov.collect
Executable file
|
|
@ -0,0 +1,31 @@
|
|||
#! /bin/bash -efu
|
||||
|
||||
# This fetches test data from current system's /lib/modules
|
||||
# to /tmp/COLLECT
|
||||
|
||||
IFS=$'\n'
|
||||
|
||||
find /lib/modules | grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$' \
|
||||
| while IFS='' read -r module; do
|
||||
modver=$(/sbin/modinfo -F version "$module")
|
||||
# delete possible extra lines because some modules have *two* version tags. *cough*b44*cough*
|
||||
modver=${modver%%$'\n'*} # using $'' bashism, avoid running "head -n1" process
|
||||
# replace any strange chars with underscores.
|
||||
# [!...] is glob's "match any char not in set" pattern
|
||||
# (although bash supports [^...] too, it is not standard)
|
||||
modver=${modver//[!0-9a-zA-Z._]/_}
|
||||
# only add version tag if it has a version
|
||||
[ -z "$modver" ] || modver=" = $modver"
|
||||
|
||||
d="/tmp/COLLECT$module"
|
||||
d="${d%/*}"
|
||||
mkdir -p "$d"
|
||||
|
||||
out=`/sbin/modinfo -F alias "$module" \
|
||||
| sed -E "s,[^][0-9a-zA-Z._:*?/-],_,g; s,(.+),modalias(\\1)$modver,"`
|
||||
|
||||
[ "$out" ] || continue
|
||||
|
||||
echo "/tmp/COLLECT$module.modalias$modver" >&2
|
||||
printf '%s\n' "$out" >"/tmp/COLLECT$module.modalias"
|
||||
done
|
||||
42
tests/modalias.prov.runtest
Executable file
42
tests/modalias.prov.runtest
Executable file
|
|
@ -0,0 +1,42 @@
|
|||
#!/bin/sh
|
||||
|
||||
function die()
|
||||
{
|
||||
printf '%s\n' "$*" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
set -e
|
||||
|
||||
cd modalias.prov.testdata
|
||||
test -x ../../modalias.prov || die "No ../../modalias.prov"
|
||||
|
||||
# Copy and add -t option to modalias.prov
|
||||
cp ../../modalias.prov modalias.prov
|
||||
patch -p1 <<"EOF"
|
||||
--- a/modalias.prov
|
||||
+++ b/modalias.prov
|
||||
@@ -105,6 +105,17 @@ combine_modaliases() {
|
||||
print_modaliases "$prev" "$variants" "$pos"
|
||||
}
|
||||
|
||||
+if [ "$#" = 2 ] && [ "$1" = "-t" ]; then
|
||||
+ cat -- "$2" \
|
||||
+ | { while read line; do echo "${#line} $line"; done } \
|
||||
+ | LC_ALL=C sort -u \
|
||||
+ | combine_modaliases \
|
||||
+ >"$2.test"
|
||||
+ echo "Comparing results for $2"
|
||||
+ diff -u "$2.right" "$2.test" && rm -- "$2.test"
|
||||
+ exit
|
||||
+fi
|
||||
+
|
||||
for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz|\.zst)?$') "$@"; do
|
||||
modver=$(/sbin/modinfo -F version "$module")
|
||||
# delete possible extra lines because some modules have *two* version tags. *cough*b44*cough*
|
||||
EOF
|
||||
|
||||
find | grep '\.ko.*\.modalias$' | xargs -n1 ./modalias.prov -t
|
||||
|
||||
# Rename newly generated .test as .right
|
||||
#find | grep '\.ko.*\.modalias$' | xargs -I'{}' mv '{}'.test '{}'.right
|
||||
BIN
tests/modalias.prov.testdata.tar.xz
Normal file
BIN
tests/modalias.prov.testdata.tar.xz
Normal file
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue