xref: /openbmc/linux/scripts/config (revision 73877785)
18e54701eSAndi Kleen#!/bin/bash
28e54701eSAndi Kleen# Manipulate options in a .config file from the command line
38e54701eSAndi Kleen
473877785SClement Chauplannazmyname=${0##*/}
573877785SClement Chauplannaz
6f5ef2f7bSYann E. MORIN# If no prefix forced, use the default CONFIG_
7f5ef2f7bSYann E. MORINCONFIG_="${CONFIG_-CONFIG_}"
8f5ef2f7bSYann E. MORIN
98e54701eSAndi Kleenusage() {
108e54701eSAndi Kleen	cat >&2 <<EOL
118e54701eSAndi KleenManipulate options in a .config file from the command line.
128e54701eSAndi KleenUsage:
1373877785SClement Chauplannaz$myname options command ...
148e54701eSAndi Kleencommands:
158e54701eSAndi Kleen	--enable|-e option   Enable option
168e54701eSAndi Kleen	--disable|-d option  Disable option
178e54701eSAndi Kleen	--module|-m option   Turn option into a module
18f0a6332cSJonas Aaberg	--set-str option string
19f0a6332cSJonas Aaberg	                     Set option to "string"
20f0a6332cSJonas Aaberg	--set-val option value
21f0a6332cSJonas Aaberg	                     Set option to value
22d5bfb6b3SYann E. MORIN	--undefine|-u option Undefine option
238e54701eSAndi Kleen	--state|-s option    Print state of option (n,y,m,undef)
248e54701eSAndi Kleen
258e54701eSAndi Kleen	--enable-after|-E beforeopt option
268e54701eSAndi Kleen                             Enable option directly after other option
278e54701eSAndi Kleen	--disable-after|-D beforeopt option
288e54701eSAndi Kleen                             Disable option directly after other option
298e54701eSAndi Kleen	--module-after|-M beforeopt option
308e54701eSAndi Kleen                             Turn option into module directly after other option
318e54701eSAndi Kleen
328e54701eSAndi Kleen	commands can be repeated multiple times
338e54701eSAndi Kleen
348e54701eSAndi Kleenoptions:
354edc7e32SYann E. MORIN	--file config-file   .config file to change (default .config)
364edc7e32SYann E. MORIN	--keep-case|-k       Keep next symbols' case (dont' upper-case it)
378e54701eSAndi Kleen
3873877785SClement Chauplannaz$myname doesn't check the validity of the .config file. This is done at next
398e54701eSAndi Kleenmake time.
404edc7e32SYann E. MORIN
4173877785SClement ChauplannazBy default, $myname will upper-case the given symbol. Use --keep-case to keep
424edc7e32SYann E. MORINthe case of all following symbols unchanged.
43f5ef2f7bSYann E. MORIN
4473877785SClement Chauplannaz$myname uses 'CONFIG_' as the default symbol prefix. Set the environment
4573877785SClement Chauplannazvariable CONFIG_ to the prefix to use. Eg.: CONFIG_="FOO_" $myname ...
468e54701eSAndi KleenEOL
478e54701eSAndi Kleen	exit 1
488e54701eSAndi Kleen}
498e54701eSAndi Kleen
508e54701eSAndi Kleencheckarg() {
518e54701eSAndi Kleen	ARG="$1"
528e54701eSAndi Kleen	if [ "$ARG" = "" ] ; then
538e54701eSAndi Kleen		usage
548e54701eSAndi Kleen	fi
558e54701eSAndi Kleen	case "$ARG" in
56f5ef2f7bSYann E. MORIN	${CONFIG_}*)
57f5ef2f7bSYann E. MORIN		ARG="${ARG/${CONFIG_}/}"
588e54701eSAndi Kleen		;;
598e54701eSAndi Kleen	esac
604edc7e32SYann E. MORIN	if [ "$MUNGE_CASE" = "yes" ] ; then
618e54701eSAndi Kleen		ARG="`echo $ARG | tr a-z A-Z`"
624edc7e32SYann E. MORIN	fi
638e54701eSAndi Kleen}
648e54701eSAndi Kleen
6556643222SMichal Marekset_var() {
6656643222SMichal Marek	local name=$1 new=$2 before=$3
6756643222SMichal Marek
6856643222SMichal Marek	name_re="^($name=|# $name is not set)"
6956643222SMichal Marek	before_re="^($before=|# $before is not set)"
7056643222SMichal Marek	if test -n "$before" && grep -Eq "$before_re" "$FN"; then
7156643222SMichal Marek		sed -ri "/$before_re/a $new" "$FN"
7256643222SMichal Marek	elif grep -Eq "$name_re" "$FN"; then
7356643222SMichal Marek		sed -ri "s:$name_re.*:$new:" "$FN"
7456643222SMichal Marek	else
7556643222SMichal Marek		echo "$new" >>"$FN"
7656643222SMichal Marek	fi
778e54701eSAndi Kleen}
788e54701eSAndi Kleen
79d5bfb6b3SYann E. MORINundef_var() {
80d5bfb6b3SYann E. MORIN	local name=$1
81d5bfb6b3SYann E. MORIN
82d5bfb6b3SYann E. MORIN	sed -ri "/^($name=|# $name is not set)/d" "$FN"
83d5bfb6b3SYann E. MORIN}
84d5bfb6b3SYann E. MORIN
858e54701eSAndi Kleenif [ "$1" = "--file" ]; then
868e54701eSAndi Kleen	FN="$2"
878e54701eSAndi Kleen	if [ "$FN" = "" ] ; then
888e54701eSAndi Kleen		usage
898e54701eSAndi Kleen	fi
9047312d2cSMichal Marek	shift 2
918e54701eSAndi Kleenelse
928e54701eSAndi Kleen	FN=.config
938e54701eSAndi Kleenfi
948e54701eSAndi Kleen
952302e873SAndi Kleenif [ "$1" = "" ] ; then
962302e873SAndi Kleen	usage
972302e873SAndi Kleenfi
982302e873SAndi Kleen
994edc7e32SYann E. MORINMUNGE_CASE=yes
1008e54701eSAndi Kleenwhile [ "$1" != "" ] ; do
1018e54701eSAndi Kleen	CMD="$1"
1028e54701eSAndi Kleen	shift
1038e54701eSAndi Kleen	case "$CMD" in
1044edc7e32SYann E. MORIN	--keep-case|-k)
1054edc7e32SYann E. MORIN		MUNGE_CASE=no
1064edc7e32SYann E. MORIN		continue
1074edc7e32SYann E. MORIN		;;
10847312d2cSMichal Marek	--refresh)
10947312d2cSMichal Marek		;;
11047312d2cSMichal Marek	--*-after)
1118e54701eSAndi Kleen		checkarg "$1"
11247312d2cSMichal Marek		A=$ARG
11347312d2cSMichal Marek		checkarg "$2"
11447312d2cSMichal Marek		B=$ARG
11547312d2cSMichal Marek		shift 2
11647312d2cSMichal Marek		;;
11745f53cc9SAndi Kleen	-*)
11847312d2cSMichal Marek		checkarg "$1"
1198e54701eSAndi Kleen		shift
1208e54701eSAndi Kleen		;;
12147312d2cSMichal Marek	esac
12247312d2cSMichal Marek	case "$CMD" in
12347312d2cSMichal Marek	--enable|-e)
124f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=y"
12547312d2cSMichal Marek		;;
1268e54701eSAndi Kleen
1278e54701eSAndi Kleen	--disable|-d)
128f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$ARG" "# ${CONFIG_}$ARG is not set"
1298e54701eSAndi Kleen		;;
1308e54701eSAndi Kleen
1318e54701eSAndi Kleen	--module|-m)
132f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=m"
1338e54701eSAndi Kleen		;;
1348e54701eSAndi Kleen
1351f990cf9SMichal Marek	--set-str)
136d6686da8SYann E. MORIN		# sed swallows one level of escaping, so we need double-escaping
137f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=\"${1//\"/\\\\\"}\""
1381f990cf9SMichal Marek		shift
1391f990cf9SMichal Marek		;;
1401f990cf9SMichal Marek
141f0a6332cSJonas Aaberg	--set-val)
142f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=$1"
143f0a6332cSJonas Aaberg		shift
144f0a6332cSJonas Aaberg		;;
145d5bfb6b3SYann E. MORIN	--undefine|-u)
146d5bfb6b3SYann E. MORIN		undef_var "${CONFIG_}$ARG"
147d5bfb6b3SYann E. MORIN		;;
148f0a6332cSJonas Aaberg
1498e54701eSAndi Kleen	--state|-s)
150f5ef2f7bSYann E. MORIN		if grep -q "# ${CONFIG_}$ARG is not set" $FN ; then
1518e54701eSAndi Kleen			echo n
1528e54701eSAndi Kleen		else
153f5ef2f7bSYann E. MORIN			V="$(grep "^${CONFIG_}$ARG=" $FN)"
1548e54701eSAndi Kleen			if [ $? != 0 ] ; then
1558e54701eSAndi Kleen				echo undef
1568e54701eSAndi Kleen			else
157f5ef2f7bSYann E. MORIN				V="${V/#${CONFIG_}$ARG=/}"
158d6686da8SYann E. MORIN				V="${V/#\"/}"
159d6686da8SYann E. MORIN				V="${V/%\"/}"
1601925a276SYann E. MORIN				V="${V//\\\"/\"}"
161d6686da8SYann E. MORIN				echo "${V}"
1628e54701eSAndi Kleen			fi
1638e54701eSAndi Kleen		fi
1648e54701eSAndi Kleen		;;
1658e54701eSAndi Kleen
1668e54701eSAndi Kleen	--enable-after|-E)
167f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$B" "${CONFIG_}$B=y" "${CONFIG_}$A"
1688e54701eSAndi Kleen		;;
1698e54701eSAndi Kleen
1708e54701eSAndi Kleen	--disable-after|-D)
171f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$B" "# ${CONFIG_}$B is not set" "${CONFIG_}$A"
1728e54701eSAndi Kleen		;;
1738e54701eSAndi Kleen
1748e54701eSAndi Kleen	--module-after|-M)
175f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$B" "${CONFIG_}$B=m" "${CONFIG_}$A"
1768e54701eSAndi Kleen		;;
1778e54701eSAndi Kleen
1788e54701eSAndi Kleen	# undocumented because it ignores --file (fixme)
1798e54701eSAndi Kleen	--refresh)
1808e54701eSAndi Kleen		yes "" | make oldconfig
1818e54701eSAndi Kleen		;;
1828e54701eSAndi Kleen
1838e54701eSAndi Kleen	*)
1848e54701eSAndi Kleen		usage
1858e54701eSAndi Kleen		;;
1868e54701eSAndi Kleen	esac
1878e54701eSAndi Kleendone
1888e54701eSAndi Kleen
189