config 3.6 KB
Newer Older
1 2 3
#!/bin/bash
# Manipulate options in a .config file from the command line

4 5 6
# If no prefix forced, use the default CONFIG_
CONFIG_="${CONFIG_-CONFIG_}"

7 8 9 10 11 12 13 14
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
15
	--module|-m option   Turn option into a module
16 17 18 19
	--set-str option string
	                     Set option to "string"
	--set-val option value
	                     Set option to value
20
	--undefine|-u option Undefine option
21
	--state|-s option    Print state of option (n,y,m,undef)
22 23 24 25 26 27 28 29 30 31 32

	--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:
33 34
	--file config-file   .config file to change (default .config)
	--keep-case|-k       Keep next symbols' case (dont' upper-case it)
35 36

config doesn't check the validity of the .config file. This is done at next
37 38 39 40
make time.

By default, config will upper-case the given symbol. Use --keep-case to keep
the case of all following symbols unchanged.
41 42 43

config uses 'CONFIG_' as the default symbol prefix. Set the environment
variable CONFIG_ to the prefix to use. Eg.: CONFIG_="FOO_" config ...
44 45 46 47 48 49 50 51 52 53
EOL
	exit 1
}

checkarg() {
	ARG="$1"
	if [ "$ARG" = "" ] ; then
		usage
	fi
	case "$ARG" in
54 55
	${CONFIG_}*)
		ARG="${ARG/${CONFIG_}/}"
56 57
		;;
	esac
58 59 60
	if [ "$MUNGE_CASE" = "yes" ] ; then
		ARG="`echo $ARG | tr a-z A-Z`"
	fi
61 62
}

63 64 65 66 67 68 69 70 71 72 73 74
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
75 76
}

77 78 79 80 81 82
undef_var() {
	local name=$1

	sed -ri "/^($name=|# $name is not set)/d" "$FN"
}

83 84 85 86 87
if [ "$1" = "--file" ]; then
	FN="$2"
	if [ "$FN" = "" ] ; then
		usage
	fi
88
	shift 2
89 90 91 92
else
	FN=.config
fi

93 94 95 96
if [ "$1" = "" ] ; then
	usage
fi

97
MUNGE_CASE=yes
98 99 100 101
while [ "$1" != "" ] ; do
	CMD="$1"
	shift
	case "$CMD" in
102 103 104 105
	--keep-case|-k)
		MUNGE_CASE=no
		continue
		;;
106 107 108 109 110 111 112 113 114
	--refresh)
		;;
	--*-after)
		checkarg "$1"
		A=$ARG
		checkarg "$2"
		B=$ARG
		shift 2
		;;
115
	-*)
116 117 118
		checkarg "$1"
		shift
		;;
119 120 121
	esac
	case "$CMD" in
	--enable|-e)
122
		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=y"
123
		;;
124 125

	--disable|-d)
126
		set_var "${CONFIG_}$ARG" "# ${CONFIG_}$ARG is not set"
127 128 129
		;;

	--module|-m)
130
		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=m"
131 132
		;;

133
	--set-str)
134
		# sed swallows one level of escaping, so we need double-escaping
135
		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=\"${1//\"/\\\\\"}\""
136 137 138
		shift
		;;

139
	--set-val)
140
		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=$1"
141 142
		shift
		;;
143 144 145
	--undefine|-u)
		undef_var "${CONFIG_}$ARG"
		;;
146

147
	--state|-s)
148
		if grep -q "# ${CONFIG_}$ARG is not set" $FN ; then
149 150
			echo n
		else
151
			V="$(grep "^${CONFIG_}$ARG=" $FN)"
152 153 154
			if [ $? != 0 ] ; then
				echo undef
			else
155
				V="${V/#${CONFIG_}$ARG=/}"
156 157
				V="${V/#\"/}"
				V="${V/%\"/}"
158
				V="${V//\\\"/\"}"
159
				echo "${V}"
160 161 162 163 164
			fi
		fi
		;;

	--enable-after|-E)
165
		set_var "${CONFIG_}$B" "${CONFIG_}$B=y" "${CONFIG_}$A"
166 167 168
		;;

	--disable-after|-D)
169
		set_var "${CONFIG_}$B" "# ${CONFIG_}$B is not set" "${CONFIG_}$A"
170 171 172
		;;

	--module-after|-M)
173
		set_var "${CONFIG_}$B" "${CONFIG_}$B=m" "${CONFIG_}$A"
174 175 176 177 178 179 180 181 182 183 184 185 186
		;;

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

	*)
		usage
		;;
	esac
done