Newer
Older
#!/usr/bin/env python2
#
# Author: Masahiro Yamada <yamada.masahiro@socionext.com>
#
# SPDX-License-Identifier: GPL-2.0+
#
"""
Move config options from headers to defconfig files.
Since Kconfig was introduced to U-Boot, we have worked on moving
config options from headers to Kconfig (defconfig).
This tool intends to help this tremendous work.
Usage
-----
First, you must edit the Kconfig to add the menu entries for the configs
you are moving.
And then run this tool giving CONFIG names you want to move.
For example, if you want to move CONFIG_CMD_USB and CONFIG_SYS_TEXT_BASE,
simply type as follows:
$ tools/moveconfig.py CONFIG_CMD_USB CONFIG_SYS_TEXT_BASE
The tool walks through all the defconfig files and move the given CONFIGs.
The log is also displayed on the terminal.
The log is printed for each defconfig as follows:
<defconfig_name>
<action1>
<action2>
<action3>
...
<defconfig_name> is the name of the defconfig.
<action*> shows what the tool did for that defconfig.
It looks like one of the following:
- Move 'CONFIG_... '
This config option was moved to the defconfig
- CONFIG_... is not defined in Kconfig. Do nothing.
The entry for this CONFIG was not found in Kconfig. The option is not
defined in the config header, either. So, this case can be just skipped.
- CONFIG_... is not defined in Kconfig (suspicious). Do nothing.
This option is defined in the config header, but its entry was not found
in Kconfig.
There are two common cases:
- You forgot to create an entry for the CONFIG before running
this tool, or made a typo in a CONFIG passed to this tool.
- The entry was hidden due to unmet 'depends on'.
The tool does not know if the result is reasonable, so please check it
manually.
- 'CONFIG_...' is the same as the define in Kconfig. Do nothing.
The define in the config header matched the one in Kconfig.
We do not need to touch it.
- Compiler is missing. Do nothing.
The compiler specified for this architecture was not found
in your PATH environment.
(If -e option is passed, the tool exits immediately.)
- Failed to process.
An error occurred during processing this defconfig. Skipped.
(If -e option is passed, the tool exits immediately on error.)
Finally, you will be asked, Clean up headers? [y/n]:
If you say 'y' here, the unnecessary config defines are removed
from the config headers (include/configs/*.h).
It just uses the regex method, so you should not rely on it.
Just in case, please do 'git diff' to see what happened.
How does it work?
-----------------
This tool runs configuration and builds include/autoconf.mk for every
defconfig. The config options defined in Kconfig appear in the .config
file (unless they are hidden because of unmet dependency.)
On the other hand, the config options defined by board headers are seen
in include/autoconf.mk. The tool looks for the specified options in both
of them to decide the appropriate action for the options. If the given
config option is found in the .config, but its value does not match the
one from the board header, the config option in the .config is replaced
with the define in the board header. Then, the .config is synced by
"make savedefconfig" and the defconfig is updated with it.
For faster processing, this tool handles multi-threading. It creates
separate build directories where the out-of-tree build is run. The
temporary build directories are automatically created and deleted as
needed. The number of threads are chosen based on the number of the CPU
cores of your system although you can change it via -j (--jobs) option.
Toolchains
----------
Appropriate toolchain are necessary to generate include/autoconf.mk
for all the architectures supported by U-Boot. Most of them are available
at the kernel.org site, some are not provided by kernel.org. This tool uses
the same tools as buildman, so see that tool for setup (e.g. --fetch-arch).
Tips and trips
--------------
To sync only X86 defconfigs:
./tools/moveconfig.py -s -d <(grep -l X86 configs/*)
or:
grep -l X86 configs/* | ./tools/moveconfig.py -s -d -
To process CONFIG_CMD_FPGAD only for a subset of configs based on path match:
ls configs/{hrcon*,iocon*,strider*} | \
./tools/moveconfig.py -Cy CONFIG_CMD_FPGAD -d -
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
Finding implied CONFIGs
-----------------------
Some CONFIG options can be implied by others and this can help to reduce
the size of the defconfig files. For example, CONFIG_X86 implies
CONFIG_CMD_IRQ, so we can put 'imply CMD_IRQ' under 'config X86' and
all x86 boards will have that option, avoiding adding CONFIG_CMD_IRQ to
each of the x86 defconfig files.
This tool can help find such configs. To use it, first build a database:
./tools/moveconfig.py -b
Then try to query it:
./tools/moveconfig.py -i CONFIG_CMD_IRQ
CONFIG_CMD_IRQ found in 311/2384 defconfigs
44 : CONFIG_SYS_FSL_ERRATUM_IFC_A002769
41 : CONFIG_SYS_FSL_ERRATUM_A007075
31 : CONFIG_SYS_FSL_DDR_VER_44
28 : CONFIG_ARCH_P1010
28 : CONFIG_SYS_FSL_ERRATUM_P1010_A003549
28 : CONFIG_SYS_FSL_ERRATUM_SEC_A003571
28 : CONFIG_SYS_FSL_ERRATUM_IFC_A003399
25 : CONFIG_SYS_FSL_ERRATUM_A008044
22 : CONFIG_ARCH_P1020
21 : CONFIG_SYS_FSL_DDR_VER_46
20 : CONFIG_MAX_PIRQ_LINKS
20 : CONFIG_HPET_ADDRESS
20 : CONFIG_X86
20 : CONFIG_PCIE_ECAM_SIZE
20 : CONFIG_IRQ_SLOT_COUNT
20 : CONFIG_I8259_PIC
20 : CONFIG_CPU_ADDR_BITS
20 : CONFIG_RAMBASE
20 : CONFIG_SYS_FSL_ERRATUM_A005871
20 : CONFIG_PCIE_ECAM_BASE
20 : CONFIG_X86_TSC_TIMER
20 : CONFIG_I8254_TIMER
20 : CONFIG_CMD_GETTIME
19 : CONFIG_SYS_FSL_ERRATUM_A005812
18 : CONFIG_X86_RUN_32BIT
17 : CONFIG_CMD_CHIP_CONFIG
...
This shows a list of config options which might imply CONFIG_CMD_EEPROM along
with how many defconfigs they cover. From this you can see that CONFIG_X86
implies CONFIG_CMD_EEPROM. Therefore, instead of adding CONFIG_CMD_EEPROM to
the defconfig of every x86 board, you could add a single imply line to the
Kconfig file:
config X86
bool "x86 architecture"
...
imply CMD_EEPROM
That will cover 20 defconfigs. Many of the options listed are not suitable as
they are not related. E.g. it would be odd for CONFIG_CMD_GETTIME to imply
CMD_EEPROM.
Using this search you can reduce the size of moveconfig patches.
You can automatically add 'imply' statements in the Kconfig with the -a
option:
./tools/moveconfig.py -s -i CONFIG_SCSI \
-a CONFIG_ARCH_LS1021A,CONFIG_ARCH_LS1043A
This will add 'imply SCSI' to the two CONFIG options mentioned, assuming that
the database indicates that they do actually imply CONFIG_SCSI and do not
Loading
Loading full blame...