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