18e54701eSAndi Kleen#!/bin/bash 28e54701eSAndi Kleen# Manipulate options in a .config file from the command line 38e54701eSAndi Kleen 4f5ef2f7bSYann E. MORIN# If no prefix forced, use the default CONFIG_ 5f5ef2f7bSYann E. MORINCONFIG_="${CONFIG_-CONFIG_}" 6f5ef2f7bSYann E. MORIN 78e54701eSAndi Kleenusage() { 88e54701eSAndi Kleen cat >&2 <<EOL 98e54701eSAndi KleenManipulate options in a .config file from the command line. 108e54701eSAndi KleenUsage: 118e54701eSAndi Kleenconfig options command ... 128e54701eSAndi Kleencommands: 138e54701eSAndi Kleen --enable|-e option Enable option 148e54701eSAndi Kleen --disable|-d option Disable option 158e54701eSAndi Kleen --module|-m option Turn option into a module 16f0a6332cSJonas Aaberg --set-str option string 17f0a6332cSJonas Aaberg Set option to "string" 18f0a6332cSJonas Aaberg --set-val option value 19f0a6332cSJonas Aaberg Set option to value 208e54701eSAndi Kleen --state|-s option Print state of option (n,y,m,undef) 218e54701eSAndi Kleen 228e54701eSAndi Kleen --enable-after|-E beforeopt option 238e54701eSAndi Kleen Enable option directly after other option 248e54701eSAndi Kleen --disable-after|-D beforeopt option 258e54701eSAndi Kleen Disable option directly after other option 268e54701eSAndi Kleen --module-after|-M beforeopt option 278e54701eSAndi Kleen Turn option into module directly after other option 288e54701eSAndi Kleen 298e54701eSAndi Kleen commands can be repeated multiple times 308e54701eSAndi Kleen 318e54701eSAndi Kleenoptions: 324edc7e32SYann E. MORIN --file config-file .config file to change (default .config) 334edc7e32SYann E. MORIN --keep-case|-k Keep next symbols' case (dont' upper-case it) 348e54701eSAndi Kleen 358e54701eSAndi Kleenconfig doesn't check the validity of the .config file. This is done at next 368e54701eSAndi Kleenmake time. 374edc7e32SYann E. MORIN 384edc7e32SYann E. MORINBy default, config will upper-case the given symbol. Use --keep-case to keep 394edc7e32SYann E. MORINthe case of all following symbols unchanged. 40f5ef2f7bSYann E. MORIN 41f5ef2f7bSYann E. MORINconfig uses 'CONFIG_' as the default symbol prefix. Set the environment 42f5ef2f7bSYann E. MORINvariable CONFIG_ to the prefix to use. Eg.: CONFIG_="FOO_" config ... 438e54701eSAndi KleenEOL 448e54701eSAndi Kleen exit 1 458e54701eSAndi Kleen} 468e54701eSAndi Kleen 478e54701eSAndi Kleencheckarg() { 488e54701eSAndi Kleen ARG="$1" 498e54701eSAndi Kleen if [ "$ARG" = "" ] ; then 508e54701eSAndi Kleen usage 518e54701eSAndi Kleen fi 528e54701eSAndi Kleen case "$ARG" in 53f5ef2f7bSYann E. MORIN ${CONFIG_}*) 54f5ef2f7bSYann E. MORIN ARG="${ARG/${CONFIG_}/}" 558e54701eSAndi Kleen ;; 568e54701eSAndi Kleen esac 574edc7e32SYann E. MORIN if [ "$MUNGE_CASE" = "yes" ] ; then 588e54701eSAndi Kleen ARG="`echo $ARG | tr a-z A-Z`" 594edc7e32SYann E. MORIN fi 608e54701eSAndi Kleen} 618e54701eSAndi Kleen 6256643222SMichal Marekset_var() { 6356643222SMichal Marek local name=$1 new=$2 before=$3 6456643222SMichal Marek 6556643222SMichal Marek name_re="^($name=|# $name is not set)" 6656643222SMichal Marek before_re="^($before=|# $before is not set)" 6756643222SMichal Marek if test -n "$before" && grep -Eq "$before_re" "$FN"; then 6856643222SMichal Marek sed -ri "/$before_re/a $new" "$FN" 6956643222SMichal Marek elif grep -Eq "$name_re" "$FN"; then 7056643222SMichal Marek sed -ri "s:$name_re.*:$new:" "$FN" 7156643222SMichal Marek else 7256643222SMichal Marek echo "$new" >>"$FN" 7356643222SMichal Marek fi 748e54701eSAndi Kleen} 758e54701eSAndi Kleen 768e54701eSAndi Kleenif [ "$1" = "--file" ]; then 778e54701eSAndi Kleen FN="$2" 788e54701eSAndi Kleen if [ "$FN" = "" ] ; then 798e54701eSAndi Kleen usage 808e54701eSAndi Kleen fi 8147312d2cSMichal Marek shift 2 828e54701eSAndi Kleenelse 838e54701eSAndi Kleen FN=.config 848e54701eSAndi Kleenfi 858e54701eSAndi Kleen 862302e873SAndi Kleenif [ "$1" = "" ] ; then 872302e873SAndi Kleen usage 882302e873SAndi Kleenfi 892302e873SAndi Kleen 904edc7e32SYann E. MORINMUNGE_CASE=yes 918e54701eSAndi Kleenwhile [ "$1" != "" ] ; do 928e54701eSAndi Kleen CMD="$1" 938e54701eSAndi Kleen shift 948e54701eSAndi Kleen case "$CMD" in 954edc7e32SYann E. MORIN --keep-case|-k) 964edc7e32SYann E. MORIN MUNGE_CASE=no 974edc7e32SYann E. MORIN shift 984edc7e32SYann E. MORIN continue 994edc7e32SYann E. MORIN ;; 10047312d2cSMichal Marek --refresh) 10147312d2cSMichal Marek ;; 10247312d2cSMichal Marek --*-after) 1038e54701eSAndi Kleen checkarg "$1" 10447312d2cSMichal Marek A=$ARG 10547312d2cSMichal Marek checkarg "$2" 10647312d2cSMichal Marek B=$ARG 10747312d2cSMichal Marek shift 2 10847312d2cSMichal Marek ;; 10945f53cc9SAndi Kleen -*) 11047312d2cSMichal Marek checkarg "$1" 1118e54701eSAndi Kleen shift 1128e54701eSAndi Kleen ;; 11347312d2cSMichal Marek esac 11447312d2cSMichal Marek case "$CMD" in 11547312d2cSMichal Marek --enable|-e) 116f5ef2f7bSYann E. MORIN set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=y" 11747312d2cSMichal Marek ;; 1188e54701eSAndi Kleen 1198e54701eSAndi Kleen --disable|-d) 120f5ef2f7bSYann E. MORIN set_var "${CONFIG_}$ARG" "# ${CONFIG_}$ARG is not set" 1218e54701eSAndi Kleen ;; 1228e54701eSAndi Kleen 1238e54701eSAndi Kleen --module|-m) 124f5ef2f7bSYann E. MORIN set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=m" 1258e54701eSAndi Kleen ;; 1268e54701eSAndi Kleen 1271f990cf9SMichal Marek --set-str) 128d6686da8SYann E. MORIN # sed swallows one level of escaping, so we need double-escaping 129f5ef2f7bSYann E. MORIN set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=\"${1//\"/\\\\\"}\"" 1301f990cf9SMichal Marek shift 1311f990cf9SMichal Marek ;; 1321f990cf9SMichal Marek 133f0a6332cSJonas Aaberg --set-val) 134f5ef2f7bSYann E. MORIN set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=$1" 135f0a6332cSJonas Aaberg shift 136f0a6332cSJonas Aaberg ;; 137f0a6332cSJonas Aaberg 1388e54701eSAndi Kleen --state|-s) 139f5ef2f7bSYann E. MORIN if grep -q "# ${CONFIG_}$ARG is not set" $FN ; then 1408e54701eSAndi Kleen echo n 1418e54701eSAndi Kleen else 142f5ef2f7bSYann E. MORIN V="$(grep "^${CONFIG_}$ARG=" $FN)" 1438e54701eSAndi Kleen if [ $? != 0 ] ; then 1448e54701eSAndi Kleen echo undef 1458e54701eSAndi Kleen else 146f5ef2f7bSYann E. MORIN V="${V/#${CONFIG_}$ARG=/}" 147d6686da8SYann E. MORIN V="${V/#\"/}" 148d6686da8SYann E. MORIN V="${V/%\"/}" 149d6686da8SYann E. MORIN V="${V/\\\"/\"}" 150d6686da8SYann E. MORIN echo "${V}" 1518e54701eSAndi Kleen fi 1528e54701eSAndi Kleen fi 1538e54701eSAndi Kleen ;; 1548e54701eSAndi Kleen 1558e54701eSAndi Kleen --enable-after|-E) 156f5ef2f7bSYann E. MORIN set_var "${CONFIG_}$B" "${CONFIG_}$B=y" "${CONFIG_}$A" 1578e54701eSAndi Kleen ;; 1588e54701eSAndi Kleen 1598e54701eSAndi Kleen --disable-after|-D) 160f5ef2f7bSYann E. MORIN set_var "${CONFIG_}$B" "# ${CONFIG_}$B is not set" "${CONFIG_}$A" 1618e54701eSAndi Kleen ;; 1628e54701eSAndi Kleen 1638e54701eSAndi Kleen --module-after|-M) 164f5ef2f7bSYann E. MORIN set_var "${CONFIG_}$B" "${CONFIG_}$B=m" "${CONFIG_}$A" 1658e54701eSAndi Kleen ;; 1668e54701eSAndi Kleen 1678e54701eSAndi Kleen # undocumented because it ignores --file (fixme) 1688e54701eSAndi Kleen --refresh) 1698e54701eSAndi Kleen yes "" | make oldconfig 1708e54701eSAndi Kleen ;; 1718e54701eSAndi Kleen 1728e54701eSAndi Kleen *) 1738e54701eSAndi Kleen usage 1748e54701eSAndi Kleen ;; 1758e54701eSAndi Kleen esac 1768e54701eSAndi Kleendone 1778e54701eSAndi Kleen 178