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