]> git.ipfire.org Git - ipfire-3.x.git/blame - kernel/scripts/configure
kernel: Add support for aarch64
[ipfire-3.x.git] / kernel / scripts / configure
CommitLineData
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
7BASEDIR=$(dirname ${0})
8SCRIPTS_DIR=${BASEDIR}
9
7f6f4de5
MT
10# x86_64
11CONFIGS="x86_64:default"
12
13# i686
14CONFIGS="${CONFIGS} i686:legacy i686:default"
15
d5383c43
MT
16# aarch64
17CONFIGS="${CONFIGS} aarch64:default"
18
7f6f4de5 19# armv7hl
302e8df8 20CONFIGS="${CONFIGS} armv7hl:lpae armv7hl:default"
7f6f4de5
MT
21
22# armv5tel
9bf77c63 23CONFIGS="${CONFIGS} armv5tel:default"
4c928ab7 24
d5383c43
MT
25PLATFORMS="x86 arm"
26declare -A SUBPLATFORMS
27SUBPLATFORMS=(
28 [arm]="arm64 arm32"
29)
30
31function 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
47function 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
63function 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
4c928ab7
MT
79function 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
d5383c43
MT
126 # ARM64
127 aarch64:default)
128 configs="${configs} config-arm-generic config-arm64-generic"
129 ;;
130
4c928ab7 131 # ARM
9bf77c63 132 armv5tel:default)
d5383c43
MT
133 configs="${configs} config-arm-generic config-arm32-generic"
134 configs="${configs} config-armv5tel-default"
4c928ab7 135 ;;
7f6f4de5 136 armv7hl:default)
d5383c43
MT
137 configs="${configs} config-arm-generic config-arm32-generic"
138 configs="${configs} config-armv7hl-default"
302e8df8
MT
139 ;;
140 armv7hl:lpae)
d5383c43
MT
141 configs="${configs} config-arm-generic config-arm32-generic"
142 configs="${configs} config-armv7hl-default config-armv7hl-lpae"
81bb0557 143 ;;
4c928ab7
MT
144 *)
145 echo >&2 "ERROR: Invalid parameters given: $@"
146 return 1
147 ;;
148 esac
149
4c928ab7
MT
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})..."
d5383c43 164 local kernel_arch="$(get_kernel_arch "${arch}")"
4c928ab7
MT
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".
178function 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
229function diff_configs() {
230 local extra_configs="$@"
231
d5383c43
MT
232 local filename
233 local platform
234 local subplatform
235
236 declare -A platform_configs
237 declare -A subplatform_configs
4c928ab7
MT
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
9bf77c63 249 # Do not include leaf configuration.
4c928ab7 250 case "${config}" in
9bf77c63
MT
251 armv7hl:lpae)
252 continue
253 ;;
4c928ab7
MT
254 i686:legacy)
255 continue
256 ;;
4c928ab7
MT
257 esac
258
d5383c43
MT
259 platform="$(get_platform "${arch}")"
260 subplatform="$(get_subplatform "${arch}")"
302e8df8 261
d5383c43
MT
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
4c928ab7
MT
267 done
268
d5383c43
MT
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}]} \
4c928ab7
MT
281 > ${filename}
282
283 common_configs="${common_configs} ${filename}"
284 done
285
286 ${SCRIPTS_DIR}/configcommon.py ${common_configs} > ${tmpdir}/config-generic
287
d5383c43
MT
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
302e8df8
MT
300 done
301
4c928ab7
MT
302 for config in ${CONFIGS}; do
303 arch=${config%:*}
304 flavour=${config#*:}
305
4c928ab7
MT
306 filename=${tmpdir}/config-${arch}-${flavour}
307
308 case "${config}" in
d5383c43
MT
309 aarch64:default)
310 # Virtual configuration
311 rm -f ${filename}
312 continue
313 ;;
9bf77c63 314 armv7hl:lpae|i686:legacy)
4c928ab7 315 # Legacy depends directly on the default configuration.
9bf77c63 316 ${SCRIPTS_DIR}/configdiff.py ${tmpdir}/config-${arch}-default \
302e8df8
MT
317 ${filename} > ${filename}.tmp
318 ;;
4c928ab7 319 *)
d5383c43
MT
320 platform="$(get_subplatform "${arch}" || get_platform "${arch}")"
321 ${SCRIPTS_DIR}/configdiff.py ${tmpdir}/config-${platform}-common \
4c928ab7
MT
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
339KERNEL_DIR=
340
341# Parse commandline.
342while [ $# -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
362done
363
364if [ -z "${KERNEL_DIR}" ]; then
365 echo >&2 "--kernel-dir=... was not set!"
366 exit 2
367fi
368
369if [ -z "${action}" ]; then
370 echo >&2 "No action given... Try ${0} help."
371 exit 2
372fi
373
374case "${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 ;;
387esac
388
389exit 1