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