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