1.. SPDX-License-Identifier: GPL-2.0+ 2 3moveconfig 4========== 5 6Since Kconfig was introduced to U-Boot, we have worked on moving 7config options from headers to Kconfig (defconfig). 8 9This tool intends to help this tremendous work. 10 11Installing 12---------- 13 14You may need to install 'python3-asteval' for the 'asteval' module. 15 16Usage 17----- 18 19First, you must edit the Kconfig to add the menu entries for the configs 20you are moving. 21 22Then run this tool giving CONFIG names you want to move. 23For example, if you want to move CONFIG_CMD_USB and CONFIG_SYS_TEXT_BASE, 24simply type as follows:: 25 26 $ tools/moveconfig.py CONFIG_CMD_USB CONFIG_SYS_TEXT_BASE 27 28The tool walks through all the defconfig files and move the given CONFIGs. 29 30The log is also displayed on the terminal. 31 32The log is printed for each defconfig as follows:: 33 34 <defconfig_name> 35 <action1> 36 <action2> 37 <action3> 38 ... 39 40`<defconfig_name>` is the name of the defconfig. 41 42`<action*>` shows what the tool did for that defconfig. 43It looks like one of the following: 44 45 - Move 'CONFIG\_... ' 46 This config option was moved to the defconfig 47 48 - CONFIG\_... is not defined in Kconfig. Do nothing. 49 The entry for this CONFIG was not found in Kconfig. The option is not 50 defined in the config header, either. So, this case can be just skipped. 51 52 - CONFIG\_... is not defined in Kconfig (suspicious). Do nothing. 53 This option is defined in the config header, but its entry was not found 54 in Kconfig. 55 There are two common cases: 56 57 - You forgot to create an entry for the CONFIG before running 58 this tool, or made a typo in a CONFIG passed to this tool. 59 - The entry was hidden due to unmet 'depends on'. 60 61 The tool does not know if the result is reasonable, so please check it 62 manually. 63 64 - 'CONFIG\_...' is the same as the define in Kconfig. Do nothing. 65 The define in the config header matched the one in Kconfig. 66 We do not need to touch it. 67 68 - Compiler is missing. Do nothing. 69 The compiler specified for this architecture was not found 70 in your PATH environment. 71 (If -e option is passed, the tool exits immediately.) 72 73 - Failed to process. 74 An error occurred during processing this defconfig. Skipped. 75 (If -e option is passed, the tool exits immediately on error.) 76 77Finally, you will be asked, Clean up headers? [y/n]: 78 79If you say 'y' here, the unnecessary config defines are removed 80from the config headers (include/configs/\*.h). 81It just uses the regex method, so you should not rely on it. 82Just in case, please do 'git diff' to see what happened. 83 84 85How does it work? 86----------------- 87 88This tool runs configuration and builds include/autoconf.mk for every 89defconfig. The config options defined in Kconfig appear in the .config 90file (unless they are hidden because of unmet dependency.) 91On the other hand, the config options defined by board headers are seen 92in include/autoconf.mk. The tool looks for the specified options in both 93of them to decide the appropriate action for the options. If the given 94config option is found in the .config, but its value does not match the 95one from the board header, the config option in the .config is replaced 96with the define in the board header. Then, the .config is synced by 97"make savedefconfig" and the defconfig is updated with it. 98 99For faster processing, this tool handles multi-threading. It creates 100separate build directories where the out-of-tree build is run. The 101temporary build directories are automatically created and deleted as 102needed. The number of threads are chosen based on the number of the CPU 103cores of your system although you can change it via -j (--jobs) option. 104 105 106Toolchains 107---------- 108 109Appropriate toolchain are necessary to generate include/autoconf.mk 110for all the architectures supported by U-Boot. Most of them are available 111at the kernel.org site, some are not provided by kernel.org. This tool uses 112the same tools as buildman, so see that tool for setup (e.g. --fetch-arch). 113 114 115Tips and trips 116-------------- 117 118To sync only X86 defconfigs:: 119 120 ./tools/moveconfig.py -s -d <(grep -l X86 configs/*) 121 122or:: 123 124 grep -l X86 configs/* | ./tools/moveconfig.py -s -d - 125 126To process CONFIG_CMD_FPGAD only for a subset of configs based on path match:: 127 128 ls configs/{hrcon*,iocon*,strider*} | \ 129 ./tools/moveconfig.py -Cy CONFIG_CMD_FPGAD -d - 130 131 132Finding implied CONFIGs 133----------------------- 134 135Some CONFIG options can be implied by others and this can help to reduce 136the size of the defconfig files. For example, CONFIG_X86 implies 137CONFIG_CMD_IRQ, so we can put 'imply CMD_IRQ' under 'config X86' and 138all x86 boards will have that option, avoiding adding CONFIG_CMD_IRQ to 139each of the x86 defconfig files. 140 141This tool can help find such configs. To use it, first build a database:: 142 143 ./tools/moveconfig.py -b 144 145Then try to query it:: 146 147 ./tools/moveconfig.py -i CONFIG_I8042_KEYB 148 CONFIG_I8042_KEYB found in 33/5155 defconfigs 149 28 : CONFIG_X86 150 28 : CONFIG_SA_PCIEX_LENGTH 151 28 : CONFIG_HPET_ADDRESS 152 28 : CONFIG_MAX_PIRQ_LINKS 153 28 : CONFIG_I8254_TIMER 154 28 : CONFIG_I8259_PIC 155 28 : CONFIG_RAMBASE 156 28 : CONFIG_IRQ_SLOT_COUNT 157 28 : CONFIG_PCIE_ECAM_SIZE 158 28 : CONFIG_APIC 159 ... 160 161This shows a list of config options which might imply CONFIG_I8042_KEYB along 162with how many defconfigs they cover. From this you can see that CONFIG_X86 163generally implies CONFIG_I8042_KEYB but not always (28 out of 35). Therefore, 164instead of adding CONFIG_I8042_KEYB to 165the defconfig of every x86 board, you could add a single imply line to the 166Kconfig file:: 167 168 config X86 169 bool "x86 architecture" 170 ... 171 imply CMD_EEPROM 172 173That will cover 28 defconfigs and you can perhaps find another condition that 174indicates that CONFIG_I8042_KEYB is not needed for the remaining 5 boards. Many 175of the options listed are not suitable as they are not related. E.g. it would be 176odd for CONFIG_RAMBASE to imply CONFIG_I8042_KEYB. 177 178Using this search you can reduce the size of moveconfig patches. 179 180You can automatically add 'imply' statements in the Kconfig with the -a 181option:: 182 183 ./tools/moveconfig.py -s -i CONFIG_SCSI \ 184 -a CONFIG_ARCH_LS1021A,CONFIG_ARCH_LS1043A 185 186This will add 'imply SCSI' to the two CONFIG options mentioned, assuming that 187the database indicates that they do actually imply CONFIG_SCSI and do not 188already have an 'imply SCSI'. 189 190The output shows where the imply is added:: 191 192 18 : CONFIG_ARCH_LS1021A arch/arm/cpu/armv7/ls102xa/Kconfig:1 193 13 : CONFIG_ARCH_LS1043A arch/arm/cpu/armv8/fsl-layerscape/Kconfig:11 194 12 : CONFIG_ARCH_LS1046A arch/arm/cpu/armv8/fsl-layerscape/Kconfig:31 195 196The first number is the number of boards which can avoid having a special 197CONFIG_SCSI option in their defconfig file if this 'imply' is added. 198The location at the right is the Kconfig file and line number where the config 199appears. For example, adding 'imply CONFIG_SCSI' to the 'config ARCH_LS1021A' 200in arch/arm/cpu/armv7/ls102xa/Kconfig at line 1 will help 18 boards to reduce 201the size of their defconfig files. 202 203If you want to add an 'imply' to every imply config in the list, you can use:: 204 205 ./tools/moveconfig.py -s -i CONFIG_SCSI -a all 206 207To control which ones are displayed, use -I <list> where list is a list of 208options (use '-I help' to see possible options and their meaning). 209 210To skip showing you options that already have an 'imply' attached, use -A. 211 212When you have finished adding 'imply' options you can regenerate the 213defconfig files for affected boards with something like:: 214 215 git show --stat | ./tools/moveconfig.py -s -d - 216 217This will regenerate only those defconfigs changed in the current commit. 218If you start with (say) 100 defconfigs being changed in the commit, and add 219a few 'imply' options as above, then regenerate, hopefully you can reduce the 220number of defconfigs changed in the commit. 221 222 223Available options 224----------------- 225 226 -c, --color 227 Surround each portion of the log with escape sequences to display it 228 in color on the terminal. 229 230 -C, --commit 231 Create a git commit with the changes when the operation is complete. A 232 standard commit message is used which may need to be edited. 233 234 -d, --defconfigs 235 Specify a file containing a list of defconfigs to move. The defconfig 236 files can be given with shell-style wildcards. Use '-' to read from stdin. 237 238 -n, --dry-run 239 Perform a trial run that does not make any changes. It is useful to 240 see what is going to happen before one actually runs it. 241 242 -e, --exit-on-error 243 Exit immediately if Make exits with a non-zero status while processing 244 a defconfig file. 245 246 -s, --force-sync 247 Do "make savedefconfig" forcibly for all the defconfig files. 248 If not specified, "make savedefconfig" only occurs for cases 249 where at least one CONFIG was moved. 250 251 -S, --spl 252 Look for moved config options in spl/include/autoconf.mk instead of 253 include/autoconf.mk. This is useful for moving options for SPL build 254 because SPL related options (mostly prefixed with CONFIG_SPL\_) are 255 sometimes blocked by CONFIG_SPL_BUILD ifdef conditionals. 256 257 -H, --headers-only 258 Only cleanup the headers; skip the defconfig processing 259 260 -j, --jobs 261 Specify the number of threads to run simultaneously. If not specified, 262 the number of threads is the same as the number of CPU cores. 263 264 -r, --git-ref 265 Specify the git ref to clone for building the autoconf.mk. If unspecified 266 use the CWD. This is useful for when changes to the Kconfig affect the 267 default values and you want to capture the state of the defconfig from 268 before that change was in effect. If in doubt, specify a ref pre-Kconfig 269 changes (use HEAD if Kconfig changes are not committed). Worst case it will 270 take a bit longer to run, but will always do the right thing. 271 272 -v, --verbose 273 Show any build errors as boards are built 274 275 -y, --yes 276 Instead of prompting, automatically go ahead with all operations. This 277 includes cleaning up headers, CONFIG_SYS_EXTRA_OPTIONS, the config whitelist 278 and the README. 279 280To see the complete list of supported options, run:: 281 282 tools/moveconfig.py -h 283