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