xref: /linux/scripts/config (revision d6686da814c884e341d3bd8aa54947c91cb678be)
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
13f0a6332cSJonas Aaberg	--set-str option string
14f0a6332cSJonas Aaberg	                     Set option to "string"
15f0a6332cSJonas Aaberg	--set-val option value
16f0a6332cSJonas Aaberg	                     Set option to value
178e54701eSAndi Kleen	--state|-s option    Print state of option (n,y,m,undef)
188e54701eSAndi Kleen
198e54701eSAndi Kleen	--enable-after|-E beforeopt option
208e54701eSAndi Kleen                             Enable option directly after other option
218e54701eSAndi Kleen	--disable-after|-D beforeopt option
228e54701eSAndi Kleen                             Disable option directly after other option
238e54701eSAndi Kleen	--module-after|-M beforeopt option
248e54701eSAndi Kleen                             Turn option into module directly after other option
258e54701eSAndi Kleen
268e54701eSAndi Kleen	commands can be repeated multiple times
278e54701eSAndi Kleen
288e54701eSAndi Kleenoptions:
298e54701eSAndi Kleen	--file .config file to change (default .config)
308e54701eSAndi Kleen
318e54701eSAndi Kleenconfig doesn't check the validity of the .config file. This is done at next
328e54701eSAndi Kleen make time.
338e54701eSAndi KleenEOL
348e54701eSAndi Kleen	exit 1
358e54701eSAndi Kleen}
368e54701eSAndi Kleen
378e54701eSAndi Kleencheckarg() {
388e54701eSAndi Kleen	ARG="$1"
398e54701eSAndi Kleen	if [ "$ARG" = "" ] ; then
408e54701eSAndi Kleen		usage
418e54701eSAndi Kleen	fi
428e54701eSAndi Kleen	case "$ARG" in
438e54701eSAndi Kleen	CONFIG_*)
448e54701eSAndi Kleen		ARG="${ARG/CONFIG_/}"
458e54701eSAndi Kleen		;;
468e54701eSAndi Kleen	esac
478e54701eSAndi Kleen	ARG="`echo $ARG | tr a-z A-Z`"
488e54701eSAndi Kleen}
498e54701eSAndi Kleen
5056643222SMichal Marekset_var() {
5156643222SMichal Marek	local name=$1 new=$2 before=$3
5256643222SMichal Marek
5356643222SMichal Marek	name_re="^($name=|# $name is not set)"
5456643222SMichal Marek	before_re="^($before=|# $before is not set)"
5556643222SMichal Marek	if test -n "$before" && grep -Eq "$before_re" "$FN"; then
5656643222SMichal Marek		sed -ri "/$before_re/a $new" "$FN"
5756643222SMichal Marek	elif grep -Eq "$name_re" "$FN"; then
5856643222SMichal Marek		sed -ri "s:$name_re.*:$new:" "$FN"
5956643222SMichal Marek	else
6056643222SMichal Marek		echo "$new" >>"$FN"
6156643222SMichal Marek	fi
628e54701eSAndi Kleen}
638e54701eSAndi Kleen
648e54701eSAndi Kleenif [ "$1" = "--file" ]; then
658e54701eSAndi Kleen	FN="$2"
668e54701eSAndi Kleen	if [ "$FN" = "" ] ; then
678e54701eSAndi Kleen		usage
688e54701eSAndi Kleen	fi
6947312d2cSMichal Marek	shift 2
708e54701eSAndi Kleenelse
718e54701eSAndi Kleen	FN=.config
728e54701eSAndi Kleenfi
738e54701eSAndi Kleen
742302e873SAndi Kleenif [ "$1" = "" ] ; then
752302e873SAndi Kleen	usage
762302e873SAndi Kleenfi
772302e873SAndi Kleen
788e54701eSAndi Kleenwhile [ "$1" != "" ] ; do
798e54701eSAndi Kleen	CMD="$1"
808e54701eSAndi Kleen	shift
818e54701eSAndi Kleen	case "$CMD" in
8247312d2cSMichal Marek	--refresh)
8347312d2cSMichal Marek		;;
8447312d2cSMichal Marek	--*-after)
858e54701eSAndi Kleen		checkarg "$1"
8647312d2cSMichal Marek		A=$ARG
8747312d2cSMichal Marek		checkarg "$2"
8847312d2cSMichal Marek		B=$ARG
8947312d2cSMichal Marek		shift 2
9047312d2cSMichal Marek		;;
9145f53cc9SAndi Kleen	-*)
9247312d2cSMichal Marek		checkarg "$1"
938e54701eSAndi Kleen		shift
948e54701eSAndi Kleen		;;
9547312d2cSMichal Marek	esac
9647312d2cSMichal Marek	case "$CMD" in
9747312d2cSMichal Marek	--enable|-e)
9847312d2cSMichal Marek		set_var "CONFIG_$ARG" "CONFIG_$ARG=y"
9947312d2cSMichal Marek		;;
1008e54701eSAndi Kleen
1018e54701eSAndi Kleen	--disable|-d)
10256643222SMichal Marek		set_var "CONFIG_$ARG" "# CONFIG_$ARG is not set"
1038e54701eSAndi Kleen		;;
1048e54701eSAndi Kleen
1058e54701eSAndi Kleen	--module|-m)
10656643222SMichal Marek		set_var "CONFIG_$ARG" "CONFIG_$ARG=m"
1078e54701eSAndi Kleen		;;
1088e54701eSAndi Kleen
1091f990cf9SMichal Marek	--set-str)
110*d6686da8SYann E. MORIN		# sed swallows one level of escaping, so we need double-escaping
111*d6686da8SYann E. MORIN		set_var "CONFIG_$ARG" "CONFIG_$ARG=\"${1//\"/\\\\\"}\""
1121f990cf9SMichal Marek		shift
1131f990cf9SMichal Marek		;;
1141f990cf9SMichal Marek
115f0a6332cSJonas Aaberg	--set-val)
116f0a6332cSJonas Aaberg		set_var "CONFIG_$ARG" "CONFIG_$ARG=$1"
117f0a6332cSJonas Aaberg		shift
118f0a6332cSJonas Aaberg		;;
119f0a6332cSJonas Aaberg
1208e54701eSAndi Kleen	--state|-s)
1218e54701eSAndi Kleen		if grep -q "# CONFIG_$ARG is not set" $FN ; then
1228e54701eSAndi Kleen			echo n
1238e54701eSAndi Kleen		else
1248e54701eSAndi Kleen			V="$(grep "^CONFIG_$ARG=" $FN)"
1258e54701eSAndi Kleen			if [ $? != 0 ] ; then
1268e54701eSAndi Kleen				echo undef
1278e54701eSAndi Kleen			else
128*d6686da8SYann E. MORIN				V="${V/#CONFIG_$ARG=/}"
129*d6686da8SYann E. MORIN				V="${V/#\"/}"
130*d6686da8SYann E. MORIN				V="${V/%\"/}"
131*d6686da8SYann E. MORIN				V="${V/\\\"/\"}"
132*d6686da8SYann E. MORIN				echo "${V}"
1338e54701eSAndi Kleen			fi
1348e54701eSAndi Kleen		fi
1358e54701eSAndi Kleen		;;
1368e54701eSAndi Kleen
1378e54701eSAndi Kleen	--enable-after|-E)
13856643222SMichal Marek		set_var "CONFIG_$B" "CONFIG_$B=y" "CONFIG_$A"
1398e54701eSAndi Kleen		;;
1408e54701eSAndi Kleen
1418e54701eSAndi Kleen	--disable-after|-D)
14256643222SMichal Marek		set_var "CONFIG_$B" "# CONFIG_$B is not set" "CONFIG_$A"
1438e54701eSAndi Kleen		;;
1448e54701eSAndi Kleen
1458e54701eSAndi Kleen	--module-after|-M)
14656643222SMichal Marek		set_var "CONFIG_$B" "CONFIG_$B=m" "CONFIG_$A"
1478e54701eSAndi Kleen		;;
1488e54701eSAndi Kleen
1498e54701eSAndi Kleen	# undocumented because it ignores --file (fixme)
1508e54701eSAndi Kleen	--refresh)
1518e54701eSAndi Kleen		yes "" | make oldconfig
1528e54701eSAndi Kleen		;;
1538e54701eSAndi Kleen
1548e54701eSAndi Kleen	*)
1558e54701eSAndi Kleen		usage
1568e54701eSAndi Kleen		;;
1578e54701eSAndi Kleen	esac
1588e54701eSAndi Kleendone
1598e54701eSAndi Kleen
160