Skip to contentSkip to conversation

KBUILD: Add script to manipulate .config files on the command line

PATCH In review Andi Kleen 3 participants 12 messages Jan 3, 2009 – Jan 7, 2009 Kbuild

lore
Share & tools
lore

Andi Kleen

author
#0 lore raw

PATCH 1/3 KBUILD: 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

---
 scripts/config |  150 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 150 insertions(+)
scripts/config new file +150 -0
Index: linux-2.6.28-kbuild/scripts/config
===================================================================
@@ -0,0 +1,150 @@
+#!/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
+
author
#1 lore raw

PATCH 2/3 KBUILD: Add a symlink to the source for separate objdirs

I have some scripts which need to map back to the source directory from an objdir. This was so far done by parsing the Makefile, but the Makefile format changes occasionally and breaks my scripts then.

To make this more reliable add a "source" symlink back.

---
 Makefile |    1 +
 1 file changed, 1 insertion(+)
Makefile +1 -0
Index: linux-2.6.28-kbuild/Makefile
===================================================================
@@ -936,6 +936,7 @@
 	    mkdir -p include2;                                          \
 	    ln -fsn $(srctree)/include/asm-$(SRCARCH) include2/asm;     \
 	fi
+	ln -fsn $(srctree) source
 endif
 
 # prepare2 creates a makefile if using a separate output directory
#2 lore raw

Re: [PATCH] [2/3] KBUILD: Add a symlink to the source for separate objdirs

Quoted 9 lines · Andi Kleen

I have some scripts which need to map back to the source directory from an objdir. This was so far done by parsing the Makefile, but the Makefile format changes occasionally and breaks my scripts then.

To make this more reliable add a "source" symlink back.

Like we do when we install modules. Agreed this is usefull. Applied.

Sam

author
#3 lore raw

PATCH 3/3 KBUILD: Add a "bin" symlink for the scripts directory too

In reply to Andi Kleen

Several of the scripts in "scripts" are useful to operate on files in a separate objdir. Instead of always manually typing the path to the source dir create a convenient symlink to the source dir's script directory in the objdir too.

I named it bin because scripts was already used for the object files of scripts.

---
 Makefile |    1 +
 1 file changed, 1 insertion(+)
Makefile +1 -0
Index: linux-2.6.28-kbuild/Makefile
===================================================================
@@ -937,6 +937,7 @@
 	    ln -fsn $(srctree)/include/asm-$(SRCARCH) include2/asm;     \
 	fi
 	ln -fsn $(srctree) source
+	ln -fsn $(srctree)/scripts bin
 endif
 
 # prepare2 creates a makefile if using a separate output directory
#4 lore raw

Re: [PATCH] [3/3] KBUILD: Add a "bin" symlink for the scripts directory too

Quoted 8 lines · Andi Kleen

Several of the scripts in "scripts" are useful to operate on files in a separate objdir. Instead of always manually typing the path to the source dir create a convenient symlink to the source dir's script directory in the objdir too.

I named it bin because scripts was already used for the object files of scripts.

So you suggest we in the O=... case should have
a bin symlink to save you typing "source/sc<tab>

That does not justify another symlink in the output directory.

Sam

author
#5 lore raw

Re: [PATCH] [3/3] KBUILD: Add a "bin" symlink for the scripts directory too

Quoted 7 lines · Sam Ravnborg
Quoted 6 lines · Andi Kleen

Several of the scripts in "scripts" are useful to operate on files in a separate objdir. Instead of always manually typing the path to the source dir create a convenient symlink to the source dir's script directory in the objdir too.

Quoted 5 lines
Quoted 2 lines

I named it bin because scripts was already used for the object files of scripts.

So you suggest we in the O=... case should have
a bin symlink to save you typing "source/sc<tab>

Yes.

Quoted 3 lines

That does not justify another symlink in the output directory.

Why not? They don't cost anything, do they? And
convenience matters.

-Andi

Signature · 1 line
[email protected]
#6 lore raw

Re: [PATCH] [3/3] KBUILD: Add a "bin" symlink for the scripts directory too

