#!/usr/bin/env bash # SPDX-License-Identifier: GPL-2.0 # Manipulate options in a .config file from the command line myname=${0##*/} # If no prefix forced, use the default CONFIG_ CONFIG_="${CONFIG_-CONFIG_}" # We use an uncommon delimiter for sed substitutions SED_DELIM=$(echo -en "\001") usage() { cat >&2 <>"$FN" fi } undef_var() { local name=$1 txt_delete "^($name=|# $name is not set)" "$FN" } SED_EDITED=0 on_exit() { if [ "$SED_EDITED" -ge 1 ]; then rm -f "$FN.swp" fi } trap on_exit EXIT FN=.config CMDS=() while [[ $# -gt 0 ]]; do if [ "$1" = "--file" ]; then if [ "$2" = "" ]; then usage fi FN="$2" shift 2 else CMDS+=("$1") shift fi done set -- "${CMDS[@]}" if [ "$1" = "" ] ; then usage fi MUNGE_CASE=yes while [ "$1" != "" ] ; do CMD="$1" shift case "$CMD" in --keep-case|-k) MUNGE_CASE=no continue ;; --refresh) ;; --*-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 "${CONFIG_}$ARG" "${CONFIG_}$ARG=y" ;; --disable|-d) set_var "${CONFIG_}$ARG" "# ${CONFIG_}$ARG is not set" ;; --module|-m) set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=m" ;; --set-str) # sed swallows one level of escaping, so we need double-escaping set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=\"${1//\"/\\\\\"}\"" shift ;; --set-val) set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=$1" shift ;; --undefine|-u) undef_var "${CONFIG_}$ARG" ;; --state|-s) if grep -q "# ${CONFIG_}$ARG is not set" $FN ; then echo n else V="$(grep "^${CONFIG_}$ARG=" $FN)" if [ $? != 0 ] ; then echo undef else V="${V/#${CONFIG_}$ARG=/}" V="${V/#\"/}" V="${V/%\"/}" V="${V//\\\"/\"}" echo "${V}" fi fi ;; --enable-after|-E) set_var "${CONFIG_}$B" "${CONFIG_}$B=y" "${CONFIG_}$A" ;; --disable-after|-D) set_var "${CONFIG_}$B" "# ${CONFIG_}$B is not set" "${CONFIG_}$A" ;; --module-after|-M) set_var "${CONFIG_}$B" "${CONFIG_}$B=m" "${CONFIG_}$A" ;; --refresh) yes "" | make oldconfig KCONFIG_CONFIG=$FN ;; *) echo "bad command: $CMD" >&2 usage ;; esac done