xref: /linux/scripts/config (revision 2302e8730e5caa774e7c6702fc878404d71f13f9)
18e54701eSAndi Kleen#!/bin/bash
28e54701eSAndi Kleen# Manipulate options in a .config file from the command line
38e54701eSAndi Kleen
48e54701eSAndi Kleenusage() {
58e54701eSAndi Kleen	cat >&2 <<EOL
68e54701eSAndi KleenManipulate options in a .config file from the command line.
78e54701eSAndi KleenUsage:
88e54701eSAndi Kleenconfig options command ...
98e54701eSAndi Kleencommands:
108e54701eSAndi Kleen	--enable|-e option   Enable option
118e54701eSAndi Kleen	--disable|-d option  Disable option
128e54701eSAndi Kleen	--module|-m option      Turn option into a module
138e54701eSAndi Kleen	--state|-s option       Print state of option (n,y,m,undef)
148e54701eSAndi Kleen
158e54701eSAndi Kleen	--enable-after|-E beforeopt option
168e54701eSAndi Kleen                             Enable option directly after other option
178e54701eSAndi Kleen	--disable-after|-D beforeopt option
188e54701eSAndi Kleen                             Disable option directly after other option
198e54701eSAndi Kleen	--module-after|-M beforeopt option
208e54701eSAndi Kleen                             Turn option into module directly after other option
218e54701eSAndi Kleen
228e54701eSAndi Kleen	commands can be repeated multiple times
238e54701eSAndi Kleen
248e54701eSAndi Kleenoptions:
258e54701eSAndi Kleen	--file .config file to change (default .config)
268e54701eSAndi Kleen
278e54701eSAndi Kleenconfig doesn't check the validity of the .config file. This is done at next
288e54701eSAndi Kleen make time.
298e54701eSAndi KleenThe options need to be already in the file before they can be changed,
308e54701eSAndi Kleenbut sometimes you can cheat with the --*-after options.
318e54701eSAndi KleenEOL
328e54701eSAndi Kleen	exit 1
338e54701eSAndi Kleen}
348e54701eSAndi Kleen
358e54701eSAndi Kleencheckarg() {
368e54701eSAndi Kleen	ARG="$1"
378e54701eSAndi Kleen	if [ "$ARG" = "" ] ; then
388e54701eSAndi Kleen		usage
398e54701eSAndi Kleen	fi
408e54701eSAndi Kleen	case "$ARG" in
418e54701eSAndi Kleen	CONFIG_*)
428e54701eSAndi Kleen		ARG="${ARG/CONFIG_/}"
438e54701eSAndi Kleen		;;
448e54701eSAndi Kleen	esac
458e54701eSAndi Kleen	ARG="`echo $ARG | tr a-z A-Z`"
468e54701eSAndi Kleen}
478e54701eSAndi Kleen
488e54701eSAndi Kleenreplace() {
498e54701eSAndi Kleen	sed -i -e "$@" $FN
508e54701eSAndi Kleen}
518e54701eSAndi Kleen
528e54701eSAndi Kleenif [ "$1" = "--file" ]; then
538e54701eSAndi Kleen	FN="$2"
548e54701eSAndi Kleen	if [ "$FN" = "" ] ; then
558e54701eSAndi Kleen		usage
568e54701eSAndi Kleen	fi
578e54701eSAndi Kleen	shift
588e54701eSAndi Kleen	shift
598e54701eSAndi Kleenelse
608e54701eSAndi Kleen	FN=.config
618e54701eSAndi Kleenfi
628e54701eSAndi Kleen
63*2302e873SAndi Kleenif [ "$1" = "" ] ; then
64*2302e873SAndi Kleen	usage
65*2302e873SAndi Kleenfi
66*2302e873SAndi Kleen
678e54701eSAndi Kleenwhile [ "$1" != "" ] ; do
688e54701eSAndi Kleen	CMD="$1"
698e54701eSAndi Kleen	shift
708e54701eSAndi Kleen	case "$CMD" in
718e54701eSAndi Kleen	--enable|-e)
728e54701eSAndi Kleen		checkarg "$1"
738e54701eSAndi Kleen		replace "s/# CONFIG_$ARG is not set/CONFIG_$ARG=y/"
748e54701eSAndi Kleen		shift
758e54701eSAndi Kleen		;;
768e54701eSAndi Kleen
778e54701eSAndi Kleen	--disable|-d)
788e54701eSAndi Kleen		checkarg "$1"
798e54701eSAndi Kleen		replace "s/CONFIG_$ARG=[my]/# CONFIG_$ARG is not set/"
808e54701eSAndi Kleen		shift
818e54701eSAndi Kleen		;;
828e54701eSAndi Kleen
838e54701eSAndi Kleen	--module|-m)
848e54701eSAndi Kleen		checkarg "$1"
858e54701eSAndi Kleen		replace "s/CONFIG_$ARG=y/CONFIG_$ARG=m/" \
868e54701eSAndi Kleen			-e "s/# CONFIG_$ARG is not set/CONFIG_$ARG=m/"
878e54701eSAndi Kleen		shift
888e54701eSAndi Kleen		;;
898e54701eSAndi Kleen
908e54701eSAndi Kleen	--state|-s)
918e54701eSAndi Kleen		checkarg "$1"
928e54701eSAndi Kleen		if grep -q "# CONFIG_$ARG is not set" $FN ; then
938e54701eSAndi Kleen			echo n
948e54701eSAndi Kleen		else
958e54701eSAndi Kleen			V="$(grep "^CONFIG_$ARG=" $FN)"
968e54701eSAndi Kleen			if [ $? != 0 ] ; then
978e54701eSAndi Kleen				echo undef
988e54701eSAndi Kleen			else
998e54701eSAndi Kleen				V="${V/CONFIG_$ARG=/}"
1008e54701eSAndi Kleen				V="${V/\"/}"
1018e54701eSAndi Kleen				echo "$V"
1028e54701eSAndi Kleen			fi
1038e54701eSAndi Kleen		fi
1048e54701eSAndi Kleen		shift
1058e54701eSAndi Kleen		;;
1068e54701eSAndi Kleen
1078e54701eSAndi Kleen	--enable-after|-E)
1088e54701eSAndi Kleen		checkarg "$1"
1098e54701eSAndi Kleen		A=$ARG
1108e54701eSAndi Kleen		checkarg "$2"
1118e54701eSAndi Kleen		B=$ARG
1128e54701eSAndi Kleen		replace "/CONFIG_$A=[my]/aCONFIG_$B=y" \
1138e54701eSAndi Kleen			-e "/# CONFIG_$ARG is not set/a/CONFIG_$ARG=y" \
1148e54701eSAndi Kleen			-e "s/# CONFIG_$ARG is not set/CONFIG_$ARG=y/"
1158e54701eSAndi Kleen		shift
1168e54701eSAndi Kleen		shift
1178e54701eSAndi Kleen		;;
1188e54701eSAndi Kleen
1198e54701eSAndi Kleen	--disable-after|-D)
1208e54701eSAndi Kleen		checkarg "$1"
1218e54701eSAndi Kleen		A=$ARG
1228e54701eSAndi Kleen		checkarg "$2"
1238e54701eSAndi Kleen		B=$ARG
1248e54701eSAndi Kleen		replace "/CONFIG_$A=[my]/a# CONFIG_$B is not set" \
1258e54701eSAndi Kleen		-e "/# CONFIG_$ARG is not set/a/# CONFIG_$ARG is not set" \
1268e54701eSAndi Kleen		-e "s/CONFIG_$ARG=[my]/# CONFIG_$ARG is not set/"
1278e54701eSAndi Kleen		shift
1288e54701eSAndi Kleen		shift
1298e54701eSAndi Kleen		;;
1308e54701eSAndi Kleen
1318e54701eSAndi Kleen	--module-after|-M)
1328e54701eSAndi Kleen		checkarg "$1"
1338e54701eSAndi Kleen		A=$ARG
1348e54701eSAndi Kleen		checkarg "$2"
1358e54701eSAndi Kleen		B=$ARG
1368e54701eSAndi Kleen		replace "/CONFIG_$A=[my]/aCONFIG_$B=m" \
1378e54701eSAndi Kleen			-e "/# CONFIG_$ARG is not set/a/CONFIG_$ARG=m" \
1388e54701eSAndi Kleen			-e "s/CONFIG_$ARG=y/CONFIG_$ARG=m/" \
1398e54701eSAndi Kleen			-e "s/# CONFIG_$ARG is not set/CONFIG_$ARG=m/"
1408e54701eSAndi Kleen		shift
1418e54701eSAndi Kleen		shift
1428e54701eSAndi Kleen		;;
1438e54701eSAndi Kleen
1448e54701eSAndi Kleen	# undocumented because it ignores --file (fixme)
1458e54701eSAndi Kleen	--refresh)
1468e54701eSAndi Kleen		yes "" | make oldconfig
1478e54701eSAndi Kleen		;;
1488e54701eSAndi Kleen
1498e54701eSAndi Kleen	*)
1508e54701eSAndi Kleen		usage
1518e54701eSAndi Kleen		;;
1528e54701eSAndi Kleen	esac
1538e54701eSAndi Kleendone
1548e54701eSAndi Kleen
155