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