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