
In this document you will find information about:
- how to build external modules
- how to make your module use the kbuild infrastructure
- how kbuild will install a kernel
- how to install modules in a non-standard location

=== Table of Contents

	=== 1 Introduction
	=== 2 How to build external modules
	   --- 2.1 Building external modules
	   --- 2.2 Available targets
	   --- 2.3 Available options
	   --- 2.4 Preparing the kernel tree for module build
	   --- 2.5 Building separate files for a module
	=== 3. Example commands
	=== 4. Creating a kbuild file for an external module
	=== 5. Include files
	   --- 5.1 How to include files from the kernel include dir
	   --- 5.2 External modules using an include/ dir
	   --- 5.3 External modules using several directories
	=== 6. Module installation
	   --- 6.1 INSTALL_MOD_PATH
	   --- 6.2 INSTALL_MOD_DIR
	=== 7. Module versioning & Module.symvers
	   --- 7.1 Symbols from the kernel (vmlinux + modules)
	   --- 7.2 Symbols and external modules
	   --- 7.3 Symbols from another external module
	=== 8. Tips & Tricks
	   --- 8.1 Testing for CONFIG_FOO_BAR



=== 1. Introduction

kbuild includes functionality for building modules both
within the kernel source tree and outside the kernel source tree.
The latter is usually referred to as external or "out-of-tree"
modules and is used both during development and for modules that
are not planned to be included in the kernel tree.

What is covered within this file is mainly information to authors
of modules. The author of an external module should supply
a makefile that hides most of the complexity, so one only has to type
'make' to build the module. A complete example will be presented in
chapter 4, "Creating a kbuild file for an external module".


=== 2. How to build external modules

kbuild offers functionality to build external modules, with the
prerequisite that there is a pre-built kernel available with full source.
A subset of the targets available when building the kernel is available
when building an external module.

--- 2.1 Building external modules

	Use the following command to build an external module:

		make -C <path-to-kernel> M=`pwd`

	For the running kernel use:

		make -C /lib/modules/`uname -r`/build M=`pwd`

	For the above command to succeed, the kernel must have been
	built with modules enabled.

	To install the modules that were just built:

		make -C <path-to-kernel> M=`pwd` modules_install

	More complex examples will be shown later, the above should
	be enough to get you started.

--- 2.2 Available targets

	$KDIR refers to the path to the kernel source top-level directory

	make -C $KDIR M=`pwd`
		Will build the module(s) located in current directory.
		All output files will be located in the same directory
		as the module source.
		No attempts are made to update the kernel source, and it is
		a precondition that a successful make has been executed
		for the kernel.

	make -C $KDIR M=`pwd` modules
		The modules target is implied when no target is given.
		Same functionality as if no target was specified.
		See description above.

	make -C $KDIR M=`pwd` modules_install
		Install the external module(s).
		Installation default is in /lib/modules/<kernel-version>/extra,
		but may be prefixed with INSTALL_MOD_PATH - see separate
		chapter.

	make -C $KDIR M=`pwd` clean
		Remove all generated files for the module - the kernel
		source directory is not modified.

	make -C $KDIR M=`pwd` help
		help will list the available target when building external
		modules.

--- 2.3 Available options:

	$KDIR refers to the path to the kernel source top-level directory

	make -C $KDIR
		Used to specify where to find the kernel source.
		'$KDIR' represent the directory where the kernel source is.
		Make will actually change directory to the specified directory
		when executed but change back when finished.

	make -C $KDIR M=`pwd`
		M= is used to tell kbuild that an external module is
		being built.
		The option given to M= is the directory where the external
		module (kbuild file) is located.
		When an external module is being built only a subset of the
		usual targets are available.

	make -C $KDIR SUBDIRS=`pwd`
		Same as M=. The SUBDIRS= syntax is kept for backwards
		compatibility.

--- 2.4 Preparing the kernel tree for module build

	To make sure the kernel contains the information required to
	build external modules the target 'modules_prepare' must be used.
	'modules_prepare' exists solely as a simple way to prepare
	a kernel source tree for building external modules.
	Note: modules_prepare will not build Module.symvers even if
	CONFIG_MODVERSIONS is set. Therefore a full kernel build
	needs to be executed to make module versioning work.

--- 2.5 Building separate files for a module
	It is possible to build single files which are part of a module.
	This works equally well for the kernel, a module and even for
	external modules.
	Examples (module foo.ko, consist of bar.o, baz.o):
		make -C $KDIR M=`pwd` bar.lst
		make -C $KDIR M=`pwd` bar.o
		make -C $KDIR M=`pwd` foo.ko
		make -C $KDIR M=`pwd` /


