blob: cdd2d8d601f12d9fbcf65f0f4a2f598c4e35a1fa (
plain) (
blame)
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
|
#!/bin/sh
set -e
KERNFRAG=${KERNFRAG:-/etc/kernfrag}
err() {
printf "kern: %s\n" "$@" >&2
}
errx() {
err "$@"
exit 1
}
has_boot_mount() {
awk '{print $2}' /etc/fstab | grep -q ^/boot$
}
is_boot_mounted() {
mountpoint -q /boot
}
mount_boot_on_demand() {
if has_boot_mount && ! is_boot_mounted; then
sudo mount /boot
fi
}
get_latest_kernel() {
eselect --brief kernel list | tail -n1
}
get_selected_kernel() {
readlink /usr/src/linux
}
get_running_kernel() {
uname -r
}
get_running_config() {
mount_boot_on_demand
config=/boot/config-$(get_running_kernel)
test -r "$config" || errx "Could not read configuration file: $config"
echo "$config"
}
set_kernel() {
kern=${1:-$(get_latest_kernel)}
selected=$(get_selected_kernel)
kerndir=/usr/src/$kern
test -d "$kerndir" || errx "No such file or directory: $kerndir"
if test "$kern" = "$selected"; then
err "Warning: Latest kernel already selected: $kern"
return
fi
printf "Selecting kernel: %s\n" "$kern"
sudo eselect kernel set "$kern"
sudo chown -R "$(id -un)":"$(id -gn)" "$kerndir"
}
config_kernel() {
host=${1:-$(hostname)}
test -d "$KERNFRAG" || errx "No such file or directory: $KERNFRAG"
printf "Starting merge for %s...\n\n" "$host"
awk -v prefix="$KERNFRAG/fragments/" '{print prefix $0}' \
"$KERNFRAG/templates/base" "$KERNFRAG/templates/$host" | xargs scripts/kconfig/merge_config.sh
}
diff_kernel() {
diff=${1:-$(get_running_config)}
if command -v git >/dev/null; then
git diff --no-index "$diff" .config
else
diff -u "$diff" .config
fi
}
build_kernel() {
make -j"$(nproc)"
}
install_kernel() {
mount_boot_on_demand
sudo make install modules_install
}
post_install_kernel() {
sudo emerge --ask=n @module-rebuild
}
clean_kernel() {
sudo eclean-kernel -An3
}
strip_config() {
sed -nE '/^(# )?CONFIG_.*/p' "$1"
}
test_diff() {
dt=$(mktemp)
strip_config "$(get_running_config)" > "$dt"
if ! strip_config .config | diff -q "$dt" -; then
diff_kernel || true
printf "Continue? [y/N] "
read -r response
if test "$response" != "y"; then
rm "$dt"
return 1
fi
fi
rm "$dt"
}
all() {
set_kernel
cd /usr/src/linux
config_kernel
test_diff
build_kernel
install_kernel
post_install_kernel
clean_kernel
}
if test $# -eq 0; then
all
exit 0
fi
cmd=$1
shift
case $cmd in
set) set_kernel "$@";;
config) config_kernel "$@";;
diff) diff_kernel "$@";;
build) build_kernel;;
install) install_kernel;;
postinst) post_install_kernel;;
clean) clean_kernel;;
all) all;;
esac
|