In my quest to automate the testing of the Linux Kernel, I need to automate the build of the Linux Kernel. To build the Kernel, you need the requisite packages. What are they? Let’s find out.
I am staring with a Baremetal Fedora Image. It has 344 packages installed already. I’m going to assume that this set is available when I do my automated build as well, or that the needed packages will get pulled in by dependencies. If not, I will find out when my automation fails to run and I will add them at that point.
Most Fedora and CentOS based documents on building the Kernel have you do a group install of the “Development Tools” yum package group. I don’t want to do this for two reasons. First, I want to use the beaker format which just lists the packages in the job description. Second, I want to minimize the non-required packages, and Development Tools is general purpose group for coding; not everyone needs everythingm, and I don’t want to put non-essential packages on the system.
In order to build the linux Kernel, I need to get the code on the server. While I could push it from a remote system, if I want to run this from a beaker job, I will have no machine that can push it. Thus, I will start by installing git.
sudo yum install git |
That installs 66 Packages and takes Installed size: 58 MB of space.
Next I clone the Linux kernel tree. I am using https://gitlab.com/linux-kernel/linux, but you can do the same thing from the kernel.org Repo or one of the other public git mirrors. This is quite large and takes a while.
Receiving objects: 100% (8358688/8358688), 1.51 GiB | 20.57 MiB/s, done. |
I’m going to use an existing config file to make the old configuration into my new one.
$ make olddefconfig -bash: make: command not found |
OK, first missing package. make pulls in libtool-ltdl and guile22
$ make olddefconfig HOSTCC scripts/basic/fixdep /bin/sh: line 1: gcc: command not found make[1]: *** [scripts/Makefile.host:95: scripts/basic/fixdep] Error 127 make: *** [Makefile:552: scripts_basic] Error 2 |
gcc. No Suprise there. That pulls in 17 packages.
$ make olddefconfig HOSTCC scripts/basic/fixdep HOSTCC scripts/kconfig/conf.o HOSTCC scripts/kconfig/confdata.o HOSTCC scripts/kconfig/expr.o LEX scripts/kconfig/lexer.lex.c /bin/sh: line 1: flex: command not found make[1]: *** [scripts/Makefile.host:9: scripts/kconfig/lexer.lex.c] Error 127 make: *** [Makefile:616: olddefconfig] Error 2 |
flex also pulls in m4
$ make olddefconfig LEX scripts/kconfig/lexer.lex.c YACC scripts/kconfig/parser.tab.[ch] /bin/sh: line 1: bison: command not found make[1]: *** [scripts/Makefile.host:17: scripts/kconfig/parser.tab.h] Error 127 make: *** [Makefile:616: olddefconfig] Error 2 |
bison
That gets through the config build process. Lets checkout the main compile. To speed things up, I compile with 1 thread per CPU:
make -j 32 |
scripts/sign-file.c:25:10: fatal error: openssl/opensslv.h: No such file or directory 25 | #include <openssl/opensslv.h> | ^~~~~~~~~~~~~~~~~~~~ compilation terminated. make[1]: *** [scripts/Makefile.host:95: scripts/sign-file] Error 1 make: *** [Makefile:1203: scripts] Error 2 |
I’m sure there were flamewars about including cryptography in the Linux Kernel. openssl-devel
/bin/sh: line 1: bc: command not found make[1]: *** [Kbuild:24: include/generated/timeconst.h] Error 127 make[1]: *** Waiting for unfinished jobs.... make: *** [Makefile:1219: prepare0] Error 2 |
bc
main.c:55:10: fatal error: libelf.h: No such file or directory 55 | #include <libelf.h> | ^~~~~~~~~~ |
elfutils-libelf-devel
. And with that, the make process completes successfully. Lets’ now make the modules.
That works, too.
So the minimal list for compile is
elfutils-libelf-devel
openssl-devel
- bison
- flex
- gcc
- make
To install the dependencies in order to build the kernel just do: `yum builddep kernel`
If you have an RPM, yes. But what if you only have the raw Kernel sources? I’m doing a minimal build based on a git checkout of the Kernel tree.
And…sometimes it is good to check your assumptions, as I am doing in this post.