2015-07-14 19:35:15 +02:00
|
|
|
// -*- mode:doc; -*-
|
|
|
|
// vim: set syntax=asciidoc:
|
|
|
|
|
|
|
|
[[linux-kernel-specific-infra]]
|
|
|
|
=== Infrastructure specific to the Linux kernel package
|
|
|
|
|
|
|
|
The Linux kernel package can use some specific infrastructures based on package
|
|
|
|
hooks for building Linux kernel tools or/and building Linux kernel extensions.
|
|
|
|
|
|
|
|
[[linux-kernel-tools]]
|
|
|
|
==== linux-kernel-tools
|
|
|
|
|
|
|
|
Buildroot offers a helper infrastructure to build some userspace tools
|
|
|
|
for the target available within the Linux kernel sources. Since their
|
2016-09-06 16:29:15 +02:00
|
|
|
source code is part of the kernel source code, a special package,
|
|
|
|
+linux-tools+, exists and re-uses the sources of the Linux kernel that
|
|
|
|
runs on the target.
|
2015-07-14 19:35:15 +02:00
|
|
|
|
|
|
|
Let's look at an example of a Linux tool. For a new Linux tool named
|
|
|
|
+foo+, create a new menu entry in the existing
|
2016-09-06 16:29:15 +02:00
|
|
|
+package/linux-tools/Config.in+. This file will contain the option
|
2015-07-14 19:35:15 +02:00
|
|
|
descriptions related to each kernel tool that will be used and
|
|
|
|
displayed in the configuration tool. It would basically look like:
|
|
|
|
|
|
|
|
------------------------------
|
2016-09-06 16:29:15 +02:00
|
|
|
01: config BR2_PACKAGE_LINUX_TOOLS_FOO
|
2015-07-14 19:35:15 +02:00
|
|
|
02: bool "foo"
|
2016-09-06 16:29:15 +02:00
|
|
|
03: select BR2_PACKAGE_LINUX_TOOLS
|
|
|
|
04: help
|
|
|
|
05: This is a comment that explains what foo kernel tool is.
|
|
|
|
06:
|
|
|
|
07: http://foosoftware.org/foo/
|
2015-07-14 19:35:15 +02:00
|
|
|
------------------------------
|
|
|
|
|
2016-09-06 16:29:15 +02:00
|
|
|
The name of the option starts with the prefix +BR2_PACKAGE_LINUX_TOOLS_+,
|
2015-07-14 19:35:15 +02:00
|
|
|
followed by the uppercase name of the tool (like is done for packages).
|
|
|
|
|
2016-09-06 16:29:15 +02:00
|
|
|
.Note
|
|
|
|
Unlike other packages, the +linux-tools+ package options appear in the
|
|
|
|
+linux+ kernel menu, under the `Linux Kernel Tools` sub-menu, not under
|
|
|
|
the `Target packages` main menu.
|
|
|
|
|
|
|
|
Then for each linux tool, add a new +.mk+ file named
|
|
|
|
+package/linux-tools/linux-tool-foo.mk+. It would basically look like:
|
2015-07-14 19:35:15 +02:00
|
|
|
|
|
|
|
------------------------------
|
|
|
|
01: ################################################################################
|
|
|
|
02: #
|
|
|
|
03: # foo
|
|
|
|
04: #
|
|
|
|
05: ################################################################################
|
|
|
|
06:
|
|
|
|
07: LINUX_TOOLS += foo
|
|
|
|
08:
|
|
|
|
09: FOO_DEPENDENCIES = libbbb
|
|
|
|
10:
|
|
|
|
11: define FOO_BUILD_CMDS
|
2016-09-06 16:29:15 +02:00
|
|
|
12: $(TARGET_MAKE_ENV) $(MAKE) -C $(LINUX_DIR)/tools foo
|
2015-07-14 19:35:15 +02:00
|
|
|
13: endef
|
|
|
|
14:
|
|
|
|
15: define FOO_INSTALL_STAGING_CMDS
|
2016-09-06 16:29:15 +02:00
|
|
|
16: $(TARGET_MAKE_ENV) $(MAKE) -C $(LINUX_DIR)/tools \
|
|
|
|
17: DESTDIR=$(STAGING_DIR) \
|
|
|
|
18: foo_install
|
2015-07-14 19:35:15 +02:00
|
|
|
19: endef
|
|
|
|
20:
|
|
|
|
21: define FOO_INSTALL_TARGET_CMDS
|
2016-09-06 16:29:15 +02:00
|
|
|
22: $(TARGET_MAKE_ENV) $(MAKE) -C $(LINUX_DIR)/tools \
|
|
|
|
23: DESTDIR=$(TARGET_DIR) \
|
|
|
|
24: foo_install
|
2015-07-14 19:35:15 +02:00
|
|
|
25: endef
|
|
|
|
--------------------------------
|
|
|
|
|
|
|
|
On line 7, we register the Linux tool +foo+ to the list of available
|
|
|
|
Linux tools.
|
|
|
|
|
|
|
|
On line 9, we specify the list of dependencies this tool relies on. These
|
|
|
|
dependencies are added to the Linux package dependencies list only when the
|
|
|
|
+foo+ tool is selected.
|
|
|
|
|
|
|
|
The rest of the Makefile, lines 11-25 defines what should be done at the
|
|
|
|
different steps of the Linux tool build process like for a
|
|
|
|
xref:generic-package-tutorial[+generic package+]. They will actually be
|
|
|
|
used only when the +foo+ tool is selected. The only supported commands are
|
|
|
|
+_BUILD_CMDS+, +_INSTALL_STAGING_CMDS+ and +_INSTALL_TARGET_CMDS+.
|
|
|
|
|
|
|
|
.Note
|
|
|
|
One *must not* call +$(eval $(generic-package))+ or any other
|
|
|
|
package infrastructure! Linux tools are not packages by themselves,
|
2016-09-06 16:29:15 +02:00
|
|
|
they are part of the +linux-tools+ package.
|
2015-07-14 19:35:15 +02:00
|
|
|
|
|
|
|
[[linux-kernel-ext]]
|
|
|
|
==== linux-kernel-extensions
|
|
|
|
|
|
|
|
Some packages provide new features that require the Linux kernel tree
|
|
|
|
to be modified. This can be in the form of patches to be applied on
|
|
|
|
the kernel tree, or in the form of new files to be added to the
|
|
|
|
tree. The Buildroot's Linux kernel extensions infrastructure provides
|
|
|
|
a simple solution to automatically do this, just after the kernel
|
|
|
|
sources are extracted and before the kernel patches are
|
|
|
|
applied. Examples of extensions packaged using this mechanism are the
|
|
|
|
real-time extensions Xenomai and RTAI, as well as the set of
|
|
|
|
out-of-tree LCD screens drivers +fbtft+.
|
|
|
|
|
|
|
|
Let's look at an example on how to add a new Linux extension +foo+.
|
|
|
|
|
|
|
|
First, create the package +foo+ that provides the extension: this
|
|
|
|
package is a standard package; see the previous chapters on how to
|
|
|
|
create such a package. This package is in charge of downloading the
|
|
|
|
sources archive, checking the hash, defining the licence informations
|
|
|
|
and building user space tools if any.
|
|
|
|
|
|
|
|
Then create the 'Linux extension' proper: create a new menu entry in
|
|
|
|
the existing +linux/Config.ext.in+. This file contains the option
|
|
|
|
descriptions related to each kernel extension that will be used and
|
|
|
|
displayed in the configuration tool. It would basically look like:
|
|
|
|
|
|
|
|
------------------------------
|
|
|
|
01: config BR2_LINUX_KERNEL_EXT_FOO
|
|
|
|
02: bool "foo"
|
|
|
|
03: help
|
|
|
|
04: This is a comment that explains what foo kernel extension is.
|
|
|
|
05:
|
|
|
|
06: http://foosoftware.org/foo/
|
|
|
|
------------------------------
|
|
|
|
|
|
|
|
Then for each linux extension, add a new +.mk+ file named
|
|
|
|
+linux/linux-ext-foo.mk+. It should basically contain:
|
|
|
|
|
|
|
|
------------------------------
|
|
|
|
01: ################################################################################
|
|
|
|
02: #
|
|
|
|
03: # foo
|
|
|
|
04: #
|
|
|
|
05: ################################################################################
|
|
|
|
06:
|
|
|
|
07: LINUX_EXTENSIONS += foo
|
|
|
|
08:
|
|
|
|
09: define FOO_PREPARE_KERNEL
|
|
|
|
10: $(FOO_DIR)/prepare-kernel-tree.sh --linux-dir=$(@D)
|
|
|
|
11: endef
|
|
|
|
--------------------------------
|
|
|
|
|
|
|
|
On line 7, we add the Linux extension +foo+ to the list of available
|
|
|
|
Linux extensions.
|
|
|
|
|
|
|
|
On line 9-11, we define what should be done by the extension to modify
|
|
|
|
the Linux kernel tree; this is specific to the linux extension and can
|
|
|
|
use the variables defined by the +foo+ package, like: +$(FOO_DIR)+ or
|
|
|
|
+$(FOO_VERSION)+... as well as all the Linux variables, like:
|
|
|
|
+$(LINUX_VERSION)+ or +$(LINUX_VERSION_PROBED)+, +$(KERNEL_ARCH)+...
|
|
|
|
See the xref:kernel-variables[definition of those kernel variables].
|