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