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