xref: /linux-6.15/scripts/config (revision 56643222)
1#!/bin/bash
2# Manipulate options in a .config file from the command line
3
4usage() {
5	cat >&2 <<EOL
6Manipulate options in a .config file from the command line.
7Usage:
8config options command ...
9commands:
10	--enable|-e option   Enable option
11	--disable|-d option  Disable option
12	--module|-m option      Turn option into a module
13	--state|-s option       Print state of option (n,y,m,undef)
14
15	--enable-after|-E beforeopt option
16                             Enable option directly after other option
17	--disable-after|-D beforeopt option
18                             Disable option directly after other option
19	--module-after|-M beforeopt option
20                             Turn option into module directly after other option
21
22	commands can be repeated multiple times
23
24options:
25	--file .config file to change (default .config)
26
27config doesn't check the validity of the .config file. This is done at next
28 make time.
29EOL
30	exit 1
31}
32
33checkarg() {
34	ARG="$1"
35	if [ "$ARG" = "" ] ; then
36		usage
37	fi
38	case "$ARG" in
39	CONFIG_*)
40		ARG="${ARG/CONFIG_/}"
41		;;
42	esac
43	ARG="`echo $ARG | tr a-z A-Z`"
44}
45
46set_var() {
47	local name=$1 new=$2 before=$3
48
49	name_re="^($name=|# $name is not set)"
50	before_re="^($before=|# $before is not set)"
51	if test -n "$before" && grep -Eq "$before_re" "$FN"; then
52		sed -ri "/$before_re/a $new" "$FN"
53	elif grep -Eq "$name_re" "$FN"; then
54		sed -ri "s:$name_re.*:$new:" "$FN"
55	else
56		echo "$new" >>"$FN"
57	fi
58}
59
60if [ "$1" = "--file" ]; then
61	FN="$2"
62	if [ "$FN" = "" ] ; then
63		usage
64	fi
65	shift
66	shift
67else
68	FN=.config
69fi
70
71if [ "$1" = "" ] ; then
72	usage
73fi
74
75while [ "$1" != "" ] ; do
76	CMD="$1"
77	shift
78	case "$CMD" in
79	--enable|-e)
80		checkarg "$1"
81		set_var "CONFIG_$ARG" "CONFIG_$ARG=y"
82		shift
83		;;
84
85	--disable|-d)
86		checkarg "$1"
87		set_var "CONFIG_$ARG" "# CONFIG_$ARG is not set"
88		shift
89		;;
90
91	--module|-m)
92		checkarg "$1"
93		set_var "CONFIG_$ARG" "CONFIG_$ARG=m"
94		shift
95		;;
96
97	--state|-s)
98		checkarg "$1"
99		if grep -q "# CONFIG_$ARG is not set" $FN ; then
100			echo n
101		else
102			V="$(grep "^CONFIG_$ARG=" $FN)"
103			if [ $? != 0 ] ; then
104				echo undef
105			else
106				V="${V/CONFIG_$ARG=/}"
107				V="${V/\"/}"
108				echo "$V"
109			fi
110		fi
111		shift
112		;;
113
114	--enable-after|-E)
115		checkarg "$1"
116		A=$ARG
117		checkarg "$2"
118		B=$ARG
119		set_var "CONFIG_$B" "CONFIG_$B=y" "CONFIG_$A"
120		shift
121		shift
122		;;
123
124	--disable-after|-D)
125		checkarg "$1"
126		A=$ARG
127		checkarg "$2"
128		B=$ARG
129		set_var "CONFIG_$B" "# CONFIG_$B is not set" "CONFIG_$A"
130		shift
131		shift
132		;;
133
134	--module-after|-M)
135		checkarg "$1"
136		A=$ARG
137		checkarg "$2"
138		B=$ARG
139		set_var "CONFIG_$B" "CONFIG_$B=m" "CONFIG_$A"
140		shift
141		shift
142		;;
143
144	# undocumented because it ignores --file (fixme)
145	--refresh)
146		yes "" | make oldconfig
147		;;
148
149	*)
150		usage
151		;;
152	esac
153done
154
155