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