]>
Commit | Line | Data |
---|---|---|
4c928ab7 MT |
1 | #!/bin/bash |
2 | ############################################################################### | |
3 | # IPFire.org - An Open Source Firewall Solution # | |
4 | # Copyright (C) - IPFire Development Team <info@ipfire.org> # | |
5 | ############################################################################### | |
6 | ||
7 | BASEDIR=$(dirname ${0}) | |
8 | SCRIPTS_DIR=${BASEDIR} | |
9 | ||
7f6f4de5 MT |
10 | # x86_64 |
11 | CONFIGS="x86_64:default" | |
12 | ||
13 | # i686 | |
14 | CONFIGS="${CONFIGS} i686:legacy i686:default" | |
15 | ||
16 | # armv7hl | |
17 | CONFIGS="${CONFIGS} armv7hl:exynos armv7hl:default" | |
18 | ||
19 | # armv5tel | |
20 | CONFIGS="${CONFIGS} armv5tel:versatile armv5tel:kirkwood" | |
4c928ab7 MT |
21 | |
22 | function merge_config() { | |
23 | local arch=${1} | |
24 | local flavour=${2} | |
25 | local output=${3} | |
26 | shift 3 | |
27 | ||
28 | local arg | |
29 | for arg in arch flavour output; do | |
30 | if [ -z "${!arg}" ]; then | |
31 | echo >&2 "merge usage: <arch> <flavour> <output filename>" | |
32 | exit 2 | |
33 | fi | |
34 | done | |
35 | ||
36 | local config_mode="oldnoconfig" | |
37 | local extra_configs | |
38 | while [ $# -gt 0 ]; do | |
39 | case "${1}" in | |
40 | --mode=*) | |
41 | config_mode=${1#--mode=} | |
42 | shift | |
43 | ;; | |
44 | -*) | |
45 | echo >&2 "Unknown option: ${1}" | |
46 | ;; | |
47 | *) | |
48 | extra_configs="${extra_configs} ${1}" | |
49 | ;; | |
50 | esac | |
51 | shift | |
52 | done | |
53 | ||
54 | local configs="${extra_configs} config-generic" | |
55 | ||
56 | case "${arch}:${flavour}" in | |
57 | # x86 | |
58 | x86_64:default) | |
59 | configs="${configs} config-x86-generic config-x86_64-default" | |
60 | ;; | |
61 | i686:default) | |
62 | configs="${configs} config-x86-generic config-i686-default" | |
63 | ;; | |
64 | i686:legacy) | |
65 | configs="${configs} config-x86-generic config-i686-default" | |
66 | configs="${configs} config-i686-legacy" | |
67 | ;; | |
68 | ||
69 | # ARM | |
70 | armv5tel:versatile) | |
71 | configs="${configs} config-arm-generic" | |
72 | ;; | |
73 | armv5tel:kirkwood) | |
74 | configs="${configs} config-arm-generic config-armv5tel-kirkwood" | |
75 | ;; | |
7f6f4de5 MT |
76 | armv7hl:default) |
77 | configs="${configs} config-arm-generic config-armv7hl-default" | |
81bb0557 | 78 | ;; |
7f6f4de5 MT |
79 | armv7hl:exynos) |
80 | configs="${configs} config-arm-generic config-armv7hl-default" | |
81 | configs="${configs} config-armv7hl-exynos" | |
4c928ab7 MT |
82 | ;; |
83 | *) | |
84 | echo >&2 "ERROR: Invalid parameters given: $@" | |
85 | return 1 | |
86 | ;; | |
87 | esac | |
88 | ||
89 | # Determine the kernel arch. | |
90 | local kernel_arch= | |
91 | case "${arch}" in | |
92 | arm*) | |
93 | kernel_arch="arm" | |
94 | ;; | |
95 | i?86|x86*) | |
96 | kernel_arch="x86" | |
97 | ;; | |
98 | esac | |
99 | ||
100 | # Merge the configuration files from its elementary configuration | |
101 | # files. | |
102 | local tmp_out=$(mktemp) | |
103 | local tmp_in=$(mktemp) | |
104 | ||
105 | local config | |
106 | for config in ${configs}; do | |
107 | cat ${tmp_out} > ${tmp_in} | |
108 | perl ${SCRIPTS_DIR}/merge.pl \ | |
109 | ${config} ${tmp_in} > ${tmp_out} | |
110 | done | |
111 | ||
112 | if [ "${config_mode}" != "none" ]; then | |
113 | echo "Running 'make oldnoconfig' for ${arch} (${flavour})..." | |
114 | ( | |
115 | cd ${KERNEL_DIR} | |
116 | cat ${tmp_out} > .config | |
117 | make ARCH="${kernel_arch}" ${config_mode} | |
118 | cat .config > ${tmp_out} | |
119 | ) | |
120 | fi | |
121 | ||
122 | cat ${tmp_out} > ${output} | |
123 | rm -f ${tmp_in} ${tmp_out} | |
124 | } | |
125 | ||
126 | # This function runs an interactive "make oldconfig". | |
127 | function make_oldconfig() { | |
128 | local arch="x86_64" | |
129 | local kernel_arch="x86" | |
130 | local flavour="default" | |
131 | ||
132 | local config_in=$(mktemp) | |
133 | local config_out=$(mktemp) | |
134 | local diff_out=$(mktemp) | |
135 | ||
136 | merge_config ${arch} ${flavour} ${config_in} --mode=none | |
137 | ||
138 | ( | |
139 | cd ${KERNEL_DIR} | |
140 | cat ${config_in} > .config | |
141 | ||
142 | echo "You may now edit the configuration..." | |
143 | ||
144 | local option | |
145 | select option in oldconfig menuconfig oldnoconfig startover quit; do | |
146 | case "${option}" in | |
147 | oldconfig|menuconfig|oldnoconfig) | |
148 | make ARCH=${kernel_arch} ${option} | |
149 | ;; | |
150 | startover) | |
151 | cat ${config_in} > .config | |
152 | ;; | |
153 | quit) | |
154 | break | |
155 | ;; | |
156 | esac | |
157 | done | |
158 | ||
159 | cat .config > ${config_out} | |
160 | ) | |
161 | ||
162 | ${SCRIPTS_DIR}/configdiff.py ${config_in} ${config_out} > ${diff_out} | |
163 | ||
164 | # Update the rest of the configurations. | |
165 | diff_configs ${diff_out} --mode=oldconfig | |
166 | ||
167 | rm -f ${config_in} ${config_out} ${diff_out} | |
168 | } | |
169 | ||
170 | # config-generic | |
171 | # Intersection of all files. | |
172 | # config-x86-generic | |
173 | # Diff of (intersection of (i686-{default,legacy} and x86_64-default) | |
174 | # against config-generic). | |
175 | # config-x86-x86_64 | |
176 | # Diff against merge of (config-generic and config-x86-generic). | |
177 | ||
178 | function diff_configs() { | |
179 | local extra_configs="$@" | |
180 | ||
181 | declare -A arch_configs | |
182 | ||
183 | tmpdir=$(mktemp -d) | |
184 | ||
185 | for config in ${CONFIGS}; do | |
186 | arch=${config%:*} | |
187 | flavour=${config#*:} | |
188 | ||
189 | filename=${tmpdir}/config-${arch}-${flavour} | |
190 | ||
191 | merge_config ${arch} ${flavour} ${filename} ${extra_configs} | |
192 | ||
193 | # Do not include i686 legacy. | |
194 | case "${config}" in | |
195 | i686:legacy) | |
196 | continue | |
197 | ;; | |
198 | armv5tel:versatile) | |
199 | ;; | |
200 | arm*) | |
201 | continue | |
202 | ;; | |
203 | esac | |
204 | ||
205 | case "${arch}" in | |
206 | x86*|i?86) | |
207 | arch_configs[x86]="${arch_configs[x86]} ${filename}" | |
208 | ;; | |
209 | arm*) | |
210 | arch_configs[arm]="${arch_configs[arm]} ${filename}" | |
211 | ;; | |
212 | *) | |
213 | echo >&2 "ERROR: Invalid architecture: ${arch}" | |
214 | ;; | |
215 | esac | |
216 | done | |
217 | ||
218 | common_configs="" | |
219 | for arch in x86 arm; do | |
220 | filename="${tmpdir}/config-${arch}-common" | |
221 | ${SCRIPTS_DIR}/configcommon.py ${arch_configs[${arch}]} \ | |
222 | > ${filename} | |
223 | ||
224 | common_configs="${common_configs} ${filename}" | |
225 | done | |
226 | ||
227 | ${SCRIPTS_DIR}/configcommon.py ${common_configs} > ${tmpdir}/config-generic | |
228 | ||
229 | ${SCRIPTS_DIR}/configdiff.py ${tmpdir}/config-generic ${tmpdir}/config-arm-common \ | |
230 | > ${tmpdir}/config-arm-generic | |
231 | ||
232 | ${SCRIPTS_DIR}/configdiff.py ${tmpdir}/config-generic ${tmpdir}/config-x86-common \ | |
233 | > ${tmpdir}/config-x86-generic | |
234 | ||
235 | for config in ${CONFIGS}; do | |
236 | arch=${config%:*} | |
237 | flavour=${config#*:} | |
238 | ||
239 | case "${config}" in | |
240 | arm*:*) | |
241 | suparch="arm" | |
242 | ;; | |
243 | i?86:*|x86*:*) | |
244 | suparch="x86" | |
245 | ;; | |
246 | esac | |
247 | filename=${tmpdir}/config-${arch}-${flavour} | |
248 | ||
249 | case "${config}" in | |
250 | i686:legacy) | |
251 | # Legacy depends directly on the default configuration. | |
252 | ${SCRIPTS_DIR}/configdiff.py ${tmpdir}/config-i686-default \ | |
253 | ${filename} > ${filename}.tmp | |
254 | ;; | |
7f6f4de5 MT |
255 | armv7hl:exynos) |
256 | # Exynos depends directly on the default configuration. | |
257 | ${SCRIPTS_DIR}/configdiff.py ${tmpdir}/config-armv7hl-default \ | |
258 | ${filename} > ${filename}.tmp | |
259 | ;; | |
4c928ab7 MT |
260 | armv5tel:versatile) |
261 | rm -f ${filename} | |
262 | continue | |
263 | ;; | |
264 | *) | |
265 | ${SCRIPTS_DIR}/configdiff.py ${tmpdir}/config-${suparch}-common \ | |
266 | ${filename} > ${filename}.tmp | |
267 | ;; | |
268 | esac | |
269 | mv ${filename}{.tmp,} | |
270 | done | |
271 | rm -f ${tmpdir}/config-*-common | |
272 | ||
273 | for config in ${tmpdir}/*; do | |
274 | if ! cmp $(basename ${config}) ${config} &>/dev/null; then | |
275 | echo "$(basename ${config}) has changed." | |
276 | fi | |
277 | cat ${config} > $(basename ${config}) | |
278 | done | |
279 | ||
280 | rm -rf ${tmpdir} | |
281 | } | |
282 | ||
283 | KERNEL_DIR= | |
284 | ||
285 | # Parse commandline. | |
286 | while [ $# -gt 0 ]; do | |
287 | arg=${1}; shift | |
288 | case "${arg}" in | |
289 | --kernel-dir=*) | |
290 | KERNEL_DIR=${arg#--kernel-dir=} | |
291 | ;; | |
292 | help|"") | |
293 | echo "${0} - available commands:" | |
294 | echo " * merge <arch> <flavour> <output filename>" | |
295 | echo " * update ..." | |
296 | echo " * oldconfig" | |
297 | echo "" | |
298 | echo " You must always set --kernel-dir=..." | |
299 | exit 0 | |
300 | ;; | |
301 | merge|oldconfig|update) | |
302 | action=${arg} | |
303 | break | |
304 | ;; | |
305 | esac | |
306 | done | |
307 | ||
308 | if [ -z "${KERNEL_DIR}" ]; then | |
309 | echo >&2 "--kernel-dir=... was not set!" | |
310 | exit 2 | |
311 | fi | |
312 | ||
313 | if [ -z "${action}" ]; then | |
314 | echo >&2 "No action given... Try ${0} help." | |
315 | exit 2 | |
316 | fi | |
317 | ||
318 | case "${action}" in | |
319 | merge) | |
320 | merge_config $@ | |
321 | exit $? | |
322 | ;; | |
323 | oldconfig) | |
324 | make_oldconfig | |
325 | exit $? | |
326 | ;; | |
327 | update) | |
328 | diff_configs $@ | |
329 | exit $? | |
330 | ;; | |
331 | esac | |
332 | ||
333 | exit 1 |