Note: This article applies only to distortos v0.1.0 – v0.6.0.
Preparing kconfig-frontends for Linux is a fast and simple process, similar (if not identical) to preparation of any software using autotools. Typically the whole process will require you to only download the source tarball, extract it somewhere and run ./configure && make && sudo make install
in extracted folder. But if you want to understand what exactly is going on or if you have some problems with this simplistic approach – read on, as the rest of this article will go into the details of the process.
0. Prerequisites
kconfig-frontends has a few dependencies, which may already be present on your system. If they are not, make sure to install them before proceeding. Generally – apart from the obvious things like make, gcc, binutils and coreutils – you need:
- autoconf (optional),
- bison or yacc,
- curl (optional),
- flex,
- gawk,
- gperf,
- ncurses library,
- patch (optional),
- tar (optional).
1. Download and extract the source tarball
This step is pretty obvious and requires no detailed explanation. Just open your shell and execute following commands.
$ curl -O http://ymorin.is-a-geek.org/download/kconfig-frontends/kconfig-frontends-3.12.0.0.tar.xz $ tar -xf kconfig-frontends-3.12.0.0.tar.xz
Alternatively you can do the same by opening project’s website, downloading latest release with your browser and extracting it anywhere using the tools available in your system.
Before proceeding with the following steps, cd
into the extracted kconfig-frontends package with your shell.
$ cd kconfig-frontends-3.12.0.0
2. Patch (optional)
If your system has gperf 3.0.4 or earlier, you may safely skip this chapter.
gperf 3.1 (released on 5th January of 2017) changed the type used as length argument in generated functions from unsigned int
to size_t
. This will cause your build to fail with following error message:
CC libkconfig_parser_la-yconf.lo In file included from yconf.c:234:0: hconf.gperf:141:1: error: conflicting types for 'kconf_id_lookup' hconf.gperf:12:31: note: previous declaration of 'kconf_id_lookup' was here static const struct kconf_id *kconf_id_lookup(register const char *str, register unsigned int len); ^~~~~~~~~~~~~~~ make[3]: *** [Makefile:456: libkconfig_parser_la-yconf.lo] Error 1 make[2]: *** [Makefile:350: all] Error 2 make[1]: *** [Makefile:334: all-recursive] Error 1 make: *** [Makefile:385: all-recursive] Error 1
The procedure to fix it is pretty straightforward – it requires patching kconfig-frontends and regenerating configure & build scripts.
First download the patch file using curl.
$ curl -O https://gist.githubusercontent.com/KamilSzczygiel/d16a5d88075939578f7bd8fadd0907aa/raw/1928495cfb6a6141365d545a23d66203222d28c0/kconfig-frontends.patch
We can now apply the patch to the kconfig-frontends.
$ patch -p1 -i kconfig-frontends.patch
As the patch modifies sources of configuration and build files, they have to be regenerated.
$ autoreconf -fi
3. Configure
kconfig-frontend‘s configure script has a lot of options – if you are very curious, just execute ./configure --help
. Below I’ll cover only the most important ones.
The first thing you should know is that there are multiple frontends available in the kconfig-frontends package:
- conf – which is a “frontend” using only stdin and stdout, it asks you a question and you answer it with your keyboard by pressing y, n, 0, 1, etc., it can also be used to update existing configurations with default values of all new options;
- mconf – which is the “traditional” frontend using ncurses;
- nconf – “modern” frontend using ncurses;
- gconf – graphical frontend using GTK+ libraries;
- qconf – graphical frontend using Qt libraries;
For distortos you only need conf and mconf, so its a good idea to explicitly enable them in configure script with --enable-conf --enable-mconf
. This way configure script will quit with an error if it’s not possible to build them – possibly due to missing dependency, which should tell you which one it was. Don’t worry about other frontends – they are not required for distortos and they will still be compiled if only their dependencies are present on your system.
To make things simpler, it is a good idea to enable static linking of binaries with --disable-shared --enable-static
. This way the library which deals with parsing Kconfig files – libkconfig-parser – will be statically linked into each frontend which uses it. This obviously increases the size of compiled binaries, but we are talking about a few hundred kilobytes for each binary, so this really makes no difference nowadays (;
The last important option is --prefix
. Default value of this option is /usr/local
, which should be ok on most systems out there. If you need to adjust that, just add --prefix=/your/new/path/for/prefix
to the invocation of configure script. Do note that for the compiled files to be usable, bin/
subfolder of that path (/usr/local/bin
if you did not specify that option or /your/new/path/for/prefix/bin
otherwise) should be in the PATH environment variable of your system.
So the recommended set of options to configure kconfig-frontends for use with distortos would be:
$ ./configure --enable-conf --enable-mconf --disable-shared --enable-static
If everything worked correctly, after a few seconds you should see something like this in your console:
configure: Configured with: configure: - parser library : static configure: - root-menu prompt : Configuration configure: - config prefix : CONFIG_ configure: - frontends : conf gconf mconf nconf qconf configure: - transform name : s&^&kconfig-& configure: - localised : yes configure: - install utilities : yes configure: - CFLAGS CXXFLAGS : -Wall
The list of enabled frontends may be different, but it must have conf and mconf.
4. Compile and install
There is not much to say about last two steps – just compile and install the package in the standard way:
$ make $ sudo make install
These two steps should both take less than a minute.
At the very end you may strip the installed executables to make them smaller – this step is not required, so you may as well skip it.
$ sudo strip /usr/local/bin/kconfig-*
Obviously you need to adjust the path if you selected another one with --prefix
during package configuration.
Don’t worry if this produces a few “File format not recognized” errors – some of the files are shell scripts and cannot be stripped, this is normal and nothing to worry about.
Summary
Below you may find all shell commands listed in the paragraphs above. These should be all you need to do – just paste them into your shell, one by one.
$ curl -O http://ymorin.is-a-geek.org/download/kconfig-frontends/kconfig-frontends-3.12.0.0.tar.xz $ tar -xf kconfig-frontends-3.12.0.0.tar.xz $ cd kconfig-frontends-3.12.0.0 # -- begin optional - required only for gperf 3.1 or newer -- $ curl -O https://gist.githubusercontent.com/KamilSzczygiel/d16a5d88075939578f7bd8fadd0907aa/raw/1928495cfb6a6141365d545a23d66203222d28c0/kconfig-frontends.patch $ patch -p1 -i kconfig-frontends.patch $ autoreconf -fi # -- end optional -- $ ./configure --enable-conf --enable-mconf --disable-shared --enable-static $ make $ sudo make install $ sudo strip /usr/local/bin/kconfig-*
Hey man great catch. I saw the same issue, but soon found myself running down a rabbit chasing the references. Thank you for teaching me how to patch and to fix that error. You da best 🙂