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