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