Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8e54701e authored by Andi Kleen's avatar Andi Kleen Committed by Sam Ravnborg
Browse files

kconfig: add script to manipulate .config files on the command line



I often change single options in .config files. Instead of using
an editor or one of the frontends it's convenient to do this from
the command line. It's also useful to do from automated build scripts
when building different variants from a base config file.

I extracted most of the CONFIG manipulation code from one of my
build scripts into a new shell script scripts/config

The script is not integrated with the normal Kconfig machinery
and doesn't do any checking against Kconfig files, but just manipulates
that text format. This is always done at make time anyways.

I believe this script would be a useful standard addition for scripts/*

Sample usage:

./scripts/config --disable smp
Disable SMP in .config file

./scripts/config --file otherdir/.config --module e1000e
Enable E1000E as module in otherdir/.config

./scripts/config --state smp
y
Check state of config option CONFIG_SMP

After merging into git please make scripts/config executable

Signed-off-by: default avatarAndi Kleen <ak@linux.intel.com>
Signed-off-by: default avatarSam Ravnborg <sam@ravnborg.org>
parent 4f628248
Loading
Loading
Loading
Loading

scripts/config

0 → 100755
+150 −0
Original line number Diff line number Diff line
#!/bin/bash
# Manipulate options in a .config file from the command line

usage() {
	cat >&2 <<EOL
Manipulate options in a .config file from the command line.
Usage:
config options command ...
commands:
	--enable|-e option   Enable option
	--disable|-d option  Disable option
	--module|-m option      Turn option into a module
	--state|-s option       Print state of option (n,y,m,undef)

	--enable-after|-E beforeopt option
                             Enable option directly after other option
	--disable-after|-D beforeopt option
                             Disable option directly after other option
	--module-after|-M beforeopt option
                             Turn option into module directly after other option

	commands can be repeated multiple times

options:
	--file .config file to change (default .config)

config doesn't check the validity of the .config file. This is done at next
 make time.
The options need to be already in the file before they can be changed,
but sometimes you can cheat with the --*-after options.
EOL
	exit 1
}

checkarg() {
	ARG="$1"
	if [ "$ARG" = "" ] ; then
		usage
	fi
	case "$ARG" in
	CONFIG_*)
		ARG="${ARG/CONFIG_/}"
		;;
	esac
	ARG="`echo $ARG | tr a-z A-Z`"
}

replace() {
	sed -i -e "$@" $FN
}

if [ "$1" = "--file" ]; then
	FN="$2"
	if [ "$FN" = "" ] ; then
		usage
	fi
	shift
	shift
else
	FN=.config
fi

while [ "$1" != "" ] ; do
	CMD="$1"
	shift
	case "$CMD" in
	--enable|-e)
		checkarg "$1"
		replace "s/# CONFIG_$ARG is not set/CONFIG_$ARG=y/"
		shift
		;;

	--disable|-d)
		checkarg "$1"
		replace "s/CONFIG_$ARG=[my]/# CONFIG_$ARG is not set/"
		shift
		;;

	--module|-m)
		checkarg "$1"
		replace "s/CONFIG_$ARG=y/CONFIG_$ARG=m/" \
			-e "s/# CONFIG_$ARG is not set/CONFIG_$ARG=m/"
		shift
		;;

	--state|-s)
		checkarg "$1"
		if grep -q "# CONFIG_$ARG is not set" $FN ; then
			echo n
		else
			V="$(grep "^CONFIG_$ARG=" $FN)"
			if [ $? != 0 ] ; then
				echo undef
			else
				V="${V/CONFIG_$ARG=/}"
				V="${V/\"/}"
				echo "$V"
			fi
		fi
		shift
		;;

	--enable-after|-E)
		checkarg "$1"
		A=$ARG
		checkarg "$2"
		B=$ARG
		replace "/CONFIG_$A=[my]/aCONFIG_$B=y" \
			-e "/# CONFIG_$ARG is not set/a/CONFIG_$ARG=y" \
			-e "s/# CONFIG_$ARG is not set/CONFIG_$ARG=y/"
		shift
		shift
		;;

	--disable-after|-D)
		checkarg "$1"
		A=$ARG
		checkarg "$2"
		B=$ARG
		replace "/CONFIG_$A=[my]/a# CONFIG_$B is not set" \
		-e "/# CONFIG_$ARG is not set/a/# CONFIG_$ARG is not set" \
		-e "s/CONFIG_$ARG=[my]/# CONFIG_$ARG is not set/"
		shift
		shift
		;;

	--module-after|-M)
		checkarg "$1"
		A=$ARG
		checkarg "$2"
		B=$ARG
		replace "/CONFIG_$A=[my]/aCONFIG_$B=m" \
			-e "/# CONFIG_$ARG is not set/a/CONFIG_$ARG=m" \
			-e "s/CONFIG_$ARG=y/CONFIG_$ARG=m/" \
			-e "s/# CONFIG_$ARG is not set/CONFIG_$ARG=m/"
		shift
		shift
		;;

	# undocumented because it ignores --file (fixme)
	--refresh)
		yes "" | make oldconfig
		;;

	*)
		usage
		;;
	esac
done