blob: 8efb1eb2685c078559c8684fd2e769db4cd67490 [file] [log] [blame]
Simon Glass844a48f2023-09-23 13:44:16 -06001.. SPDX-License-Identifier: GPL-2.0+
2
3qconfig - Querying CONFIG options
4=================================
5
6It is not possible to see all the CONFIG options used by a board without
7building its `.config` file. This tool allows this to be done efficiently for
8all boards, or a subset, writing the results to a unified database file.
9
10This database can be queried, to find boards which used a certain combination
11of options, to aid in discovering Kconfig options which imply others.
12
13The tool also permits syncing of defconfigs, which corrects the ordering and
14drops options which are implied by others.
15
16Finally, it allows scanning the source code to look for inconsistencies in the
17use of Kconfig options.
18
19Installation
20------------
21
22You may need to install 'python3-asteval' for the 'asteval' module.
23
24How does it work?
25-----------------
26
27When building a database (`-b`), this tool runs configuration and builds
28include/autoconf.mk for every defconfig. The config options defined in Kconfig
29appear in the .config file (unless they are hidden because of unmet dependency.)
30On the other hand, the config options defined by board headers are seen
31in include/autoconf.mk.
32
33When resyncing defconfigs (`-s`) the .config is synced by "make savedefconfig"
34and the defconfig is updated with it.
35
36For faster processing, this tool is multi-threaded. It creates
37separate build directories where the out-of-tree build is run. The
38temporary build directories are automatically created and deleted as
39needed. The number of threads are chosen based on the number of the CPU
40cores of your system although you can change it via -j (--jobs) option.
41
42Note that `*.config` fragments are not supported.
43
44Toolchains
45----------
46
47Appropriate toolchains are necessary to generate include/autoconf.mk
48for all the architectures supported by U-Boot. Most of them are available
49at the kernel.org site. This tool uses the same tools as
50:doc:`../build/buildman`, so you can use `buildman --fetch-arch` to fetch
51toolchains.
52
53
54Examples
55--------
56
57To sync only X86 defconfigs::
58
59 ./tools/qconfig.py -s -d <(grep -l X86 configs/*)
60
61or::
62
63 grep -l X86 configs/* | ./tools/qconfig.py -s -d -
64
65To process CONFIG_CMD_FPGAD only for a subset of configs based on path match::
66
67 ls configs/{hrcon*,iocon*,strider*} | \
68 ./tools/qconfig.py -C CONFIG_CMD_FPGAD -d -
69
70
71Finding boards with particular CONFIG combinations
72--------------------------------------------------
73
74You can use `qconfig.py` to figure out which boards have a CONFIG enabled, or
75which do not. To use it, first build a database::
76
77 ./tools/qconfig.py -b
78
79Then you can run queries using the `-f` flag followed by a list of CONFIG terms.
80Each term is CONFIG name, with or without a tilde (~) prefix. The tool searches
81for boards which match the CONFIG name, or do not match if tilde is used. For
82example, to find boards which enabled CONFIG_SCSI but not CONFIG_BLK::
83
84 tools/qconfig.py -f SCSI ~BLK
85 3 matches
86 pg_wcom_seli8_defconfig highbank_defconfig pg_wcom_expu1_defconfig
87
88
89Finding implied CONFIGs
90-----------------------
91
92Some CONFIG options can be implied by others and this can help to reduce
93the size of the defconfig files. For example, CONFIG_X86 implies
94CONFIG_CMD_IRQ, so we can put 'imply CMD_IRQ' under 'config X86' and
95all x86 boards will have that option, avoiding adding CONFIG_CMD_IRQ to
96each of the x86 defconfig files.
97
98This tool can help find such configs. To use it, first build a database::
99
100 ./tools/qconfig.py -b
101
102Then try to query it::
103
104 ./tools/qconfig.py -i CONFIG_I8042_KEYB
105 CONFIG_I8042_KEYB found in 33/5155 defconfigs
106 28 : CONFIG_X86
107 28 : CONFIG_SA_PCIEX_LENGTH
108 28 : CONFIG_HPET_ADDRESS
109 28 : CONFIG_MAX_PIRQ_LINKS
110 28 : CONFIG_I8254_TIMER
111 28 : CONFIG_I8259_PIC
112 28 : CONFIG_RAMBASE
113 28 : CONFIG_IRQ_SLOT_COUNT
114 28 : CONFIG_PCIE_ECAM_SIZE
115 28 : CONFIG_APIC
116 ...
117
118This shows a list of config options which might imply CONFIG_I8042_KEYB along
119with how many defconfigs they cover. From this you can see that CONFIG_X86
120generally implies CONFIG_I8042_KEYB but not always (28 out of 35). Therefore,
121instead of adding CONFIG_I8042_KEYB to
122the defconfig of every x86 board, you could add a single imply line to the
123Kconfig file::
124
125 config X86
126 bool "x86 architecture"
127 ...
128 imply CMD_EEPROM
129
130That will cover 28 defconfigs and you can perhaps find another condition that
131indicates that CONFIG_I8042_KEYB is not needed for the remaining 5 boards. Many
132of the options listed are not suitable as they are not related. E.g. it would be
133odd for CONFIG_RAMBASE to imply CONFIG_I8042_KEYB.
134
135Using this search you can reduce the size of qconfig patches.
136
137You can automatically add 'imply' statements in the Kconfig with the -a
138option::
139
140 ./tools/qconfig.py -s -i CONFIG_SCSI \
141 -a CONFIG_ARCH_LS1021A,CONFIG_ARCH_LS1043A
142
143This will add 'imply SCSI' to the two CONFIG options mentioned, assuming that
144the database indicates that they do actually imply CONFIG_SCSI and do not
145already have an 'imply SCSI'.
146
147The output shows where the imply is added::
148
149 18 : CONFIG_ARCH_LS1021A arch/arm/cpu/armv7/ls102xa/Kconfig:1
150 13 : CONFIG_ARCH_LS1043A arch/arm/cpu/armv8/fsl-layerscape/Kconfig:11
151 12 : CONFIG_ARCH_LS1046A arch/arm/cpu/armv8/fsl-layerscape/Kconfig:31
152
153The first number is the number of boards which can avoid having a special
154CONFIG_SCSI option in their defconfig file if this 'imply' is added.
155The location at the right is the Kconfig file and line number where the config
156appears. For example, adding 'imply CONFIG_SCSI' to the 'config ARCH_LS1021A'
157in arch/arm/cpu/armv7/ls102xa/Kconfig at line 1 will help 18 boards to reduce
158the size of their defconfig files.
159
160If you want to add an 'imply' to every imply config in the list, you can use::
161
162 ./tools/qconfig.py -s -i CONFIG_SCSI -a all
163
164To control which ones are displayed, use -I <list> where list is a list of
165options (use '-I help' to see possible options and their meaning).
166
167To skip showing you options that already have an 'imply' attached, use -A.
168
169When you have finished adding 'imply' options you can regenerate the
170defconfig files for affected boards with something like::
171
172 git show --stat | ./tools/qconfig.py -s -d -
173
174This will regenerate only those defconfigs changed in the current commit.
175If you start with (say) 100 defconfigs being changed in the commit, and add
176a few 'imply' options as above, then regenerate, hopefully you can reduce the
177number of defconfigs changed in the commit.
178
179
180Available options
181-----------------
182
183 --nocolour
184 Disables colouring of output. This is normally used when writing to a
185 terminal.
186
187 -C, --commit
188 Create a git commit with the changes when the operation is complete. A
189 standard commit message is used which may need to be edited.
190
191 -d, --defconfigs
192 Specify a file containing a list of defconfigs to move. The defconfig
193 files can be given with shell-style wildcards. Use '-' to read from stdin.
194
195 -f, --find
196 Find boards with a given config combination
197
198 -n, --dry-run
199 Perform a trial run that does not make any changes. It is useful to
200 see what is going to happen before one actually runs it.
201
202 -e, --exit-on-error
203 Exit immediately if Make exits with a non-zero status while processing
204 a defconfig file.
205
206 -s, --force-sync
207 Do "make savedefconfig" forcibly for all the defconfig files.
208 If not specified, "make savedefconfig" only occurs for cases
209 where at least one CONFIG was moved.
210
211 -S, --spl
212 Look for moved config options in spl/include/autoconf.mk instead of
213 include/autoconf.mk. This is useful for moving options for SPL build
214 because SPL related options (mostly prefixed with CONFIG_SPL\_) are
215 sometimes blocked by CONFIG_SPL_BUILD ifdef conditionals.
216
217 -j, --jobs
218 Specify the number of threads to run simultaneously. If not specified,
219 the number of threads is the same as the number of CPU cores.
220
221 -r, --git-ref
222 Specify the git ref to clone for building the autoconf.mk. If unspecified
223 use the CWD. This is useful for when changes to the Kconfig affect the
224 default values and you want to capture the state of the defconfig from
225 before that change was in effect. If in doubt, specify a ref pre-Kconfig
226 changes (use HEAD if Kconfig changes are not committed). Worst case it will
227 take a bit longer to run, but will always do the right thing.
228
229 -v, --verbose
230 Show any build errors as boards are built
231
232To see the complete list of supported options, run::
233
234 tools/qconfig.py -h