xref: /linux/scripts/config (revision b24413180f5600bcb3bb70fbed5cf186b60864bd)
18e54701eSAndi Kleen#!/bin/bash
2*b2441318SGreg Kroah-Hartman# SPDX-License-Identifier: GPL-2.0
38e54701eSAndi Kleen# Manipulate options in a .config file from the command line
48e54701eSAndi Kleen
573877785SClement Chauplannazmyname=${0##*/}
673877785SClement Chauplannaz
7f5ef2f7bSYann E. MORIN# If no prefix forced, use the default CONFIG_
8f5ef2f7bSYann E. MORINCONFIG_="${CONFIG_-CONFIG_}"
9f5ef2f7bSYann E. MORIN
108e54701eSAndi Kleenusage() {
118e54701eSAndi Kleen	cat >&2 <<EOL
128e54701eSAndi KleenManipulate options in a .config file from the command line.
138e54701eSAndi KleenUsage:
1473877785SClement Chauplannaz$myname options command ...
158e54701eSAndi Kleencommands:
168e54701eSAndi Kleen	--enable|-e option   Enable option
178e54701eSAndi Kleen	--disable|-d option  Disable option
188e54701eSAndi Kleen	--module|-m option   Turn option into a module
19f0a6332cSJonas Aaberg	--set-str option string
20f0a6332cSJonas Aaberg	                     Set option to "string"
21f0a6332cSJonas Aaberg	--set-val option value
22f0a6332cSJonas Aaberg	                     Set option to value
23d5bfb6b3SYann E. MORIN	--undefine|-u option Undefine option
248e54701eSAndi Kleen	--state|-s option    Print state of option (n,y,m,undef)
258e54701eSAndi Kleen
268e54701eSAndi Kleen	--enable-after|-E beforeopt option
278e54701eSAndi Kleen                             Enable option directly after other option
288e54701eSAndi Kleen	--disable-after|-D beforeopt option
298e54701eSAndi Kleen                             Disable option directly after other option
308e54701eSAndi Kleen	--module-after|-M beforeopt option
318e54701eSAndi Kleen                             Turn option into module directly after other option
328e54701eSAndi Kleen
338e54701eSAndi Kleen	commands can be repeated multiple times
348e54701eSAndi Kleen
358e54701eSAndi Kleenoptions:
364edc7e32SYann E. MORIN	--file config-file   .config file to change (default .config)
374edc7e32SYann E. MORIN	--keep-case|-k       Keep next symbols' case (dont' upper-case it)
388e54701eSAndi Kleen
3973877785SClement Chauplannaz$myname doesn't check the validity of the .config file. This is done at next
408e54701eSAndi Kleenmake time.
414edc7e32SYann E. MORIN
4273877785SClement ChauplannazBy default, $myname will upper-case the given symbol. Use --keep-case to keep
434edc7e32SYann E. MORINthe case of all following symbols unchanged.
44f5ef2f7bSYann E. MORIN
4573877785SClement Chauplannaz$myname uses 'CONFIG_' as the default symbol prefix. Set the environment
4673877785SClement Chauplannazvariable CONFIG_ to the prefix to use. Eg.: CONFIG_="FOO_" $myname ...
478e54701eSAndi KleenEOL
488e54701eSAndi Kleen	exit 1
498e54701eSAndi Kleen}
508e54701eSAndi Kleen
518e54701eSAndi Kleencheckarg() {
528e54701eSAndi Kleen	ARG="$1"
538e54701eSAndi Kleen	if [ "$ARG" = "" ] ; then
548e54701eSAndi Kleen		usage
558e54701eSAndi Kleen	fi
568e54701eSAndi Kleen	case "$ARG" in
57f5ef2f7bSYann E. MORIN	${CONFIG_}*)
58f5ef2f7bSYann E. MORIN		ARG="${ARG/${CONFIG_}/}"
598e54701eSAndi Kleen		;;
608e54701eSAndi Kleen	esac
614edc7e32SYann E. MORIN	if [ "$MUNGE_CASE" = "yes" ] ; then
628e54701eSAndi Kleen		ARG="`echo $ARG | tr a-z A-Z`"
634edc7e32SYann E. MORIN	fi
648e54701eSAndi Kleen}
658e54701eSAndi Kleen
6683e8b90eSClement Chauplannaztxt_append() {
6783e8b90eSClement Chauplannaz	local anchor="$1"
6883e8b90eSClement Chauplannaz	local insert="$2"
6983e8b90eSClement Chauplannaz	local infile="$3"
7083e8b90eSClement Chauplannaz	local tmpfile="$infile.swp"
7183e8b90eSClement Chauplannaz
7283e8b90eSClement Chauplannaz	# sed append cmd: 'a\' + newline + text + newline
7383e8b90eSClement Chauplannaz	cmd="$(printf "a\\%b$insert" "\n")"
7483e8b90eSClement Chauplannaz
7583e8b90eSClement Chauplannaz	sed -e "/$anchor/$cmd" "$infile" >"$tmpfile"
7683e8b90eSClement Chauplannaz	# replace original file with the edited one
7783e8b90eSClement Chauplannaz	mv "$tmpfile" "$infile"
7883e8b90eSClement Chauplannaz}
7983e8b90eSClement Chauplannaz
8083e8b90eSClement Chauplannaztxt_subst() {
8183e8b90eSClement Chauplannaz	local before="$1"
8283e8b90eSClement Chauplannaz	local after="$2"
8383e8b90eSClement Chauplannaz	local infile="$3"
8483e8b90eSClement Chauplannaz	local tmpfile="$infile.swp"
8583e8b90eSClement Chauplannaz
8686eb7818SClement Chauplannaz	sed -e "s:$before:$after:" "$infile" >"$tmpfile"
8783e8b90eSClement Chauplannaz	# replace original file with the edited one
8883e8b90eSClement Chauplannaz	mv "$tmpfile" "$infile"
8983e8b90eSClement Chauplannaz}
9083e8b90eSClement Chauplannaz
9183e8b90eSClement Chauplannaztxt_delete() {
9283e8b90eSClement Chauplannaz	local text="$1"
9383e8b90eSClement Chauplannaz	local infile="$2"
9483e8b90eSClement Chauplannaz	local tmpfile="$infile.swp"
9583e8b90eSClement Chauplannaz
9683e8b90eSClement Chauplannaz	sed -e "/$text/d" "$infile" >"$tmpfile"
9783e8b90eSClement Chauplannaz	# replace original file with the edited one
9883e8b90eSClement Chauplannaz	mv "$tmpfile" "$infile"
9983e8b90eSClement Chauplannaz}
10083e8b90eSClement Chauplannaz
10156643222SMichal Marekset_var() {
10256643222SMichal Marek	local name=$1 new=$2 before=$3
10356643222SMichal Marek
10456643222SMichal Marek	name_re="^($name=|# $name is not set)"
10556643222SMichal Marek	before_re="^($before=|# $before is not set)"
10656643222SMichal Marek	if test -n "$before" && grep -Eq "$before_re" "$FN"; then
10783e8b90eSClement Chauplannaz		txt_append "^$before=" "$new" "$FN"
10883e8b90eSClement Chauplannaz		txt_append "^# $before is not set" "$new" "$FN"
10956643222SMichal Marek	elif grep -Eq "$name_re" "$FN"; then
11083e8b90eSClement Chauplannaz		txt_subst "^$name=.*" "$new" "$FN"
11183e8b90eSClement Chauplannaz		txt_subst "^# $name is not set" "$new" "$FN"
11256643222SMichal Marek	else
11356643222SMichal Marek		echo "$new" >>"$FN"
11456643222SMichal Marek	fi
1158e54701eSAndi Kleen}
1168e54701eSAndi Kleen
117d5bfb6b3SYann E. MORINundef_var() {
118d5bfb6b3SYann E. MORIN	local name=$1
119d5bfb6b3SYann E. MORIN
12083e8b90eSClement Chauplannaz	txt_delete "^$name=" "$FN"
12183e8b90eSClement Chauplannaz	txt_delete "^# $name is not set" "$FN"
122d5bfb6b3SYann E. MORIN}
123d5bfb6b3SYann E. MORIN
1248e54701eSAndi Kleenif [ "$1" = "--file" ]; then
1258e54701eSAndi Kleen	FN="$2"
1268e54701eSAndi Kleen	if [ "$FN" = "" ] ; then
1278e54701eSAndi Kleen		usage
1288e54701eSAndi Kleen	fi
12947312d2cSMichal Marek	shift 2
1308e54701eSAndi Kleenelse
1318e54701eSAndi Kleen	FN=.config
1328e54701eSAndi Kleenfi
1338e54701eSAndi Kleen
1342302e873SAndi Kleenif [ "$1" = "" ] ; then
1352302e873SAndi Kleen	usage
1362302e873SAndi Kleenfi
1372302e873SAndi Kleen
1384edc7e32SYann E. MORINMUNGE_CASE=yes
1398e54701eSAndi Kleenwhile [ "$1" != "" ] ; do
1408e54701eSAndi Kleen	CMD="$1"
1418e54701eSAndi Kleen	shift
1428e54701eSAndi Kleen	case "$CMD" in
1434edc7e32SYann E. MORIN	--keep-case|-k)
1444edc7e32SYann E. MORIN		MUNGE_CASE=no
1454edc7e32SYann E. MORIN		continue
1464edc7e32SYann E. MORIN		;;
14747312d2cSMichal Marek	--refresh)
14847312d2cSMichal Marek		;;
14957a9c760SClement Chauplannaz	--*-after|-E|-D|-M)
1508e54701eSAndi Kleen		checkarg "$1"
15147312d2cSMichal Marek		A=$ARG
15247312d2cSMichal Marek		checkarg "$2"
15347312d2cSMichal Marek		B=$ARG
15447312d2cSMichal Marek		shift 2
15547312d2cSMichal Marek		;;
15645f53cc9SAndi Kleen	-*)
15747312d2cSMichal Marek		checkarg "$1"
1588e54701eSAndi Kleen		shift
1598e54701eSAndi Kleen		;;
16047312d2cSMichal Marek	esac
16147312d2cSMichal Marek	case "$CMD" in
16247312d2cSMichal Marek	--enable|-e)
163f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=y"
16447312d2cSMichal Marek		;;
1658e54701eSAndi Kleen
1668e54701eSAndi Kleen	--disable|-d)
167f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$ARG" "# ${CONFIG_}$ARG is not set"
1688e54701eSAndi Kleen		;;
1698e54701eSAndi Kleen
1708e54701eSAndi Kleen	--module|-m)
171f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=m"
1728e54701eSAndi Kleen		;;
1738e54701eSAndi Kleen
1741f990cf9SMichal Marek	--set-str)
175d6686da8SYann E. MORIN		# sed swallows one level of escaping, so we need double-escaping
176f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=\"${1//\"/\\\\\"}\""
1771f990cf9SMichal Marek		shift
1781f990cf9SMichal Marek		;;
1791f990cf9SMichal Marek
180f0a6332cSJonas Aaberg	--set-val)
181f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=$1"
182f0a6332cSJonas Aaberg		shift
183f0a6332cSJonas Aaberg		;;
184d5bfb6b3SYann E. MORIN	--undefine|-u)
185d5bfb6b3SYann E. MORIN		undef_var "${CONFIG_}$ARG"
186d5bfb6b3SYann E. MORIN		;;
187f0a6332cSJonas Aaberg
1888e54701eSAndi Kleen	--state|-s)
189f5ef2f7bSYann E. MORIN		if grep -q "# ${CONFIG_}$ARG is not set" $FN ; then
1908e54701eSAndi Kleen			echo n
1918e54701eSAndi Kleen		else
192f5ef2f7bSYann E. MORIN			V="$(grep "^${CONFIG_}$ARG=" $FN)"
1938e54701eSAndi Kleen			if [ $? != 0 ] ; then
1948e54701eSAndi Kleen				echo undef
1958e54701eSAndi Kleen			else
196f5ef2f7bSYann E. MORIN				V="${V/#${CONFIG_}$ARG=/}"
197d6686da8SYann E. MORIN				V="${V/#\"/}"
198d6686da8SYann E. MORIN				V="${V/%\"/}"
1991925a276SYann E. MORIN				V="${V//\\\"/\"}"
200d6686da8SYann E. MORIN				echo "${V}"
2018e54701eSAndi Kleen			fi
2028e54701eSAndi Kleen		fi
2038e54701eSAndi Kleen		;;
2048e54701eSAndi Kleen
2058e54701eSAndi Kleen	--enable-after|-E)
206f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$B" "${CONFIG_}$B=y" "${CONFIG_}$A"
2078e54701eSAndi Kleen		;;
2088e54701eSAndi Kleen
2098e54701eSAndi Kleen	--disable-after|-D)
210f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$B" "# ${CONFIG_}$B is not set" "${CONFIG_}$A"
2118e54701eSAndi Kleen		;;
2128e54701eSAndi Kleen
2138e54701eSAndi Kleen	--module-after|-M)
214f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$B" "${CONFIG_}$B=m" "${CONFIG_}$A"
2158e54701eSAndi Kleen		;;
2168e54701eSAndi Kleen
2178e54701eSAndi Kleen	# undocumented because it ignores --file (fixme)
2188e54701eSAndi Kleen	--refresh)
2198e54701eSAndi Kleen		yes "" | make oldconfig
2208e54701eSAndi Kleen		;;
2218e54701eSAndi Kleen
2228e54701eSAndi Kleen	*)
2238e54701eSAndi Kleen		usage
2248e54701eSAndi Kleen		;;
2258e54701eSAndi Kleen	esac
2268e54701eSAndi Kleendone
227