#!/bin/bash # kmodtool - Helper script for building kernel module RPMs # 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ä , # Thorsten Leemhuis # Jon Masters # # 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. # 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_rhel9" knownvariants=@(debug|kdump|zfcpdump) kmod_name= kver= verrel= variant= 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}" } # 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}}" local dotvariant="${variant:+${variant_char}${variant}}" echo "%package -n kmod-${kmod_name}${dashvariant}" if [ -z "$kmod_provides_summary" ]; then echo "Summary: ${kmod_name} kernel module(s)" fi if [ -z "$kmod_provides_group" ]; then echo "Group: System Environment/Kernel" fi if [ ! -z "$kmod_version" ]; then echo "Version: %{kmod_version}" fi if [ ! -z "$kmod_release" ]; then echo "Release: %{kmod_release}" fi cat <= ${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 [ "yes" != "$nobuildreqs" ] then cat < /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 cat < /var/run/rpm-kmod-${kmod_name}${dashvariant}-modules EOF cat < /dev/null || : fi modules=( \$(cat /var/run/rpm-kmod-${kmod_name}${dashvariant}-modules) ) rm /var/run/rpm-kmod-${kmod_name}${dashvariant}-modules if [ -x "/usr/sbin/weak-modules" ]; then printf '%s\n' "\${modules[@]}" \ | /usr/sbin/weak-modules --remove-modules fi EOF echo "%files -n kmod-${kmod_name}${dashvariant}" if [ "" == "$override_filelist" ]; then echo "%defattr(644,root,root,755)" echo "/lib/modules/${verrel}${dotvariant}" else cat "$override_filelist" | get_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 <