=== 3. Example commands

This example shows the actual commands to be executed when building
an external module for the currently running kernel.
In the example below, the distribution is supposed to use the
facility to locate output files for a kernel compile in a different
directory than the kernel source - but the examples will also work
when the source and the output files are mixed in the same directory.

# Kernel source
/lib/modules/<kernel-version>/source -> /usr/src/linux-<version>

# Output from kernel compile
/lib/modules/<kernel-version>/build -> /usr/src/linux-<version>-up

Change to the directory where the kbuild file is located and execute
the following commands to build the module:

	cd /home/user/src/module
	make -C /usr/src/`uname -r`/source            \
	        O=/lib/modules/`uname-r`/build        \
	        M=`pwd`

Then, to install the module use the following command:

	make -C /usr/src/`uname -r`/source            \
	        O=/lib/modules/`uname-r`/build        \
	        M=`pwd`                               \
		modules_install

If you look closely you will see that this is the same command as
listed before - with the directories spelled out.

The above are rather long commands, and the following chapter
lists a few tricks to make it all easier.


=== 4. Creating a kbuild file for an external module

kbuild is the build system for the kernel, and external modules
must use kbuild to stay compatible with changes in the build system
and to pick up the right flags to gcc etc.

The kbuild file used as input shall follow the syntax described
in Documentation/kbuild/makefiles.txt. This chapter will introduce a few
more tricks to be used when dealing with external modules.

In the following a Makefile will be created for a module with the
following files:
	8123_if.c
	8123_if.h
	8123_pci.c
	8123_bin.o_shipped	<= Binary blob

--- 4.1 Shared Makefile for module and kernel

	An external module always includes a wrapper Makefile supporting
	building the module using 'make' with no arguments.
	The Makefile provided will most likely include additional
	functionality such as test targets etc. and this part shall
	be filtered away from kbuild since it may impact kbuild if
	name clashes occurs.

	Example 1:
		--> filename: Makefile
		ifneq ($(KERNELRELEASE),)
		# kbuild part of makefile
		obj-m  := 8123.o
		8123-y := 8123_if.o 8123_pci.o 8123_bin.o

		else
		# Normal Makefile

		KERNELDIR := /lib/modules/`uname -r`/build
		all::
			$(MAKE) -C $(KERNELDIR) M=`pwd` $@

		# Module specific targets
		genbin:
			echo "X" > 8123_bin.o_shipped

		endif

	In example 1, the check for KERNELRELEASE is used to separate
	the two parts of the Makefile. kbuild will only see the two
	assignments whereas make will see everything except the two
	kbuild assignments.

	In recent versions of the kernel, kbuild will look for a file named
	Kbuild and as second option look for a file named Makefile.
	Utilising the Kbuild file makes us split up the Makefile in example 1
	into two files as shown in example 2:

	Example 2:
		--> filename: Kbuild
		obj-m  := 8123.o
		8123-y := 8123_if.o 8123_pci.o 8123_bin.o

		--> filename: Makefile
		KERNELDIR := /lib/modules/`uname -r`/build
		all::
			$(MAKE) -C $(KERNELDIR) M=`pwd` $@

		# Module specific targets
		genbin:
			echo "X" > 8123_bin.o_shipped


	In example 2, we are down to two fairly simple files and for simple
	files as used in this example the split is questionable. But some
	external modules use Makefiles of several hundred lines and here it
	really pays off to separate the kbuild part from the rest.
	Example 3 shows a backward compatible version.

	Example 3:
		--> filename: Kbuild
		obj-m  := 8123.o
		8123-y := 8123_if.o 8123_pci.o 8123_bin.o

		--> filename: Makefile
		ifneq ($(KERNELRELEASE),)
		include Kbuild
		else
		# Normal Makefile

		KERNELDIR := /lib/modules/`uname -r`/build
		all::
			$(MAKE) -C $(KERNELDIR) M=`pwd` $@

		# Module specific targets
		genbin:
			echo "X" > 8123_bin.o_shipped

		endif

	The trick here is to include the Kbuild file from Makefile, so
	if an older version of kbuild picks up the Makefile, the Kbuild
	file will be included.

