18e54701eSAndi Kleen#!/bin/bash 28e54701eSAndi Kleen# Manipulate options in a .config file from the command line 38e54701eSAndi Kleen 48e54701eSAndi Kleenusage() { 58e54701eSAndi Kleen cat >&2 <<EOL 68e54701eSAndi KleenManipulate options in a .config file from the command line. 78e54701eSAndi KleenUsage: 88e54701eSAndi Kleenconfig options command ... 98e54701eSAndi Kleencommands: 108e54701eSAndi Kleen --enable|-e option Enable option 118e54701eSAndi Kleen --disable|-d option Disable option 128e54701eSAndi Kleen --module|-m option Turn option into a module 13f0a6332cSJonas Aaberg --set-str option string 14f0a6332cSJonas Aaberg Set option to "string" 15f0a6332cSJonas Aaberg --set-val option value 16f0a6332cSJonas Aaberg Set option to value 178e54701eSAndi Kleen --state|-s option Print state of option (n,y,m,undef) 188e54701eSAndi Kleen 198e54701eSAndi Kleen --enable-after|-E beforeopt option 208e54701eSAndi Kleen Enable option directly after other option 218e54701eSAndi Kleen --disable-after|-D beforeopt option 228e54701eSAndi Kleen Disable option directly after other option 238e54701eSAndi Kleen --module-after|-M beforeopt option 248e54701eSAndi Kleen Turn option into module directly after other option 258e54701eSAndi Kleen 268e54701eSAndi Kleen commands can be repeated multiple times 278e54701eSAndi Kleen 288e54701eSAndi Kleenoptions: 29*4edc7e32SYann E. MORIN --file config-file .config file to change (default .config) 30*4edc7e32SYann E. MORIN --keep-case|-k Keep next symbols' case (dont' upper-case it) 318e54701eSAndi Kleen 328e54701eSAndi Kleenconfig doesn't check the validity of the .config file. This is done at next 338e54701eSAndi Kleenmake time. 34*4edc7e32SYann E. MORIN 35*4edc7e32SYann E. MORINBy default, config will upper-case the given symbol. Use --keep-case to keep 36*4edc7e32SYann E. MORINthe case of all following symbols unchanged. 378e54701eSAndi KleenEOL 388e54701eSAndi Kleen exit 1 398e54701eSAndi Kleen} 408e54701eSAndi Kleen 418e54701eSAndi Kleencheckarg() { 428e54701eSAndi Kleen ARG="$1" 438e54701eSAndi Kleen if [ "$ARG" = "" ] ; then 448e54701eSAndi Kleen usage 458e54701eSAndi Kleen fi 468e54701eSAndi Kleen case "$ARG" in 478e54701eSAndi Kleen CONFIG_*) 488e54701eSAndi Kleen ARG="${ARG/CONFIG_/}" 498e54701eSAndi Kleen ;; 508e54701eSAndi Kleen esac 51*4edc7e32SYann E. MORIN if [ "$MUNGE_CASE" = "yes" ] ; then 528e54701eSAndi Kleen ARG="`echo $ARG | tr a-z A-Z`" 53*4edc7e32SYann E. MORIN fi 548e54701eSAndi Kleen} 558e54701eSAndi Kleen 5656643222SMichal Marekset_var() { 5756643222SMichal Marek local name=$1 new=$2 before=$3 5856643222SMichal Marek 5956643222SMichal Marek name_re="^($name=|# $name is not set)" 6056643222SMichal Marek before_re="^($before=|# $before is not set)" 6156643222SMichal Marek if test -n "$before" && grep -Eq "$before_re" "$FN"; then 6256643222SMichal Marek sed -ri "/$before_re/a $new" "$FN" 6356643222SMichal Marek elif grep -Eq "$name_re" "$FN"; then 6456643222SMichal Marek sed -ri "s:$name_re.*:$new:" "$FN" 6556643222SMichal Marek else 6656643222SMichal Marek echo "$new" >>"$FN" 6756643222SMichal Marek fi 688e54701eSAndi Kleen} 698e54701eSAndi Kleen 708e54701eSAndi Kleenif [ "$1" = "--file" ]; then 718e54701eSAndi Kleen FN="$2" 728e54701eSAndi Kleen if [ "$FN" = "" ] ; then 738e54701eSAndi Kleen usage 748e54701eSAndi Kleen fi 7547312d2cSMichal Marek shift 2 768e54701eSAndi Kleenelse 778e54701eSAndi Kleen FN=.config 788e54701eSAndi Kleenfi 798e54701eSAndi Kleen 802302e873SAndi Kleenif [ "$1" = "" ] ; then 812302e873SAndi Kleen usage 822302e873SAndi Kleenfi 832302e873SAndi Kleen 84*4edc7e32SYann E. MORINMUNGE_CASE=yes 858e54701eSAndi Kleenwhile [ "$1" != "" ] ; do 868e54701eSAndi Kleen CMD="$1" 878e54701eSAndi Kleen shift 888e54701eSAndi Kleen case "$CMD" in 89*4edc7e32SYann E. MORIN --keep-case|-k) 90*4edc7e32SYann E. MORIN MUNGE_CASE=no 91*4edc7e32SYann E. MORIN shift 92*4edc7e32SYann E. MORIN continue 93*4edc7e32SYann E. MORIN ;; 9447312d2cSMichal Marek --refresh) 9547312d2cSMichal Marek ;; 9647312d2cSMichal Marek --*-after) 978e54701eSAndi Kleen checkarg "$1" 9847312d2cSMichal Marek A=$ARG 9947312d2cSMichal Marek checkarg "$2" 10047312d2cSMichal Marek B=$ARG 10147312d2cSMichal Marek shift 2 10247312d2cSMichal Marek ;; 10345f53cc9SAndi Kleen -*) 10447312d2cSMichal Marek checkarg "$1" 1058e54701eSAndi Kleen shift 1068e54701eSAndi Kleen ;; 10747312d2cSMichal Marek esac 10847312d2cSMichal Marek case "$CMD" in 10947312d2cSMichal Marek --enable|-e) 11047312d2cSMichal Marek set_var "CONFIG_$ARG" "CONFIG_$ARG=y" 11147312d2cSMichal Marek ;; 1128e54701eSAndi Kleen 1138e54701eSAndi Kleen --disable|-d) 11456643222SMichal Marek set_var "CONFIG_$ARG" "# CONFIG_$ARG is not set" 1158e54701eSAndi Kleen ;; 1168e54701eSAndi Kleen 1178e54701eSAndi Kleen --module|-m) 11856643222SMichal Marek set_var "CONFIG_$ARG" "CONFIG_$ARG=m" 1198e54701eSAndi Kleen ;; 1208e54701eSAndi Kleen 1211f990cf9SMichal Marek --set-str) 122d6686da8SYann E. MORIN # sed swallows one level of escaping, so we need double-escaping 123d6686da8SYann E. MORIN set_var "CONFIG_$ARG" "CONFIG_$ARG=\"${1//\"/\\\\\"}\"" 1241f990cf9SMichal Marek shift 1251f990cf9SMichal Marek ;; 1261f990cf9SMichal Marek 127f0a6332cSJonas Aaberg --set-val) 128f0a6332cSJonas Aaberg set_var "CONFIG_$ARG" "CONFIG_$ARG=$1" 129f0a6332cSJonas Aaberg shift 130f0a6332cSJonas Aaberg ;; 131f0a6332cSJonas Aaberg 1328e54701eSAndi Kleen --state|-s) 1338e54701eSAndi Kleen if grep -q "# CONFIG_$ARG is not set" $FN ; then 1348e54701eSAndi Kleen echo n 1358e54701eSAndi Kleen else 1368e54701eSAndi Kleen V="$(grep "^CONFIG_$ARG=" $FN)" 1378e54701eSAndi Kleen if [ $? != 0 ] ; then 1388e54701eSAndi Kleen echo undef 1398e54701eSAndi Kleen else 140d6686da8SYann E. MORIN V="${V/#CONFIG_$ARG=/}" 141d6686da8SYann E. MORIN V="${V/#\"/}" 142d6686da8SYann E. MORIN V="${V/%\"/}" 143d6686da8SYann E. MORIN V="${V/\\\"/\"}" 144d6686da8SYann E. MORIN echo "${V}" 1458e54701eSAndi Kleen fi 1468e54701eSAndi Kleen fi 1478e54701eSAndi Kleen ;; 1488e54701eSAndi Kleen 1498e54701eSAndi Kleen --enable-after|-E) 15056643222SMichal Marek set_var "CONFIG_$B" "CONFIG_$B=y" "CONFIG_$A" 1518e54701eSAndi Kleen ;; 1528e54701eSAndi Kleen 1538e54701eSAndi Kleen --disable-after|-D) 15456643222SMichal Marek set_var "CONFIG_$B" "# CONFIG_$B is not set" "CONFIG_$A" 1558e54701eSAndi Kleen ;; 1568e54701eSAndi Kleen 1578e54701eSAndi Kleen --module-after|-M) 15856643222SMichal Marek set_var "CONFIG_$B" "CONFIG_$B=m" "CONFIG_$A" 1598e54701eSAndi Kleen ;; 1608e54701eSAndi Kleen 1618e54701eSAndi Kleen # undocumented because it ignores --file (fixme) 1628e54701eSAndi Kleen --refresh) 1638e54701eSAndi Kleen yes "" | make oldconfig 1648e54701eSAndi Kleen ;; 1658e54701eSAndi Kleen 1668e54701eSAndi Kleen *) 1678e54701eSAndi Kleen usage 1688e54701eSAndi Kleen ;; 1698e54701eSAndi Kleen esac 1708e54701eSAndi Kleendone 1718e54701eSAndi Kleen 172