xref: /openbmc/linux/scripts/config (revision f5ef2f7b)
18e54701eSAndi Kleen#!/bin/bash
28e54701eSAndi Kleen# Manipulate options in a .config file from the command line
38e54701eSAndi Kleen
4f5ef2f7bSYann E. MORIN# If no prefix forced, use the default CONFIG_
5f5ef2f7bSYann E. MORINCONFIG_="${CONFIG_-CONFIG_}"
6f5ef2f7bSYann E. MORIN
78e54701eSAndi Kleenusage() {
88e54701eSAndi Kleen	cat >&2 <<EOL
98e54701eSAndi KleenManipulate options in a .config file from the command line.
108e54701eSAndi KleenUsage:
118e54701eSAndi Kleenconfig options command ...
128e54701eSAndi Kleencommands:
138e54701eSAndi Kleen	--enable|-e option   Enable option
148e54701eSAndi Kleen	--disable|-d option  Disable option
158e54701eSAndi Kleen	--module|-m option   Turn option into a module
16f0a6332cSJonas Aaberg	--set-str option string
17f0a6332cSJonas Aaberg	                     Set option to "string"
18f0a6332cSJonas Aaberg	--set-val option value
19f0a6332cSJonas Aaberg	                     Set option to value
208e54701eSAndi Kleen	--state|-s option    Print state of option (n,y,m,undef)
218e54701eSAndi Kleen
228e54701eSAndi Kleen	--enable-after|-E beforeopt option
238e54701eSAndi Kleen                             Enable option directly after other option
248e54701eSAndi Kleen	--disable-after|-D beforeopt option
258e54701eSAndi Kleen                             Disable option directly after other option
268e54701eSAndi Kleen	--module-after|-M beforeopt option
278e54701eSAndi Kleen                             Turn option into module directly after other option
288e54701eSAndi Kleen
298e54701eSAndi Kleen	commands can be repeated multiple times
308e54701eSAndi Kleen
318e54701eSAndi Kleenoptions:
324edc7e32SYann E. MORIN	--file config-file   .config file to change (default .config)
334edc7e32SYann E. MORIN	--keep-case|-k       Keep next symbols' case (dont' upper-case it)
348e54701eSAndi Kleen
358e54701eSAndi Kleenconfig doesn't check the validity of the .config file. This is done at next
368e54701eSAndi Kleenmake time.
374edc7e32SYann E. MORIN
384edc7e32SYann E. MORINBy default, config will upper-case the given symbol. Use --keep-case to keep
394edc7e32SYann E. MORINthe case of all following symbols unchanged.
40f5ef2f7bSYann E. MORIN
41f5ef2f7bSYann E. MORINconfig uses 'CONFIG_' as the default symbol prefix. Set the environment
42f5ef2f7bSYann E. MORINvariable CONFIG_ to the prefix to use. Eg.: CONFIG_="FOO_" config ...
438e54701eSAndi KleenEOL
448e54701eSAndi Kleen	exit 1
458e54701eSAndi Kleen}
468e54701eSAndi Kleen
478e54701eSAndi Kleencheckarg() {
488e54701eSAndi Kleen	ARG="$1"
498e54701eSAndi Kleen	if [ "$ARG" = "" ] ; then
508e54701eSAndi Kleen		usage
518e54701eSAndi Kleen	fi
528e54701eSAndi Kleen	case "$ARG" in
53f5ef2f7bSYann E. MORIN	${CONFIG_}*)
54f5ef2f7bSYann E. MORIN		ARG="${ARG/${CONFIG_}/}"
558e54701eSAndi Kleen		;;
568e54701eSAndi Kleen	esac
574edc7e32SYann E. MORIN	if [ "$MUNGE_CASE" = "yes" ] ; then
588e54701eSAndi Kleen		ARG="`echo $ARG | tr a-z A-Z`"
594edc7e32SYann E. MORIN	fi
608e54701eSAndi Kleen}
618e54701eSAndi Kleen
6256643222SMichal Marekset_var() {
6356643222SMichal Marek	local name=$1 new=$2 before=$3
6456643222SMichal Marek
6556643222SMichal Marek	name_re="^($name=|# $name is not set)"
6656643222SMichal Marek	before_re="^($before=|# $before is not set)"
6756643222SMichal Marek	if test -n "$before" && grep -Eq "$before_re" "$FN"; then
6856643222SMichal Marek		sed -ri "/$before_re/a $new" "$FN"
6956643222SMichal Marek	elif grep -Eq "$name_re" "$FN"; then
7056643222SMichal Marek		sed -ri "s:$name_re.*:$new:" "$FN"
7156643222SMichal Marek	else
7256643222SMichal Marek		echo "$new" >>"$FN"
7356643222SMichal Marek	fi
748e54701eSAndi Kleen}
758e54701eSAndi Kleen
768e54701eSAndi Kleenif [ "$1" = "--file" ]; then
778e54701eSAndi Kleen	FN="$2"
788e54701eSAndi Kleen	if [ "$FN" = "" ] ; then
798e54701eSAndi Kleen		usage
808e54701eSAndi Kleen	fi
8147312d2cSMichal Marek	shift 2
828e54701eSAndi Kleenelse
838e54701eSAndi Kleen	FN=.config
848e54701eSAndi Kleenfi
858e54701eSAndi Kleen
862302e873SAndi Kleenif [ "$1" = "" ] ; then
872302e873SAndi Kleen	usage
882302e873SAndi Kleenfi
892302e873SAndi Kleen
904edc7e32SYann E. MORINMUNGE_CASE=yes
918e54701eSAndi Kleenwhile [ "$1" != "" ] ; do
928e54701eSAndi Kleen	CMD="$1"
938e54701eSAndi Kleen	shift
948e54701eSAndi Kleen	case "$CMD" in
954edc7e32SYann E. MORIN	--keep-case|-k)
964edc7e32SYann E. MORIN		MUNGE_CASE=no
974edc7e32SYann E. MORIN		shift
984edc7e32SYann E. MORIN		continue
994edc7e32SYann E. MORIN		;;
10047312d2cSMichal Marek	--refresh)
10147312d2cSMichal Marek		;;
10247312d2cSMichal Marek	--*-after)
1038e54701eSAndi Kleen		checkarg "$1"
10447312d2cSMichal Marek		A=$ARG
10547312d2cSMichal Marek		checkarg "$2"
10647312d2cSMichal Marek		B=$ARG
10747312d2cSMichal Marek		shift 2
10847312d2cSMichal Marek		;;
10945f53cc9SAndi Kleen	-*)
11047312d2cSMichal Marek		checkarg "$1"
1118e54701eSAndi Kleen		shift
1128e54701eSAndi Kleen		;;
11347312d2cSMichal Marek	esac
11447312d2cSMichal Marek	case "$CMD" in
11547312d2cSMichal Marek	--enable|-e)
116f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=y"
11747312d2cSMichal Marek		;;
1188e54701eSAndi Kleen
1198e54701eSAndi Kleen	--disable|-d)
120f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$ARG" "# ${CONFIG_}$ARG is not set"
1218e54701eSAndi Kleen		;;
1228e54701eSAndi Kleen
1238e54701eSAndi Kleen	--module|-m)
124f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=m"
1258e54701eSAndi Kleen		;;
1268e54701eSAndi Kleen
1271f990cf9SMichal Marek	--set-str)
128d6686da8SYann E. MORIN		# sed swallows one level of escaping, so we need double-escaping
129f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=\"${1//\"/\\\\\"}\""
1301f990cf9SMichal Marek		shift
1311f990cf9SMichal Marek		;;
1321f990cf9SMichal Marek
133f0a6332cSJonas Aaberg	--set-val)
134f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=$1"
135f0a6332cSJonas Aaberg		shift
136f0a6332cSJonas Aaberg		;;
137f0a6332cSJonas Aaberg
1388e54701eSAndi Kleen	--state|-s)
139f5ef2f7bSYann E. MORIN		if grep -q "# ${CONFIG_}$ARG is not set" $FN ; then
1408e54701eSAndi Kleen			echo n
1418e54701eSAndi Kleen		else
142f5ef2f7bSYann E. MORIN			V="$(grep "^${CONFIG_}$ARG=" $FN)"
1438e54701eSAndi Kleen			if [ $? != 0 ] ; then
1448e54701eSAndi Kleen				echo undef
1458e54701eSAndi Kleen			else
146f5ef2f7bSYann E. MORIN				V="${V/#${CONFIG_}$ARG=/}"
147d6686da8SYann E. MORIN				V="${V/#\"/}"
148d6686da8SYann E. MORIN				V="${V/%\"/}"
149d6686da8SYann E. MORIN				V="${V/\\\"/\"}"
150d6686da8SYann E. MORIN				echo "${V}"
1518e54701eSAndi Kleen			fi
1528e54701eSAndi Kleen		fi
1538e54701eSAndi Kleen		;;
1548e54701eSAndi Kleen
1558e54701eSAndi Kleen	--enable-after|-E)
156f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$B" "${CONFIG_}$B=y" "${CONFIG_}$A"
1578e54701eSAndi Kleen		;;
1588e54701eSAndi Kleen
1598e54701eSAndi Kleen	--disable-after|-D)
160f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$B" "# ${CONFIG_}$B is not set" "${CONFIG_}$A"
1618e54701eSAndi Kleen		;;
1628e54701eSAndi Kleen
1638e54701eSAndi Kleen	--module-after|-M)
164f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$B" "${CONFIG_}$B=m" "${CONFIG_}$A"
1658e54701eSAndi Kleen		;;
1668e54701eSAndi Kleen
1678e54701eSAndi Kleen	# undocumented because it ignores --file (fixme)
1688e54701eSAndi Kleen	--refresh)
1698e54701eSAndi Kleen		yes "" | make oldconfig
1708e54701eSAndi Kleen		;;
1718e54701eSAndi Kleen
1728e54701eSAndi Kleen	*)
1738e54701eSAndi Kleen		usage
1748e54701eSAndi Kleen		;;
1758e54701eSAndi Kleen	esac
1768e54701eSAndi Kleendone
1778e54701eSAndi Kleen
178