#!/bin/bash # Manipulate options in a .config file from the command line myname=${0##*/} # If no prefix forced, use the default BR2_ BR2_PREFIX="${BR2_PREFIX-BR2_}" usage() { cat >&2 <<EOL Manipulate options in a .config file from the command line. Usage: $myname options command ... commands: --enable|-e option Enable option --disable|-d option Disable option --set-str option string Set option to "string" --set-val option value Set option to value --undefine|-u option Undefine option --state|-s option Print state of option (n,y,m,undef) --enable-after|-E beforeopt option Enable option directly after other option --disable-after|-D beforeopt option Disable option directly after other option commands can be repeated multiple times options: --file config-file .config file to change (default .config) --keep-case|-k Keep next symbols' case (dont' upper-case it) --package|-p Operate on package (set prefix to BR2_PACKAGE_) $myname doesn't check the validity of the .config file. This is done at next make time. By default, $myname will upper-case the given symbol. Use --keep-case to keep the case of all following symbols unchanged. $myname uses 'BR2_' as the default symbol prefix. Set the environment variable BR2_PREFIX to the prefix to use. Eg.: BR2_PREFIX="FOO_" $myname ... EOL exit 1 } checkarg() { ARG="$1" if [ "$ARG" = "" ] ; then usage fi if [ "$MUNGE_CASE" = "yes" ] ; then ARG="`echo $ARG | tr a-z- A-Z_`" fi case "$ARG" in ${BR2_PREFIX}*) ARG="${ARG/${BR2_PREFIX}/}" ;; esac } txt_append() { local anchor="$1" local insert="$2" local infile="$3" local tmpfile="$infile.swp" # sed append cmd: 'a\' + newline + text + newline cmd="$(printf "a\\%b$insert" "\n")" sed -i -e "/$anchor/$cmd" "$infile" } txt_subst() { local before="$1" local after="$2" local infile="$3" local tmpfile="$infile.swp" sed -i -e "s:$before:$after:" "$infile" } txt_delete() { local text="$1" local infile="$2" local tmpfile="$infile.swp" sed -i -e "/$text/d" "$infile" } set_var() { local name=$1 new=$2 before=$3 name_re="^($name=|# $name is not set)" before_re="^($before=|# $before is not set)" if test -n "$before" && grep -Eq "$before_re" "$FN"; then txt_append "^$before=" "$new" "$FN" txt_append "^# $before is not set" "$new" "$FN" elif grep -Eq "$name_re" "$FN"; then txt_subst "^$name=.*" "$new" "$FN" txt_subst "^# $name is not set" "$new" "$FN" else echo "$new" >>"$FN" fi } undef_var() { local name=$1 txt_delete "^$name=" "$FN" txt_delete "^# $name is not set" "$FN" } if [ "$1" = "--file" ]; then FN="$2" if [ "$FN" = "" ] ; then usage fi shift 2 else FN=.config fi if [ "$1" = "" ] ; then usage fi MUNGE_CASE=yes while [ "$1" != "" ] ; do CMD="$1" shift case "$CMD" in --keep-case|-k) MUNGE_CASE=no continue ;; --package|-p) BR2_PREFIX="BR2_PACKAGE_" continue ;; --*-after|-E|-D|-M) checkarg "$1" A=$ARG checkarg "$2" B=$ARG shift 2 ;; -*) checkarg "$1" shift ;; esac case "$CMD" in --enable|-e) set_var "${BR2_PREFIX}$ARG" "${BR2_PREFIX}$ARG=y" ;; --disable|-d) set_var "${BR2_PREFIX}$ARG" "# ${BR2_PREFIX}$ARG is not set" ;; --set-str) # sed swallows one level of escaping, so we need double-escaping set_var "${BR2_PREFIX}$ARG" "${BR2_PREFIX}$ARG=\"${1//\"/\\\\\"}\"" shift ;; --set-val) set_var "${BR2_PREFIX}$ARG" "${BR2_PREFIX}$ARG=$1" shift ;; --undefine|-u) undef_var "${BR2_PREFIX}$ARG" ;; --state|-s) if grep -q "# ${BR2_PREFIX}$ARG is not set" $FN ; then echo n else V="$(grep "^${BR2_PREFIX}$ARG=" $FN)" if [ $? != 0 ] ; then echo undef else V="${V/#${BR2_PREFIX}$ARG=/}" V="${V/#\"/}" V="${V/%\"/}" V="${V//\\\"/\"}" echo "${V}" fi fi ;; --enable-after|-E) set_var "${BR2_PREFIX}$B" "${BR2_PREFIX}$B=y" "${BR2_PREFIX}$A" ;; --disable-after|-D) set_var "${BR2_PREFIX}$B" "# ${BR2_PREFIX}$B is not set" "${BR2_PREFIX}$A" ;; *) usage ;; esac done