xref: /linux/scripts/config (revision 47312d2cfd9b769c1739738602c163c4c9814c7b)
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 KleenEOL
308e54701eSAndi Kleen	exit 1
318e54701eSAndi Kleen}
328e54701eSAndi Kleen
338e54701eSAndi Kleencheckarg() {
348e54701eSAndi Kleen	ARG="$1"
358e54701eSAndi Kleen	if [ "$ARG" = "" ] ; then
368e54701eSAndi Kleen		usage
378e54701eSAndi Kleen	fi
388e54701eSAndi Kleen	case "$ARG" in
398e54701eSAndi Kleen	CONFIG_*)
408e54701eSAndi Kleen		ARG="${ARG/CONFIG_/}"
418e54701eSAndi Kleen		;;
428e54701eSAndi Kleen	esac
438e54701eSAndi Kleen	ARG="`echo $ARG | tr a-z A-Z`"
448e54701eSAndi Kleen}
458e54701eSAndi Kleen
4656643222SMichal Marekset_var() {
4756643222SMichal Marek	local name=$1 new=$2 before=$3
4856643222SMichal Marek
4956643222SMichal Marek	name_re="^($name=|# $name is not set)"
5056643222SMichal Marek	before_re="^($before=|# $before is not set)"
5156643222SMichal Marek	if test -n "$before" && grep -Eq "$before_re" "$FN"; then
5256643222SMichal Marek		sed -ri "/$before_re/a $new" "$FN"
5356643222SMichal Marek	elif grep -Eq "$name_re" "$FN"; then
5456643222SMichal Marek		sed -ri "s:$name_re.*:$new:" "$FN"
5556643222SMichal Marek	else
5656643222SMichal Marek		echo "$new" >>"$FN"
5756643222SMichal Marek	fi
588e54701eSAndi Kleen}
598e54701eSAndi Kleen
608e54701eSAndi Kleenif [ "$1" = "--file" ]; then
618e54701eSAndi Kleen	FN="$2"
628e54701eSAndi Kleen	if [ "$FN" = "" ] ; then
638e54701eSAndi Kleen		usage
648e54701eSAndi Kleen	fi
65*47312d2cSMichal Marek	shift 2
668e54701eSAndi Kleenelse
678e54701eSAndi Kleen	FN=.config
688e54701eSAndi Kleenfi
698e54701eSAndi Kleen
702302e873SAndi Kleenif [ "$1" = "" ] ; then
712302e873SAndi Kleen	usage
722302e873SAndi Kleenfi
732302e873SAndi Kleen
748e54701eSAndi Kleenwhile [ "$1" != "" ] ; do
758e54701eSAndi Kleen	CMD="$1"
768e54701eSAndi Kleen	shift
778e54701eSAndi Kleen	case "$CMD" in
78*47312d2cSMichal Marek	--refresh)
79*47312d2cSMichal Marek		;;
80*47312d2cSMichal Marek	--*-after)
818e54701eSAndi Kleen		checkarg "$1"
82*47312d2cSMichal Marek		A=$ARG
83*47312d2cSMichal Marek		checkarg "$2"
84*47312d2cSMichal Marek		B=$ARG
85*47312d2cSMichal Marek		shift 2
86*47312d2cSMichal Marek		;;
87*47312d2cSMichal Marek	--*)
88*47312d2cSMichal Marek		checkarg "$1"
898e54701eSAndi Kleen		shift
908e54701eSAndi Kleen		;;
91*47312d2cSMichal Marek	esac
92*47312d2cSMichal Marek	case "$CMD" in
93*47312d2cSMichal Marek	--enable|-e)
94*47312d2cSMichal Marek		set_var "CONFIG_$ARG" "CONFIG_$ARG=y"
95*47312d2cSMichal Marek		;;
968e54701eSAndi Kleen
978e54701eSAndi Kleen	--disable|-d)
9856643222SMichal Marek		set_var "CONFIG_$ARG" "# CONFIG_$ARG is not set"
998e54701eSAndi Kleen		;;
1008e54701eSAndi Kleen
1018e54701eSAndi Kleen	--module|-m)
10256643222SMichal Marek		set_var "CONFIG_$ARG" "CONFIG_$ARG=m"
1038e54701eSAndi Kleen		;;
1048e54701eSAndi Kleen
1058e54701eSAndi Kleen	--state|-s)
1068e54701eSAndi Kleen		if grep -q "# CONFIG_$ARG is not set" $FN ; then
1078e54701eSAndi Kleen			echo n
1088e54701eSAndi Kleen		else
1098e54701eSAndi Kleen			V="$(grep "^CONFIG_$ARG=" $FN)"
1108e54701eSAndi Kleen			if [ $? != 0 ] ; then
1118e54701eSAndi Kleen				echo undef
1128e54701eSAndi Kleen			else
1138e54701eSAndi Kleen				V="${V/CONFIG_$ARG=/}"
1148e54701eSAndi Kleen				V="${V/\"/}"
1158e54701eSAndi Kleen				echo "$V"
1168e54701eSAndi Kleen			fi
1178e54701eSAndi Kleen		fi
1188e54701eSAndi Kleen		;;
1198e54701eSAndi Kleen
1208e54701eSAndi Kleen	--enable-after|-E)
12156643222SMichal Marek		set_var "CONFIG_$B" "CONFIG_$B=y" "CONFIG_$A"
1228e54701eSAndi Kleen		;;
1238e54701eSAndi Kleen
1248e54701eSAndi Kleen	--disable-after|-D)
12556643222SMichal Marek		set_var "CONFIG_$B" "# CONFIG_$B is not set" "CONFIG_$A"
1268e54701eSAndi Kleen		;;
1278e54701eSAndi Kleen
1288e54701eSAndi Kleen	--module-after|-M)
12956643222SMichal Marek		set_var "CONFIG_$B" "CONFIG_$B=m" "CONFIG_$A"
1308e54701eSAndi Kleen		;;
1318e54701eSAndi Kleen
1328e54701eSAndi Kleen	# undocumented because it ignores --file (fixme)
1338e54701eSAndi Kleen	--refresh)
1348e54701eSAndi Kleen		yes "" | make oldconfig
1358e54701eSAndi Kleen		;;
1368e54701eSAndi Kleen
1378e54701eSAndi Kleen	*)
1388e54701eSAndi Kleen		usage
1398e54701eSAndi Kleen		;;
1408e54701eSAndi Kleen	esac
1418e54701eSAndi Kleendone
1428e54701eSAndi Kleen
143