1eda14cbcSMatt Macy#!/usr/bin/env bash 216038816SMartin Matuska# shellcheck disable=SC2086 3eda14cbcSMatt Macy 4eda14cbcSMatt Macy# kmodtool - Helper script for building kernel module RPMs 5eda14cbcSMatt Macy# Copyright (c) 2003-2012 Ville Skyttä <ville.skytta@iki.fi>, 6eda14cbcSMatt Macy# Thorsten Leemhuis <fedora@leemhuis.info> 7eda14cbcSMatt Macy# Nicolas Chauvet <kwizart@gmail.com> 8eda14cbcSMatt Macy# 9eda14cbcSMatt Macy# Permission is hereby granted, free of charge, to any person obtaining 10eda14cbcSMatt Macy# a copy of this software and associated documentation files (the 11eda14cbcSMatt Macy# "Software"), to deal in the Software without restriction, including 12eda14cbcSMatt Macy# without limitation the rights to use, copy, modify, merge, publish, 13eda14cbcSMatt Macy# distribute, sublicense, and/or sell copies of the Software, and to 14eda14cbcSMatt Macy# permit persons to whom the Software is furnished to do so, subject to 15eda14cbcSMatt Macy# the following conditions: 16eda14cbcSMatt Macy# 17eda14cbcSMatt Macy# The above copyright notice and this permission notice shall be 18eda14cbcSMatt Macy# included in all copies or substantial portions of the Software. 19eda14cbcSMatt Macy# 20eda14cbcSMatt Macy# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 21eda14cbcSMatt Macy# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 22eda14cbcSMatt Macy# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 23eda14cbcSMatt Macy# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 24eda14cbcSMatt Macy# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 25eda14cbcSMatt Macy# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 26eda14cbcSMatt Macy# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27eda14cbcSMatt Macy 28eda14cbcSMatt Macyshopt -s extglob 29eda14cbcSMatt Macy 30eda14cbcSMatt Macymyprog="kmodtool-${repo}" 31eda14cbcSMatt Macymyver="0.12.1" 32eda14cbcSMatt Macy 33eda14cbcSMatt Macykmodname= 34eda14cbcSMatt Macybuild_kernels="current" 35eda14cbcSMatt Macykernels_known_variants= 36eda14cbcSMatt Macykernel_versions= 37eda14cbcSMatt Macykernel_versions_to_build_for= 38eda14cbcSMatt Macyprefix= 39eda14cbcSMatt Macyfilterfile= 40eda14cbcSMatt Macytarget= 41eda14cbcSMatt Macybuildroot= 4216038816SMartin Matuskadashvariant= 43eda14cbcSMatt Macy 44eda14cbcSMatt Macyerror_out() 45eda14cbcSMatt Macy{ 46eda14cbcSMatt Macy local errorlevel=${1} 47eda14cbcSMatt Macy shift 4816038816SMartin Matuska echo "Error: $*" >&2 49eda14cbcSMatt Macy # the next line is not multi-line safe -- not needed *yet* 5016038816SMartin Matuska echo "%global kmodtool_check echo \"kmodtool error: $*\"; exit ${errorlevel};" 5116038816SMartin Matuska exit "${errorlevel}" 52eda14cbcSMatt Macy} 53eda14cbcSMatt Macy 54eda14cbcSMatt Macyprint_rpmtemplate_header() 55eda14cbcSMatt Macy{ 56eda14cbcSMatt Macy echo 57*e92ffd9bSMartin Matuska echo "%global kmodinstdir_prefix ${prefix}/lib/modules/" 58*e92ffd9bSMartin Matuska echo "%global kmodinstdir_postfix /extra/${kmodname}/" 59*e92ffd9bSMartin Matuska echo "%global kernel_versions ${kernel_versions}" 60eda14cbcSMatt Macy echo 61eda14cbcSMatt Macy} 62eda14cbcSMatt Macy 63eda14cbcSMatt Macyprint_akmodtemplate () 64eda14cbcSMatt Macy{ 65eda14cbcSMatt Macy echo 66eda14cbcSMatt Macy cat <<EOF 67eda14cbcSMatt Macy 68eda14cbcSMatt Macy%global akmod_install mkdir -p \$RPM_BUILD_ROOT/%{_usrsrc}/akmods/; \\\ 69eda14cbcSMatt MacyLANG=C rpmbuild --define "_sourcedir %{_sourcedir}" \\\ 70eda14cbcSMatt Macy--define "_srcrpmdir \$RPM_BUILD_ROOT/%{_usrsrc}/akmods/" \\\ 71eda14cbcSMatt Macy-bs --nodeps %{_specdir}/%{name}.spec ; \\\ 72eda14cbcSMatt Macyln -s \$(ls \$RPM_BUILD_ROOT/%{_usrsrc}/akmods/) \$RPM_BUILD_ROOT/%{_usrsrc}/akmods/${kmodname}-kmod.latest 73eda14cbcSMatt Macy 74eda14cbcSMatt Macy%package -n akmod-${kmodname} 75eda14cbcSMatt MacySummary: Akmod package for ${kmodname} kernel module(s) 76eda14cbcSMatt MacyGroup: System Environment/Kernel 77eda14cbcSMatt MacyRequires: kmodtool 78eda14cbcSMatt MacyRequires: akmods 79eda14cbcSMatt Macy%{?AkmodsBuildRequires:Requires: %{AkmodsBuildRequires}} 80eda14cbcSMatt Macy# same requires and provides as a kmods package would have 81eda14cbcSMatt MacyRequires: ${kmodname}-kmod-common >= %{?epoch:%{epoch}:}%{version} 82eda14cbcSMatt MacyProvides: ${kmodname}-kmod = %{?epoch:%{epoch}:}%{version}-%{release} 83eda14cbcSMatt MacyEOF 84eda14cbcSMatt Macy 85*e92ffd9bSMartin Matuska if [ -n "${obsolete_name}" ]; then 86eda14cbcSMatt Macy echo "Provides: akmod-${obsolete_name} = ${obsolete_version}" 87eda14cbcSMatt Macy echo "Obsoletes: akmod-${obsolete_name} < ${obsolete_version}" 88eda14cbcSMatt Macy fi 89eda14cbcSMatt Macy 90eda14cbcSMatt Macy cat <<EOF 91eda14cbcSMatt Macy 92eda14cbcSMatt Macy%description -n akmod-${kmodname} 93eda14cbcSMatt MacyThis package provides the akmod package for the ${kmodname} kernel modules. 94eda14cbcSMatt Macy 95eda14cbcSMatt Macy%posttrans -n akmod-${kmodname} 96eda14cbcSMatt Macynohup ${prefix}/sbin/akmods --from-akmod-posttrans --akmod ${kmodname} &> /dev/null & 97eda14cbcSMatt Macy 98eda14cbcSMatt Macy%files -n akmod-${kmodname} 99eda14cbcSMatt Macy%defattr(-,root,root,-) 100eda14cbcSMatt Macy%{_usrsrc}/akmods/* 101eda14cbcSMatt Macy 102eda14cbcSMatt MacyEOF 103eda14cbcSMatt Macy} 104eda14cbcSMatt Macy 105eda14cbcSMatt Macyprint_akmodmeta () 106eda14cbcSMatt Macy{ 107eda14cbcSMatt Macy cat <<EOF 108eda14cbcSMatt Macy%package -n kmod-${kmodname} 109eda14cbcSMatt MacySummary: Metapackage which tracks in ${kmodname} kernel module for newest kernel${dashvariant} 110eda14cbcSMatt MacyGroup: System Environment/Kernel 111eda14cbcSMatt Macy 112eda14cbcSMatt MacyProvides: ${kmodname}-kmod = %{?epoch:%{epoch}:}%{version}-%{release} 113eda14cbcSMatt MacyProvides: kmod-${kmodname}-xen = %{?epoch:%{epoch}:}%{version}-%{release} 114eda14cbcSMatt MacyProvides: kmod-${kmodname}-smp = %{?epoch:%{epoch}:}%{version}-%{release} 115eda14cbcSMatt MacyProvides: kmod-${kmodname}-PAE = %{?epoch:%{epoch}:}%{version}-%{release} 116eda14cbcSMatt MacyRequires: akmod-${kmodname} = %{?epoch:%{epoch}:}%{version}-%{release} 117eda14cbcSMatt MacyEOF 118eda14cbcSMatt Macy 119*e92ffd9bSMartin Matuska if [ -n "${obsolete_name}" ]; then 120eda14cbcSMatt Macy echo "Provides: kmod-${obsolete_name} = ${obsolete_version}" 121eda14cbcSMatt Macy echo "Obsoletes: kmod-${obsolete_name} < ${obsolete_version}" 122eda14cbcSMatt Macy fi 123eda14cbcSMatt Macycat <<EOF 124eda14cbcSMatt Macy 125eda14cbcSMatt Macy%description -n kmod-${kmodname}${dashvariant} 126eda14cbcSMatt MacyThis is a meta-package without payload which sole purpose is to require the 127eda14cbcSMatt Macy${kmodname} kernel module(s) for the newest kernel${dashvariant}, 128eda14cbcSMatt Macyto make sure you get it together with a new kernel. 129eda14cbcSMatt Macy 130eda14cbcSMatt Macy%files -n kmod-${kmodname}${dashvariant} 131eda14cbcSMatt Macy%defattr(644,root,root,755) 132eda14cbcSMatt MacyEOF 133eda14cbcSMatt Macy} 134eda14cbcSMatt Macy 135eda14cbcSMatt Macyprint_rpmtemplate_per_kmodpkg () 136eda14cbcSMatt Macy{ 137*e92ffd9bSMartin Matuska if [ "${1}" = "--custom" ]; then 138eda14cbcSMatt Macy shift 139eda14cbcSMatt Macy local customkernel=true 140*e92ffd9bSMartin Matuska elif [ "${1}" = "--redhat" ]; then 141eda14cbcSMatt Macy # this is needed for akmods 142eda14cbcSMatt Macy shift 143eda14cbcSMatt Macy local redhatkernel=true 144eda14cbcSMatt Macy fi 145eda14cbcSMatt Macy 146eda14cbcSMatt Macy local kernel_uname_r=${1} 147eda14cbcSMatt Macy local kernel_variant="${2:+-${2}}" 148eda14cbcSMatt Macy 149eda14cbcSMatt Macy # Detect depmod install location 150eda14cbcSMatt Macy local depmod_path=/sbin/depmod 151*e92ffd9bSMartin Matuska if [ ! -f "${depmod_path}" ]; then 152eda14cbcSMatt Macy depmod_path=/usr/sbin/depmod 153eda14cbcSMatt Macy fi 154eda14cbcSMatt Macy 155eda14cbcSMatt Macy # first part 156eda14cbcSMatt Macy cat <<EOF 157eda14cbcSMatt Macy%package -n kmod-${kmodname}-${kernel_uname_r} 158eda14cbcSMatt MacySummary: ${kmodname} kernel module(s) for ${kernel_uname_r} 159eda14cbcSMatt MacyGroup: System Environment/Kernel 160eda14cbcSMatt MacyProvides: kernel-modules-for-kernel = ${kernel_uname_r} 161eda14cbcSMatt MacyProvides: kmod-${kmodname}-uname-r = ${kernel_uname_r} 162eda14cbcSMatt MacyProvides: ${kmodname}-kmod = %{?epoch:%{epoch}:}%{version}-%{release} 163eda14cbcSMatt MacyRequires: ${kmodname}-kmod-common >= %{?epoch:%{epoch}:}%{version} 164eda14cbcSMatt Macy 165eda14cbcSMatt Macy%if 0%{?rhel} == 6 || 0%{?centos} == 6 166eda14cbcSMatt MacyRequires(post): module-init-tools 167eda14cbcSMatt MacyRequires(postun): module-init-tools 168eda14cbcSMatt Macy%else 169eda14cbcSMatt MacyRequires(post): kmod 170eda14cbcSMatt MacyRequires(postun): kmod 171eda14cbcSMatt Macy%endif 172eda14cbcSMatt MacyEOF 173eda14cbcSMatt Macy 174*e92ffd9bSMartin Matuska if [ -n "${obsolete_name}" ]; then 175eda14cbcSMatt Macy echo "Provides: kmod-${obsolete_name}-${kernel_uname_r} = ${obsolete_version}" 176eda14cbcSMatt Macy echo "Obsoletes: kmod-${obsolete_name}-${kernel_uname_r} < ${obsolete_version}" 177eda14cbcSMatt Macy fi 178eda14cbcSMatt Macy 179eda14cbcSMatt Macy # second part 180*e92ffd9bSMartin Matuska if [ -z "${customkernel}" ]; then 181eda14cbcSMatt Macy cat <<EOF 182eda14cbcSMatt MacyRequires: kernel-uname-r = ${kernel_uname_r} 183eda14cbcSMatt MacyBuildRequires: kernel-devel-uname-r = ${kernel_uname_r} 184eda14cbcSMatt Macy%{?KmodsRequires:Requires: %{KmodsRequires}-uname-r = ${kernel_uname_r}} 185eda14cbcSMatt Macy%{?KmodsRequires:BuildRequires: %{KmodsRequires}-uname-r = ${kernel_uname_r}} 186eda14cbcSMatt Macy%post -n kmod-${kmodname}-${kernel_uname_r} 187*e92ffd9bSMartin Matuskaif [ -f "/boot/System.map-${kernel_uname_r}" ]; then 188eda14cbcSMatt Macy ${prefix}${depmod_path} -aeF /boot/System.map-${kernel_uname_r} ${kernel_uname_r} > /dev/null || : 189*e92ffd9bSMartin Matuskaelif [ -f "/lib/modules/${kernel_uname_r}/System.map" ]; then 19016038816SMartin Matuska ${prefix}${depmod_path} -aeF /lib/modules/${kernel_uname_r}/System.map ${kernel_uname_r} > /dev/null || : 19116038816SMartin Matuskaelse 19216038816SMartin Matuska ${prefix}${depmod_path} -ae ${kernel_uname_r} &> /dev/null || : 19316038816SMartin Matuskafi 194eda14cbcSMatt Macy%postun -n kmod-${kmodname}-${kernel_uname_r} 195*e92ffd9bSMartin Matuskaif [ -f "/boot/System.map-${kernel_uname_r}" ]; then 196eda14cbcSMatt Macy ${prefix}${depmod_path} -aF /boot/System.map-${kernel_uname_r} ${kernel_uname_r} &> /dev/null || : 197*e92ffd9bSMartin Matuskaelif [ -f "/lib/modules/${kernel_uname_r}/System.map" ]; then 19816038816SMartin Matuska ${prefix}${depmod_path} -aF /lib/modules/${kernel_uname_r}/System.map ${kernel_uname_r} &> /dev/null || : 19916038816SMartin Matuskaelse 20016038816SMartin Matuska ${prefix}${depmod_path} -a ${kernel_uname_r} &> /dev/null || : 20116038816SMartin Matuskafi 202eda14cbcSMatt Macy 203eda14cbcSMatt MacyEOF 204eda14cbcSMatt Macy else 205eda14cbcSMatt Macy cat <<EOF 206eda14cbcSMatt Macy%post -n kmod-${kmodname}-${kernel_uname_r} 207*e92ffd9bSMartin Matuska[ "\$(uname -r)" = "${kernel_uname_r}" ] && ${prefix}${depmod_path} -a > /dev/null || : 208eda14cbcSMatt Macy%postun -n kmod-${kmodname}-${kernel_uname_r} 209*e92ffd9bSMartin Matuska[ "\$(uname -r)" = "${kernel_uname_r}" ] && ${prefix}${depmod_path} -a > /dev/null || : 210eda14cbcSMatt Macy 211eda14cbcSMatt MacyEOF 212eda14cbcSMatt Macy fi 213eda14cbcSMatt Macy 214eda14cbcSMatt Macy # third part 215eda14cbcSMatt Macy cat <<EOF 216eda14cbcSMatt Macy%description -n kmod-${kmodname}-${kernel_uname_r} 217eda14cbcSMatt MacyThis package provides the ${kmodname} kernel modules built for the Linux 218eda14cbcSMatt Macykernel ${kernel_uname_r} for the %{_target_cpu} family of processors. 219eda14cbcSMatt Macy%files -n kmod-${kmodname}-${kernel_uname_r} 220eda14cbcSMatt Macy%defattr(644,root,root,755) 221eda14cbcSMatt Macy%dir $prefix/lib/modules/${kernel_uname_r}/extra 222eda14cbcSMatt Macy${prefix}/lib/modules/${kernel_uname_r}/extra/${kmodname}/ 223eda14cbcSMatt Macy 224eda14cbcSMatt Macy 225eda14cbcSMatt MacyEOF 226eda14cbcSMatt Macy} 227eda14cbcSMatt Macy 228eda14cbcSMatt Macyprint_rpmtemplate_kmoddevelpkg () 229eda14cbcSMatt Macy{ 230*e92ffd9bSMartin Matuska if [ "${1}" = "--custom" ]; then 231eda14cbcSMatt Macy shift 232eda14cbcSMatt Macy local customkernel=true 233*e92ffd9bSMartin Matuska elif [ "${1}" = "--redhat" ]; then 234eda14cbcSMatt Macy shift 235eda14cbcSMatt Macy local redhatkernel=true 236eda14cbcSMatt Macy fi 237eda14cbcSMatt Macy 238eda14cbcSMatt Macy local kernel_uname_r=${1} 239eda14cbcSMatt Macy 240eda14cbcSMatt Macy cat <<EOF 241eda14cbcSMatt Macy%package -n kmod-${kmodname}-devel 242eda14cbcSMatt MacySummary: ${kmodname} kernel module(s) devel common 243eda14cbcSMatt MacyGroup: System Environment/Kernel 244eda14cbcSMatt MacyProvides: ${kmodname}-devel-kmod = %{?epoch:%{epoch}:}%{version}-%{release} 245eda14cbcSMatt MacyEOF 246eda14cbcSMatt Macy 247*e92ffd9bSMartin Matuska if [ -z "${customkernel}" ] && [ -z "${redhatkernel}" ]; then 248eda14cbcSMatt Macy echo "Requires: kmod-${kmodname}-devel-${kernel_uname_r} >= %{?epoch:%{epoch}:}%{version}-%{release}" 249eda14cbcSMatt Macy fi 250eda14cbcSMatt Macy 251*e92ffd9bSMartin Matuska if [ -n "${obsolete_name}" ]; then 252eda14cbcSMatt Macy echo "Provides: kmod-${obsolete_name}-devel = ${obsolete_version}" 253eda14cbcSMatt Macy echo "Obsoletes: kmod-${obsolete_name}-devel < ${obsolete_version}" 254eda14cbcSMatt Macy fi 255eda14cbcSMatt Macy 256eda14cbcSMatt Macy cat <<EOF 257eda14cbcSMatt Macy%description -n kmod-${kmodname}-devel 258eda14cbcSMatt MacyThis package provides the common header files to build kernel modules 259eda14cbcSMatt Macywhich depend on the ${kmodname} kernel module. It may optionally require 260eda14cbcSMatt Macythe ${kmodname}-devel-<kernel> objects for the newest kernel. 261eda14cbcSMatt Macy 262eda14cbcSMatt Macy%files -n kmod-${kmodname}-devel 263eda14cbcSMatt Macy%defattr(644,root,root,755) 264eda14cbcSMatt Macy%{_usrsrc}/${kmodname}-%{version} 265eda14cbcSMatt MacyEOF 266*e92ffd9bSMartin Matuska if [ -n "${obsolete_name}" ]; then 267eda14cbcSMatt Macy echo "%{_usrsrc}/${obsolete_name}-%{version}" 268eda14cbcSMatt Macy fi 269eda14cbcSMatt Macy 270eda14cbcSMatt Macy for kernel in ${1}; do 271eda14cbcSMatt Macy local kernel_uname_r=${kernel} 272eda14cbcSMatt Macy echo "%exclude %{_usrsrc}/${kmodname}-%{version}/${kernel_uname_r}" 273*e92ffd9bSMartin Matuska if [ -n "${obsolete_name}" ]; then 274eda14cbcSMatt Macy echo "%exclude %{_usrsrc}/${obsolete_name}-%{version}/${kernel_uname_r}" 275eda14cbcSMatt Macy fi 276eda14cbcSMatt Macy done 277eda14cbcSMatt Macy 278eda14cbcSMatt Macy echo 279eda14cbcSMatt Macy echo 280eda14cbcSMatt Macy} 281eda14cbcSMatt Macy 282eda14cbcSMatt Macyprint_rpmtemplate_per_kmoddevelpkg () 283eda14cbcSMatt Macy{ 284*e92ffd9bSMartin Matuska if [ "${1}" = "--custom" ]; then 285eda14cbcSMatt Macy shift 286eda14cbcSMatt Macy local customkernel=true 287*e92ffd9bSMartin Matuska elif [ "${1}" = "--redhat" ]; then 288eda14cbcSMatt Macy # this is needed for akmods 289eda14cbcSMatt Macy shift 290eda14cbcSMatt Macy local redhatkernel=true 291eda14cbcSMatt Macy fi 292eda14cbcSMatt Macy 293eda14cbcSMatt Macy local kernel_uname_r=${1} 294eda14cbcSMatt Macy local kernel_variant="${2:+-${2}}" 295eda14cbcSMatt Macy 296eda14cbcSMatt Macy # first part 297eda14cbcSMatt Macy cat <<EOF 298eda14cbcSMatt Macy%package -n kmod-${kmodname}-devel-${kernel_uname_r} 299eda14cbcSMatt MacySummary: ${kmodname} kernel module(s) devel for ${kernel_uname_r} 300eda14cbcSMatt MacyGroup: System Environment/Kernel 301eda14cbcSMatt MacyProvides: kernel-objects-for-kernel = ${kernel_uname_r} 302eda14cbcSMatt MacyProvides: ${kmodname}-devel-kmod = %{?epoch:%{epoch}:}%{version}-%{release} 303eda14cbcSMatt MacyProvides: kmod-${kmodname}-devel-uname-r = ${kernel_uname_r} 304eda14cbcSMatt MacyEOF 305eda14cbcSMatt Macy 306*e92ffd9bSMartin Matuska if [ -n "${obsolete_name}" ]; then 307eda14cbcSMatt Macy echo "Provides: kmod-${obsolete_name}-devel-${kernel_uname_r} = ${obsolete_version}" 308eda14cbcSMatt Macy echo "Obsoletes: kmod-${obsolete_name}-devel-${kernel_uname_r} < ${obsolete_version}" 309eda14cbcSMatt Macy fi 310eda14cbcSMatt Macy 311eda14cbcSMatt Macy # second part 312*e92ffd9bSMartin Matuska if [ -z "${customkernel}" ]; then 313eda14cbcSMatt Macy cat <<EOF 314eda14cbcSMatt MacyRequires: kernel-devel-uname-r = ${kernel_uname_r} 315eda14cbcSMatt MacyBuildRequires: kernel-devel-uname-r = ${kernel_uname_r} 316eda14cbcSMatt Macy%{?KmodsDevelRequires:Requires: %{KmodsDevelRequires}-uname-r = ${kernel_uname_r}} 317eda14cbcSMatt Macy%{?KmodsDevelRequires:BuildRequires: %{KmodsDevelRequires}-uname-r = ${kernel_uname_r}} 318eda14cbcSMatt MacyEOF 319eda14cbcSMatt Macy fi 320eda14cbcSMatt Macy 321eda14cbcSMatt Macy # third part 322eda14cbcSMatt Macy cat <<EOF 323eda14cbcSMatt Macy%description -n kmod-${kmodname}-devel-${kernel_uname_r} 324eda14cbcSMatt MacyThis package provides objects and symbols required to build kernel modules 325eda14cbcSMatt Macywhich depend on the ${kmodname} kernel modules built for the Linux 326eda14cbcSMatt Macykernel ${kernel_uname_r} for the %{_target_cpu} family of processors. 327eda14cbcSMatt Macy%files -n kmod-${kmodname}-devel-${kernel_uname_r} 328eda14cbcSMatt Macy%defattr(644,root,root,755) 329eda14cbcSMatt Macy%{_usrsrc}/${kmodname}-%{version}/${kernel_uname_r} 330eda14cbcSMatt MacyEOF 331*e92ffd9bSMartin Matuska if [ -n "${obsolete_name}" ]; then 332eda14cbcSMatt Macy echo "%{_usrsrc}/${obsolete_name}-%{version}/${kernel_uname_r}" 333eda14cbcSMatt Macy fi 334eda14cbcSMatt Macy} 335eda14cbcSMatt Macy 336eda14cbcSMatt Macyprint_rpmtemplate_kmodmetapkg () 337eda14cbcSMatt Macy{ 338eda14cbcSMatt Macy local kernel_uname_r=${1} 339eda14cbcSMatt Macy local kernel_variant="${2:+-${2}}" 340eda14cbcSMatt Macy 341eda14cbcSMatt Macy cat <<EOF 342eda14cbcSMatt Macy%package -n kmod-${kmodname}${kernel_variant} 343eda14cbcSMatt MacySummary: Metapackage which tracks in ${kmodname} kernel module for newest kernel${kernel_variant} 344eda14cbcSMatt MacyGroup: System Environment/Kernel 345eda14cbcSMatt Macy 346eda14cbcSMatt MacyProvides: ${kmodname}-kmod = %{?epoch:%{epoch}:}%{version}-%{release} 347eda14cbcSMatt MacyRequires: kmod-${kmodname}-${kernel_uname_r} >= %{?epoch:%{epoch}:}%{version}-%{release} 348eda14cbcSMatt Macy%{?KmodsMetaRequires:Requires: %{?KmodsMetaRequires}} 349eda14cbcSMatt MacyEOF 350eda14cbcSMatt Macy 351*e92ffd9bSMartin Matuska if [ -n "${obsolete_name}" ]; then 352eda14cbcSMatt Macy echo "Provides: kmod-${obsolete_name}${kernel_variant} = ${obsolete_version}" 353eda14cbcSMatt Macy echo "Obsoletes: kmod-${obsolete_name}${kernel_variant} < ${obsolete_version}" 354eda14cbcSMatt Macy fi 355eda14cbcSMatt Macy 356eda14cbcSMatt Macy cat <<EOF 357eda14cbcSMatt Macy 358eda14cbcSMatt Macy%description -n kmod-${kmodname}${kernel_variant} 359eda14cbcSMatt MacyThis is a meta-package without payload which sole purpose is to require the 360eda14cbcSMatt Macy${kmodname} kernel module(s) for the newest kernel${kernel_variant}. 361eda14cbcSMatt Macyto make sure you get it together with a new kernel. 362eda14cbcSMatt Macy 363eda14cbcSMatt Macy%files -n kmod-${kmodname}${kernel_variant} 364eda14cbcSMatt Macy%defattr(644,root,root,755) 365eda14cbcSMatt Macy 366eda14cbcSMatt Macy 367eda14cbcSMatt MacyEOF 368eda14cbcSMatt Macy} 369eda14cbcSMatt Macy 370eda14cbcSMatt Macyprint_customrpmtemplate () 371eda14cbcSMatt Macy{ 372eda14cbcSMatt Macy for kernel in ${1} 373eda14cbcSMatt Macy do 374*e92ffd9bSMartin Matuska if [ -e "${buildroot}/usr/src/kernels/${kernel}" ] ; then 375eda14cbcSMatt Macy # this looks like a Fedora/RH kernel -- print a normal template (which includes the proper BR) and be happy :) 376eda14cbcSMatt Macy kernel_versions="${kernel_versions}${kernel}___${buildroot}%{_usrsrc}/kernels/${kernel} " 377eda14cbcSMatt Macy 378eda14cbcSMatt Macy # parse kernel versions string and print template 379eda14cbcSMatt Macy local kernel_verrelarch=${kernel%%${kernels_known_variants}} 380eda14cbcSMatt Macy print_rpmtemplate_per_kmodpkg --redhat ${kernel} ${kernel##${kernel_verrelarch}} 381eda14cbcSMatt Macy 382eda14cbcSMatt Macy # create development package 383*e92ffd9bSMartin Matuska if [ -n "${devel}" ]; then 384eda14cbcSMatt Macy # create devel package including common headers 385eda14cbcSMatt Macy print_rpmtemplate_kmoddevelpkg --redhat ${kernel} ${kernel##${kernel_verrelarch}} 386eda14cbcSMatt Macy 387eda14cbcSMatt Macy # create devel package 388eda14cbcSMatt Macy print_rpmtemplate_per_kmoddevelpkg --redhat ${kernel} ${kernel##${kernel_verrelarch}} 389eda14cbcSMatt Macy fi 390*e92ffd9bSMartin Matuska elif [ -e "${prefix}/lib/modules/${kernel}/build/Makefile" ]; then 391eda14cbcSMatt Macy # likely a user-build-kernel with available buildfiles 392eda14cbcSMatt Macy # fixme: we should check if uname from Makefile is the same as ${kernel} 393eda14cbcSMatt Macy 394eda14cbcSMatt Macy kernel_versions="${kernel_versions}${kernel}___${prefix}/lib/modules/${kernel}/build/ " 395eda14cbcSMatt Macy print_rpmtemplate_per_kmodpkg --custom "${kernel}" 396eda14cbcSMatt Macy 397eda14cbcSMatt Macy # create development package 398*e92ffd9bSMartin Matuska if [ -n "${devel}" ]; then 399eda14cbcSMatt Macy # create devel package including common headers 400eda14cbcSMatt Macy print_rpmtemplate_kmoddevelpkg --custom "${kernel}" 401eda14cbcSMatt Macy 402eda14cbcSMatt Macy # create devel package 403eda14cbcSMatt Macy print_rpmtemplate_per_kmoddevelpkg --custom "${kernel}" 404eda14cbcSMatt Macy fi 405eda14cbcSMatt Macy else 406eda14cbcSMatt Macy error_out 2 "Don't know how to handle ${kernel} -- ${prefix}/lib/modules/${kernel}/build/Makefile not found" 407eda14cbcSMatt Macy fi 408eda14cbcSMatt Macy done 409eda14cbcSMatt Macy 410eda14cbcSMatt Macy # well, it's no header anymore, but who cares ;-) 411eda14cbcSMatt Macy print_rpmtemplate_header 412eda14cbcSMatt Macy} 413eda14cbcSMatt Macy 414eda14cbcSMatt Macy 415eda14cbcSMatt Macyprint_rpmtemplate () 416eda14cbcSMatt Macy{ 417eda14cbcSMatt Macy # create kernel_versions var 418eda14cbcSMatt Macy for kernel_version in ${kernel_versions_to_build_for} 419eda14cbcSMatt Macy do 420eda14cbcSMatt Macy kernel_versions="${kernel_versions}${kernel_version}___%{_usrsrc}/kernels/${kernel_version} " 421eda14cbcSMatt Macy done 422eda14cbcSMatt Macy 423eda14cbcSMatt Macy # and print it and some other required stuff as macro 424eda14cbcSMatt Macy print_rpmtemplate_header 425eda14cbcSMatt Macy 426eda14cbcSMatt Macy # now print the packages 427eda14cbcSMatt Macy for kernel in ${kernel_versions_to_build_for} ; do 428eda14cbcSMatt Macy 429eda14cbcSMatt Macy local kernel_verrelarch=${kernel%%${kernels_known_variants}} 430eda14cbcSMatt Macy 431eda14cbcSMatt Macy # create metapackage 432*e92ffd9bSMartin Matuska print_rpmtemplate_kmodmetapkg "${kernel}" "${kernel##${kernel_verrelarch}}" 433eda14cbcSMatt Macy 434eda14cbcSMatt Macy # create package 435*e92ffd9bSMartin Matuska print_rpmtemplate_per_kmodpkg "${kernel}" "${kernel##${kernel_verrelarch}}" 436eda14cbcSMatt Macy 437*e92ffd9bSMartin Matuska if [ -n "${devel}" ]; then 438eda14cbcSMatt Macy # create devel package including common headers 439*e92ffd9bSMartin Matuska print_rpmtemplate_kmoddevelpkg "${kernel}" "${kernel##${kernel_verrelarch}}" 440eda14cbcSMatt Macy 441eda14cbcSMatt Macy # create devel package 442*e92ffd9bSMartin Matuska print_rpmtemplate_per_kmoddevelpkg "${kernel}" "${kernel##${kernel_verrelarch}}" 443eda14cbcSMatt Macy fi 444eda14cbcSMatt Macy done 445eda14cbcSMatt Macy} 446eda14cbcSMatt Macy 447eda14cbcSMatt Macymyprog_help () 448eda14cbcSMatt Macy{ 449dae17134SMartin Matuska echo "Usage: ${0##*/} [OPTIONS]" 450*e92ffd9bSMartin Matuska echo 451*e92ffd9bSMartin Matuska echo "Creates a template to be used during kmod building" 452*e92ffd9bSMartin Matuska echo 453*e92ffd9bSMartin Matuska echo "Available options:" 454eda14cbcSMatt Macy echo " --filterfile <file> -- filter the results with grep --file <file>" 455eda14cbcSMatt Macy echo " --for-kernels <list> -- created templates only for these kernels" 456eda14cbcSMatt Macy echo " --kmodname <file> -- name of the kmod (required)" 457eda14cbcSMatt Macy echo " --devel -- make kmod-devel package" 458eda14cbcSMatt Macy echo " --noakmod -- no akmod package" 459eda14cbcSMatt Macy echo " --repo <name> -- use buildsys-build-<name>-kerneldevpkgs" 460eda14cbcSMatt Macy echo " --target <arch> -- target-arch (required)" 461eda14cbcSMatt Macy echo " --buildroot <dir> -- Build root (place to look for build files)" 462eda14cbcSMatt Macy} 463eda14cbcSMatt Macy 464*e92ffd9bSMartin Matuskawhile [ -n "${1}" ] ; do 465eda14cbcSMatt Macy case "${1}" in 466eda14cbcSMatt Macy --filterfile) 467eda14cbcSMatt Macy shift 468*e92ffd9bSMartin Matuska if [ -z "${1}" ] ; then 469eda14cbcSMatt Macy error_out 2 "Please provide path to a filter-file together with --filterfile" >&2 470*e92ffd9bSMartin Matuska elif [ ! -e "${1}" ]; then 471eda14cbcSMatt Macy error_out 2 "Filterfile ${1} not found" >&2 472eda14cbcSMatt Macy fi 473eda14cbcSMatt Macy filterfile="${1}" 474eda14cbcSMatt Macy shift 475eda14cbcSMatt Macy ;; 476eda14cbcSMatt Macy --kmodname) 477eda14cbcSMatt Macy shift 478*e92ffd9bSMartin Matuska if [ -z "${1}" ] ; then 479eda14cbcSMatt Macy error_out 2 "Please provide the name of the kmod together with --kmodname" >&2 480eda14cbcSMatt Macy fi 481eda14cbcSMatt Macy # strip pending -kmod 482eda14cbcSMatt Macy kmodname="${1%%-kmod}" 483eda14cbcSMatt Macy shift 484eda14cbcSMatt Macy ;; 485eda14cbcSMatt Macy --devel) 486eda14cbcSMatt Macy shift 487eda14cbcSMatt Macy devel="true" 488eda14cbcSMatt Macy ;; 489eda14cbcSMatt Macy --prefix) 490eda14cbcSMatt Macy shift 491*e92ffd9bSMartin Matuska if [ -z "${1}" ] ; then 492eda14cbcSMatt Macy error_out 2 "Please provide a prefix with --prefix" >&2 493eda14cbcSMatt Macy fi 494eda14cbcSMatt Macy prefix="${1}" 495eda14cbcSMatt Macy shift 496eda14cbcSMatt Macy ;; 497eda14cbcSMatt Macy --repo) 498eda14cbcSMatt Macy shift 499*e92ffd9bSMartin Matuska if [ -z "${1}" ] ; then 500eda14cbcSMatt Macy error_out 2 "Please provide the name of the repo together with --repo" >&2 501eda14cbcSMatt Macy fi 502eda14cbcSMatt Macy repo=${1} 503eda14cbcSMatt Macy shift 504eda14cbcSMatt Macy ;; 505eda14cbcSMatt Macy --for-kernels) 506eda14cbcSMatt Macy shift 507*e92ffd9bSMartin Matuska if [ -z "${1}" ] ; then 508eda14cbcSMatt Macy error_out 2 "Please provide the name of the kmod together with --kmodname" >&2 509eda14cbcSMatt Macy fi 510eda14cbcSMatt Macy for_kernels="${1}" 511eda14cbcSMatt Macy shift 512eda14cbcSMatt Macy ;; 513eda14cbcSMatt Macy --noakmod) 514eda14cbcSMatt Macy shift 515eda14cbcSMatt Macy noakmod="true" 516eda14cbcSMatt Macy ;; 517eda14cbcSMatt Macy --obsolete-name) 518eda14cbcSMatt Macy shift 519*e92ffd9bSMartin Matuska if [ -z "${1}" ] ; then 520eda14cbcSMatt Macy error_out 2 "Please provide the name of the kmod to obsolete together with --obsolete-name" >&2 521eda14cbcSMatt Macy fi 522eda14cbcSMatt Macy obsolete_name="${1}" 523eda14cbcSMatt Macy shift 524eda14cbcSMatt Macy ;; 525eda14cbcSMatt Macy --obsolete-version) 526eda14cbcSMatt Macy shift 527*e92ffd9bSMartin Matuska if [ -z "${1}" ] ; then 528eda14cbcSMatt Macy error_out 2 "Please provide the version of the kmod to obsolete together with --obsolete-version" >&2 529eda14cbcSMatt Macy fi 530eda14cbcSMatt Macy obsolete_version="${1}" 531eda14cbcSMatt Macy shift 532eda14cbcSMatt Macy ;; 533eda14cbcSMatt Macy --target) 534eda14cbcSMatt Macy shift 535eda14cbcSMatt Macy target="${1}" 536eda14cbcSMatt Macy shift 537eda14cbcSMatt Macy ;; 538eda14cbcSMatt Macy --akmod) 539eda14cbcSMatt Macy shift 540eda14cbcSMatt Macy build_kernels="akmod" 541eda14cbcSMatt Macy ;; 542eda14cbcSMatt Macy --newest) 543eda14cbcSMatt Macy shift 544eda14cbcSMatt Macy build_kernels="newest" 545eda14cbcSMatt Macy ;; 546eda14cbcSMatt Macy --current) 547eda14cbcSMatt Macy shift 548eda14cbcSMatt Macy build_kernels="current" 549eda14cbcSMatt Macy ;; 550eda14cbcSMatt Macy --buildroot) 551eda14cbcSMatt Macy shift 552eda14cbcSMatt Macy buildroot="${1}" 553eda14cbcSMatt Macy shift 554eda14cbcSMatt Macy ;; 555eda14cbcSMatt Macy --help) 556eda14cbcSMatt Macy myprog_help 557eda14cbcSMatt Macy exit 0 558eda14cbcSMatt Macy ;; 559eda14cbcSMatt Macy --version) 560eda14cbcSMatt Macy echo "${myprog} ${myver}" 561eda14cbcSMatt Macy exit 0 562eda14cbcSMatt Macy ;; 563eda14cbcSMatt Macy *) 564eda14cbcSMatt Macy echo "Error: Unknown option '${1}'." >&2 565eda14cbcSMatt Macy usage >&2 566eda14cbcSMatt Macy exit 2 567eda14cbcSMatt Macy ;; 568eda14cbcSMatt Macy esac 569eda14cbcSMatt Macydone 570eda14cbcSMatt Macy 571*e92ffd9bSMartin Matuskaif [ -e ./kmodtool-kernel-variants ]; then 572eda14cbcSMatt Macy kernels_known_variants="$(cat ./kmodtool-kernel-variants)" 573*e92ffd9bSMartin Matuskaelif [ -e /usr/share/kmodtool/kernel-variants ] ; then 574eda14cbcSMatt Macy kernels_known_variants="$(cat /usr/share/kmodtool/kernel-variants)" 575eda14cbcSMatt Macyelse 576eda14cbcSMatt Macy kernels_known_variants="@(smp?(-debug)|PAE?(-debug)|debug|kdump|xen|kirkwood|highbank|imx|omap|tegra)" 577eda14cbcSMatt Macyfi 578eda14cbcSMatt Macy 579eda14cbcSMatt Macy# general sanity checks 580*e92ffd9bSMartin Matuskaif [ -z "${target}" ]; then 581eda14cbcSMatt Macy error_out 2 "please pass target arch with --target" 582*e92ffd9bSMartin Matuskaelif [ -z "${kmodname}" ]; then 583eda14cbcSMatt Macy error_out 2 "please pass kmodname with --kmodname" 584*e92ffd9bSMartin Matuskaelif [ -z "${kernels_known_variants}" ] ; then 585eda14cbcSMatt Macy error_out 2 "could not determine known variants" 586*e92ffd9bSMartin Matuskaelif { [ -n "${obsolete_name}" ] && [ -z "${obsolete_version}" ]; } || { [ -z "${obsolete_name}" ] && [ -n "${obsolete_version}" ]; } ; then 587eda14cbcSMatt Macy error_out 2 "you need to provide both --obsolete-name and --obsolete-version" 588eda14cbcSMatt Macyfi 589eda14cbcSMatt Macy 590eda14cbcSMatt Macy# go 591*e92ffd9bSMartin Matuskaif [ -n "${for_kernels}" ]; then 592eda14cbcSMatt Macy # this is easy: 593eda14cbcSMatt Macy print_customrpmtemplate "${for_kernels}" 594*e92ffd9bSMartin Matuskaelif [ "${build_kernels}" = "akmod" ]; then 595eda14cbcSMatt Macy # do only a akmod package 596eda14cbcSMatt Macy print_akmodtemplate 597eda14cbcSMatt Macy print_akmodmeta 598eda14cbcSMatt Macyelse 599eda14cbcSMatt Macy # seems we are on out own to decide for which kernels to build 600eda14cbcSMatt Macy 601eda14cbcSMatt Macy # we need more sanity checks in this case 602*e92ffd9bSMartin Matuska if [ -z "${repo}" ]; then 603eda14cbcSMatt Macy error_out 2 "please provide repo name with --repo" 604*e92ffd9bSMartin Matuska elif ! command -v "buildsys-build-${repo}-kerneldevpkgs" > /dev/null 2>&1; then 605eda14cbcSMatt Macy error_out 2 "buildsys-build-${repo}-kerneldevpkgs not found" 606eda14cbcSMatt Macy fi 607eda14cbcSMatt Macy 608eda14cbcSMatt Macy # call buildsys-build-${repo}-kerneldevpkgs to get the list of kernels 609eda14cbcSMatt Macy cmdoptions="--target ${target}" 610eda14cbcSMatt Macy 611eda14cbcSMatt Macy # filterfile to filter list of kernels? 612*e92ffd9bSMartin Matuska if [ -n "${filterfile}" ] ; then 613eda14cbcSMatt Macy cmdoptions="${cmdoptions} --filterfile ${filterfile}" 614eda14cbcSMatt Macy fi 615eda14cbcSMatt Macy 616*e92ffd9bSMartin Matuska kernel_versions_to_build_for=$(buildsys-build-${repo}-kerneldevpkgs "--${build_kernels}" ${cmdoptions}) 617eda14cbcSMatt Macy returncode=$? 618*e92ffd9bSMartin Matuska if [ "$returncode" -ne 0 ]; then 619*e92ffd9bSMartin Matuska 620*e92ffd9bSMartin Matuska error_out 2 "buildsys-build-${repo}-kerneldevpkgs failed: ${kernel_versions_to_build_for}" 621eda14cbcSMatt Macy fi 622eda14cbcSMatt Macy 623*e92ffd9bSMartin Matuska if [ "${build_kernels}" = "current" ] && [ -z "${noakmod}" ]; then 624eda14cbcSMatt Macy print_akmodtemplate 625eda14cbcSMatt Macy fi 626eda14cbcSMatt Macy 627eda14cbcSMatt Macy print_rpmtemplate 628eda14cbcSMatt Macyfi 629