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