KBUILD: Add script to manipulate .config files on the command line
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
@@ -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 +
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
@@ -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
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 theMakefileformat changes occasionally and breaks my scripts then.To make this more reliable add a "source" symlink back.
Signed-off-by Andi Kleen <[email protected]>
Like we do when we install modules. Agreed this is usefull. Applied.
Sam
PATCH 3/3 KBUILD: Add a "bin" symlink for the scripts directory too
In reply to Andi KleenSeveral 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
@@ -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
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
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]
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
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
Kconfigmachinery and doesn't do any checking againstKconfigfiles, 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 <><
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/configThis looks very useful, thanks for sharing.
Quoted 7 lines
Quoted 3 lines
The script is not integrated with the normal
Kconfigmachinery and doesn't do any checking againstKconfigfiles, 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]
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/configThe script is not integrated with the normal
Kconfigmachinery and doesn't do any checking againstKconfigfiles, 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 optionCONFIG_SMPAfter merging into git please make
scripts/configexecutableSigned-off-by Andi Kleen <[email protected]>
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
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
@@ -60,6 +60,10 @@ FN=.config fi +if [ "$1" = "" ] ; then + usage +fi + while [ "$1" != "" ] ; do CMD="$1" shift
Signature · 1 line
[email protected]
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 inscripts/configRequested by Sam.
Signed-off-by Andi Kleen <[email protected]>
Thanks,
added and pushes out to kbuild-fixes.git
Sam