xref: /openbmc/linux/scripts/config (revision 4edc7e32)
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:
294edc7e32SYann E. MORIN	--file config-file   .config file to change (default .config)
304edc7e32SYann 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.
344edc7e32SYann E. MORIN
354edc7e32SYann E. MORINBy default, config will upper-case the given symbol. Use --keep-case to keep
364edc7e32SYann 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
514edc7e32SYann E. MORIN	if [ "$MUNGE_CASE" = "yes" ] ; then
528e54701eSAndi Kleen		ARG="`echo $ARG | tr a-z A-Z`"
534edc7e32SYann 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
844edc7e32SYann E. MORINMUNGE_CASE=yes
858e54701eSAndi Kleenwhile [ "$1" != "" ] ; do
868e54701eSAndi Kleen	CMD="$1"
878e54701eSAndi Kleen	shift
888e54701eSAndi Kleen	case "$CMD" in
894edc7e32SYann E. MORIN	--keep-case|-k)
904edc7e32SYann E. MORIN		MUNGE_CASE=no
914edc7e32SYann E. MORIN		shift
924edc7e32SYann E. MORIN		continue
934edc7e32SYann 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