* Update buildroot-patches for 2020.11-rc1 buildroot * Update buildroot to 2020.11-rc1 Signed-off-by: Stefan Agner <stefan@agner.ch> * Don't rely on sfdisk --list-free output The --list-free (-F) argument does not allow machine readable mode. And it seems that the output format changes over time (different spacing, using size postfixes instead of raw blocks). Use sfdisk json output and calculate free partition space ourselfs. This works for 2.35 and 2.36 and is more robust since we rely on output which is meant for scripts to parse. * Migrate defconfigs for Buildroot 2020.11-rc1 In particular, rename BR2_TARGET_UBOOT_BOOT_SCRIPT(_SOURCE) to BR2_PACKAGE_HOST_UBOOT_TOOLS_BOOT_SCRIPT(_SOURCE). * Rebase/remove systemd patches for systemd 246 * Drop apparmor/libapparmor from buildroot-external * hassos-persists: use /run as directory for lockfiles The U-Boot tools use /var/lock by default which is not created any more by systemd by default (it is under tmpfiles legacy.conf, which we no longer install). * Disable systemd-update-done.service The service is not suited for pure read-only systems. In particular the service needs to be able to write a file in /etc and /var. Remove the service. Note: This is a static service and cannot be removed using systemd-preset. * Disable apparmor.service for now The service loads all default profiles. Some might actually cause problems. E.g. the profile for ping seems not to match our setup for /etc/resolv.conf: [85503.634653] audit: type=1400 audit(1605286002.684:236): apparmor="DENIED" operation="open" profile="ping" name="/run/resolv.conf" pid=27585 comm="ping" requested_mask="r" denied_mask="r" fsuid=0 ouid=0
447 lines
16 KiB
Plaintext
447 lines
16 KiB
Plaintext
// -*- mode:doc -*- ;
|
|
// vim: set syntax=asciidoc:
|
|
|
|
[[outside-br-custom]]
|
|
=== Keeping customizations outside of Buildroot
|
|
|
|
As already briefly mentioned in xref:customize-dir-structure[], you can
|
|
place project-specific customizations in two locations:
|
|
|
|
* directly within the Buildroot tree, typically maintaining them using
|
|
branches in a version control system so that upgrading to a newer
|
|
Buildroot release is easy.
|
|
|
|
* outside of the Buildroot tree, using the _br2-external_ mechanism.
|
|
This mechanism allows to keep package recipes, board support and
|
|
configuration files outside of the Buildroot tree, while still
|
|
having them nicely integrated in the build logic. We call this
|
|
location a _br2-external tree_. This section explains how to use
|
|
the br2-external mechanism and what to provide in a br2-external
|
|
tree.
|
|
|
|
One can tell Buildroot to use one or more br2-external trees by setting
|
|
the +BR2_EXTERNAL+ make variable set to the path(s) of the br2-external
|
|
tree(s) to use. It can be passed to any Buildroot +make+ invocation. It
|
|
is automatically saved in the hidden +.br2-external.mk+ file in the output
|
|
directory. Thanks to this, there is no need to pass +BR2_EXTERNAL+ at
|
|
every +make+ invocation. It can however be changed at any time by
|
|
passing a new value, and can be removed by passing an empty value.
|
|
|
|
.Note
|
|
The path to a br2-external tree can be either absolute or relative.
|
|
If it is passed as a relative path, it is important to note that it is
|
|
interpreted relative to the main Buildroot source directory, *not* to
|
|
the Buildroot output directory.
|
|
|
|
.Note:
|
|
If using an br2-external tree from before Buildroot 2016.11, you need to
|
|
convert it before you can use it with Buildroot 2016.11 onward. See
|
|
xref:br2-external-converting[] for help on doing so.
|
|
|
|
Some examples:
|
|
|
|
-----
|
|
buildroot/ $ make BR2_EXTERNAL=/path/to/foo menuconfig
|
|
-----
|
|
|
|
From now on, definitions from the +/path/to/foo+ br2-external tree
|
|
will be used:
|
|
|
|
-----
|
|
buildroot/ $ make
|
|
buildroot/ $ make legal-info
|
|
-----
|
|
|
|
We can switch to another br2-external tree at any time:
|
|
|
|
-----
|
|
buildroot/ $ make BR2_EXTERNAL=/where/we/have/bar xconfig
|
|
-----
|
|
|
|
We can also use multiple br2-external trees:
|
|
|
|
----
|
|
buildroot/ $ make BR2_EXTERNAL=/path/to/foo:/where/we/have/bar menuconfig
|
|
----
|
|
|
|
Or disable the usage of any br2-external tree:
|
|
|
|
-----
|
|
buildroot/ $ make BR2_EXTERNAL= xconfig
|
|
-----
|
|
|
|
==== Layout of a br2-external tree
|
|
|
|
A br2-external tree must contain at least those three files, described
|
|
in the following chapters:
|
|
|
|
* +external.desc+
|
|
* +external.mk+
|
|
* +Config.in+
|
|
|
|
Apart from those mandatory files, there may be additional and optional
|
|
content that may be present in a br2-external tree, like the +configs/+
|
|
or +provides/+ directories. They are described in the following chapters
|
|
as well.
|
|
|
|
A complete example br2-external tree layout is also described later.
|
|
|
|
===== The +external.desc+ file
|
|
|
|
That file describes the br2-external tree: the _name_ and _description_
|
|
for that br2-external tree.
|
|
|
|
The format for this file is line based, with each line starting by a
|
|
keyword, followed by a colon and one or more spaces, followed by the
|
|
value assigned to that keyword. There are two keywords currently
|
|
recognised:
|
|
|
|
* +name+, mandatory, defines the name for that br2-external tree. That
|
|
name must only use ASCII characters in the set +[A-Za-z0-9_]+; any
|
|
other character is forbidden. Buildroot sets the variable
|
|
+BR2_EXTERNAL_$(NAME)_PATH+ to the absolute path of the br2-external
|
|
tree, so that you can use it to refer to your br2-external tree. This
|
|
variable is available both in Kconfig, so you can use it to source your
|
|
Kconfig files (see below) and in the Makefile, so that you can use it
|
|
to include other Makefiles (see below) or refer to other files (like
|
|
data files) from your br2-external tree.
|
|
+
|
|
.Note:
|
|
Since it is possible to use multiple br2-external trees at once, this
|
|
name is used by Buildroot to generate variables for each of those trees.
|
|
That name is used to identify your br2-external tree, so try to come up
|
|
with a name that really describes your br2-external tree, in order for
|
|
it to be relatively unique, so that it does not clash with another name
|
|
from another br2-external tree, especially if you are planning on
|
|
somehow sharing your br2-external tree with third parties or using
|
|
br2-external trees from third parties.
|
|
|
|
* +desc+, optional, provides a short description for that br2-external
|
|
tree. It shall fit on a single line, is mostly free-form (see below),
|
|
and is used when displaying information about a br2-external tree (e.g.
|
|
above the list of defconfig files, or as the prompt in the menuconfig);
|
|
as such, it should relatively brief (40 chars is probably a good upper
|
|
limit). The description is available in the +BR2_EXTERNAL_$(NAME)_DESC+
|
|
variable.
|
|
|
|
Examples of names and the corresponding +BR2_EXTERNAL_$(NAME)_PATH+
|
|
variables:
|
|
|
|
* +FOO+ -> +BR2_EXTERNAL_FOO_PATH+
|
|
* +BAR_42+ -> +BR2_EXTERNAL_BAR_42_PATH+
|
|
|
|
In the following examples, it is assumed the name to be set to +BAR_42+.
|
|
|
|
.Note:
|
|
Both +BR2_EXTERNAL_$(NAME)_PATH+ and `BR2_EXTERNAL_$(NAME)_DESC` are
|
|
available in the Kconfig files and the Makefiles. They are also
|
|
exported in the environment so are available in post-build, post-image
|
|
and in-fakeroot scripts.
|
|
|
|
===== The +Config.in+ and +external.mk+ files
|
|
|
|
Those files (which may each be empty) can be used to define package
|
|
recipes (i.e. +foo/Config.in+ and +foo/foo.mk+ like for packages bundled
|
|
in Buildroot itself) or other custom configuration options or make logic.
|
|
|
|
Buildroot automatically includes the +Config.in+ from each br2-external
|
|
tree to make it appear in the top-level configuration menu, and includes
|
|
the +external.mk+ from each br2-external tree with the rest of the
|
|
makefile logic.
|
|
|
|
The main usage of this is to store package recipes. The recommended way
|
|
to do this is to write a +Config.in+ file that looks like:
|
|
|
|
------
|
|
source "$BR2_EXTERNAL_BAR_42_PATH/package/package1/Config.in"
|
|
source "$BR2_EXTERNAL_BAR_42_PATH/package/package2/Config.in"
|
|
------
|
|
|
|
Then, have an +external.mk+ file that looks like:
|
|
|
|
------
|
|
include $(sort $(wildcard $(BR2_EXTERNAL_BAR_42_PATH)/package/*/*.mk))
|
|
------
|
|
|
|
And then in +$(BR2_EXTERNAL_BAR_42_PATH)/package/package1+ and
|
|
+$(BR2_EXTERNAL_BAR_42_PATH)/package/package2+ create normal
|
|
Buildroot package recipes, as explained in xref:adding-packages[].
|
|
If you prefer, you can also group the packages in subdirectories
|
|
called <boardname> and adapt the above paths accordingly.
|
|
|
|
You can also define custom configuration options in +Config.in+ and
|
|
custom make logic in +external.mk+.
|
|
|
|
===== The +configs/+ directory
|
|
|
|
One can store Buildroot defconfigs in the +configs+ subdirectory of
|
|
the br2-external tree. Buildroot will automatically show them in the
|
|
output of +make list-defconfigs+ and allow them to be loaded with the
|
|
normal +make <name>_defconfig+ command. They will be visible in the
|
|
'make list-defconfigs' output, below an +External configs+ label that
|
|
contains the name of the br2-external tree they are defined in.
|
|
|
|
.Note:
|
|
If a defconfig file is present in more than one br2-external tree, then
|
|
the one from the last br2-external tree is used. It is thus possible
|
|
to override a defconfig bundled in Buildroot or another br2-external
|
|
tree.
|
|
|
|
===== The +provides/+ directory
|
|
|
|
For some packages, Buildroot provides a choice between two (or more)
|
|
implementations of API-compatible such packages. For example, there is
|
|
a choice to choose either libjpeg ot jpeg-turbo; there is one between
|
|
openssl or libressl; there is one to select one of the known,
|
|
pre-configured toolchains...
|
|
|
|
It is possible for a br2-external to extend those choices, by providing
|
|
a set of files that define those alternatives:
|
|
|
|
* +provides/toolchains.in+ defines the pre-configured toolchains, which
|
|
will then be listed in the toolchain selection;
|
|
* +provides/jpeg.in+ defines the alternative libjpeg implementations;
|
|
* +provides/openssl.in+ defines the alternative openssl implementations;
|
|
* +provides/skeleton.in+ defines the alternative skeleton implementations;
|
|
* +provides/init.in+ defines the alternative init system implementations, this
|
|
can be used to select a default skeleton for your init.
|
|
|
|
===== Free-form content
|
|
|
|
One can store all the board-specific configuration files there, such
|
|
as the kernel configuration, the root filesystem overlay, or any other
|
|
configuration file for which Buildroot allows to set the location (by
|
|
using the +BR2_EXTERNAL_$(NAME)_PATH+ variable). For example, you
|
|
could set the paths to a global patch directory, to a rootfs overlay
|
|
and to the kernel configuration file as follows (e.g. by running
|
|
`make menuconfig` and filling in these options):
|
|
|
|
----
|
|
BR2_GLOBAL_PATCH_DIR=$(BR2_EXTERNAL_BAR_42_PATH)/patches/
|
|
BR2_ROOTFS_OVERLAY=$(BR2_EXTERNAL_BAR_42_PATH)/board/<boardname>/overlay/
|
|
BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE=$(BR2_EXTERNAL_BAR_42_PATH)/board/<boardname>/kernel.config
|
|
----
|
|
|
|
===== Additional Linux kernel extensions
|
|
|
|
Additional Linux kernel extensions (see xref:linux-kernel-ext[]) can
|
|
be added by storing them in the `linux/` directory at the root of a
|
|
br2-external tree.
|
|
|
|
===== Example layout
|
|
|
|
Here is an example layout using all features of br2-external (the sample
|
|
content is shown for the file above it, when it is relevant to explain
|
|
the br2-external tree; this is all entirely made up just for the sake of
|
|
illustration, of course):
|
|
|
|
----
|
|
/path/to/br2-ext-tree/
|
|
|- external.desc
|
|
| |name: BAR_42
|
|
| |desc: Example br2-external tree
|
|
| `----
|
|
|
|
|
|- Config.in
|
|
| |source "$BR2_EXTERNAL_BAR_42_PATH/toolchain/toolchain-external-mine/Config.in.options"
|
|
| |source "$BR2_EXTERNAL_BAR_42_PATH/package/pkg-1/Config.in"
|
|
| |source "$BR2_EXTERNAL_BAR_42_PATH/package/pkg-2/Config.in"
|
|
| |source "$BR2_EXTERNAL_BAR_42_PATH/package/my-jpeg/Config.in"
|
|
| |
|
|
| |config BAR_42_FLASH_ADDR
|
|
| | hex "my-board flash address"
|
|
| | default 0x10AD
|
|
| `----
|
|
|
|
|
|- external.mk
|
|
| |include $(sort $(wildcard $(BR2_EXTERNAL_BAR_42_PATH)/package/*/*.mk))
|
|
| |include $(sort $(wildcard $(BR2_EXTERNAL_BAR_42_PATH)/toolchain/*/*.mk))
|
|
| |
|
|
| |flash-my-board:
|
|
| | $(BR2_EXTERNAL_BAR_42_PATH)/board/my-board/flash-image \
|
|
| | --image $(BINARIES_DIR)/image.bin \
|
|
| | --address $(BAR_42_FLASH_ADDR)
|
|
| `----
|
|
|
|
|
|- package/pkg-1/Config.in
|
|
| |config BR2_PACKAGE_PKG_1
|
|
| | bool "pkg-1"
|
|
| | help
|
|
| | Some help about pkg-1
|
|
| `----
|
|
|- package/pkg-1/pkg-1.hash
|
|
|- package/pkg-1/pkg-1.mk
|
|
| |PKG_1_VERSION = 1.2.3
|
|
| |PKG_1_SITE = /some/where/to/get/pkg-1
|
|
| |PKG_1_LICENSE = blabla
|
|
| |
|
|
| |define PKG_1_INSTALL_INIT_SYSV
|
|
| | $(INSTALL) -D -m 0755 $(PKG_1_PKGDIR)/S99my-daemon \
|
|
| | $(TARGET_DIR)/etc/init.d/S99my-daemon
|
|
| |endef
|
|
| |
|
|
| |$(eval $(autotools-package))
|
|
| `----
|
|
|- package/pkg-1/S99my-daemon
|
|
|
|
|
|- package/pkg-2/Config.in
|
|
|- package/pkg-2/pkg-2.hash
|
|
|- package/pkg-2/pkg-2.mk
|
|
|
|
|
|- provides/jpeg.in
|
|
| |config BR2_PACKAGE_MY_JPEG
|
|
| | bool "my-jpeg"
|
|
| `----
|
|
|- package/my-jpeg/Config.in
|
|
| |config BR2_PACKAGE_PROVIDES_JPEG
|
|
| | default "my-jpeg" if BR2_PACKAGE_MY_JPEG
|
|
| `----
|
|
|- package/my-jpeg/my-jpeg.mk
|
|
| |# This is a normal package .mk file
|
|
| |MY_JPEG_VERSION = 1.2.3
|
|
| |MY_JPEG_SITE = https://example.net/some/place
|
|
| |MY_JPEG_PROVIDES = jpeg
|
|
| |$(eval $(autotools-package))
|
|
| `----
|
|
|
|
|
|- provides/init.in
|
|
| |config BR2_INIT_MINE
|
|
| | bool "my custom init"
|
|
| | select BR2_PACKAGE_MY_INIT
|
|
| | select BR2_PACKAGE_SKELETON_INIT_MINE if BR2_ROOTFS_SKELETON_DEFAULT
|
|
| `----
|
|
|
|
|
|- provides/skeleton.in
|
|
| |config BR2_ROOTFS_SKELETON_MINE
|
|
| | bool "my custom skeleton"
|
|
| | select BR2_PACKAGE_SKELETON_MINE
|
|
| `----
|
|
|- package/skeleton-mine/Config.in
|
|
| |config BR2_PACKAGE_SKELETON_MINE
|
|
| | bool
|
|
| | select BR2_PACKAGE_HAS_SKELETON
|
|
| |
|
|
| |config BR2_PACKAGE_PROVIDES_SKELETON
|
|
| | default "skeleton-mine" if BR2_PACKAGE_SKELETON_MINE
|
|
| `----
|
|
|- package/skeleton-mine/skeleton-mine.mk
|
|
| |SKELETON_MINE_ADD_TOOLCHAIN_DEPENDENCY = NO
|
|
| |SKELETON_MINE_ADD_SKELETON_DEPENDENCY = NO
|
|
| |SKELETON_MINE_PROVIDES = skeleton
|
|
| |SKELETON_MINE_INSTALL_STAGING = YES
|
|
| |$(eval $(generic-package))
|
|
| `----
|
|
|
|
|
|- provides/toolchains.in
|
|
| |config BR2_TOOLCHAIN_EXTERNAL_MINE
|
|
| | bool "my custom toolchain"
|
|
| | depends on BR2_some_arch
|
|
| | select BR2_INSTALL_LIBSTDCPP
|
|
| `----
|
|
|- toolchain/toolchain-external-mine/Config.in.options
|
|
| |if BR2_TOOLCHAIN_EXTERNAL_MINE
|
|
| |config BR2_TOOLCHAIN_EXTERNAL_PREFIX
|
|
| | default "arch-mine-linux-gnu"
|
|
| |config BR2_PACKAGE_PROVIDES_TOOLCHAIN_EXTERNAL
|
|
| | default "toolchain-external-mine"
|
|
| |endif
|
|
| `----
|
|
|- toolchain/toolchain-external-mine/toolchain-external-mine.mk
|
|
| |TOOLCHAIN_EXTERNAL_MINE_SITE = https://example.net/some/place
|
|
| |TOOLCHAIN_EXTERNAL_MINE_SOURCE = my-toolchain.tar.gz
|
|
| |$(eval $(toolchain-external-package))
|
|
| `----
|
|
|
|
|
|- linux/Config.ext.in
|
|
| |config BR2_LINUX_KERNEL_EXT_EXAMPLE_DRIVER
|
|
| | bool "example-external-driver"
|
|
| | help
|
|
| | Example external driver
|
|
| |---
|
|
|- linux/linux-ext-example-driver.mk
|
|
|
|
|
|- configs/my-board_defconfig
|
|
| |BR2_GLOBAL_PATCH_DIR="$(BR2_EXTERNAL_BAR_42_PATH)/patches/"
|
|
| |BR2_ROOTFS_OVERLAY="$(BR2_EXTERNAL_BAR_42_PATH)/board/my-board/overlay/"
|
|
| |BR2_ROOTFS_POST_IMAGE_SCRIPT="$(BR2_EXTERNAL_BAR_42_PATH)/board/my-board/post-image.sh"
|
|
| |BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="$(BR2_EXTERNAL_BAR_42_PATH)/board/my-board/kernel.config"
|
|
| `----
|
|
|
|
|
|- patches/linux/0001-some-change.patch
|
|
|- patches/linux/0002-some-other-change.patch
|
|
|- patches/busybox/0001-fix-something.patch
|
|
|
|
|
|- board/my-board/kernel.config
|
|
|- board/my-board/overlay/var/www/index.html
|
|
|- board/my-board/overlay/var/www/my.css
|
|
|- board/my-board/flash-image
|
|
`- board/my-board/post-image.sh
|
|
|#!/bin/sh
|
|
|generate-my-binary-image \
|
|
| --root ${BINARIES_DIR}/rootfs.tar \
|
|
| --kernel ${BINARIES_DIR}/zImage \
|
|
| --dtb ${BINARIES_DIR}/my-board.dtb \
|
|
| --output ${BINARIES_DIR}/image.bin
|
|
`----
|
|
----
|
|
|
|
The br2-external tree will then be visible in the menuconfig (with
|
|
the layout expanded):
|
|
|
|
----
|
|
External options --->
|
|
*** Example br2-external tree (in /path/to/br2-ext-tree/)
|
|
[ ] pkg-1
|
|
[ ] pkg-2
|
|
(0x10AD) my-board flash address
|
|
----
|
|
|
|
If you are using more than one br2-external tree, it would look like
|
|
(with the layout expanded and the second one with name +FOO_27+ but no
|
|
+desc:+ field in +external.desc+):
|
|
|
|
----
|
|
External options --->
|
|
Example br2-external tree --->
|
|
*** Example br2-external tree (in /path/to/br2-ext-tree)
|
|
[ ] pkg-1
|
|
[ ] pkg-2
|
|
(0x10AD) my-board flash address
|
|
FOO_27 --->
|
|
*** FOO_27 (in /path/to/another-br2-ext)
|
|
[ ] foo
|
|
[ ] bar
|
|
----
|
|
|
|
Additionally, the jpeg provider will be visible in the jpeg choice:
|
|
|
|
----
|
|
Target packages --->
|
|
Libraries --->
|
|
Graphics --->
|
|
[*] jpeg support
|
|
jpeg variant () --->
|
|
( ) jpeg
|
|
( ) jpeg-turbo
|
|
*** jpeg from: Example br2-external tree ***
|
|
(X) my-jpeg
|
|
*** jpeg from: FOO_27 ***
|
|
( ) another-jpeg
|
|
----
|
|
|
|
And similarly for the toolchains:
|
|
|
|
----
|
|
Toolchain --->
|
|
Toolchain () --->
|
|
( ) Custom toolchain
|
|
*** Toolchains from: Example br2-external tree ***
|
|
(X) my custom toolchain
|
|
----
|
|
|
|
.Note
|
|
The toolchain options in +toolchain/toolchain-external-mine/Config.in.options+
|
|
will not appear in the `Toolchain` menu. They must be explicitly included
|
|
from within the br2-external's top-level +Config.in+ and will thus appear
|
|
in the `External options` menu.
|