mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 10:49:33 +00:00
![Andi Kleen](/assets/img/avatar_default.png)
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: Andi Kleen <ak@linux.intel.com> Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
150 lines
2.9 KiB
Bash
Executable file
150 lines
2.9 KiB
Bash
Executable file
#!/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
|
|
|