| #!/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 | |
| if [ "$1" = "" ] ; then | |
| usage | |
| 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 | |