1#!/bin/bash 2# Manipulate options in a .config file from the command line 3 4myname=${0##*/} 5 6# If no prefix forced, use the default BR2_ 7BR2_PREFIX="${BR2_PREFIX-BR2_}" 8 9usage() { 10 cat >&2 <<EOL 11Manipulate options in a .config file from the command line. 12Usage: 13$myname options command ... 14commands: 15 --enable|-e option Enable option 16 --disable|-d option Disable option 17 --set-str option string 18 Set option to "string" 19 --set-val option value 20 Set option to value 21 --undefine|-u option Undefine option 22 --state|-s option Print state of option (n,y,m,undef) 23 24 --enable-after|-E beforeopt option 25 Enable option directly after other option 26 --disable-after|-D beforeopt option 27 Disable option directly after other option 28 29 commands can be repeated multiple times 30 31options: 32 --file config-file .config file to change (default .config) 33 --keep-case|-k Keep next symbols' case (dont' upper-case it) 34 --package|-p Operate on package (set prefix to BR2_PACKAGE_) 35 36$myname doesn't check the validity of the .config file. This is done at next 37make time. 38 39By default, $myname will upper-case the given symbol. Use --keep-case to keep 40the case of all following symbols unchanged. 41 42$myname uses 'BR2_' as the default symbol prefix. Set the environment 43variable BR2_PREFIX to the prefix to use. Eg.: BR2_PREFIX="FOO_" $myname ... 44EOL 45 exit 1 46} 47 48checkarg() { 49 ARG="$1" 50 if [ "$ARG" = "" ] ; then 51 usage 52 fi 53 if [ "$MUNGE_CASE" = "yes" ] ; then 54 ARG="$(echo "$ARG" | tr a-z- A-Z_)" 55 fi 56 case "$ARG" in 57 ${BR2_PREFIX}*) 58 ARG="${ARG/${BR2_PREFIX}/}" 59 ;; 60 esac 61} 62 63txt_append() { 64 local anchor="$1" 65 local insert="$2" 66 local infile="$3" 67 68 # sed append cmd: 'a\' + newline + text + newline 69 cmd="$(printf "a\\%b$insert" "\n")" 70 71 sed -i -e "/$anchor/$cmd" "$infile" 72} 73 74txt_subst() { 75 local before="$1" 76 local after="$2" 77 local infile="$3" 78 79 sed -i -e "s:$before:$after:" "$infile" 80} 81 82txt_delete() { 83 local text="$1" 84 local infile="$2" 85 86 sed -i -e "/$text/d" "$infile" 87} 88 89set_var() { 90 local name=$1 new=$2 before=$3 91 92 name_re="^($name=|# $name is not set)" 93 before_re="^($before=|# $before is not set)" 94 if test -n "$before" && grep -Eq "$before_re" "$FN"; then 95 txt_append "^$before=" "$new" "$FN" 96 txt_append "^# $before is not set" "$new" "$FN" 97 elif grep -Eq "$name_re" "$FN"; then 98 txt_subst "^$name=.*" "$new" "$FN" 99 txt_subst "^# $name is not set" "$new" "$FN" 100 else 101 echo "$new" >>"$FN" 102 fi 103} 104 105undef_var() { 106 local name=$1 107 108 txt_delete "^$name=" "$FN" 109 txt_delete "^# $name is not set" "$FN" 110} 111 112if [ "$1" = "--file" ]; then 113 FN="$2" 114 if [ "$FN" = "" ] ; then 115 usage 116 fi 117 shift 2 118else 119 FN=.config 120fi 121 122if [ "$1" = "" ] ; then 123 usage 124fi 125 126MUNGE_CASE=yes 127while [ "$1" != "" ] ; do 128 CMD="$1" 129 shift 130 case "$CMD" in 131 --keep-case|-k) 132 MUNGE_CASE=no 133 continue 134 ;; 135 --package|-p) 136 BR2_PREFIX="BR2_PACKAGE_" 137 continue 138 ;; 139 --*-after|-E|-D|-M) 140 checkarg "$1" 141 A=$ARG 142 checkarg "$2" 143 B=$ARG 144 shift 2 145 ;; 146 -*) 147 checkarg "$1" 148 shift 149 ;; 150 esac 151 case "$CMD" in 152 --enable|-e) 153 set_var "${BR2_PREFIX}$ARG" "${BR2_PREFIX}$ARG=y" 154 ;; 155 156 --disable|-d) 157 set_var "${BR2_PREFIX}$ARG" "# ${BR2_PREFIX}$ARG is not set" 158 ;; 159 160 --set-str) 161 # sed swallows one level of escaping, so we need double-escaping 162 set_var "${BR2_PREFIX}$ARG" "${BR2_PREFIX}$ARG=\"${1//\"/\\\\\"}\"" 163 shift 164 ;; 165 166 --set-val) 167 set_var "${BR2_PREFIX}$ARG" "${BR2_PREFIX}$ARG=$1" 168 shift 169 ;; 170 --undefine|-u) 171 undef_var "${BR2_PREFIX}$ARG" 172 ;; 173 174 --state|-s) 175 if grep -q "# ${BR2_PREFIX}$ARG is not set" $FN ; then 176 echo n 177 else 178 if V="$(grep "^${BR2_PREFIX}$ARG=" $FN)"; then 179 V="${V/#${BR2_PREFIX}$ARG=/}" 180 V="${V/#\"/}" 181 V="${V/%\"/}" 182 V="${V//\\\"/\"}" 183 echo "${V}" 184 else 185 echo undef 186 fi 187 fi 188 ;; 189 190 --enable-after|-E) 191 set_var "${BR2_PREFIX}$B" "${BR2_PREFIX}$B=y" "${BR2_PREFIX}$A" 192 ;; 193 194 --disable-after|-D) 195 set_var "${BR2_PREFIX}$B" "# ${BR2_PREFIX}$B is not set" "${BR2_PREFIX}$A" 196 ;; 197 198 *) 199 usage 200 ;; 201 esac 202done 203