--- 4.2 Binary blobs included in a module

	Some external modules needs to include a .o as a blob. kbuild
	has support for this, but requires the blob file to be named
	<filename>_shipped. In our example the blob is named
	8123_bin.o_shipped and when the kbuild rules kick in the file
	8123_bin.o is created as a simple copy off the 8213_bin.o_shipped file
	with the _shipped part stripped of the filename.
	This allows the 8123_bin.o filename to be used in the assignment to
	the module.

	Example 4:
		obj-m  := 8123.o
		8123-y := 8123_if.o 8123_pci.o 8123_bin.o

	In example 4, there is no distinction between the ordinary .c/.h files
	and the binary file. But kbuild will pick up different rules to create
	the .o file.


=== 5. Include files

Include files are a necessity when a .c file uses something from other .c
files (not strictly in the sense of C, but if good programming practice is
used). Any module that consists of more than one .c file will have a .h file
for one of the .c files.

- If the .h file only describes a module internal interface, then the .h file
  shall be placed in the same directory as the .c files.
- If the .h files describe an interface used by other parts of the kernel
  located in different directories, the .h files shall be located in
  include/linux/ or other include/ directories as appropriate.

One exception for this rule is larger subsystems that have their own directory
under include/ such as include/scsi. Another exception is arch-specific
.h files which are located under include/asm-$(ARCH)/*.

External modules have a tendency to locate include files in a separate include/
directory and therefore need to deal with this in their kbuild file.

--- 5.1 How to include files from the kernel include dir

	When a module needs to include a file from include/linux/, then one
	just uses:

		#include <linux/modules.h>

	kbuild will make sure to add options to gcc so the relevant
	directories are searched.
	Likewise for .h files placed in the same directory as the .c file.

		#include "8123_if.h"

	will do the job.

--- 5.2 External modules using an include/ dir

	External modules often locate their .h files in a separate include/
	directory although this is not usual kernel style. When an external
	module uses an include/ dir then kbuild needs to be told so.
	The trick here is to use either EXTRA_CFLAGS (take effect for all .c
	files) or CFLAGS_$F.o (take effect only for a single file).

	In our example, if we move 8123_if.h to a subdirectory named include/
	the resulting Kbuild file would look like:

		--> filename: Kbuild
		obj-m  := 8123.o

		EXTRA_CFLAGS := -Iinclude
		8123-y := 8123_if.o 8123_pci.o 8123_bin.o

	Note that in the assignment there is no space between -I and the path.
	This is a kbuild limitation:  there must be no space present.

--- 5.3 External modules using several directories

	If an external module does not follow the usual kernel style, but
	decides to spread files over several directories, then kbuild can
	handle this too.

	Consider the following example:

	|
	+- src/complex_main.c
	|   +- hal/hardwareif.c
	|   +- hal/include/hardwareif.h
	+- include/complex.h

	To build a single module named complex.ko, we then need the following
	kbuild file:

	Kbuild:
		obj-m := complex.o
		complex-y := src/complex_main.o
		complex-y += src/hal/hardwareif.o

		EXTRA_CFLAGS := -I$(src)/include
		EXTRA_CFLAGS += -I$(src)src/hal/include


	kbuild knows how to handle .o files located in another directory -
	although this is NOT recommended practice. The syntax is to specify
	the directory relative to the directory where the Kbuild file is
	located.

	To find the .h files, we have to explicitly tell kbuild where to look
	for the .h files. When kbuild executes, the current directory is always
	the root of the kernel tree (argument to -C) and therefore we have to
	tell kbuild how to find the .h files using absolute paths.
	$(src) will specify the absolute path to the directory where the
	Kbuild file are located when being build as an external module.
	Therefore -I$(src)/ is used to point out the directory of the Kbuild
	file and any additional path are just appended.

=== 6. Module installation

Modules which are included in the kernel are installed in the directory:

	/lib/modules/$(KERNELRELEASE)/kernel

External modules are installed in the directory:

	/lib/modules/$(KERNELRELEASE)/extra

--- 6.1 INSTALL_MOD_PATH

	Above are the default directories, but as always, some level of
	customization is possible. One can prefix the path using the variable
	INSTALL_MOD_PATH:

		$ make INSTALL_MOD_PATH=/frodo modules_install
		=> Install dir: /frodo/lib/modules/$(KERNELRELEASE)/kernel

	INSTALL_MOD_PATH may be set as an ordinary shell variable or as in the
	example above, can be specified on the command line when calling make.
	INSTALL_MOD_PATH has effect both when installing modules included in
	the kernel as well as when installing external modules.

--- 6.2 INSTALL_MOD_DIR

	When installing external modules they are by default installed to a
	directory under /lib/modules/$(KERNELRELEASE)/extra, but one may wish
	to locate modules for a specific functionality in a separate
	directory. For this purpose, one can use INSTALL_MOD_DIR to specify an
	alternative name to 'extra'.

		$ make INSTALL_MOD_DIR=gandalf -C KERNELDIR \
			M=`pwd` modules_install
		=> Install dir: /lib/modules/$(KERNELRELEASE)/gandalf


=== 7. Module versioning & Module.symvers

Module versioning is enabled by the CONFIG_MODVERSIONS tag.

Module versioning is used as a simple ABI consistency check. The Module
versioning creates a CRC value of the full prototype for an exported symbol and
when a module is loaded/used then the CRC values contained in the kernel are
compared with similar values in the module. If they are not equal, then the
kernel refuses to load the module.

Module.symvers contains a list of all exported symbols from a kernel build.

--- 7.1 Symbols from the kernel (vmlinux + modules)

	During a kernel build, a file named Module.symvers will be generated.
	Module.symvers contains all exported symbols from the kernel and
	compiled modules. For each symbols, the corresponding CRC value
	is stored too.

	The syntax of the Module.symvers file is:
		<CRC>       <Symbol>           <module>
	Sample:
		0x2d036834  scsi_remove_host   drivers/scsi/scsi_mod

	For a kernel build without CONFIG_MODVERSIONS enabled, the crc
	would read: 0x00000000

	Module.symvers serves two purposes:
	1) It lists all exported symbols both from vmlinux and all modules
	2) It lists the CRC if CONFIG_MODVERSIONS is enabled

--- 7.2 Symbols and external modules

	When building an external module, the build system needs access to
	the symbols from the kernel to check if all external symbols are
	defined. This is done in the MODPOST step and to obtain all
	symbols, modpost reads Module.symvers from the kernel.
	If a Module.symvers file is present in the directory where
	the external module is being built, this file will be read too.
	During the MODPOST step, a new Module.symvers file will be written
	containing all exported symbols that were not defined in the kernel.

--- 7.3 Symbols from another external module

	Sometimes, an external module uses exported symbols from another
	external module. Kbuild needs to have full knowledge on all symbols
	to avoid spitting out warnings about undefined symbols.
	Three solutions exist to let kbuild know all symbols of more than
	one external module.
	The method with a top-level kbuild file is recommended but may be
	impractical in certain situations.

	Use a top-level Kbuild file
		If you have two modules: 'foo' and 'bar', and 'foo' needs
		symbols from 'bar', then one can use a common top-level kbuild
		file so both modules are compiled in same build.

		Consider following directory layout:
		./foo/ <= contains the foo module
		./bar/ <= contains the bar module
		The top-level Kbuild file would then look like:

		#./Kbuild: (this file may also be named Makefile)
			obj-y := foo/ bar/

		Executing:
			make -C $KDIR M=`pwd`

		will then do the expected and compile both modules with full
		knowledge on symbols from both modules.

	Use an extra Module.symvers file
		When an external module is built, a Module.symvers file is
		generated containing all exported symbols which are not
		defined in the kernel.
		To get access to symbols from module 'bar', one can copy the
		Module.symvers file from the compilation of the 'bar' module
		to the directory where the 'foo' module is built.
		During the module build, kbuild will read the Module.symvers
		file in the directory of the external module and when the
		build is finished, a new Module.symvers file is created
		containing the sum of all symbols defined and not part of the
		kernel.

	Use make variable KBUILD_EXTRA_SYMBOLS in the Makefile
		If it is impractical to copy Module.symvers from another
		module, you can assign a space separated list of files to
		KBUILD_EXTRA_SYMBOLS in your Makfile. These files will be
		loaded by modpost during the initialisation of its symbol
		tables.

=== 8. Tips & Tricks

--- 8.1 Testing for CONFIG_FOO_BAR

	Modules often need to check for certain CONFIG_ options to decide if
	a specific feature shall be included in the module. When kbuild is used
	this is done by referencing the CONFIG_ variable directly.

		#fs/ext2/Makefile
		obj-$(CONFIG_EXT2_FS) += ext2.o

		ext2-y := balloc.o bitmap.o dir.o
		ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o

	External modules have traditionally used grep to check for specific
	CONFIG_ settings directly in .config. This usage is broken.
	As introduced before, external modules shall use kbuild when building
	and therefore can use the same methods as in-kernel modules when
	testing for CONFIG_ definitions.

