xref: /linux/scripts/config (revision db58316892a5e9034efe718d4c1630788db7528f)
1#!/bin/bash
2# Manipulate options in a .config file from the command line
3
4# If no prefix forced, use the default CONFIG_
5CONFIG_="${CONFIG_-CONFIG_}"
6
7usage() {
8	cat >&2 <<EOL
9Manipulate options in a .config file from the command line.
10Usage:
11config options command ...
12commands:
13	--enable|-e option   Enable option
14	--disable|-d option  Disable option
15	--module|-m option   Turn option into a module
16	--set-str option string
17	                     Set option to "string"
18	--set-val option value
19	                     Set option to value
20	--undefine|-u option Undefine option
21	--state|-s option    Print state of option (n,y,m,undef)
22
23	--enable-after|-E beforeopt option
24                             Enable option directly after other option
25	--disable-after|-D beforeopt option
26                             Disable option directly after other option
27	--module-after|-M beforeopt option
28                             Turn option into module directly after other option
29
30	commands can be repeated multiple times
31
32options:
33	--file config-file   .config file to change (default .config)
34	--keep-case|-k       Keep next symbols' case (dont' upper-case it)
35
36config doesn't check the validity of the .config file. This is done at next
37make time.
38
39By default, config will upper-case the given symbol. Use --keep-case to keep
40the case of all following symbols unchanged.
41
42config uses 'CONFIG_' as the default symbol prefix. Set the environment
43variable CONFIG_ to the prefix to use. Eg.: CONFIG_="FOO_" config ...
44EOL
45	exit 1
46}
47
48checkarg() {
49	ARG="$1"
50	if [ "$ARG" = "" ] ; then
51		usage
52	fi
53	case "$ARG" in
54	${CONFIG_}*)
55		ARG="${ARG/${CONFIG_}/}"
56		;;
57	esac
58	if [ "$MUNGE_CASE" = "yes" ] ; then
59		ARG="`echo $ARG | tr a-z A-Z`"
60	fi
61}
62
63set_var() {
64	local name=$1 new=$2 before=$3
65
66	name_re="^($name=|# $name is not set)"
67	before_re="^($before=|# $before is not set)"
68	if test -n "$before" && grep -Eq "$before_re" "$FN"; then
69		sed -ri "/$before_re/a $new" "$FN"
70	elif grep -Eq "$name_re" "$FN"; then
71		sed -ri "s:$name_re.*:$new:" "$FN"
72	else
73		echo "$new" >>"$FN"
74	fi
75}
76
77undef_var() {
78	local name=$1
79
80	sed -ri "/^($name=|# $name is not set)/d" "$FN"
81}
82
83if [ "$1" = "--file" ]; then
84	FN="$2"
85	if [ "$FN" = "" ] ; then
86		usage
87	fi
88	shift 2
89else
90	FN=.config
91fi
92
93if [ "$1" = "" ] ; then
94	usage
95fi
96
97MUNGE_CASE=yes
98while [ "$1" != "" ] ; do
99	CMD="$1"
100	shift
101	case "$CMD" in
102	--keep-case|-k)
103		MUNGE_CASE=no
104		continue
105		;;
106	--refresh)
107		;;
108	--*-after|-E|-D|-M)
109		checkarg "$1"
110		A=$ARG
111		checkarg "$2"
112		B=$ARG
113		shift 2
114		;;
115	-*)
116		checkarg "$1"
117		shift
118		;;
119	esac
120	case "$CMD" in
121	--enable|-e)
122		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=y"
123		;;
124
125	--disable|-d)
126		set_var "${CONFIG_}$ARG" "# ${CONFIG_}$ARG is not set"
127		;;
128
129	--module|-m)
130		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=m"
131		;;
132
133	--set-str)
134		# sed swallows one level of escaping, so we need double-escaping
135		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=\"${1//\"/\\\\\"}\""
136		shift
137		;;
138
139	--set-val)
140		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=$1"
141		shift
142		;;
143	--undefine|-u)
144		undef_var "${CONFIG_}$ARG"
145		;;
146
147	--state|-s)
148		if grep -q "# ${CONFIG_}$ARG is not set" $FN ; then
149			echo n
150		else
151			V="$(grep "^${CONFIG_}$ARG=" $FN)"
152			if [ $? != 0 ] ; then
153				echo undef
154			else
155				V="${V/#${CONFIG_}$ARG=/}"
156				V="${V/#\"/}"
157				V="${V/%\"/}"
158				V="${V//\\\"/\"}"
159				echo "${V}"
160			fi
161		fi
162		;;
163
164	--enable-after|-E)
165		set_var "${CONFIG_}$B" "${CONFIG_}$B=y" "${CONFIG_}$A"
166		;;
167
168	--disable-after|-D)
169		set_var "${CONFIG_}$B" "# ${CONFIG_}$B is not set" "${CONFIG_}$A"
170		;;
171
172	--module-after|-M)
173		set_var "${CONFIG_}$B" "${CONFIG_}$B=m" "${CONFIG_}$A"
174		;;
175
176	# undocumented because it ignores --file (fixme)
177	--refresh)
178		yes "" | make oldconfig
179		;;
180
181	*)
182		usage
183		;;
184	esac
185done
186
187