xref: /linux/scripts/config (revision 4edc7e32affd40ceb06ba58ff55e4664396b24c7)
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:
29*4edc7e32SYann E. MORIN	--file config-file   .config file to change (default .config)
30*4edc7e32SYann E. MORIN	--keep-case|-k       Keep next symbols' case (dont' upper-case it)
318e54701eSAndi Kleen
328e54701eSAndi Kleenconfig doesn't check the validity of the .config file. This is done at next
338e54701eSAndi Kleenmake time.
34*4edc7e32SYann E. MORIN
35*4edc7e32SYann E. MORINBy default, config will upper-case the given symbol. Use --keep-case to keep
36*4edc7e32SYann E. MORINthe case of all following symbols unchanged.
378e54701eSAndi KleenEOL
388e54701eSAndi Kleen	exit 1
398e54701eSAndi Kleen}
408e54701eSAndi Kleen
418e54701eSAndi Kleencheckarg() {
428e54701eSAndi Kleen	ARG="$1"
438e54701eSAndi Kleen	if [ "$ARG" = "" ] ; then
448e54701eSAndi Kleen		usage
458e54701eSAndi Kleen	fi
468e54701eSAndi Kleen	case "$ARG" in
478e54701eSAndi Kleen	CONFIG_*)
488e54701eSAndi Kleen		ARG="${ARG/CONFIG_/}"
498e54701eSAndi Kleen		;;
508e54701eSAndi Kleen	esac
51*4edc7e32SYann E. MORIN	if [ "$MUNGE_CASE" = "yes" ] ; then
528e54701eSAndi Kleen		ARG="`echo $ARG | tr a-z A-Z`"
53*4edc7e32SYann E. MORIN	fi
548e54701eSAndi Kleen}
558e54701eSAndi Kleen
5656643222SMichal Marekset_var() {
5756643222SMichal Marek	local name=$1 new=$2 before=$3
5856643222SMichal Marek
5956643222SMichal Marek	name_re="^($name=|# $name is not set)"
6056643222SMichal Marek	before_re="^($before=|# $before is not set)"
6156643222SMichal Marek	if test -n "$before" && grep -Eq "$before_re" "$FN"; then
6256643222SMichal Marek		sed -ri "/$before_re/a $new" "$FN"
6356643222SMichal Marek	elif grep -Eq "$name_re" "$FN"; then
6456643222SMichal Marek		sed -ri "s:$name_re.*:$new:" "$FN"
6556643222SMichal Marek	else
6656643222SMichal Marek		echo "$new" >>"$FN"
6756643222SMichal Marek	fi
688e54701eSAndi Kleen}
698e54701eSAndi Kleen
708e54701eSAndi Kleenif [ "$1" = "--file" ]; then
718e54701eSAndi Kleen	FN="$2"
728e54701eSAndi Kleen	if [ "$FN" = "" ] ; then
738e54701eSAndi Kleen		usage
748e54701eSAndi Kleen	fi
7547312d2cSMichal Marek	shift 2
768e54701eSAndi Kleenelse
778e54701eSAndi Kleen	FN=.config
788e54701eSAndi Kleenfi
798e54701eSAndi Kleen
802302e873SAndi Kleenif [ "$1" = "" ] ; then
812302e873SAndi Kleen	usage
822302e873SAndi Kleenfi
832302e873SAndi Kleen
84*4edc7e32SYann E. MORINMUNGE_CASE=yes
858e54701eSAndi Kleenwhile [ "$1" != "" ] ; do
868e54701eSAndi Kleen	CMD="$1"
878e54701eSAndi Kleen	shift
888e54701eSAndi Kleen	case "$CMD" in
89*4edc7e32SYann E. MORIN	--keep-case|-k)
90*4edc7e32SYann E. MORIN		MUNGE_CASE=no
91*4edc7e32SYann E. MORIN		shift
92*4edc7e32SYann E. MORIN		continue
93*4edc7e32SYann E. MORIN		;;
9447312d2cSMichal Marek	--refresh)
9547312d2cSMichal Marek		;;
9647312d2cSMichal Marek	--*-after)
978e54701eSAndi Kleen		checkarg "$1"
9847312d2cSMichal Marek		A=$ARG
9947312d2cSMichal Marek		checkarg "$2"
10047312d2cSMichal Marek		B=$ARG
10147312d2cSMichal Marek		shift 2
10247312d2cSMichal Marek		;;
10345f53cc9SAndi Kleen	-*)
10447312d2cSMichal Marek		checkarg "$1"
1058e54701eSAndi Kleen		shift
1068e54701eSAndi Kleen		;;
10747312d2cSMichal Marek	esac
10847312d2cSMichal Marek	case "$CMD" in
10947312d2cSMichal Marek	--enable|-e)
11047312d2cSMichal Marek		set_var "CONFIG_$ARG" "CONFIG_$ARG=y"
11147312d2cSMichal Marek		;;
1128e54701eSAndi Kleen
1138e54701eSAndi Kleen	--disable|-d)
11456643222SMichal Marek		set_var "CONFIG_$ARG" "# CONFIG_$ARG is not set"
1158e54701eSAndi Kleen		;;
1168e54701eSAndi Kleen
1178e54701eSAndi Kleen	--module|-m)
11856643222SMichal Marek		set_var "CONFIG_$ARG" "CONFIG_$ARG=m"
1198e54701eSAndi Kleen		;;
1208e54701eSAndi Kleen
1211f990cf9SMichal Marek	--set-str)
122d6686da8SYann E. MORIN		# sed swallows one level of escaping, so we need double-escaping
123d6686da8SYann E. MORIN		set_var "CONFIG_$ARG" "CONFIG_$ARG=\"${1//\"/\\\\\"}\""
1241f990cf9SMichal Marek		shift
1251f990cf9SMichal Marek		;;
1261f990cf9SMichal Marek
127f0a6332cSJonas Aaberg	--set-val)
128f0a6332cSJonas Aaberg		set_var "CONFIG_$ARG" "CONFIG_$ARG=$1"
129f0a6332cSJonas Aaberg		shift
130f0a6332cSJonas Aaberg		;;
131f0a6332cSJonas Aaberg
1328e54701eSAndi Kleen	--state|-s)
1338e54701eSAndi Kleen		if grep -q "# CONFIG_$ARG is not set" $FN ; then
1348e54701eSAndi Kleen			echo n
1358e54701eSAndi Kleen		else
1368e54701eSAndi Kleen			V="$(grep "^CONFIG_$ARG=" $FN)"
1378e54701eSAndi Kleen			if [ $? != 0 ] ; then
1388e54701eSAndi Kleen				echo undef
1398e54701eSAndi Kleen			else
140d6686da8SYann E. MORIN				V="${V/#CONFIG_$ARG=/}"
141d6686da8SYann E. MORIN				V="${V/#\"/}"
142d6686da8SYann E. MORIN				V="${V/%\"/}"
143d6686da8SYann E. MORIN				V="${V/\\\"/\"}"
144d6686da8SYann E. MORIN				echo "${V}"
1458e54701eSAndi Kleen			fi
1468e54701eSAndi Kleen		fi
1478e54701eSAndi Kleen		;;
1488e54701eSAndi Kleen
1498e54701eSAndi Kleen	--enable-after|-E)
15056643222SMichal Marek		set_var "CONFIG_$B" "CONFIG_$B=y" "CONFIG_$A"
1518e54701eSAndi Kleen		;;
1528e54701eSAndi Kleen
1538e54701eSAndi Kleen	--disable-after|-D)
15456643222SMichal Marek		set_var "CONFIG_$B" "# CONFIG_$B is not set" "CONFIG_$A"
1558e54701eSAndi Kleen		;;
1568e54701eSAndi Kleen
1578e54701eSAndi Kleen	--module-after|-M)
15856643222SMichal Marek		set_var "CONFIG_$B" "CONFIG_$B=m" "CONFIG_$A"
1598e54701eSAndi Kleen		;;
1608e54701eSAndi Kleen
1618e54701eSAndi Kleen	# undocumented because it ignores --file (fixme)
1628e54701eSAndi Kleen	--refresh)
1638e54701eSAndi Kleen		yes "" | make oldconfig
1648e54701eSAndi Kleen		;;
1658e54701eSAndi Kleen
1668e54701eSAndi Kleen	*)
1678e54701eSAndi Kleen		usage
1688e54701eSAndi Kleen		;;
1698e54701eSAndi Kleen	esac
1708e54701eSAndi Kleendone
1718e54701eSAndi Kleen
172