xref: /linux/scripts/config (revision 3abe3d0223dd1ceb3af6543b71db3856762603a8)
1c25ce589SFinn Behrens#!/usr/bin/env bash
2b2441318SGreg 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
10e461bc9fSJeremie Francois (on alpha)# We use an uncommon delimiter for sed substitutions
11e461bc9fSJeremie Francois (on alpha)SED_DELIM=$(echo -en "\001")
12e461bc9fSJeremie Francois (on alpha)
138e54701eSAndi Kleenusage() {
148e54701eSAndi Kleen	cat >&2 <<EOL
158e54701eSAndi KleenManipulate options in a .config file from the command line.
168e54701eSAndi KleenUsage:
1773877785SClement Chauplannaz$myname options command ...
188e54701eSAndi Kleencommands:
198e54701eSAndi Kleen	--enable|-e option   Enable option
208e54701eSAndi Kleen	--disable|-d option  Disable option
218e54701eSAndi Kleen	--module|-m option   Turn option into a module
22f0a6332cSJonas Aaberg	--set-str option string
23f0a6332cSJonas Aaberg	                     Set option to "string"
24f0a6332cSJonas Aaberg	--set-val option value
25f0a6332cSJonas Aaberg	                     Set option to value
26d5bfb6b3SYann E. MORIN	--undefine|-u option Undefine option
278e54701eSAndi Kleen	--state|-s option    Print state of option (n,y,m,undef)
288e54701eSAndi Kleen
298e54701eSAndi Kleen	--enable-after|-E beforeopt option
308e54701eSAndi Kleen                             Enable option directly after other option
318e54701eSAndi Kleen	--disable-after|-D beforeopt option
328e54701eSAndi Kleen                             Disable option directly after other option
338e54701eSAndi Kleen	--module-after|-M beforeopt option
348e54701eSAndi Kleen                             Turn option into module directly after other option
35f757f601SSeyediman Seyedarab	--refresh            Refresh the config using old settings
368e54701eSAndi Kleen
378e54701eSAndi Kleen	commands can be repeated multiple times
388e54701eSAndi Kleen
398e54701eSAndi Kleenoptions:
404edc7e32SYann E. MORIN	--file config-file   .config file to change (default .config)
415a0eefddSMartin Weiss	--keep-case|-k       Keep next symbols' case (don't upper-case it)
428e54701eSAndi Kleen
4373877785SClement Chauplannaz$myname doesn't check the validity of the .config file. This is done at next
448e54701eSAndi Kleenmake time.
454edc7e32SYann E. MORIN
4673877785SClement ChauplannazBy default, $myname will upper-case the given symbol. Use --keep-case to keep
474edc7e32SYann E. MORINthe case of all following symbols unchanged.
48f5ef2f7bSYann E. MORIN
4973877785SClement Chauplannaz$myname uses 'CONFIG_' as the default symbol prefix. Set the environment
5073877785SClement Chauplannazvariable CONFIG_ to the prefix to use. Eg.: CONFIG_="FOO_" $myname ...
518e54701eSAndi KleenEOL
528e54701eSAndi Kleen	exit 1
538e54701eSAndi Kleen}
548e54701eSAndi Kleen
558e54701eSAndi Kleencheckarg() {
568e54701eSAndi Kleen	ARG="$1"
578e54701eSAndi Kleen	if [ "$ARG" = "" ] ; then
588e54701eSAndi Kleen		usage
598e54701eSAndi Kleen	fi
608e54701eSAndi Kleen	case "$ARG" in
61f5ef2f7bSYann E. MORIN	${CONFIG_}*)
62f5ef2f7bSYann E. MORIN		ARG="${ARG/${CONFIG_}/}"
638e54701eSAndi Kleen		;;
648e54701eSAndi Kleen	esac
654edc7e32SYann E. MORIN	if [ "$MUNGE_CASE" = "yes" ] ; then
668e54701eSAndi Kleen		ARG="`echo $ARG | tr a-z A-Z`"
674edc7e32SYann E. MORIN	fi
688e54701eSAndi Kleen}
698e54701eSAndi Kleen
7083e8b90eSClement Chauplannaztxt_append() {
7183e8b90eSClement Chauplannaz	local anchor="$1"
7283e8b90eSClement Chauplannaz	local insert="$2"
7383e8b90eSClement Chauplannaz	local infile="$3"
7483e8b90eSClement Chauplannaz
7583e8b90eSClement Chauplannaz	# sed append cmd: 'a\' + newline + text + newline
7683e8b90eSClement Chauplannaz	cmd="$(printf "a\\%b$insert" "\n")"
7783e8b90eSClement Chauplannaz
78*a75c339aSRong Zhang	# We don't really need a backup file, but in-place editing with backup
79*a75c339aSRong Zhang	# skipped is not portable due to different implementations parsing
80*a75c339aSRong Zhang	# arguments in incompatible manners.
81*a75c339aSRong Zhang	# Create a backup file anyway to ensure portability. The file will be
82*a75c339aSRong Zhang	# deleted on exit.
83*a75c339aSRong Zhang	sed -E -i.swp -e "/$anchor/$cmd" "$infile"
84*a75c339aSRong Zhang	SED_EDITED=1
8583e8b90eSClement Chauplannaz}
8683e8b90eSClement Chauplannaz
8783e8b90eSClement Chauplannaztxt_subst() {
8883e8b90eSClement Chauplannaz	local before="$1"
8983e8b90eSClement Chauplannaz	local after="$2"
9083e8b90eSClement Chauplannaz	local infile="$3"
9183e8b90eSClement Chauplannaz
92*a75c339aSRong Zhang	sed -E -i.swp -e "s$SED_DELIM$before$SED_DELIM$after$SED_DELIM" "$infile"
93*a75c339aSRong Zhang	SED_EDITED=1
9483e8b90eSClement Chauplannaz}
9583e8b90eSClement Chauplannaz
9683e8b90eSClement Chauplannaztxt_delete() {
9783e8b90eSClement Chauplannaz	local text="$1"
9883e8b90eSClement Chauplannaz	local infile="$2"
9983e8b90eSClement Chauplannaz
100*a75c339aSRong Zhang	sed -E -i.swp -e "/$text/d" "$infile"
101*a75c339aSRong Zhang	SED_EDITED=1
10283e8b90eSClement Chauplannaz}
10383e8b90eSClement Chauplannaz
10456643222SMichal Marekset_var() {
10556643222SMichal Marek	local name=$1 new=$2 before=$3
10656643222SMichal Marek
107dc4ab230SRong Zhang	name_re="^($name=.*|# $name is not set)"
10856643222SMichal Marek	before_re="^($before=|# $before is not set)"
10956643222SMichal Marek	if test -n "$before" && grep -Eq "$before_re" "$FN"; then
110dc4ab230SRong Zhang		txt_append "$before_re" "$new" "$FN"
11156643222SMichal Marek	elif grep -Eq "$name_re" "$FN"; then
112dc4ab230SRong Zhang		txt_subst "$name_re" "$new" "$FN"
11356643222SMichal Marek	else
11456643222SMichal Marek		echo "$new" >>"$FN"
11556643222SMichal Marek	fi
1168e54701eSAndi Kleen}
1178e54701eSAndi Kleen
118d5bfb6b3SYann E. MORINundef_var() {
119d5bfb6b3SYann E. MORIN	local name=$1
120d5bfb6b3SYann E. MORIN
121dc4ab230SRong Zhang	txt_delete "^($name=|# $name is not set)" "$FN"
122d5bfb6b3SYann E. MORIN}
123d5bfb6b3SYann E. MORIN
124*a75c339aSRong ZhangSED_EDITED=0
125*a75c339aSRong Zhangon_exit() {
126*a75c339aSRong Zhang	if [ "$SED_EDITED" -ge 1 ]; then
127*a75c339aSRong Zhang		rm -f "$FN.swp"
128*a75c339aSRong Zhang	fi
129*a75c339aSRong Zhang}
130*a75c339aSRong Zhangtrap on_exit EXIT
131*a75c339aSRong Zhang
132f757f601SSeyediman SeyedarabFN=.config
133f757f601SSeyediman SeyedarabCMDS=()
134f757f601SSeyediman Seyedarabwhile [[ $# -gt 0 ]]; do
1358e54701eSAndi Kleen	if [ "$1" = "--file" ]; then
136f757f601SSeyediman Seyedarab		if [ "$2" = "" ]; then
1378e54701eSAndi Kleen			usage
1388e54701eSAndi Kleen		fi
139f757f601SSeyediman Seyedarab		FN="$2"
14047312d2cSMichal Marek		shift 2
1418e54701eSAndi Kleen	else
142f757f601SSeyediman Seyedarab		CMDS+=("$1")
143f757f601SSeyediman Seyedarab		shift
1448e54701eSAndi Kleen	fi
145f757f601SSeyediman Seyedarabdone
1468e54701eSAndi Kleen
147f757f601SSeyediman Seyedarabset -- "${CMDS[@]}"
1482302e873SAndi Kleenif [ "$1" = "" ] ; then
1492302e873SAndi Kleen	usage
1502302e873SAndi Kleenfi
1512302e873SAndi Kleen
1524edc7e32SYann E. MORINMUNGE_CASE=yes
1538e54701eSAndi Kleenwhile [ "$1" != "" ] ; do
1548e54701eSAndi Kleen	CMD="$1"
1558e54701eSAndi Kleen	shift
1568e54701eSAndi Kleen	case "$CMD" in
1574edc7e32SYann E. MORIN	--keep-case|-k)
1584edc7e32SYann E. MORIN		MUNGE_CASE=no
1594edc7e32SYann E. MORIN		continue
1604edc7e32SYann E. MORIN		;;
16147312d2cSMichal Marek	--refresh)
16247312d2cSMichal Marek		;;
16357a9c760SClement Chauplannaz	--*-after|-E|-D|-M)
1648e54701eSAndi Kleen		checkarg "$1"
16547312d2cSMichal Marek		A=$ARG
16647312d2cSMichal Marek		checkarg "$2"
16747312d2cSMichal Marek		B=$ARG
16847312d2cSMichal Marek		shift 2
16947312d2cSMichal Marek		;;
17045f53cc9SAndi Kleen	-*)
17147312d2cSMichal Marek		checkarg "$1"
1728e54701eSAndi Kleen		shift
1738e54701eSAndi Kleen		;;
17447312d2cSMichal Marek	esac
17547312d2cSMichal Marek	case "$CMD" in
17647312d2cSMichal Marek	--enable|-e)
177f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=y"
17847312d2cSMichal Marek		;;
1798e54701eSAndi Kleen
1808e54701eSAndi Kleen	--disable|-d)
181f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$ARG" "# ${CONFIG_}$ARG is not set"
1828e54701eSAndi Kleen		;;
1838e54701eSAndi Kleen
1848e54701eSAndi Kleen	--module|-m)
185f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=m"
1868e54701eSAndi Kleen		;;
1878e54701eSAndi Kleen
1881f990cf9SMichal Marek	--set-str)
189d6686da8SYann E. MORIN		# sed swallows one level of escaping, so we need double-escaping
190f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=\"${1//\"/\\\\\"}\""
1911f990cf9SMichal Marek		shift
1921f990cf9SMichal Marek		;;
1931f990cf9SMichal Marek
194f0a6332cSJonas Aaberg	--set-val)
195f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=$1"
196f0a6332cSJonas Aaberg		shift
197f0a6332cSJonas Aaberg		;;
198d5bfb6b3SYann E. MORIN	--undefine|-u)
199d5bfb6b3SYann E. MORIN		undef_var "${CONFIG_}$ARG"
200d5bfb6b3SYann E. MORIN		;;
201f0a6332cSJonas Aaberg
2028e54701eSAndi Kleen	--state|-s)
203f5ef2f7bSYann E. MORIN		if grep -q "# ${CONFIG_}$ARG is not set" $FN ; then
2048e54701eSAndi Kleen			echo n
2058e54701eSAndi Kleen		else
206f5ef2f7bSYann E. MORIN			V="$(grep "^${CONFIG_}$ARG=" $FN)"
2078e54701eSAndi Kleen			if [ $? != 0 ] ; then
2088e54701eSAndi Kleen				echo undef
2098e54701eSAndi Kleen			else
210f5ef2f7bSYann E. MORIN				V="${V/#${CONFIG_}$ARG=/}"
211d6686da8SYann E. MORIN				V="${V/#\"/}"
212d6686da8SYann E. MORIN				V="${V/%\"/}"
2131925a276SYann E. MORIN				V="${V//\\\"/\"}"
214d6686da8SYann E. MORIN				echo "${V}"
2158e54701eSAndi Kleen			fi
2168e54701eSAndi Kleen		fi
2178e54701eSAndi Kleen		;;
2188e54701eSAndi Kleen
2198e54701eSAndi Kleen	--enable-after|-E)
220f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$B" "${CONFIG_}$B=y" "${CONFIG_}$A"
2218e54701eSAndi Kleen		;;
2228e54701eSAndi Kleen
2238e54701eSAndi Kleen	--disable-after|-D)
224f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$B" "# ${CONFIG_}$B is not set" "${CONFIG_}$A"
2258e54701eSAndi Kleen		;;
2268e54701eSAndi Kleen
2278e54701eSAndi Kleen	--module-after|-M)
228f5ef2f7bSYann E. MORIN		set_var "${CONFIG_}$B" "${CONFIG_}$B=m" "${CONFIG_}$A"
2298e54701eSAndi Kleen		;;
2308e54701eSAndi Kleen
2318e54701eSAndi Kleen	--refresh)
232f757f601SSeyediman Seyedarab		yes "" | make oldconfig KCONFIG_CONFIG=$FN
2338e54701eSAndi Kleen		;;
2348e54701eSAndi Kleen
2358e54701eSAndi Kleen	*)
236d39648ebSRandy Dunlap		echo "bad command: $CMD" >&2
2378e54701eSAndi Kleen		usage
2388e54701eSAndi Kleen		;;
2398e54701eSAndi Kleen	esac
2408e54701eSAndi Kleendone
241