"Das U-Boot" Source Tree
at master 248 lines 8.9 kB view raw
1.. 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 88It is also possible to search for particular values. For example, this finds all 89boards with an empty string for `CONFIG_DEFAULT_FDT_FILE`:: 90 91 ./tools/qconfig.py -f DEFAULT_FDT_FILE=\"\" 92 1092 matches 93 ... 94 95This finds boards which have a value for SYS_MAXARGS other than 64:: 96 97 ./tools/qconfig.py -f ~SYS_MAXARGS=64 98 cfg CONFIG_SYS_MAXARGS 99 281 matches 100 ... 101 102 103Finding implied CONFIGs 104----------------------- 105 106Some CONFIG options can be implied by others and this can help to reduce 107the size of the defconfig files. For example, CONFIG_X86 implies 108CONFIG_CMD_IRQ, so we can put 'imply CMD_IRQ' under 'config X86' and 109all x86 boards will have that option, avoiding adding CONFIG_CMD_IRQ to 110each of the x86 defconfig files. 111 112This tool can help find such configs. To use it, first build a database:: 113 114 ./tools/qconfig.py -b 115 116Then try to query it:: 117 118 ./tools/qconfig.py -i CONFIG_I8042_KEYB 119 CONFIG_I8042_KEYB found in 33/5155 defconfigs 120 28 : CONFIG_X86 121 28 : CONFIG_SA_PCIEX_LENGTH 122 28 : CONFIG_HPET_ADDRESS 123 28 : CONFIG_MAX_PIRQ_LINKS 124 28 : CONFIG_I8254_TIMER 125 28 : CONFIG_I8259_PIC 126 28 : CONFIG_RAMBASE 127 28 : CONFIG_IRQ_SLOT_COUNT 128 28 : CONFIG_PCIE_ECAM_SIZE 129 28 : CONFIG_APIC 130 ... 131 132This shows a list of config options which might imply CONFIG_I8042_KEYB along 133with how many defconfigs they cover. From this you can see that CONFIG_X86 134generally implies CONFIG_I8042_KEYB but not always (28 out of 35). Therefore, 135instead of adding CONFIG_I8042_KEYB to 136the defconfig of every x86 board, you could add a single imply line to the 137Kconfig file:: 138 139 config X86 140 bool "x86 architecture" 141 ... 142 imply CMD_EEPROM 143 144That will cover 28 defconfigs and you can perhaps find another condition that 145indicates that CONFIG_I8042_KEYB is not needed for the remaining 5 boards. Many 146of the options listed are not suitable as they are not related. E.g. it would be 147odd for CONFIG_RAMBASE to imply CONFIG_I8042_KEYB. 148 149Using this search you can reduce the size of qconfig patches. 150 151You can automatically add 'imply' statements in the Kconfig with the -a 152option:: 153 154 ./tools/qconfig.py -s -i CONFIG_SCSI \ 155 -a CONFIG_ARCH_LS1021A,CONFIG_ARCH_LS1043A 156 157This will add 'imply SCSI' to the two CONFIG options mentioned, assuming that 158the database indicates that they do actually imply CONFIG_SCSI and do not 159already have an 'imply SCSI'. 160 161The output shows where the imply is added:: 162 163 18 : CONFIG_ARCH_LS1021A arch/arm/cpu/armv7/ls102xa/Kconfig:1 164 13 : CONFIG_ARCH_LS1043A arch/arm/cpu/armv8/fsl-layerscape/Kconfig:11 165 12 : CONFIG_ARCH_LS1046A arch/arm/cpu/armv8/fsl-layerscape/Kconfig:31 166 167The first number is the number of boards which can avoid having a special 168CONFIG_SCSI option in their defconfig file if this 'imply' is added. 169The location at the right is the Kconfig file and line number where the config 170appears. For example, adding 'imply CONFIG_SCSI' to the 'config ARCH_LS1021A' 171in arch/arm/cpu/armv7/ls102xa/Kconfig at line 1 will help 18 boards to reduce 172the size of their defconfig files. 173 174If you want to add an 'imply' to every imply config in the list, you can use:: 175 176 ./tools/qconfig.py -s -i CONFIG_SCSI -a all 177 178To control which ones are displayed, use -I <list> where list is a list of 179options (use '-I help' to see possible options and their meaning). 180 181To skip showing you options that already have an 'imply' attached, use -A. 182 183When you have finished adding 'imply' options you can regenerate the 184defconfig files for affected boards with something like:: 185 186 git show --stat | ./tools/qconfig.py -s -d - 187 188This will regenerate only those defconfigs changed in the current commit. 189If you start with (say) 100 defconfigs being changed in the commit, and add 190a few 'imply' options as above, then regenerate, hopefully you can reduce the 191number of defconfigs changed in the commit. 192 193 194Available options 195----------------- 196 197 --nocolour 198 Disables colouring of output. This is normally used when writing to a 199 terminal. 200 201 -C, --commit 202 Create a git commit with the changes when the operation is complete. A 203 standard commit message is used which may need to be edited. 204 205 -d, --defconfigs 206 Specify a file containing a list of defconfigs to move. The defconfig 207 files can be given with shell-style wildcards. Use '-' to read from stdin. 208 209 -f, --find 210 Find boards with a given config combination 211 212 -n, --dry-run 213 Perform a trial run that does not make any changes. It is useful to 214 see what is going to happen before one actually runs it. 215 216 -e, --exit-on-error 217 Exit immediately if Make exits with a non-zero status while processing 218 a defconfig file. 219 220 -s, --force-sync 221 Do "make savedefconfig" forcibly for all the defconfig files. 222 If not specified, "make savedefconfig" only occurs for cases 223 where at least one CONFIG was moved. 224 225 -S, --spl 226 Look for moved config options in spl/include/autoconf.mk instead of 227 include/autoconf.mk. This is useful for moving options for SPL build 228 because SPL related options (mostly prefixed with CONFIG_SPL\_) are 229 sometimes blocked by CONFIG_XPL_BUILD ifdef conditionals. 230 231 -j, --jobs 232 Specify the number of threads to run simultaneously. If not specified, 233 the number of threads is the same as the number of CPU cores. 234 235 -r, --git-ref 236 Specify the git ref to clone for building the autoconf.mk. If unspecified 237 use the CWD. This is useful for when changes to the Kconfig affect the 238 default values and you want to capture the state of the defconfig from 239 before that change was in effect. If in doubt, specify a ref pre-Kconfig 240 changes (use HEAD if Kconfig changes are not committed). Worst case it will 241 take a bit longer to run, but will always do the right thing. 242 243 -v, --verbose 244 Show any build errors as boards are built 245 246To see the complete list of supported options, run:: 247 248 tools/qconfig.py -h