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