xref: /linux-6.15/scripts/config (revision 47312d2c)
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 2
66else
67	FN=.config
68fi
69
70if [ "$1" = "" ] ; then
71	usage
72fi
73
74while [ "$1" != "" ] ; do
75	CMD="$1"
76	shift
77	case "$CMD" in
78	--refresh)
79		;;
80	--*-after)
81		checkarg "$1"
82		A=$ARG
83		checkarg "$2"
84		B=$ARG
85		shift 2
86		;;
87	--*)
88		checkarg "$1"
89		shift
90		;;
91	esac
92	case "$CMD" in
93	--enable|-e)
94		set_var "CONFIG_$ARG" "CONFIG_$ARG=y"
95		;;
96
97	--disable|-d)
98		set_var "CONFIG_$ARG" "# CONFIG_$ARG is not set"
99		;;
100
101	--module|-m)
102		set_var "CONFIG_$ARG" "CONFIG_$ARG=m"
103		;;
104
105	--state|-s)
106		if grep -q "# CONFIG_$ARG is not set" $FN ; then
107			echo n
108		else
109			V="$(grep "^CONFIG_$ARG=" $FN)"
110			if [ $? != 0 ] ; then
111				echo undef
112			else
113				V="${V/CONFIG_$ARG=/}"
114				V="${V/\"/}"
115				echo "$V"
116			fi
117		fi
118		;;
119
120	--enable-after|-E)
121		set_var "CONFIG_$B" "CONFIG_$B=y" "CONFIG_$A"
122		;;
123
124	--disable-after|-D)
125		set_var "CONFIG_$B" "# CONFIG_$B is not set" "CONFIG_$A"
126		;;
127
128	--module-after|-M)
129		set_var "CONFIG_$B" "CONFIG_$B=m" "CONFIG_$A"
130		;;
131
132	# undocumented because it ignores --file (fixme)
133	--refresh)
134		yes "" | make oldconfig
135		;;
136
137	*)
138		usage
139		;;
140	esac
141done
142
143