xref: /freebsd/sys/contrib/openzfs/scripts/kmodtool (revision eda14cbc264d6969b02f2b1994cef11148e914f1)
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