Logoj0ke.net Open Build Service > Projects > home:jg:playground > flashcache-kmod > kmodtool.flashcache
Sign Up | Log In

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