config 3.2 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11
#!/bin/bash
# Manipulate options in a .config file from the command line

usage() {
	cat >&2 <<EOL
Manipulate options in a .config file from the command line.
Usage:
config options command ...
commands:
	--enable|-e option   Enable option
	--disable|-d option  Disable option
12
	--module|-m option   Turn option into a module
13 14 15 16
	--set-str option string
	                     Set option to "string"
	--set-val option value
	                     Set option to value
17
	--state|-s option    Print state of option (n,y,m,undef)
18 19 20 21 22 23 24 25 26 27 28

	--enable-after|-E beforeopt option
                             Enable option directly after other option
	--disable-after|-D beforeopt option
                             Disable option directly after other option
	--module-after|-M beforeopt option
                             Turn option into module directly after other option

	commands can be repeated multiple times

options:
29 30
	--file config-file   .config file to change (default .config)
	--keep-case|-k       Keep next symbols' case (dont' upper-case it)
31 32

config doesn't check the validity of the .config file. This is done at next
33 34 35 36
make time.

By default, config will upper-case the given symbol. Use --keep-case to keep
the case of all following symbols unchanged.
37 38 39 40 41 42 43 44 45 46 47 48 49 50
EOL
	exit 1
}

checkarg() {
	ARG="$1"
	if [ "$ARG" = "" ] ; then
		usage
	fi
	case "$ARG" in
	CONFIG_*)
		ARG="${ARG/CONFIG_/}"
		;;
	esac
51 52 53
	if [ "$MUNGE_CASE" = "yes" ] ; then
		ARG="`echo $ARG | tr a-z A-Z`"
	fi
54 55
}

56 57 58 59 60 61 62 63 64 65 66 67
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
		sed -ri "/$before_re/a $new" "$FN"
	elif grep -Eq "$name_re" "$FN"; then
		sed -ri "s:$name_re.*:$new:" "$FN"
	else
		echo "$new" >>"$FN"
	fi
68 69 70 71 72 73 74
}

if [ "$1" = "--file" ]; then
	FN="$2"
	if [ "$FN" = "" ] ; then
		usage
	fi
75
	shift 2
76 77 78 79
else
	FN=.config
fi

80 81 82 83
if [ "$1" = "" ] ; then
	usage
fi

84
MUNGE_CASE=yes
85 86 87 88
while [ "$1" != "" ] ; do
	CMD="$1"
	shift
	case "$CMD" in
89 90 91 92 93
	--keep-case|-k)
		MUNGE_CASE=no
		shift
		continue
		;;
94 95 96 97 98 99 100 101 102
	--refresh)
		;;
	--*-after)
		checkarg "$1"
		A=$ARG
		checkarg "$2"
		B=$ARG
		shift 2
		;;
103
	-*)
104 105 106
		checkarg "$1"
		shift
		;;
107 108 109 110 111
	esac
	case "$CMD" in
	--enable|-e)
		set_var "CONFIG_$ARG" "CONFIG_$ARG=y"
		;;
112 113

	--disable|-d)
114
		set_var "CONFIG_$ARG" "# CONFIG_$ARG is not set"
115 116 117
		;;

	--module|-m)
118
		set_var "CONFIG_$ARG" "CONFIG_$ARG=m"
119 120
		;;

121
	--set-str)
122 123
		# sed swallows one level of escaping, so we need double-escaping
		set_var "CONFIG_$ARG" "CONFIG_$ARG=\"${1//\"/\\\\\"}\""
124 125 126
		shift
		;;

127 128 129 130 131
	--set-val)
		set_var "CONFIG_$ARG" "CONFIG_$ARG=$1"
		shift
		;;

132 133 134 135 136 137 138 139
	--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
140 141 142 143 144
				V="${V/#CONFIG_$ARG=/}"
				V="${V/#\"/}"
				V="${V/%\"/}"
				V="${V/\\\"/\"}"
				echo "${V}"
145 146 147 148 149
			fi
		fi
		;;

	--enable-after|-E)
150
		set_var "CONFIG_$B" "CONFIG_$B=y" "CONFIG_$A"
151 152 153
		;;

	--disable-after|-D)
154
		set_var "CONFIG_$B" "# CONFIG_$B is not set" "CONFIG_$A"
155 156 157
		;;

	--module-after|-M)
158
		set_var "CONFIG_$B" "CONFIG_$B=m" "CONFIG_$A"
159 160 161 162 163 164 165 166 167 168 169 170 171
		;;

	# undocumented because it ignores --file (fixme)
	--refresh)
		yes "" | make oldconfig
		;;

	*)
		usage
		;;
	esac
done