]>
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 | |
4edc7e32 YM |
104 | continue |
105 | ;; | |
47312d2c MM |
106 | --refresh) |
107 | ;; | |
108 | --*-after) | |
109 | checkarg "$1" | |
110 | A=$ARG | |
111 | checkarg "$2" | |
112 | B=$ARG | |
113 | shift 2 | |
114 | ;; | |
45f53cc9 | 115 | -*) |
8e54701e | 116 | checkarg "$1" |
8e54701e AK |
117 | shift |
118 | ;; | |
47312d2c MM |
119 | esac |
120 | case "$CMD" in | |
121 | --enable|-e) | |
f5ef2f7b | 122 | set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=y" |
47312d2c | 123 | ;; |
8e54701e AK |
124 | |
125 | --disable|-d) | |
f5ef2f7b | 126 | set_var "${CONFIG_}$ARG" "# ${CONFIG_}$ARG is not set" |
8e54701e AK |
127 | ;; |
128 | ||
129 | --module|-m) | |
f5ef2f7b | 130 | set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=m" |
8e54701e AK |
131 | ;; |
132 | ||
1f990cf9 | 133 | --set-str) |
d6686da8 | 134 | # sed swallows one level of escaping, so we need double-escaping |
f5ef2f7b | 135 | set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=\"${1//\"/\\\\\"}\"" |
1f990cf9 MM |
136 | shift |
137 | ;; | |
138 | ||
f0a6332c | 139 | --set-val) |
f5ef2f7b | 140 | set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=$1" |
f0a6332c JA |
141 | shift |
142 | ;; | |
d5bfb6b3 YM |
143 | --undefine|-u) |
144 | undef_var "${CONFIG_}$ARG" | |
145 | ;; | |
f0a6332c | 146 | |
8e54701e | 147 | --state|-s) |
f5ef2f7b | 148 | if grep -q "# ${CONFIG_}$ARG is not set" $FN ; then |
8e54701e AK |
149 | echo n |
150 | else | |
f5ef2f7b | 151 | V="$(grep "^${CONFIG_}$ARG=" $FN)" |
8e54701e AK |
152 | if [ $? != 0 ] ; then |
153 | echo undef | |
154 | else | |
f5ef2f7b | 155 | V="${V/#${CONFIG_}$ARG=/}" |
d6686da8 YM |
156 | V="${V/#\"/}" |
157 | V="${V/%\"/}" | |
1925a276 | 158 | V="${V//\\\"/\"}" |
d6686da8 | 159 | echo "${V}" |
8e54701e AK |
160 | fi |
161 | fi | |
8e54701e AK |
162 | ;; |
163 | ||
164 | --enable-after|-E) | |
f5ef2f7b | 165 | set_var "${CONFIG_}$B" "${CONFIG_}$B=y" "${CONFIG_}$A" |
8e54701e AK |
166 | ;; |
167 | ||
168 | --disable-after|-D) | |
f5ef2f7b | 169 | set_var "${CONFIG_}$B" "# ${CONFIG_}$B is not set" "${CONFIG_}$A" |
8e54701e AK |
170 | ;; |
171 | ||
172 | --module-after|-M) | |
f5ef2f7b | 173 | set_var "${CONFIG_}$B" "${CONFIG_}$B=m" "${CONFIG_}$A" |
8e54701e AK |
174 | ;; |
175 | ||
176 | # undocumented because it ignores --file (fixme) | |
177 | --refresh) | |
178 | yes "" | make oldconfig | |
179 | ;; | |
180 | ||
181 | *) | |
182 | usage | |
183 | ;; | |
184 | esac | |
185 | done | |
186 |