File kmodtool.flashcache of Package flashcache-kmod
1
#!/bin/bash
2
3
# kmodtool - Helper script for building kernel module RPMs
4
# Copyright (c) 2003-2008 Ville Skyttä <ville.skytta@iki.fi>,
5
# Thorsten Leemhuis <fedora@leemhuis.info>
6
#
7
# Permission is hereby granted, free of charge, to any person obtaining
8
# a copy of this software and associated documentation files (the
9
# "Software"), to deal in the Software without restriction, including
10
# without limitation the rights to use, copy, modify, merge, publish,
11
# distribute, sublicense, and/or sell copies of the Software, and to
12
# permit persons to whom the Software is furnished to do so, subject to
13
# the following conditions:
14
#
15
# The above copyright notice and this permission notice shall be
16
# included in all copies or substantial portions of the Software.
17
#
18
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
22
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25
26
shopt -s extglob
27
28
myprog="kmodtool-${repo}"
29
myver="0.11.5"
30
31
kmodname=
32
build_kernels="current"
33
kernels_known_variants=@(debug)
34
kernel_versions=
35
kernel_versions_to_build_for=
36
prefix=
37
filterfile=
38
target=
39
40
error_out()
41
{
42
local errorlevel=${1}
43
shift
44
echo "Error: $@" >&2
45
# the next line is not multi-line safe -- not needed *yet*
46
echo "%define kmodtool_check echo \"kmodtool error: $@\"; exit ${errorlevel};"
47
exit ${errorlevel}
48
}
49
50
print_rpmtemplate_header()
51
{
52
echo
53
echo '%define kmodinstdir_prefix '/lib/modules/
54
echo '%define kmodinstdir_postfix '/extra/${kmodname}/
55
echo '%define kernel_versions '${kernel_versions}
56
echo
57
}
58
59
print_akmodtemplate ()
60
{
61
echo
62
cat <<EOF
63
%define akmod_install mkdir -p \$RPM_BUILD_ROOT/%{_usrsrc}/akmods/; \\\
64
rpmbuild --define "_sourcedir %{_sourcedir}" \\\
65
--define "_srcrpmdir \$RPM_BUILD_ROOT/%{_usrsrc}/akmods/" \\\
66
-bs --nodeps %{_specdir}/%{name}.spec ; \\\
67
ln -s \$(ls \$RPM_BUILD_ROOT/%{_usrsrc}/akmods/) \$RPM_BUILD_ROOT/%{_usrsrc}/akmods/${kmodname}-kmod.latest
68
%package -n akmod-${kmodname}
69
Summary: Akmod package for ${kmodname} kernel module(s)
70
Group:System Environment/Kernel
71
Requires: kmodtool
72
Requires: akmods
73
%{?AkmodsBuildRequires:Requires: %{AkmodsBuildRequires}}
74
Requires: ${kmodname}-kmod-common >= %{?epoch:%{epoch}:}%{version}
75
Provides: ${kmodname}-kmod = %{?epoch:%{epoch}:}%{version}-%{release}
76
EOF
77
78
if [[ ${obsolete_name} ]]; then
79
echo "Provides: akmod-${obsolete_name} = ${obsolete_version}"
80
echo "Obsoletes: akmod-${obsolete_name} < ${obsolete_version}"
81
fi
82
83
cat <<EOF
84
%description -n akmod-${kmodname}
85
Package provides the akmod package for the ${kmodname} kernel modules.
86
%posttrans -n akmod-${kmodname}
87
nohup /usr/sbin/akmods --from-akmod-posttrans --akmod ${kmodname} &> /dev/null &
88
%files -n akmod-${kmodname}
89
%defattr(-,root,root,-)
90
%{_usrsrc}/akmods/*
91
EOF
92
}
93
94
print_akmodmeta ()
95
{
96
cat <<EOF
97
%package -n kmod-${kmodname}
98
Summary: Metapackage tracks in ${kmodname} kernel module.
99
Group: System Environment/Kernel
100
Provides: ${kmodname}-kmod = %{?epoch:%{epoch}:}%{version}-%{release}
101
Provides: kmod-${kmodname}-xen = %{?epoch:%{epoch}:}%{version}-%{release}
102
Provides: kmod-${kmodname}-smp = %{?epoch:%{epoch}:}%{version}-%{release}
103
Provides: kmod-${kmodname}-PAE = %{?epoch:%{epoch}:}%{version}-%{release}
104
Requires: akmod-${kmodname} = %{?epoch:%{epoch}:}%{version}-%{release}
105
EOF
106
107
if [[ ${obsolete_name} ]]; then
108
echo "Provides: kmod-${obsolete_name} = ${obsolete_version}"
109
echo "Obsoletes: kmod-${obsolete_name} < ${obsolete_version}"
110
fi
111
cat <<EOF
112
%description -n kmod-${kmodname}${dashvariant}
113
Meta-package required ${kmodname} for kernel${kernel_variant}.
114
%files -n kmod-${kmodname}${dashvariant}
115
%defattr(644,root,root,755)
116
EOF
117
}
118
119
print_rpmtemplate_per_kmodpkg ()
120
{
121
if [[ "${1}" == "--custom" ]]; then
122
shift
123
local customkernel=true
124
elif [[ "${1}" == "--redhat" ]]; then
125
# this is needed for akmods
126
shift
127
local redhatkernel=true
128
fi
129
130
local kernel_uname_r=${1}
131
local kernel_variant="${2:+-${2}}"
132
133
# first part
134
cat <<EOF
135
%package -n kmod-${kmodname}-${kernel_uname_r}
136
Summary: ${kmodname} kernel module(s) for ${kernel_uname_r}
137
Group: System Environment/Kernel
138
Provides: kernel-modules-for-kernel = ${kernel_uname_r}
139
Provides: ${kmodname}-kmod = %{?epoch:%{epoch}:}%{version}-%{release}
140
Requires: ${kmodname}-kmod-common >= %{?epoch:%{epoch}:}%{version}
141
Requires(post): /sbin/depmod
142
Requires(postun): /sbin/depmod
143
EOF
144
145
if [[ ${obsolete_name} ]]; then
146
echo "Provides: kmod-${obsolete_name}-${kernel_uname_r} = ${obsolete_version}"
147
echo "Obsoletes: kmod-${obsolete_name}-${kernel_uname_r} < ${obsolete_version}"
148
fi
149
150
# second part
151
if [[ ! "${customkernel}" ]]; then
152
cat <<EOF
153
Requires: kernel-uname-r = ${kernel_uname_r}
154
BuildRequires: kernel-devel-uname-r = ${kernel_uname_r}
155
%post -n kmod-${kmodname}-${kernel_uname_r}
156
if [ -e /boot/System.map-${kernel_uname_r} ]; then
157
/sbin/depmod -aeF /boot/System.map-${kernel_uname_r} ${kernel_uname_r} > /dev/null && /sbin/mkinitrd -f /boot/initrd-${kernel_uname_r} ${kernel_uname_r} || :
158
fi
159
%postun -n kmod-${kmodname}-${kernel_uname_r}
160
if [ -e /boot/System.map-${kernel_uname_r} ]; then
161
/sbin/depmod -aF /boot/System.map-${kernel_uname_r} ${kernel_uname_r} &> /dev/null && /sbin/mkinitrd -f /boot/initrd-${kernel_uname_r} ${kernel_uname_r} || :
162
fi
163
EOF
164
else
165
cat <<EOF
166
%post -n kmod-${kmodname}-${kernel_uname_r}
167
[[ "$(uname -r)" == "${kernel_uname_r}" ]] && /sbin/depmod -a > /dev/null && /sbin/mkinitrd -f /boot/initrd-${kernel_uname_r} ${kernel_uname_r} || :
168
%postun -n kmod-${kmodname}-${kernel_uname_r}
169
[[ "$(uname -r)" == "${kernel_uname_r}" ]] && /sbin/depmod -a > /dev/null && /sbin/mkinitrd -f /boot/initrd-${kernel_uname_r} ${kernel_uname_r} || :
170
EOF
171
fi
172
173
# third part
174
cat <<EOF
175
%description -n kmod-${kmodname}-${kernel_uname_r}
176
Package provides the ${kmodname} kernel modules.
177
%files -n kmod-${kmodname}-${kernel_uname_r}
178
%defattr(644,root,root,755)
179
/lib/modules/${kernel_uname_r}/extra/${kmodname}/
180
EOF
181
}
182
183
print_rpmtemplate_kmodmetapkg ()
184
{
185
local kernel_uname_r=${1}
186
local kernel_variant="${2:+-${2}}"
187
188
cat <<EOF
189
%package -n kmod-${kmodname}${kernel_variant}
190
Summary: Metapackage tracks in ${kmodname} kernel module.
191
Group: System Environment/Kernel
192
Provides: ${kmodname}-kmod = %{?epoch:%{epoch}:}%{version}-%{release}
193
Requires: kmod-${kmodname}-${kernel_uname_r} >= %{?epoch:%{epoch}:}%{version}-%{release}
194
EOF
195
196
if [[ ${obsolete_name} ]]; then
197
echo "Provides: kmod-${obsolete_name}${kernel_variant} = ${obsolete_version}"
198
echo "Obsoletes: kmod-${obsolete_name}${kernel_variant} < ${obsolete_version}"
199
fi
200
201
cat <<EOF
202
%description -n kmod-${kmodname}${kernel_variant}
203
Meta-package required ${kmodname} for kernel${kernel_variant}.
204
%files -n kmod-${kmodname}${kernel_variant}
205
%defattr(644,root,root,755)
206
EOF
207
}
208
209
print_customrpmtemplate ()
210
{
211
for kernel in ${1}
212
do
213
if [[ -e "/usr/src/kernels/${kernel}" ]] ; then
214
# this looks like a Fedora/RH kernel -- print a normal template (which includes the proper BR) and be happy :)
215
kernel_versions="${kernel_versions}${kernel}___%{_usrsrc}/kernels/${kernel} "
216
217
# parse kernel versions string and print template
218
local kernel_verrelarch=${kernel%%${kernels_known_variants}}
219
print_rpmtemplate_per_kmodpkg --redhat ${kernel} ${kernel##${kernel_verrelarch}}
220
elif [[ -e /lib/modules/"${kernel}"/build/Makefile ]] ; then
221
# likely a user-build-kernel with available buildfiles
222
# fixme: we should check if uname from Makefile is the same as ${kernel}
223
224
kernel_versions="${kernel_versions}${kernel}___/lib/modules/${kernel}/build/ "
225
print_rpmtemplate_per_kmodpkg --custom "${kernel}"
226
else
227
error_out 2 "Don't know how to handle ${kernel} -- /lib/modules/${kernel}/build/Makefile not found"
228
fi
229
done
230
231
# well, it's no header anymore, but who cares ;-)
232
print_rpmtemplate_header
233
}
234
235
236
print_rpmtemplate ()
237
{
238
# create kernel_versions var
239
for kernel_version in ${kernel_versions_to_build_for}
240
do
241
kernel_versions="${kernel_versions}${kernel_version}___%{_usrsrc}/kernels/${kernel_version} "
242
done
243
244
# and print it and some other required stuff as macro
245
print_rpmtemplate_header
246
247
# now print the packages itselfs
248
for kernel in ${kernel_versions_to_build_for} ; do
249
250
local kernel_verrelarch=${kernel%%${kernels_known_variants}}
251
252
# create metapackage
253
print_rpmtemplate_kmodmetapkg ${kernel} ${kernel##${kernel_verrelarch}}
254
255
# create package
256
print_rpmtemplate_per_kmodpkg ${kernel} ${kernel##${kernel_verrelarch}}
257
done
258
}
259
260
myprog_help ()
261
{
262
echo "Usage: $(basename ${0}) [OPTIONS]"
263
echo $'\n'"Creates a template to be used during kmod building"
264
echo $'\n'"Available options:"
265
# FIXME echo " --datadir <dir> -- look for our shared files in <dir>"
266
echo " --filterfile <file> -- filter the results with grep --file <file>"
267
echo " --for-kernels <list> -- created templates only for these kernels"
268
echo " --kmodname <file> -- name of the kmod (required)"
269
echo " --noakmod -- no akmod package"
270
echo " --repo <name> -- use buildsys-build-<name>-kerneldevpkgs"
271
echo " --target <arch> -- target-arch (required)"
272
}
273
274
while [ "${1}" ] ; do
275
case "${1}" in
276
--filterfile)
277
shift
278
if [[ ! "${1}" ]] ; then
279
error_out 2 "Please provide path to a filter-file together with --filterfile" >&2
280
elif [[ ! -e "${1}" ]]; then
281
error_out 2 "Filterfile ${1} not found" >&2
282
fi
283
filterfile="${1}"
284
shift
285
;;
286
--kmodname)
287
shift
288
if [[ ! "${1}" ]] ; then
289
error_out 2 "Please provide the name of the kmod together with --kmodname" >&2
290
fi
291
# strip pending -kmod
292
kmodname="${1%%-kmod}"
293
shift
294
;;
295
--repo)
296
shift
297
if [[ ! "${1}" ]] ; then
298
error_out 2 "Please provide the name of the repo together with --repo" >&2
299
fi
300
repo=${1}
301
shift
302
;;
303
--for-kernels)
304
shift
305
if [[ ! "${1}" ]] ; then
306
error_out 2 "Please provide the name of the kmod together with --kmodname" >&2
307
fi
308
for_kernels="${1}"
309
shift
310
;;
311
--noakmod)
312
shift
313
noakmod="true"
314
;;
315
--obsolete-name)
316
shift
317
if [[ ! "${1}" ]] ; then
318
error_out 2 "Please provide the name of the kmod to obsolte together with --obsolete-name" >&2
319
fi
320
obsolete_name="${1}"
321
shift
322
;;
323
--obsolete-version)
324
shift
325
if [[ ! "${1}" ]] ; then
326
error_out 2 "Please provide the version of the kmod to obsolte together with --obsolete-version" >&2
327
fi
328
obsolete_version="${1}"
329
shift
330
;;
331
--target)
332
shift
333
target="${1}"
334
shift
335
;;
336
--akmod)
337
shift
338
build_kernels="akmod"
339
;;
340
--newest)
341
shift
342
build_kernels="newest"
343
;;
344
--current)
345
shift
346
build_kernels="current"
347
;;
348
--help)
349
myprog_help
350
exit 0
351
;;
352
--version)
353
echo "${myprog} ${myver}"
354
exit 0
355
;;
356
*)
357
echo "Error: Unknown option '${1}'." >&2
358
usage >&2
359
exit 2
360
;;
361
esac
362
done
363
364
if [[ -e ./kmodtool-kernel-variants ]]; then
365
kernels_known_variants="$(cat ./kmodtool-kernel-variants)"
366
elif [[ -e /usr/share/kmodtool/kernel-variants ]] ; then
367
kernels_known_variants="$(cat /usr/share/kmodtool/kernel-variants)"
368
else
369
error_out 2 "Could not find /usr/share/kmodtool/kernel-variants"
370
fi
371
372
# general sanity checks
373
if [[ ! "${target}" ]]; then
374
error_out 2 "please pass target arch with --target"
375
elif [[ ! "${kmodname}" ]]; then
376
error_out 2 "please pass kmodname with --kmodname"
377
elif [[ ! "${kernels_known_variants}" ]] ; then
378
error_out 2 "could not determine known variants"
379
elif ( [[ "${obsolete_name}" ]] && [[ ! "${obsolete_version}" ]] ) || ( [[ ! "${obsolete_name}" ]] && [[ "${obsolete_version}" ]] ) ; then
380
error_out 2 "you need to provide both --obsolete-name and --obsolete-version"
381
fi
382
383
# go
384
if [[ "${for_kernels}" ]]; then
385
# this is easy:
386
print_customrpmtemplate "${for_kernels}"
387
elif [[ "${build_kernels}" == "akmod" ]]; then
388
# do only a akmod package
389
print_akmodtemplate
390
print_akmodmeta
391
else
392
# seems we are on out own to decide for which kernels to build
393
394
# we need more sanity checks in this case
395
if [[ ! "${repo}" ]]; then
396
error_out 2 "please provide repo name with --repo"
397
elif ! $(which buildsys-build-${repo}-kerneldevpkgs &> /dev/null) ; then
398
error_out 2 "buildsys-build-${repo}-kerneldevpkgs not found"
399
fi
400
401
# call buildsys-build-${repo}-kerneldevpkgs to get the list of kernels
402
cmdoptions="--target ${target}"
403
404
# filterfile to filter list of kernels?
405
if [[ "${filterfile}" ]] ; then
406
cmdoptions="${cmdoptions} --filterfile ${filterfile}"
407
fi
408
409
kernel_versions_to_build_for="$(buildsys-build-${repo}-kerneldevpkgs --${build_kernels} ${cmdoptions})"
410
returncode=$?
411
if (( ${returncode} != 0 )); then
412
error_out 2 "buildsys-build-${repo}-kerneldevpkgs failed: $(buildsys-build-${repo}-kerneldevpkgs --${build_kernels} ${cmdoptions})"
413
fi
414
415
if [[ "${build_kernels}" == "current" ]] && [[ ! "${noakmod}" ]]; then
416
print_akmodtemplate
417
fi
418
419
print_rpmtemplate
420
fi
421