Re: diet-kconfig: a script to trim unneeded kconfigs

Takashi Iwai
2008-09-18T20:09:27Z

At Thu, 18 Sep 2008 16:01:50 +0200,
Giacomo A. Catenazzi wrote:
>
> Takashi Iwai wrote:
> > Hi,
> >
> > a topic that just came up in kernel summit is a script to remove
> > unneeded kernel configs automatically to reduce the compile time.
> > Incidentally, I already wrote such a script during the last SUSE hack
> > week a couple of weeks ago, so I'd like to share here, hopefully to
> > give an idea for further improvements.
> >
> > The script checks the currently loaded modules and trims other
> > CONFIG_XXX=m simply, and tries make oldconfig, and writes out the
> > resultant .config in the current directory after some checks.
> > You can specify the config file via option, as default, it reads from
> > /proc/config.gz.
> >
> > The script is VERY hackish. I should have begun with perl or whatever
> > better script language, but I chose bash and co. So, don't expect
> > much code quality. I'm no script guy after all :)
>
> Check my AutoKernConf (http://cateee.net/autokernconf/), it has
> huge (and automatically generated) database about drivers, modules,
> and configuration, and it gives a minimal kernel configuration for the
> most of the hardware hardware.
>
> It needs a real maintainer and tools for non-hardware drivers
> (fs, net, ...) and special hardware (CPU capabilities,
> architecture specific drivers, etc).

Thanks, this looks good. Nice to see other people already working
on a similar issue.

> > subarch=$(uname -i)
>
> -i is wrong (gives "unkwnown" on Debian).
> Check the main Makefile how to extract the architecture from uname.

Oh yeah, another hackish thing...

> > c)
> > oldconfig="$OPTARG"
> > if [ ! -f "$oldconfig" ]; then
> > echo "Cannot find old config $oldconfig"
> > exit 1
> > fi
>
> Check also the config-* in /boot

OK, such distro specific things have to be handled better. I didn't
know of /boot/config-* at all.

OTOH, if /proc/config.gz exists, it's the right place to see because
of an obvious reason. So, checking other paths should be a kind of
fallback.

> > find_kconfig () {
> > module=$1
> > modregex=$(echo $1 | sed -e's/_/[_-]/g')
> >
> > grep -E '^[[:space:]]*obj-\$\([A-Za-z0-9_]*\)[[:space:]]*[+:]=.*[[:space:]]'"$modregex"'\.o' $tmpd/makefiles | \
> > sed -e's/^.*://g' -e's/^[[:space:]]*obj-\$(\(.*\)).*$/\1/g'
> > }
>
> My python code works better (handle "alias", etc.).

We don't need to handle alias because the whole module names
come from lsmod output. That's so simple.
OTOH, I don't think the parsing in my script is perfect at all,
though. It's a result of one or two hours hack.
Improving that function a bit more robust would be pretty helpful.

Regarding the kernel config database: it's nice, indeed.
But, I don't think the whole database is required for the task I tried
to achieve. It wasn't intended to create a kernel config from
scratch. It's not necessarily the absolute minimum. Instead, it just
trims the unnecessary module builds. For that purpose, the database
is not needed by assumption of the all required modules have been
loaded. This is rather a safer option than creating a minimum kconfig
from scratch.

thanks,

Takashi