Adopt kernel-rpm-macros subpackage from redhat-rpm-config
This has been done in CentOS Stream already: https://gitlab.com/redhat/centos-stream/rpms/kernel-srpm-macros/-/merge_requests/1
This commit is contained in:
parent
2861fc251c
commit
33b5f1bcf4
24
find-provides.ksyms
Executable file
24
find-provides.ksyms
Executable file
@ -0,0 +1,24 @@
|
|||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
IFS=$'\n'
|
||||||
|
|
||||||
|
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
|
||||||
|
fi
|
||||||
|
done
|
74
find-requires.ksyms
Executable file
74
find-requires.ksyms
Executable file
@ -0,0 +1,74 @@
|
|||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
IFS=$'\n'
|
||||||
|
|
||||||
|
# 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
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
# Extract all of the requirements of this module.
|
||||||
|
all_requires() {
|
||||||
|
for module in "$@"; do
|
||||||
|
set -- $(/sbin/modinfo -F vermagic "$module" | sed -e 's: .*::' -e q)
|
||||||
|
/sbin/modprobe --dump-modversions "$module" \
|
||||||
|
| awk --non-decimal-data '
|
||||||
|
BEGIN { FS = "\t" ; OFS = "\t" }
|
||||||
|
{printf("0x%08x\t%s\n", $1, $2)}' \
|
||||||
|
| sed -r -e 's:$:\t'"$1"':'
|
||||||
|
done \
|
||||||
|
| LC_ALL=C sort -k2,2 -u
|
||||||
|
}
|
||||||
|
|
||||||
|
# Filter out requirements fulfilled by the module itself.
|
||||||
|
mod_requires() {
|
||||||
|
LC_ALL=C join -t $'\t' -j 2 -v 1 \
|
||||||
|
<(all_requires "$@") \
|
||||||
|
<(all_provides "$@") \
|
||||||
|
| LC_ALL=C sort -k1,1 -u
|
||||||
|
}
|
||||||
|
|
||||||
|
if ! [ -e /sbin/modinfo -a -e /sbin/modprobe ]; then
|
||||||
|
cat > /dev/null
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
modules=($(grep -E '/lib/modules/.+\.ko$'))
|
||||||
|
if [ ${#modules[@]} -gt 0 ]; then
|
||||||
|
kernel=$(/sbin/modinfo -F vermagic "${modules[0]}" | sed -e 's: .*::' -e q)
|
||||||
|
|
||||||
|
# get all that kernel provides
|
||||||
|
symvers=$(mktemp -t ${0##*/}.XXXXX)
|
||||||
|
|
||||||
|
cat /usr/src/kernels/$kernel/Module.symvers | awk '
|
||||||
|
BEGIN { FS = "\t" ; OFS = "\t" }
|
||||||
|
{ print $2 "\t" $1 }
|
||||||
|
' \
|
||||||
|
| sed -r -e 's:$:\t'"$kernel"':' \
|
||||||
|
| LC_ALL=C 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 }'
|
||||||
|
|
||||||
|
# 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 }'
|
||||||
|
fi
|
14
firmware.prov
Normal file
14
firmware.prov
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# firmware.prov - Automatically extract any and all firmware dependencies from
|
||||||
|
# kernel object (.ko) files and add to RPM deps.
|
||||||
|
|
||||||
|
IFS=$'\n'
|
||||||
|
|
||||||
|
for module in $(grep -E '/lib/modules/.+\.ko$') $*;
|
||||||
|
do
|
||||||
|
for firmware in `/sbin/modinfo -F firmware $module`;
|
||||||
|
do
|
||||||
|
echo "firmware($firmware)"
|
||||||
|
done
|
||||||
|
done
|
@ -1,6 +1,6 @@
|
|||||||
Name: kernel-srpm-macros
|
Name: kernel-srpm-macros
|
||||||
Version: 1.0
|
Version: 1.0
|
||||||
Release: 4%{?dist}
|
Release: 5%{?dist}
|
||||||
Summary: RPM macros that list arches the full kernel is built on
|
Summary: RPM macros that list arches the full kernel is built on
|
||||||
# This package only exist in Fedora repositories
|
# This package only exist in Fedora repositories
|
||||||
# The license is the standard (MIT) specified in
|
# The license is the standard (MIT) specified in
|
||||||
@ -8,17 +8,45 @@ Summary: RPM macros that list arches the full kernel is built on
|
|||||||
# and as URL we provide dist-git URL
|
# and as URL we provide dist-git URL
|
||||||
License: MIT
|
License: MIT
|
||||||
URL: https://src.fedoraproject.org/rpms/kernel-srpm-macros
|
URL: https://src.fedoraproject.org/rpms/kernel-srpm-macros
|
||||||
Source0: macros.kernel-srpm
|
|
||||||
BuildArch: noarch
|
BuildArch: noarch
|
||||||
|
|
||||||
|
# Macros
|
||||||
|
Source0: macros.kernel-srpm
|
||||||
|
Source1: macros.kmp
|
||||||
|
|
||||||
|
# Dependency generator scripts (deprecated)
|
||||||
|
Source100: find-provides.ksyms
|
||||||
|
Source101: find-requires.ksyms
|
||||||
|
Source102: firmware.prov
|
||||||
|
Source103: modalias.prov
|
||||||
|
|
||||||
|
# Misc helper scripts
|
||||||
|
Source200: kmodtool
|
||||||
|
Source201: rpmsort
|
||||||
|
Source202: symset-table
|
||||||
|
|
||||||
|
%global rrcdir /usr/lib/rpm/redhat
|
||||||
|
|
||||||
|
|
||||||
%description
|
%description
|
||||||
This packages contains the rpm macro that list what arches
|
This packages contains the rpm macro that list what arches
|
||||||
the full kernel is built on.
|
the full kernel is built on.
|
||||||
The variable to use is kernel_arches.
|
The variable to use is kernel_arches.
|
||||||
|
|
||||||
|
%package -n kernel-rpm-macros
|
||||||
|
Version: 185
|
||||||
|
Release: %{release}%{?dist}
|
||||||
|
Summary: Macros and scripts for building kernel module packages
|
||||||
|
Requires: redhat-rpm-config >= 13
|
||||||
|
|
||||||
|
%description -n kernel-rpm-macros
|
||||||
|
Macros and scripts for building kernel module packages.
|
||||||
|
|
||||||
%prep
|
%prep
|
||||||
# nothing to do
|
# Not strictly necessary but allows working on file names instead
|
||||||
|
# of source numbers in install section
|
||||||
|
%setup -c -T
|
||||||
|
cp -p %{sources} .
|
||||||
|
|
||||||
|
|
||||||
%build
|
%build
|
||||||
@ -27,17 +55,38 @@ The variable to use is kernel_arches.
|
|||||||
|
|
||||||
%install
|
%install
|
||||||
mkdir -p %{buildroot}/%{_rpmconfigdir}/macros.d
|
mkdir -p %{buildroot}/%{_rpmconfigdir}/macros.d
|
||||||
install -p -m 0644 -t %{buildroot}/%{_rpmconfigdir}/macros.d %{SOURCE0}
|
install -p -m 0644 -t %{buildroot}/%{_rpmconfigdir}/macros.d macros.kernel-srpm
|
||||||
%if 0%{?rhel} >= 8
|
%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/' \
|
||||||
%{buildroot}/%{_rpmconfigdir}/macros.d/macros.kernel-srpm
|
%{buildroot}/%{_rpmconfigdir}/macros.d/macros.kernel-srpm
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
mkdir -p %{buildroot}%{rrcdir}/find-provides.d
|
||||||
|
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 644 -t %{buildroot}%{rrcdir}/find-provides.d firmware.prov modalias.prov
|
||||||
|
install -p -m 644 -t %{buildroot}%{_rpmconfigdir}/macros.d macros.kmp
|
||||||
|
|
||||||
|
|
||||||
%files
|
%files
|
||||||
%{_rpmconfigdir}/macros.d/*
|
%{_rpmconfigdir}/macros.d/macros.kernel-srpm
|
||||||
|
|
||||||
|
%files -n kernel-rpm-macros
|
||||||
|
%{_rpmconfigdir}/macros.d/macros.kmp
|
||||||
|
%dir %{rrcdir}/find-provides.d
|
||||||
|
%{rrcdir}/kmodtool
|
||||||
|
%{rrcdir}/rpmsort
|
||||||
|
%{rrcdir}/symset-table
|
||||||
|
%{rrcdir}/find-provides.ksyms
|
||||||
|
%{rrcdir}/find-requires.ksyms
|
||||||
|
%{rrcdir}/find-provides.d/firmware.prov
|
||||||
|
%{rrcdir}/find-provides.d/modalias.prov
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu Jun 03 2021 Michal Domonkos <mdomonko@redhat.com> - 1.0-5
|
||||||
|
- Adopt kernel-rpm-macros subpackage from redhat-rpm-config
|
||||||
|
|
||||||
* Tue Jan 26 2021 Fedora Release Engineering <releng@fedoraproject.org> - 1.0-4
|
* Tue Jan 26 2021 Fedora Release Engineering <releng@fedoraproject.org> - 1.0-4
|
||||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
|
||||||
|
|
||||||
|
267
kmodtool
Executable file
267
kmodtool
Executable file
@ -0,0 +1,267 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# kmodtool - Helper script for building kernel module RPMs
|
||||||
|
# Copyright (c) 2003-2006 Ville Skyttä <ville.skytta@iki.fi>,
|
||||||
|
# Thorsten Leemhuis <fedora@leemhuis.info>
|
||||||
|
# Jon Masters <jcm@redhat.com>
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
# a copy of this software and associated documentation files (the
|
||||||
|
# "Software"), to deal in the Software without restriction, including
|
||||||
|
# without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
# permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
# the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice shall be
|
||||||
|
# included in all copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
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)
|
||||||
|
kmod_name=
|
||||||
|
kver=
|
||||||
|
verrel=
|
||||||
|
variant=
|
||||||
|
kmp=
|
||||||
|
|
||||||
|
get_verrel ()
|
||||||
|
{
|
||||||
|
verrel=${1:-$(uname -r)}
|
||||||
|
verrel=${verrel%%$knownvariants}
|
||||||
|
}
|
||||||
|
|
||||||
|
print_verrel ()
|
||||||
|
{
|
||||||
|
get_verrel $@
|
||||||
|
echo "${verrel}"
|
||||||
|
}
|
||||||
|
|
||||||
|
get_variant ()
|
||||||
|
{
|
||||||
|
get_verrel $@
|
||||||
|
variant=${1:-$(uname -r)}
|
||||||
|
variant=${variant##$verrel}
|
||||||
|
variant=${variant:-'""'}
|
||||||
|
}
|
||||||
|
|
||||||
|
print_variant ()
|
||||||
|
{
|
||||||
|
get_variant $@
|
||||||
|
echo "${variant}"
|
||||||
|
}
|
||||||
|
|
||||||
|
get_rpmtemplate ()
|
||||||
|
{
|
||||||
|
local variant="${1}"
|
||||||
|
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
|
||||||
|
|
||||||
|
echo "%package -n kmod-${kmod_name}${dashvariant}"
|
||||||
|
|
||||||
|
if [ -z "$kmp_provides_summary" ]; then
|
||||||
|
echo "Summary: ${kmod_name} kernel module(s)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$kmp_provides_group" ]; then
|
||||||
|
echo "Group: System Environment/Kernel"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -z "$kmp_version" ]; then
|
||||||
|
echo "Version: %{kmp_version}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -z "$kmp_release" ]; then
|
||||||
|
echo "Release: %{kmp_release}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -z "$kmp" ]; then
|
||||||
|
echo "%global _use_internal_dependency_generator 0"
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat <<EOF
|
||||||
|
Provides: kernel-modules = ${verrel}${variant}
|
||||||
|
Provides: ${kmod_name}-kmod = %{?epoch:%{epoch}:}%{version}-%{release}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
if [ -z "$kmp" ]; then
|
||||||
|
echo "Requires: ${kdep}"
|
||||||
|
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
|
||||||
|
|
||||||
|
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.
|
||||||
|
%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 || :
|
||||||
|
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
|
||||||
|
%preun -n kmod-${kmod_name}${dashvariant}
|
||||||
|
rpm -ql kmod-${kmod_name}${dashvariant} | grep '\.ko$' \
|
||||||
|
> /var/run/rpm-kmod-${kmod_name}${dashvariant}-modules
|
||||||
|
EOF
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat <<EOF
|
||||||
|
%postun -n kmod-${kmod_name}${dashvariant}
|
||||||
|
/sbin/depmod -aF /boot/System.map-${verrel}${variant} ${verrel}${variant} &> /dev/null || :
|
||||||
|
EOF
|
||||||
|
|
||||||
|
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
|
||||||
|
printf '%s\n' "\${modules[@]}" \
|
||||||
|
| /sbin/weak-modules --remove-modules
|
||||||
|
fi
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "%files -n kmod-${kmod_name}${dashvariant}"
|
||||||
|
|
||||||
|
if [ "" == "$kmp_override_filelist" ];
|
||||||
|
then
|
||||||
|
echo "%defattr(644,root,root,755)"
|
||||||
|
echo "/lib/modules/${verrel}${variant}/"
|
||||||
|
echo "/lib/firmware/"
|
||||||
|
else
|
||||||
|
cat "$kmp_override_filelist"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
print_rpmtemplate ()
|
||||||
|
{
|
||||||
|
kmod_name="${1}"
|
||||||
|
shift
|
||||||
|
kver="${1}"
|
||||||
|
get_verrel "${1}"
|
||||||
|
shift
|
||||||
|
if [ -z "${kmod_name}" ] ; then
|
||||||
|
echo "Please provide the kmodule-name as first parameter." >&2
|
||||||
|
exit 2
|
||||||
|
elif [ -z "${kver}" ] ; then
|
||||||
|
echo "Please provide the kver as second parameter." >&2
|
||||||
|
exit 2
|
||||||
|
elif [ -z "${verrel}" ] ; then
|
||||||
|
echo "Couldn't find out the verrel." >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
for variant in "$@" ; do
|
||||||
|
if [ "default" == "$variant" ];
|
||||||
|
then
|
||||||
|
get_rpmtemplate ""
|
||||||
|
else
|
||||||
|
get_rpmtemplate "${variant}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
usage ()
|
||||||
|
{
|
||||||
|
cat <<EOF
|
||||||
|
You called: ${invocation}
|
||||||
|
|
||||||
|
Usage: ${myprog} <command> <option>+
|
||||||
|
Commands:
|
||||||
|
verrel <uname>
|
||||||
|
- Get "base" version-release.
|
||||||
|
variant <uname>
|
||||||
|
- Get variant from uname.
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
invocation="$(basename ${0}) $@"
|
||||||
|
while [ "${1}" ] ; do
|
||||||
|
case "${1}" in
|
||||||
|
verrel)
|
||||||
|
shift
|
||||||
|
print_verrel $@
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
variant)
|
||||||
|
shift
|
||||||
|
print_variant $@
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
rpmtemplate)
|
||||||
|
shift
|
||||||
|
print_rpmtemplate "$@"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
rpmtemplate_kmp)
|
||||||
|
shift
|
||||||
|
kmp=1
|
||||||
|
print_rpmtemplate "$@"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
version)
|
||||||
|
echo "${myprog} ${myver}"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Error: Unknown option '${1}'." >&2
|
||||||
|
usage >&2
|
||||||
|
exit 2
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# Local variables:
|
||||||
|
# mode: sh
|
||||||
|
# sh-indentation: 2
|
||||||
|
# indent-tabs-mode: nil
|
||||||
|
# End:
|
||||||
|
# ex: ts=2 sw=2 et
|
63
macros.kmp
Normal file
63
macros.kmp
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
# Use these macros to differentiate between RH and other KMP implementation(s).
|
||||||
|
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
|
||||||
|
|
||||||
|
#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_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) \
|
||||||
|
%{!?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" \
|
||||||
|
if [ ! -z "%{-f*}" ] \
|
||||||
|
then \
|
||||||
|
filelist="%{-f*}" \
|
||||||
|
fi \
|
||||||
|
if [ ! -z "%{-p*}" ] \
|
||||||
|
then \
|
||||||
|
preamble="%{-p*}" \
|
||||||
|
fi \
|
||||||
|
nobuildreqs="yes" \
|
||||||
|
if [ "x%{kmodtool_generate_buildreqs}" != "x1" ] \
|
||||||
|
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 \
|
||||||
|
)}
|
76
modalias.prov
Normal file
76
modalias.prov
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
|
||||||
|
# heavily based upon find-suggests.ksyms by Andreas Gruenbacher <agruen@suse.de>.
|
||||||
|
# with modifications by Michael Brown <Michael_E_Brown@dell.com>
|
||||||
|
#
|
||||||
|
# -- added module versioning info to modalias() symbols
|
||||||
|
# -- removed code which inspects spec files.
|
||||||
|
|
||||||
|
IFS=$'\n'
|
||||||
|
|
||||||
|
#
|
||||||
|
# Initially, dont generate modalias() lines for kernel package. This needs
|
||||||
|
# additional discussion. Would like to eventually add them for
|
||||||
|
# completeness, so that we can determine when drivers are folded into
|
||||||
|
# mainline kernel.
|
||||||
|
#
|
||||||
|
case "$1" in
|
||||||
|
kernel-module-*) ;; # Fedora kernel module package names start with
|
||||||
|
# kernel-module.
|
||||||
|
kernel*) is_kernel_package=1 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if ! [ -z "$is_kernel_package" ]; then
|
||||||
|
cat > /dev/null
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
print_modaliases() {
|
||||||
|
declare class=$1 variants=$2 pos=$3
|
||||||
|
if [ -n "$variants" ]; then
|
||||||
|
echo "${class:0:pos}[$variants]${class:pos+1}"
|
||||||
|
else
|
||||||
|
[ -z "$class" ] || echo "$class"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ $n -eq ${#class} ]; then
|
||||||
|
print_modaliases "$class" "$variants" "$pos"
|
||||||
|
variants=
|
||||||
|
pos=
|
||||||
|
class=$tag
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
print_modaliases "$class" "$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// /_}
|
||||||
|
|
||||||
|
# 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
|
||||||
|
done \
|
||||||
|
| sort -u \
|
||||||
|
| combine_modaliases
|
76
rpmsort
Executable file
76
rpmsort
Executable file
@ -0,0 +1,76 @@
|
|||||||
|
#! /usr/bin/perl -w
|
||||||
|
|
||||||
|
# This program is free software; you can redistribute it and/or
|
||||||
|
# modify it under the terms of the GNU General Public License
|
||||||
|
# as published by the Free Software Foundation; either version 2
|
||||||
|
# of the License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
use Getopt::Long qw(:config gnu_getopt);
|
||||||
|
|
||||||
|
sub rpm_cmp_versions {
|
||||||
|
my ($evr1, $evr2) = @_;
|
||||||
|
|
||||||
|
sub _rpm_cmp {
|
||||||
|
my ($s1, $s2) = @_;
|
||||||
|
|
||||||
|
return defined $s1 <=> defined $s2
|
||||||
|
unless defined $s1 && defined $s2;
|
||||||
|
|
||||||
|
my ($r, $x1, $x2);
|
||||||
|
do {
|
||||||
|
$s1 =~ s/^[^a-zA-Z0-9]+//;
|
||||||
|
$s2 =~ s/^[^a-zA-Z0-9]+//;
|
||||||
|
if ($s1 =~ /^\d/ || $s2 =~ /^\d/) {
|
||||||
|
$s1 =~ s/^0*(\d*)//; $x1 = $1;
|
||||||
|
$s2 =~ s/^0*(\d*)//; $x2 = $1;
|
||||||
|
$r = length $x1 <=> length $x2 || $x1 cmp $x2;
|
||||||
|
} else {
|
||||||
|
$s1 =~ s/^([a-zA-Z]*)//; $x1 = $1;
|
||||||
|
$s2 =~ s/^([a-zA-Z]*)//; $x2 = $1;
|
||||||
|
return 0
|
||||||
|
if $x1 eq '' && $x2 eq '';
|
||||||
|
$r = $x1 cmp $x2;
|
||||||
|
}
|
||||||
|
} until $r;
|
||||||
|
return $r;
|
||||||
|
}
|
||||||
|
|
||||||
|
my ($e1, $v1, $r1) = $evr1 =~ /^(?:(\d*):)?(.*?)(?:-([^-]*))?$/;
|
||||||
|
my ($e2, $v2, $r2) = $evr2 =~ /^(?:(\d*):)?(.*?)(?:-([^-]*))?$/;
|
||||||
|
my $r = _rpm_cmp($e1 || 0, $e2 || 0);
|
||||||
|
$r = _rpm_cmp($v1, $v2)
|
||||||
|
unless $r;
|
||||||
|
$r = _rpm_cmp($r1, $r2)
|
||||||
|
unless $r;
|
||||||
|
return $r;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $reorder = sub { return @_ };
|
||||||
|
my $key = 0;
|
||||||
|
|
||||||
|
GetOptions ("r|reverse" => sub { $reorder = sub { return reverse @_ } },
|
||||||
|
"k|key=i" => \$key)
|
||||||
|
or do {
|
||||||
|
print STDERR "Usage\n";
|
||||||
|
exit 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
if ($key == 0) {
|
||||||
|
# Sort by entire lines
|
||||||
|
map { print } &$reorder(sort { rpm_cmp_versions($a, $b) } <>);
|
||||||
|
} else {
|
||||||
|
# Sort by field $key
|
||||||
|
my @data = map { [(split)[$key-1], $_] } <>;
|
||||||
|
map { print } &$reorder(map { $_->[1] }
|
||||||
|
sort { rpm_cmp_versions($a->[0], $b->[0]) } @data);
|
||||||
|
}
|
40
symset-table
Executable file
40
symset-table
Executable file
@ -0,0 +1,40 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
|
||||||
|
# Create a table of all symbol sets defined in all /boot/symsets*.tar.gz
|
||||||
|
# files.
|
||||||
|
#
|
||||||
|
# Format:
|
||||||
|
# kernelrelease/modver/symbol <tab> symset <tab> symset_hash
|
||||||
|
#
|
||||||
|
# This table is needed for computing the appropriate Requires: tags for
|
||||||
|
# kernel module packages.
|
||||||
|
|
||||||
|
tmpdir=$(mktemp -t -d ${0##*/}.XXXXXX)
|
||||||
|
trap "cd / ; rm -rf $tmpdir" EXIT
|
||||||
|
cd $tmpdir
|
||||||
|
|
||||||
|
shopt -s nullglob
|
||||||
|
for symsets in /boot/symsets-*.tar.gz; do
|
||||||
|
zcat $symsets \
|
||||||
|
| tar xf -
|
||||||
|
done
|
||||||
|
|
||||||
|
for symsets in /usr/src/kernels/*/symsets-*.tar.gz; do
|
||||||
|
zcat $symsets \
|
||||||
|
| tar xf -
|
||||||
|
done
|
||||||
|
|
||||||
|
for symsets in *; do
|
||||||
|
krel=${symsets#symsets-}
|
||||||
|
for symset in $symsets/*; do
|
||||||
|
class=${symset##*/} ; class=${class%.*}
|
||||||
|
hash=${symset##*.}
|
||||||
|
awk '
|
||||||
|
BEGIN { FS = "\t" ; OFS = "\t" }
|
||||||
|
{ sub(/0x0*/, "", $1)
|
||||||
|
print krel "/" $1 "/" $2, class, hash }
|
||||||
|
' krel="$krel" class="$class" hash="$hash" $symset
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
# vim:shiftwidth=4 softtabstop=4
|
Loading…
Reference in New Issue
Block a user