]>
Commit | Line | Data |
---|---|---|
8e54701e AK |
1 | #!/bin/bash |
2 | # Manipulate options in a .config file from the command line | |
3 | ||
f5ef2f7b YM |
4 | # If no prefix forced, use the default CONFIG_ |
5 | CONFIG_="${CONFIG_-CONFIG_}" | |
6 | ||
8e54701e AK |
7 | usage() { |
8 | cat >&2 <<EOL | |
9 | Manipulate options in a .config file from the command line. | |
10 | Usage: | |
11 | config options command ... | |
12 | commands: | |
13 | --enable|-e option Enable option | |
14 | --disable|-d option Disable option | |
1f990cf9 | 15 | --module|-m option Turn option into a module |
f0a6332c JA |
16 | --set-str option string |
17 | Set option to "string" | |
18 | --set-val option value | |
19 | Set option to value | |
d5bfb6b3 | 20 | --undefine|-u option Undefine option |
1f990cf9 | 21 | --state|-s option Print state of option (n,y,m,undef) |
8e54701e AK |
22 | |
23 | --enable-after|-E beforeopt option | |
24 | Enable option directly after other option | |
25 | --disable-after|-D beforeopt option | |
26 | Disable option directly after other option | |
27 | --module-after|-M beforeopt option | |
28 | Turn option into module directly after other option | |
29 | ||
30 | commands can be repeated multiple times | |
31 | ||
32 | options: | |
4edc7e32 YM |
33 | --file config-file .config file to change (default .config) |
34 | --keep-case|-k Keep next symbols' case (dont' upper-case it) | |
8e54701e AK |
35 | |
36 | config doesn't check the validity of the .config file. This is done at next | |
4edc7e32 YM |
37 | make time. |
38 | ||
39 | By default, config will upper-case the given symbol. Use --keep-case to keep | |
40 | the case of all following symbols unchanged. | |
f5ef2f7b YM |
41 | |
42 | config uses 'CONFIG_' as the default symbol prefix. Set the environment | |
43 | variable CONFIG_ to the prefix to use. Eg.: CONFIG_="FOO_" config ... | |
8e54701e AK |
44 | EOL |
45 | exit 1 | |
46 | } | |
47 | ||
48 | checkarg() { | |
49 | ARG="$1" | |
50 | if [ "$ARG" = "" ] ; then | |
51 | usage | |
52 | fi | |
53 | case "$ARG" in | |
f5ef2f7b YM |
54 | ${CONFIG_}*) |
55 | ARG="${ARG/${CONFIG_}/}" | |
8e54701e AK |
56 | ;; |
57 | esac | |
4edc7e32 YM |
58 | if [ "$MUNGE_CASE" = "yes" ] ; then |
59 | ARG="`echo $ARG | tr a-z A-Z`" | |
60 | fi | |
8e54701e AK |
61 | } |
62 | ||
56643222 MM |
63 | set_var() { |
64 | local name=$1 new=$2 before=$3 | |
65 | ||
66 | name_re="^($name=|# $name is not set)" | |
67 | before_re="^($before=|# $before is not set)" | |
68 | if test -n "$before" && grep -Eq "$before_re" "$FN"; then | |
69 | sed -ri "/$before_re/a $new" "$FN" | |
70 | elif grep -Eq "$name_re" "$FN"; then | |
71 | sed -ri "s:$name_re.*:$new:" "$FN" | |
72 | else | |
73 | echo "$new" >>"$FN" | |
74 | fi | |
8e54701e AK |
75 | } |
76 | ||
d5bfb6b3 YM |
77 | undef_var() { |
78 | local name=$1 | |
79 | ||
80 | sed -ri "/^($name=|# $name is not set)/d" "$FN" | |
81 | } | |
82 | ||
8e54701e AK |
83 | if [ "$1" = "--file" ]; then |
84 | FN="$2" | |
85 | if [ "$FN" = "" ] ; then | |
86 | usage | |
87 | fi | |
47312d2c | 88 | shift 2 |
8e54701e AK |
89 | else |
90 | FN=.config | |
91 | fi | |
92 | ||
2302e873 AK |
93 | if [ "$1" = "" ] ; then |
94 | usage | |
95 | fi | |
96 | ||
4edc7e32 | 97 | MUNGE_CASE=yes |
8e54701e AK |
98 | while [ "$1" != "" ] ; do |
99 | CMD="$1" | |
100 | shift | |
101 | case "$CMD" in | |
4edc7e32 YM |
102 | --keep-case|-k) |
103 | MUNGE_CASE=no | |
104 | shift | |
105 | continue | |
106 | ;; | |
47312d2c MM |
107 | --refresh) |
108 | ;; | |
109 | --*-after) | |
110 | checkarg "$1" | |
111 | A=$ARG | |
112 | checkarg "$2" | |
113 | B=$ARG | |
114 | shift 2 | |
115 | ;; | |
45f53cc9 | 116 | -*) |
8e54701e | 117 | checkarg "$1" |
8e54701e AK |
118 | shift |
119 | ;; | |
47312d2c MM |
120 | esac |
121 | case "$CMD" in | |
122 | --enable|-e) | |
f5ef2f7b | 123 | set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=y" |
47312d2c | 124 | ;; |
8e54701e AK |
125 | |
126 | --disable|-d) | |
f5ef2f7b | 127 | set_var "${CONFIG_}$ARG" "# ${CONFIG_}$ARG is not set" |
8e54701e AK |
128 | ;; |
129 | ||
130 | --module|-m) | |
f5ef2f7b | 131 | set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=m" |
8e54701e AK |
132 | ;; |
133 | ||
1f990cf9 | 134 | --set-str) |
d6686da8 | 135 | # sed swallows one level of escaping, so we need double-escaping |
f5ef2f7b | 136 | set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=\"${1//\"/\\\\\"}\"" |
1f990cf9 MM |
137 | shift |
138 | ;; | |
139 | ||
f0a6332c | 140 | --set-val) |
f5ef2f7b | 141 | set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=$1" |
f0a6332c JA |
142 | shift |
143 | ;; | |
d5bfb6b3 YM |
144 | --undefine|-u) |
145 | undef_var "${CONFIG_}$ARG" | |
146 | ;; | |
f0a6332c | 147 | |
8e54701e | 148 | --state|-s) |
f5ef2f7b | 149 | if grep -q "# ${CONFIG_}$ARG is not set" $FN ; then |
8e54701e AK |
150 | echo n |
151 | else | |
f5ef2f7b | 152 | V="$(grep "^${CONFIG_}$ARG=" $FN)" |
8e54701e AK |
153 | if [ $? != 0 ] ; then |
154 | echo undef | |
155 | else | |
f5ef2f7b | 156 | V="${V/#${CONFIG_}$ARG=/}" |
d6686da8 YM |
157 | V="${V/#\"/}" |
158 | V="${V/%\"/}" | |
1925a276 | 159 | V="${V//\\\"/\"}" |
d6686da8 | 160 | echo "${V}" |
8e54701e AK |
161 | fi |
162 | fi | |
8e54701e AK |
163 | ;; |
164 | ||
165 | --enable-after|-E) | |
f5ef2f7b | 166 | set_var "${CONFIG_}$B" "${CONFIG_}$B=y" "${CONFIG_}$A" |
8e54701e AK |
167 | ;; |
168 | ||
169 | --disable-after|-D) | |
f5ef2f7b | 170 | set_var "${CONFIG_}$B" "# ${CONFIG_}$B is not set" "${CONFIG_}$A" |
8e54701e AK |
171 | ;; |
172 | ||
173 | --module-after|-M) | |
f5ef2f7b | 174 | set_var "${CONFIG_}$B" "${CONFIG_}$B=m" "${CONFIG_}$A" |
8e54701e AK |
175 | ;; |
176 | ||
177 | # undocumented because it ignores --file (fixme) | |
178 | --refresh) | |
179 | yes "" | make oldconfig | |
180 | ;; | |
181 | ||
182 | *) | |
183 | usage | |
184 | ;; | |
185 | esac | |
186 | done | |
187 |