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: 298e54701eSAndi Kleen --file .config file to change (default .config) 308e54701eSAndi Kleen 318e54701eSAndi Kleenconfig doesn't check the validity of the .config file. This is done at next 328e54701eSAndi Kleen make time. 338e54701eSAndi KleenEOL 348e54701eSAndi Kleen exit 1 358e54701eSAndi Kleen} 368e54701eSAndi Kleen 378e54701eSAndi Kleencheckarg() { 388e54701eSAndi Kleen ARG="$1" 398e54701eSAndi Kleen if [ "$ARG" = "" ] ; then 408e54701eSAndi Kleen usage 418e54701eSAndi Kleen fi 428e54701eSAndi Kleen case "$ARG" in 438e54701eSAndi Kleen CONFIG_*) 448e54701eSAndi Kleen ARG="${ARG/CONFIG_/}" 458e54701eSAndi Kleen ;; 468e54701eSAndi Kleen esac 478e54701eSAndi Kleen ARG="`echo $ARG | tr a-z A-Z`" 488e54701eSAndi Kleen} 498e54701eSAndi Kleen 5056643222SMichal Marekset_var() { 5156643222SMichal Marek local name=$1 new=$2 before=$3 5256643222SMichal Marek 5356643222SMichal Marek name_re="^($name=|# $name is not set)" 5456643222SMichal Marek before_re="^($before=|# $before is not set)" 5556643222SMichal Marek if test -n "$before" && grep -Eq "$before_re" "$FN"; then 5656643222SMichal Marek sed -ri "/$before_re/a $new" "$FN" 5756643222SMichal Marek elif grep -Eq "$name_re" "$FN"; then 5856643222SMichal Marek sed -ri "s:$name_re.*:$new:" "$FN" 5956643222SMichal Marek else 6056643222SMichal Marek echo "$new" >>"$FN" 6156643222SMichal Marek fi 628e54701eSAndi Kleen} 638e54701eSAndi Kleen 648e54701eSAndi Kleenif [ "$1" = "--file" ]; then 658e54701eSAndi Kleen FN="$2" 668e54701eSAndi Kleen if [ "$FN" = "" ] ; then 678e54701eSAndi Kleen usage 688e54701eSAndi Kleen fi 6947312d2cSMichal Marek shift 2 708e54701eSAndi Kleenelse 718e54701eSAndi Kleen FN=.config 728e54701eSAndi Kleenfi 738e54701eSAndi Kleen 742302e873SAndi Kleenif [ "$1" = "" ] ; then 752302e873SAndi Kleen usage 762302e873SAndi Kleenfi 772302e873SAndi Kleen 788e54701eSAndi Kleenwhile [ "$1" != "" ] ; do 798e54701eSAndi Kleen CMD="$1" 808e54701eSAndi Kleen shift 818e54701eSAndi Kleen case "$CMD" in 8247312d2cSMichal Marek --refresh) 8347312d2cSMichal Marek ;; 8447312d2cSMichal Marek --*-after) 858e54701eSAndi Kleen checkarg "$1" 8647312d2cSMichal Marek A=$ARG 8747312d2cSMichal Marek checkarg "$2" 8847312d2cSMichal Marek B=$ARG 8947312d2cSMichal Marek shift 2 9047312d2cSMichal Marek ;; 9145f53cc9SAndi Kleen -*) 9247312d2cSMichal Marek checkarg "$1" 938e54701eSAndi Kleen shift 948e54701eSAndi Kleen ;; 9547312d2cSMichal Marek esac 9647312d2cSMichal Marek case "$CMD" in 9747312d2cSMichal Marek --enable|-e) 9847312d2cSMichal Marek set_var "CONFIG_$ARG" "CONFIG_$ARG=y" 9947312d2cSMichal Marek ;; 1008e54701eSAndi Kleen 1018e54701eSAndi Kleen --disable|-d) 10256643222SMichal Marek set_var "CONFIG_$ARG" "# CONFIG_$ARG is not set" 1038e54701eSAndi Kleen ;; 1048e54701eSAndi Kleen 1058e54701eSAndi Kleen --module|-m) 10656643222SMichal Marek set_var "CONFIG_$ARG" "CONFIG_$ARG=m" 1078e54701eSAndi Kleen ;; 1088e54701eSAndi Kleen 1091f990cf9SMichal Marek --set-str) 110*d6686da8SYann E. MORIN # sed swallows one level of escaping, so we need double-escaping 111*d6686da8SYann E. MORIN set_var "CONFIG_$ARG" "CONFIG_$ARG=\"${1//\"/\\\\\"}\"" 1121f990cf9SMichal Marek shift 1131f990cf9SMichal Marek ;; 1141f990cf9SMichal Marek 115f0a6332cSJonas Aaberg --set-val) 116f0a6332cSJonas Aaberg set_var "CONFIG_$ARG" "CONFIG_$ARG=$1" 117f0a6332cSJonas Aaberg shift 118f0a6332cSJonas Aaberg ;; 119f0a6332cSJonas Aaberg 1208e54701eSAndi Kleen --state|-s) 1218e54701eSAndi Kleen if grep -q "# CONFIG_$ARG is not set" $FN ; then 1228e54701eSAndi Kleen echo n 1238e54701eSAndi Kleen else 1248e54701eSAndi Kleen V="$(grep "^CONFIG_$ARG=" $FN)" 1258e54701eSAndi Kleen if [ $? != 0 ] ; then 1268e54701eSAndi Kleen echo undef 1278e54701eSAndi Kleen else 128*d6686da8SYann E. MORIN V="${V/#CONFIG_$ARG=/}" 129*d6686da8SYann E. MORIN V="${V/#\"/}" 130*d6686da8SYann E. MORIN V="${V/%\"/}" 131*d6686da8SYann E. MORIN V="${V/\\\"/\"}" 132*d6686da8SYann E. MORIN echo "${V}" 1338e54701eSAndi Kleen fi 1348e54701eSAndi Kleen fi 1358e54701eSAndi Kleen ;; 1368e54701eSAndi Kleen 1378e54701eSAndi Kleen --enable-after|-E) 13856643222SMichal Marek set_var "CONFIG_$B" "CONFIG_$B=y" "CONFIG_$A" 1398e54701eSAndi Kleen ;; 1408e54701eSAndi Kleen 1418e54701eSAndi Kleen --disable-after|-D) 14256643222SMichal Marek set_var "CONFIG_$B" "# CONFIG_$B is not set" "CONFIG_$A" 1438e54701eSAndi Kleen ;; 1448e54701eSAndi Kleen 1458e54701eSAndi Kleen --module-after|-M) 14656643222SMichal Marek set_var "CONFIG_$B" "CONFIG_$B=m" "CONFIG_$A" 1478e54701eSAndi Kleen ;; 1488e54701eSAndi Kleen 1498e54701eSAndi Kleen # undocumented because it ignores --file (fixme) 1508e54701eSAndi Kleen --refresh) 1518e54701eSAndi Kleen yes "" | make oldconfig 1528e54701eSAndi Kleen ;; 1538e54701eSAndi Kleen 1548e54701eSAndi Kleen *) 1558e54701eSAndi Kleen usage 1568e54701eSAndi Kleen ;; 1578e54701eSAndi Kleen esac 1588e54701eSAndi Kleendone 1598e54701eSAndi Kleen 160