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