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