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