Kernel configuration is a little complicated in Chromium OS. There are a number of different kernels based on architecture (x86_64, arm64) variants (generic, rockchip) and platforms (Seaboard, Mario). We want to split the config into a sort of hierarchy so that the common options are shared between the variants (click to enlarge):
Shown here are 6 flavours, three for ARM and three for Intel (it is not clear why flavours is spelt the British way).
We need to be able to do the following:
Scripts to deal with the kernel configuration are in the chromeos/scripts directory. A partial listing is shown below:
$ ls chromeos/scripts/ kernelconfig prepareconfig splitconfig
This script deals with each separate flavour in turn, performing the selected operations. It starts by building the config for each flavour, does the operations, and afterwards it splits the flavour configs back into the proper hierarchy. It supports four operations
There is a bit of a problem with kernelconfig. If you want to change a kernel option which is common to all flavours, for example, then you must change it once for each flavour using ‘kernelconfig editconfig’. At the moment this is ~10 times! If you miss one, then the result may be no change which can be very confusing. See below for another approach.
This is used to prepare the config for a particular flavour. It assembles the default config for the flavour. This is useful when starting development on a board and you want to build in-tree:
./chromeos/scripts/prepareconfig chromeos-tegra2 export ARCH=arm export CROSS_COMPILE=armv7a-cros-linux-gnueabi- make olddefconfig #(to pick up new options, if any) make ...
This script is used in the emerge. An example resulting string is ‘Ubuntu 2.6.32-0.1-chromeos-tegra2’.
This takes all config.* files in the currect directory and works out the common options in each. It writes these to config.common, then generates new config.* files (overwriting the original ones) with these common options removed. As a side effect, all config options will be in sorted order.
This script is used by kernelconfig to extract the common options for an architecture, then again on a second level to extract the common options for Chromium OS.
This script isn‘t really meant to be run on its own, it’s a helper function.
The kernel config is split into several config files - generic, chrome-specific, architecture-specific and board specific. Automatic tools split and combine these configs.
If you want to edit the configuration for a particular board etc. then you need to do something like:
$ cd .../src/third_party/kernel/v$VER/ $ ./chromeos/scripts/kernelconfig editconfig
The exact value for $VER depends on your board as each one is different. You can find that out by seeing what version by running `emerge-$BOARD -pv virtual/linux-sources`
.
This will run ‘make menuconfig’ for each part of the config.
You need to figure out which part your config options appear in, and then make the changes when that config comes up. When it says ‘press a key’, you have to press <enter>.
Run editconfig to modify each config appropriately using menuconfig and then regenerate the splitconfigs. The editconfig script will run “make menuconfig” on each flavor config. Please make appropriate changes for each menuconfig run and the script will generate the correct splitconfig.
cd /path/to/kernel chromeos/scripts/kernelconfig editconfig # regenerate splitconfig
This is a little faster if you know what you're doing:
$ grep -rs CONFIG_NETWORK_FILESYSTEMS chromeos/config/ chromeos/config/base.config:# CONFIG_NETWORK_FILESYSTEMS is not set
chromeos/config/base.config
to change the config like this:$ chromeos/scripts/kernelconfig olddefconfig
If you find that during that last step, your configs are disappearing, then you‘ve likely enabled a config without enabling all of its dependencies. You’ll need to either 1) track down those dependencies and enable them as well, or 2) Use the editconfig method mentioned above.
This might not be useful, but:
# get full flavour config sorted, without leading # FLAVOUR=chromeos-tegra2 cat chromeos/config/base.config \ chromeos/config/armel/common.config \ chromeos/config/armel/$FLAVOUR.flavour.config | \ grep CONFIG_ | sed "s/.*CONFIG/CONFIG/" | sort -u >1.emerge # purify .config in the same way
make ARCH=${kernarch} savedefconfig
# compare diff 1.emerge defconfig
Here is how to build the kernel yourself manually, from within the chroot.
Make sure you have done something like:
export B="tegra2_seaboard" export ARCH=arm export CROSS_COMPILE=armv7a-cros-linux-gnueabi- # indicate that you are making kernel changes
cros_workon --board=$B start sys-kernel/chromeos-kernel-$VER
The exact value for $VER depends on your board as each one is different. You can find that out by seeing what version by running `emerge-$BOARD -pv virtual/linux-sources`
.
As you probably know, the cros_workon start
tells the build system to use your local source install of the official source. Then set up the config:
# set up the .config file ./chromeos/scripts/prepareconfig chromeos-tegra2 make olddefconfig # edit config make menuconfig # (make your changes)
Now, after you make a kernel change, you can simply type make
as normal:
# build the kernel and modules make # or maybe: build the uImage on an 8 core machine make -j10 uImage # or both! make && make uImage
Run olddefconfig to regenerate the splitconfigs. The olddefconfig script will run “make olddefconfig” on each flavor config.
cd ~/trunk/src/third_party/kernel/v$VER chromeos/scripts/kernelconfig olddefconfig # regenerate splitconfig
Copy the new config to the appropriate place in the chromeos/config and then run oldconfig
cd ~/trunk/src/third_party/kernel/v$VER cp config.flavour.chromeos-new .config make ARCH=${ARCH} olddefconfig cp .config chromeos/config/<arch>/<flavour>.flavour.config chromeos/scripts/kernelconfig olddefconfig # regenerate splitconfig
cd ~/trunk/src/third_party/kernel/v$VER find chromeos/config -name \*.flavour.config
cd ~/trunk/src/third_party/kernel/v$VER cp <single config> chromeos/config/<arch>/<flavour>.flavour.config chromeos/scripts/kernelconfig olddefconfig chromeos/scripts/prepareconfig <flavour> make ARCH=${ARCH} oldconfig diff .config <single config>