123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- // -*- 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
- 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.
- 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
- +package/linux-tools/Config.in+. This file will contain the option
- descriptions related to each kernel tool that will be used and
- displayed in the configuration tool. It would basically look like:
- ------------------------------
- 01: config BR2_PACKAGE_LINUX_TOOLS_FOO
- 02: bool "foo"
- 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/
- ------------------------------
- The name of the option starts with the prefix +BR2_PACKAGE_LINUX_TOOLS_+,
- followed by the uppercase name of the tool (like is done for packages).
- .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.in+ file named
- +package/linux-tools/linux-tool-foo.mk.in+. It would basically look like:
- ------------------------------
- 01: ################################################################################
- 02: #
- 03: # foo
- 04: #
- 05: ################################################################################
- 06:
- 07: LINUX_TOOLS += foo
- 08:
- 09: FOO_DEPENDENCIES = libbbb
- 10:
- 11: define FOO_BUILD_CMDS
- 12: $(TARGET_MAKE_ENV) $(MAKE) -C $(LINUX_DIR)/tools foo
- 13: endef
- 14:
- 15: define FOO_INSTALL_STAGING_CMDS
- 16: $(TARGET_MAKE_ENV) $(MAKE) -C $(LINUX_DIR)/tools \
- 17: DESTDIR=$(STAGING_DIR) \
- 18: foo_install
- 19: endef
- 20:
- 21: define FOO_INSTALL_TARGET_CMDS
- 22: $(TARGET_MAKE_ENV) $(MAKE) -C $(LINUX_DIR)/tools \
- 23: DESTDIR=$(TARGET_DIR) \
- 24: foo_install
- 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,
- they are part of the +linux-tools+ package.
- [[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].
|