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