1#!/bin/bash 2# Manipulate options in a .config file from the command line 3 4usage() { 5 cat >&2 <<EOL 6Manipulate options in a .config file from the command line. 7Usage: 8config options command ... 9commands: 10 --enable|-e option Enable option 11 --disable|-d option Disable option 12 --module|-m option Turn option into a module 13 --set-str option value 14 Set option to "value" 15 --state|-s option Print state of option (n,y,m,undef) 16 17 --enable-after|-E beforeopt option 18 Enable option directly after other option 19 --disable-after|-D beforeopt option 20 Disable option directly after other option 21 --module-after|-M beforeopt option 22 Turn option into module directly after other option 23 24 commands can be repeated multiple times 25 26options: 27 --file .config file to change (default .config) 28 29config doesn't check the validity of the .config file. This is done at next 30 make time. 31EOL 32 exit 1 33} 34 35checkarg() { 36 ARG="$1" 37 if [ "$ARG" = "" ] ; then 38 usage 39 fi 40 case "$ARG" in 41 CONFIG_*) 42 ARG="${ARG/CONFIG_/}" 43 ;; 44 esac 45 ARG="`echo $ARG | tr a-z A-Z`" 46} 47 48set_var() { 49 local name=$1 new=$2 before=$3 50 51 name_re="^($name=|# $name is not set)" 52 before_re="^($before=|# $before is not set)" 53 if test -n "$before" && grep -Eq "$before_re" "$FN"; then 54 sed -ri "/$before_re/a $new" "$FN" 55 elif grep -Eq "$name_re" "$FN"; then 56 sed -ri "s:$name_re.*:$new:" "$FN" 57 else 58 echo "$new" >>"$FN" 59 fi 60} 61 62if [ "$1" = "--file" ]; then 63 FN="$2" 64 if [ "$FN" = "" ] ; then 65 usage 66 fi 67 shift 2 68else 69 FN=.config 70fi 71 72if [ "$1" = "" ] ; then 73 usage 74fi 75 76while [ "$1" != "" ] ; do 77 CMD="$1" 78 shift 79 case "$CMD" in 80 --refresh) 81 ;; 82 --*-after) 83 checkarg "$1" 84 A=$ARG 85 checkarg "$2" 86 B=$ARG 87 shift 2 88 ;; 89 --*) 90 checkarg "$1" 91 shift 92 ;; 93 esac 94 case "$CMD" in 95 --enable|-e) 96 set_var "CONFIG_$ARG" "CONFIG_$ARG=y" 97 ;; 98 99 --disable|-d) 100 set_var "CONFIG_$ARG" "# CONFIG_$ARG is not set" 101 ;; 102 103 --module|-m) 104 set_var "CONFIG_$ARG" "CONFIG_$ARG=m" 105 ;; 106 107 --set-str) 108 set_var "CONFIG_$ARG" "CONFIG_$ARG=\"$1\"" 109 shift 110 ;; 111 112 --state|-s) 113 if grep -q "# CONFIG_$ARG is not set" $FN ; then 114 echo n 115 else 116 V="$(grep "^CONFIG_$ARG=" $FN)" 117 if [ $? != 0 ] ; then 118 echo undef 119 else 120 V="${V/CONFIG_$ARG=/}" 121 V="${V/\"/}" 122 echo "$V" 123 fi 124 fi 125 ;; 126 127 --enable-after|-E) 128 set_var "CONFIG_$B" "CONFIG_$B=y" "CONFIG_$A" 129 ;; 130 131 --disable-after|-D) 132 set_var "CONFIG_$B" "# CONFIG_$B is not set" "CONFIG_$A" 133 ;; 134 135 --module-after|-M) 136 set_var "CONFIG_$B" "CONFIG_$B=m" "CONFIG_$A" 137 ;; 138 139 # undocumented because it ignores --file (fixme) 140 --refresh) 141 yes "" | make oldconfig 142 ;; 143 144 *) 145 usage 146 ;; 147 esac 148done 149 150