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