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