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 # sed swallows one level of escaping, so we need double-escaping 111 set_var "CONFIG_$ARG" "CONFIG_$ARG=\"${1//\"/\\\\\"}\"" 112 shift 113 ;; 114 115 --set-val) 116 set_var "CONFIG_$ARG" "CONFIG_$ARG=$1" 117 shift 118 ;; 119 120 --state|-s) 121 if grep -q "# CONFIG_$ARG is not set" $FN ; then 122 echo n 123 else 124 V="$(grep "^CONFIG_$ARG=" $FN)" 125 if [ $? != 0 ] ; then 126 echo undef 127 else 128 V="${V/#CONFIG_$ARG=/}" 129 V="${V/#\"/}" 130 V="${V/%\"/}" 131 V="${V/\\\"/\"}" 132 echo "${V}" 133 fi 134 fi 135 ;; 136 137 --enable-after|-E) 138 set_var "CONFIG_$B" "CONFIG_$B=y" "CONFIG_$A" 139 ;; 140 141 --disable-after|-D) 142 set_var "CONFIG_$B" "# CONFIG_$B is not set" "CONFIG_$A" 143 ;; 144 145 --module-after|-M) 146 set_var "CONFIG_$B" "CONFIG_$B=m" "CONFIG_$A" 147 ;; 148 149 # undocumented because it ignores --file (fixme) 150 --refresh) 151 yes "" | make oldconfig 152 ;; 153 154 *) 155 usage 156 ;; 157 esac 158done 159 160