Root/scripts/config

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

Archive Download this file



interactive