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