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