Quoted 14 lines · Andi Kleen
Quoted 7 lines · Sam Ravnborg
Quoted 6 lines · Andi Kleen

Several of the scripts in "scripts" are useful to operate on files in a separate objdir. Instead of always manually typing the path to the source dir create a convenient symlink to the source dir's script directory in the objdir too.

Quoted 5 lines
Quoted 2 lines

I named it bin because scripts was already used for the object files of scripts.

So you suggest we in the O=... case should have
a bin symlink to save you typing "source/sc<tab>

Quoted 8 lines

Yes.

Quoted 3 lines

That does not justify another symlink in the output directory.

Why not? They don't cost anything, do they? And
convenience matters.

Different people have different needs.
The next guys needs Arch to point at source/arch/$ARCH and so on.
If it is convinient for your workflow I suggest you to create it yourself.

Doing stuff like this as part of the build is simply the wrong place to do it.

Sam

#7 lore raw
In reply to Andi Kleen
Quoted 8 lines · Andi Kleen

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

This looks very useful, thanks for sharing.

Quoted 3 lines

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.

Why? I would imagine it to be useful to get immediate feedback whether changing the option was successful. It should be easy to run scripts/kconfig/conf -o on the config file afterwards.

My normal workflow when changing single options is to remove the line from .config and call make oldconfig again. What I would like to see most here is something like

./scripts/config --reconfigure smp
Remove SMP from .config, and do oldconfig to ask again.

	Arnd <><
author
#8 lore raw
Quoted 5 lines · Arnd Bergmann
Quoted 2 lines

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

This looks very useful, thanks for sharing.

Quoted 7 lines
Quoted 3 lines

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.

Why? I would imagine it to be useful to get immediate feedback whether changing the option was successful. It should be easy to run scripts/kconfig/conf -o on the config file afterwards.

Mostly so that the script doesn't need to know about the source directory. That would be another argument, making it harder to use. At least my build scripts often run in a different environment. And make always checks it anyways.

Also I wasn't sure how to change the filename of the config file without using Kconfig internals. That would be less of a concern now if it was merged, but it was one out of tree.

Quoted 7 lines

My normal workflow when changing single options is to remove the line from .config and call make oldconfig again. What I would like to see most here is something like

./scripts/config --reconfigure smp
Remove SMP from .config, and do oldconfig to ask again.

You don't need the make oldconfig, make always does that automatically.

BTW there's an undocumented option to do this, but I intentionally didn't document it because it doesn't work with --file due to the reasons stated above.

-Andi

Signature · 1 line
[email protected]
#9 lore raw
In reply to Andi Kleen
Quoted 23 lines · Andi Kleen

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

Quoted 7 lines

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

After merging into git please make scripts/config executable

When I try to run the script with no arguments nothing happens!?!

I will merge as is but please followup with a patch so it prints out usage in this situation.

Sam

author
#10 lore raw
Quoted 4 lines

When I try to run the script with no arguments nothing happens!?!

I will merge as is but please followup with a patch so it prints out usage in this situation.

Here's a patch

-Andi

---

Kbuild: print usage with no arguments in scripts/config

Requested by Sam.

---
 scripts/config |    4 ++++
 1 file changed, 4 insertions(+)
scripts/config +4 -0
Index: linux-2.6.28-kbuild/scripts/config
===================================================================
@@ -60,6 +60,10 @@
 	FN=.config
 fi
 
+if [ "$1" = "" ] ; then
+	usage
+fi
+
 while [ "$1" != "" ] ; do
 	CMD="$1"
 	shift
Signature · 1 line
[email protected]
#11 lore raw
Quoted 9 lines · Andi Kleen
Quoted 4 lines

When I try to run the script with no arguments nothing happens!?!

I will merge as is but please followup with a patch so it prints out usage in this situation.

Here's a patch

-Andi

Quoted 7 lines

---

Kbuild: print usage with no arguments in scripts/config

Requested by Sam.

Thanks,
added and pushes out to kbuild-fixes.git

Sam