xref: /OK3568_Linux_fs/kernel/scripts/config (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/usr/bin/env bash
2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0
3*4882a593Smuzhiyun# Manipulate options in a .config file from the command line
4*4882a593Smuzhiyun
5*4882a593Smuzhiyunmyname=${0##*/}
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun# If no prefix forced, use the default CONFIG_
8*4882a593SmuzhiyunCONFIG_="${CONFIG_-CONFIG_}"
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun# We use an uncommon delimiter for sed substitutions
11*4882a593SmuzhiyunSED_DELIM=$(echo -en "\001")
12*4882a593Smuzhiyun
13*4882a593Smuzhiyunusage() {
14*4882a593Smuzhiyun	cat >&2 <<EOL
15*4882a593SmuzhiyunManipulate options in a .config file from the command line.
16*4882a593SmuzhiyunUsage:
17*4882a593Smuzhiyun$myname options command ...
18*4882a593Smuzhiyuncommands:
19*4882a593Smuzhiyun	--enable|-e option   Enable option
20*4882a593Smuzhiyun	--disable|-d option  Disable option
21*4882a593Smuzhiyun	--module|-m option   Turn option into a module
22*4882a593Smuzhiyun	--set-str option string
23*4882a593Smuzhiyun	                     Set option to "string"
24*4882a593Smuzhiyun	--set-val option value
25*4882a593Smuzhiyun	                     Set option to value
26*4882a593Smuzhiyun	--undefine|-u option Undefine option
27*4882a593Smuzhiyun	--state|-s option    Print state of option (n,y,m,undef)
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun	--enable-after|-E beforeopt option
30*4882a593Smuzhiyun                             Enable option directly after other option
31*4882a593Smuzhiyun	--disable-after|-D beforeopt option
32*4882a593Smuzhiyun                             Disable option directly after other option
33*4882a593Smuzhiyun	--module-after|-M beforeopt option
34*4882a593Smuzhiyun                             Turn option into module directly after other option
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun	commands can be repeated multiple times
37*4882a593Smuzhiyun
38*4882a593Smuzhiyunoptions:
39*4882a593Smuzhiyun	--file config-file   .config file to change (default .config)
40*4882a593Smuzhiyun	--keep-case|-k       Keep next symbols' case (dont' upper-case it)
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun$myname doesn't check the validity of the .config file. This is done at next
43*4882a593Smuzhiyunmake time.
44*4882a593Smuzhiyun
45*4882a593SmuzhiyunBy default, $myname will upper-case the given symbol. Use --keep-case to keep
46*4882a593Smuzhiyunthe case of all following symbols unchanged.
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun$myname uses 'CONFIG_' as the default symbol prefix. Set the environment
49*4882a593Smuzhiyunvariable CONFIG_ to the prefix to use. Eg.: CONFIG_="FOO_" $myname ...
50*4882a593SmuzhiyunEOL
51*4882a593Smuzhiyun	exit 1
52*4882a593Smuzhiyun}
53*4882a593Smuzhiyun
54*4882a593Smuzhiyuncheckarg() {
55*4882a593Smuzhiyun	ARG="$1"
56*4882a593Smuzhiyun	if [ "$ARG" = "" ] ; then
57*4882a593Smuzhiyun		usage
58*4882a593Smuzhiyun	fi
59*4882a593Smuzhiyun	case "$ARG" in
60*4882a593Smuzhiyun	${CONFIG_}*)
61*4882a593Smuzhiyun		ARG="${ARG/${CONFIG_}/}"
62*4882a593Smuzhiyun		;;
63*4882a593Smuzhiyun	esac
64*4882a593Smuzhiyun	if [ "$MUNGE_CASE" = "yes" ] ; then
65*4882a593Smuzhiyun		ARG="`echo $ARG | tr a-z A-Z`"
66*4882a593Smuzhiyun	fi
67*4882a593Smuzhiyun}
68*4882a593Smuzhiyun
69*4882a593Smuzhiyuntxt_append() {
70*4882a593Smuzhiyun	local anchor="$1"
71*4882a593Smuzhiyun	local insert="$2"
72*4882a593Smuzhiyun	local infile="$3"
73*4882a593Smuzhiyun	local tmpfile="$infile.swp"
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun	# sed append cmd: 'a\' + newline + text + newline
76*4882a593Smuzhiyun	cmd="$(printf "a\\%b$insert" "\n")"
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun	sed -e "/$anchor/$cmd" "$infile" >"$tmpfile"
79*4882a593Smuzhiyun	# replace original file with the edited one
80*4882a593Smuzhiyun	mv "$tmpfile" "$infile"
81*4882a593Smuzhiyun}
82*4882a593Smuzhiyun
83*4882a593Smuzhiyuntxt_subst() {
84*4882a593Smuzhiyun	local before="$1"
85*4882a593Smuzhiyun	local after="$2"
86*4882a593Smuzhiyun	local infile="$3"
87*4882a593Smuzhiyun	local tmpfile="$infile.swp"
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun	sed -e "s$SED_DELIM$before$SED_DELIM$after$SED_DELIM" "$infile" >"$tmpfile"
90*4882a593Smuzhiyun	# replace original file with the edited one
91*4882a593Smuzhiyun	mv "$tmpfile" "$infile"
92*4882a593Smuzhiyun}
93*4882a593Smuzhiyun
94*4882a593Smuzhiyuntxt_delete() {
95*4882a593Smuzhiyun	local text="$1"
96*4882a593Smuzhiyun	local infile="$2"
97*4882a593Smuzhiyun	local tmpfile="$infile.swp"
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun	sed -e "/$text/d" "$infile" >"$tmpfile"
100*4882a593Smuzhiyun	# replace original file with the edited one
101*4882a593Smuzhiyun	mv "$tmpfile" "$infile"
102*4882a593Smuzhiyun}
103*4882a593Smuzhiyun
104*4882a593Smuzhiyunset_var() {
105*4882a593Smuzhiyun	local name=$1 new=$2 before=$3
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun	name_re="^($name=|# $name is not set)"
108*4882a593Smuzhiyun	before_re="^($before=|# $before is not set)"
109*4882a593Smuzhiyun	if test -n "$before" && grep -Eq "$before_re" "$FN"; then
110*4882a593Smuzhiyun		txt_append "^$before=" "$new" "$FN"
111*4882a593Smuzhiyun		txt_append "^# $before is not set" "$new" "$FN"
112*4882a593Smuzhiyun	elif grep -Eq "$name_re" "$FN"; then
113*4882a593Smuzhiyun		txt_subst "^$name=.*" "$new" "$FN"
114*4882a593Smuzhiyun		txt_subst "^# $name is not set" "$new" "$FN"
115*4882a593Smuzhiyun	else
116*4882a593Smuzhiyun		echo "$new" >>"$FN"
117*4882a593Smuzhiyun	fi
118*4882a593Smuzhiyun}
119*4882a593Smuzhiyun
120*4882a593Smuzhiyunundef_var() {
121*4882a593Smuzhiyun	local name=$1
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun	txt_delete "^$name=" "$FN"
124*4882a593Smuzhiyun	txt_delete "^# $name is not set" "$FN"
125*4882a593Smuzhiyun}
126*4882a593Smuzhiyun
127*4882a593Smuzhiyunif [ "$1" = "--file" ]; then
128*4882a593Smuzhiyun	FN="$2"
129*4882a593Smuzhiyun	if [ "$FN" = "" ] ; then
130*4882a593Smuzhiyun		usage
131*4882a593Smuzhiyun	fi
132*4882a593Smuzhiyun	shift 2
133*4882a593Smuzhiyunelse
134*4882a593Smuzhiyun	FN=.config
135*4882a593Smuzhiyunfi
136*4882a593Smuzhiyun
137*4882a593Smuzhiyunif [ "$1" = "" ] ; then
138*4882a593Smuzhiyun	usage
139*4882a593Smuzhiyunfi
140*4882a593Smuzhiyun
141*4882a593SmuzhiyunMUNGE_CASE=yes
142*4882a593Smuzhiyunwhile [ "$1" != "" ] ; do
143*4882a593Smuzhiyun	CMD="$1"
144*4882a593Smuzhiyun	shift
145*4882a593Smuzhiyun	case "$CMD" in
146*4882a593Smuzhiyun	--keep-case|-k)
147*4882a593Smuzhiyun		MUNGE_CASE=no
148*4882a593Smuzhiyun		continue
149*4882a593Smuzhiyun		;;
150*4882a593Smuzhiyun	--refresh)
151*4882a593Smuzhiyun		;;
152*4882a593Smuzhiyun	--*-after|-E|-D|-M)
153*4882a593Smuzhiyun		checkarg "$1"
154*4882a593Smuzhiyun		A=$ARG
155*4882a593Smuzhiyun		checkarg "$2"
156*4882a593Smuzhiyun		B=$ARG
157*4882a593Smuzhiyun		shift 2
158*4882a593Smuzhiyun		;;
159*4882a593Smuzhiyun	-*)
160*4882a593Smuzhiyun		checkarg "$1"
161*4882a593Smuzhiyun		shift
162*4882a593Smuzhiyun		;;
163*4882a593Smuzhiyun	esac
164*4882a593Smuzhiyun	case "$CMD" in
165*4882a593Smuzhiyun	--enable|-e)
166*4882a593Smuzhiyun		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=y"
167*4882a593Smuzhiyun		;;
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun	--disable|-d)
170*4882a593Smuzhiyun		set_var "${CONFIG_}$ARG" "# ${CONFIG_}$ARG is not set"
171*4882a593Smuzhiyun		;;
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun	--module|-m)
174*4882a593Smuzhiyun		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=m"
175*4882a593Smuzhiyun		;;
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun	--set-str)
178*4882a593Smuzhiyun		# sed swallows one level of escaping, so we need double-escaping
179*4882a593Smuzhiyun		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=\"${1//\"/\\\\\"}\""
180*4882a593Smuzhiyun		shift
181*4882a593Smuzhiyun		;;
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun	--set-val)
184*4882a593Smuzhiyun		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=$1"
185*4882a593Smuzhiyun		shift
186*4882a593Smuzhiyun		;;
187*4882a593Smuzhiyun	--undefine|-u)
188*4882a593Smuzhiyun		undef_var "${CONFIG_}$ARG"
189*4882a593Smuzhiyun		;;
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun	--state|-s)
192*4882a593Smuzhiyun		if grep -q "# ${CONFIG_}$ARG is not set" $FN ; then
193*4882a593Smuzhiyun			echo n
194*4882a593Smuzhiyun		else
195*4882a593Smuzhiyun			V="$(grep "^${CONFIG_}$ARG=" $FN)"
196*4882a593Smuzhiyun			if [ $? != 0 ] ; then
197*4882a593Smuzhiyun				echo undef
198*4882a593Smuzhiyun			else
199*4882a593Smuzhiyun				V="${V/#${CONFIG_}$ARG=/}"
200*4882a593Smuzhiyun				V="${V/#\"/}"
201*4882a593Smuzhiyun				V="${V/%\"/}"
202*4882a593Smuzhiyun				V="${V//\\\"/\"}"
203*4882a593Smuzhiyun				echo "${V}"
204*4882a593Smuzhiyun			fi
205*4882a593Smuzhiyun		fi
206*4882a593Smuzhiyun		;;
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun	--enable-after|-E)
209*4882a593Smuzhiyun		set_var "${CONFIG_}$B" "${CONFIG_}$B=y" "${CONFIG_}$A"
210*4882a593Smuzhiyun		;;
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun	--disable-after|-D)
213*4882a593Smuzhiyun		set_var "${CONFIG_}$B" "# ${CONFIG_}$B is not set" "${CONFIG_}$A"
214*4882a593Smuzhiyun		;;
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun	--module-after|-M)
217*4882a593Smuzhiyun		set_var "${CONFIG_}$B" "${CONFIG_}$B=m" "${CONFIG_}$A"
218*4882a593Smuzhiyun		;;
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun	# undocumented because it ignores --file (fixme)
221*4882a593Smuzhiyun	--refresh)
222*4882a593Smuzhiyun		yes "" | make oldconfig
223*4882a593Smuzhiyun		;;
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun	*)
226*4882a593Smuzhiyun		usage
227*4882a593Smuzhiyun		;;
228*4882a593Smuzhiyun	esac
229*4882a593Smuzhiyundone
230