]> git.ipfire.org Git - people/arne_f/ipfire-3.x.git/blob - kernel/scripts/configure
kernel: Remove armv5tel kernel build
[people/arne_f/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 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
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
123 # ARM64
124 aarch64:default)
125 configs="${configs} config-arm-generic config-arm64-generic"
126 ;;
127
128 # ARM
129 armv7hl:default)
130 configs="${configs} config-arm-generic config-arm32-generic"
131 ;;
132 armv7hl:lpae)
133 configs="${configs} config-arm-generic config-arm32-generic"
134 configs="${configs} config-armv7hl-lpae"
135 ;;
136 *)
137 echo >&2 "ERROR: Invalid parameters given: $@"
138 return 1
139 ;;
140 esac
141
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})..."
156 local kernel_arch="$(get_kernel_arch "${arch}")"
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
224 local filename
225 local platform
226 local subplatform
227
228 declare -A platform_configs
229 declare -A subplatform_configs
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
241 # Do not include leaf configuration.
242 case "${config}" in
243 armv7hl:lpae)
244 continue
245 ;;
246 i686:legacy)
247 continue
248 ;;
249 esac
250
251 platform="$(get_platform "${arch}")"
252 subplatform="$(get_subplatform "${arch}")"
253
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
259 done
260
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}]} \
273 > ${filename}
274
275 common_configs="${common_configs} ${filename}"
276 done
277
278 ${SCRIPTS_DIR}/configcommon.py ${common_configs} > ${tmpdir}/config-generic
279
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
292 done
293
294 for config in ${CONFIGS}; do
295 arch=${config%:*}
296 flavour=${config#*:}
297
298 filename=${tmpdir}/config-${arch}-${flavour}
299
300 case "${config}" in
301 aarch64:default|armv7hl:default)
302 # Virtual configuration
303 rm -f ${filename}
304 continue
305 ;;
306 i686:legacy)
307 # Legacy depends directly on the default configuration.
308 ${SCRIPTS_DIR}/configdiff.py ${tmpdir}/config-${arch}-default \
309 ${filename} > ${filename}.tmp
310 ;;
311 *)
312 platform="$(get_subplatform "${arch}" || get_platform "${arch}")"
313 ${SCRIPTS_DIR}/configdiff.py ${tmpdir}/config-${platform}-common \
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