| #!/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 |
| |