summaryrefslogtreecommitdiffstats
path: root/kheader.pl
blob: 8dbf93587e4711278750f569d786fdee427abf78 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#!/usr/bin/perl

use MDK::Common;

my @kernels = group_by2(
    'smp' => 'SMP',
    'xen0' => 'XEN0',
    'default' => 'DEFAULT',
    'legacy' => 'LEGACY',
    'enterprise' => 'ENTERPRISE',
    'secure' => 'SECURE',
    '-i686-up-4GB' => 'I686_UP_4GB',
    '-i686-up-64GB' => 'I686_UP_64GB',
    '-p3-smp-64GB' => 'P3_SMP_64GB',
    '-i586-up-1GB' => 'I586_UP_1GB',

    'desktop' => 'DESKTOP',
    'desktopsmp' => 'DESKTOPSMP',
    'desktop-i586' => 'DESKTOP_I586',
    'desktopsmp-i586' => 'DESKTOPSMP_I586',
    'laptop' => 'LAPTOP',
    'laptopsmp' => 'LAPTOPSMP',
    'server' => 'SERVER',
    'serversmp' => 'SERVERSMP',

    '*' => 'UP', #- keep it the last
);

my $init_vars = join(';', map { "$_->[1]=0" } @kernels);

my $set_vars = join('',
    map {
	<<EOF
	$_->[0])
	    $_->[1]=1;;
EOF
    } @kernels);


my $defines = join("\n",
    map {
	<<EOF
#ifndef __BOOT_KERNEL_$_->[1]
#define __BOOT_KERNEL_$_->[1] \$$_->[1]
#endif
EOF
    } @kernels);

printf(<<'KHEADER', $init_vars, $set_vars, $defines);
#!/bin/sh
# (c) Mandriva, Pixel <pixel@mandriva.com>
# 	$Id: kheader.pl 84121 2006-11-14 16:12:11Z pixel $
#
# kheader: Regenerates kernel headers
#
# chkconfig: 235 95 20
# description: This shell script regenerates the /boot/kernel.h header for \
#	   /usr/src/linux/include/{autoconf,version}.h
#
### BEGIN INIT INFO
# Provides: kheader
# Default-Start: 2 3 5
# Short-Description: Regenerates kernel headers
# Description: This shell script regenerates the /boot/kernel.h header for
#              /usr/src/linux/include/{autoconf,version}.h
### END INIT INFO

. /etc/rc.d/init.d/functions

: ${KERNEL_H:=/boot/kernel.h}
: ${HEADERFILE:=${KERNEL_H}-`uname -r`}
[ -d $(dirname $HEADERFILE) ] || exit 0

table() {
    %s

    # this will do  the trick until gprintf.py expands variables
    echo_no_gprintf="echo"

    ver=$(uname -r)
    mdk="md[kv]"
    k=$($echo_no_gprintf $ver|sed "s/.*$mdk//")

    # for tmb & multimedia kernels
    case $ver in
	*-desktop-*)
	    k=desktop$k;;
	*-laptop-*)
	    k=laptop$k;;
	*-server-*)
	    k=server$k;;
    esac

    case $k in
%s
    esac

    # since 2.6.17-2mdv, default kernels can be SMP enabled by
    # default, hence a new name
    $echo_no_gprintf "$UP:$ver" | grep -q "^1:.*$mdk" && {
        case $ver in
            # XXX simpler to maintain a skip list
            [01].*|2.[0-5].*|2.6.[0-9]-*|2.6.1[0-6]-*|2.6.17-1mdk);;
            *) UP=0; DEFAULT=1;;
        esac
    }

    unset echo_no_gprintf
}

generate () {
    table;
    # do not overwrite exsisting header, it confuses
    # kernel make and forces it to recompile everything
    cat > $HEADERFILE.tmp << EOF
/* This file is automatically generated at boot time. */
#ifndef __BOOT_KERNEL_H_
#define __BOOT_KERNEL_H_

%s
#endif
EOF

mv -f $HEADERFILE.tmp $HEADERFILE

if [ -f $KERNEL_H ] ; then
    rm -f $KERNEL_H
fi

ln -sf $HEADERFILE $KERNEL_H
}

function remove_orphaned {
    local version= i=
    for i in /boot/kernel.h-* /boot/System.map-* /boot/config-*; do
	version=${i#*-}
	[[ -f /boot/vmlinuz-${version} ]] || rm -f ${i}
    done
}

case $1 in 
    start)
    # We don't log this command, because most users don't want to hear this (c) Chmou
	generate
	touch /var/lock/subsys/kheader
	;;
    restart)
	;;
    reload)
	generate
	;;
    stop)
	remove_orphaned;
	rm -f /var/lock/subsys/kheader
	;;
    status)
	;;
    *)
    gprintf "Usage: %%s\n" "$(basename $0) {start|stop|reload|restart}"
    exit 0
    ;;
esac
KHEADER