mirror of
git://git.yoctoproject.org/poky.git
synced 2025-07-19 12:59:02 +02:00

Originally written by Richard Purdie, but formatted in rst syntax and slight rephrasing. Cc: Richard Purdie <richard.purdie@linuxfoundation.org> Reviewed-by: Quentin Schulz <quentin.schulz@cherry.de> (From yocto-docs rev: 568922014e5c00ecf0c3d19b8c7fefa0e3801183) Signed-off-by: Antonin Godard <antonin.godard@bootlin.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
498 lines
22 KiB
ReStructuredText
498 lines
22 KiB
ReStructuredText
.. SPDX-License-Identifier: CC-BY-SA-2.0-UK
|
|
|
|
***
|
|
FAQ
|
|
***
|
|
|
|
.. contents::
|
|
|
|
General questions
|
|
=================
|
|
|
|
How does Poky differ from OpenEmbedded?
|
|
---------------------------------------
|
|
|
|
The term ``Poky`` refers to the specific reference build
|
|
system that the Yocto Project provides. Poky is based on
|
|
:term:`OpenEmbedded-Core (OE-Core)` and :term:`BitBake`. Thus, the
|
|
generic term used here for the build system is the "OpenEmbedded build
|
|
system." Development in the Yocto Project using Poky is closely tied to
|
|
OpenEmbedded, with changes always being merged to OE-Core or BitBake
|
|
first before being pulled back into Poky. This practice benefits both
|
|
projects immediately.
|
|
|
|
How can you claim Poky / OpenEmbedded-Core is stable?
|
|
-----------------------------------------------------
|
|
|
|
There are three areas that help with stability;
|
|
|
|
- The Yocto Project team keeps :term:`OpenEmbedded-Core (OE-Core)` small and
|
|
focused, containing around 830 recipes as opposed to the thousands
|
|
available in other OpenEmbedded community layers. Keeping it small
|
|
makes it easy to test and maintain.
|
|
|
|
- The Yocto Project team runs manual and automated tests using a small,
|
|
fixed set of reference hardware as well as emulated targets.
|
|
|
|
- The Yocto Project uses an :yocto_ab:`autobuilder <>`, which provides
|
|
continuous build and integration tests.
|
|
|
|
Are there any products built using the OpenEmbedded build system?
|
|
-----------------------------------------------------------------
|
|
|
|
See :yocto_wiki:`Products that use the Yocto Project
|
|
</Project_Users#Products_that_use_the_Yocto_Project>` in the Yocto Project
|
|
Wiki. Don't hesitate to contribute to this page if you know other such
|
|
products.
|
|
|
|
Why isn't systemd the default init system for OpenEmbedded-Core/Yocto Project or in Poky?
|
|
-----------------------------------------------------------------------------------------
|
|
|
|
`systemd <https://systemd.io/>`__ is a desktop Linux init system with a specific
|
|
focus that is not entirely aligned with a customisable "embedded" build
|
|
system/environment.
|
|
|
|
It understandably mandates certain layouts and configurations which may
|
|
or may not align with what the objectives and direction :term:`OpenEmbedded-Core
|
|
(OE-Core)` or Yocto Project want to take. It doesn't support all of our targets.
|
|
For example `musl <https://www.musl-libc.org/>`__ support in systemd is
|
|
problematic.
|
|
|
|
If it were our default, we would have to align with all their choices
|
|
and this doesn't make sense. It is therefore a configuration option and
|
|
available to anyone where the design goals align. But we are clear it
|
|
is not the only way to handle init.
|
|
|
|
Our automated testing includes it through the ``poky-altcfg`` :term:`DISTRO` and
|
|
we don't really need it to be the default: it is tested, it works, and people
|
|
can choose to use it.
|
|
|
|
Building environment
|
|
====================
|
|
|
|
Missing dependencies on the development system?
|
|
-----------------------------------------------
|
|
|
|
If your development system does not meet the required Git, tar, and
|
|
Python versions, you can get the required tools on your host development
|
|
system in different ways (i.e. building a tarball or downloading a
|
|
tarball). See the ":ref:`ref-manual/system-requirements:required git, tar, python, make and gcc versions`"
|
|
section for steps on how to update your build tools.
|
|
|
|
How does OpenEmbedded fetch source code? Will it work through a firewall or proxy server?
|
|
-----------------------------------------------------------------------------------------
|
|
|
|
The way the build system obtains source code is highly
|
|
configurable. You can setup the build system to get source code in most
|
|
environments if HTTP transport is available.
|
|
|
|
When the build system searches for source code, it first tries the local
|
|
download directory. If that location fails, Poky tries
|
|
:term:`PREMIRRORS`, the upstream source, and then
|
|
:term:`MIRRORS` in that order.
|
|
|
|
Assuming your distribution is "poky", the OpenEmbedded build system uses
|
|
the Yocto Project source :term:`PREMIRRORS` by default for SCM-based
|
|
sources, upstreams for normal tarballs, and then falls back to a number
|
|
of other mirrors including the Yocto Project source mirror if those
|
|
fail.
|
|
|
|
As an example, you could add a specific server for the build system to
|
|
attempt before any others by adding something like the following to the
|
|
``local.conf`` configuration file::
|
|
|
|
PREMIRRORS:prepend = "\
|
|
git://.*/.* &YOCTO_DL_URL;/mirror/sources/ \
|
|
ftp://.*/.* &YOCTO_DL_URL;/mirror/sources/ \
|
|
http://.*/.* &YOCTO_DL_URL;/mirror/sources/ \
|
|
https://.*/.* &YOCTO_DL_URL;/mirror/sources/"
|
|
|
|
These changes cause the build system to intercept Git, FTP, HTTP, and
|
|
HTTPS requests and direct them to the ``http://`` sources mirror. You
|
|
can use ``file://`` URLs to point to local directories or network shares
|
|
as well.
|
|
|
|
Another option is to set::
|
|
|
|
BB_NO_NETWORK = "1"
|
|
|
|
This statement tells BitBake to issue an error
|
|
instead of trying to access the Internet. This technique is useful if
|
|
you want to ensure code builds only from local sources.
|
|
|
|
Here is another technique::
|
|
|
|
BB_FETCH_PREMIRRORONLY = "1"
|
|
|
|
This statement limits the build system to pulling source from the
|
|
:term:`PREMIRRORS` only. Again, this technique is useful for reproducing
|
|
builds.
|
|
|
|
Here is yet another technique::
|
|
|
|
BB_GENERATE_MIRROR_TARBALLS = "1"
|
|
|
|
This statement tells the build system to generate mirror tarballs. This
|
|
technique is useful if you want to create a mirror server. If not,
|
|
however, the technique can simply waste time during the build.
|
|
|
|
Finally, consider an example where you are behind an HTTP-only firewall.
|
|
You could make the following changes to the ``local.conf`` configuration
|
|
file as long as the :term:`PREMIRRORS` server is current::
|
|
|
|
PREMIRRORS:prepend = "\
|
|
git://.*/.* &YOCTO_DL_URL;/mirror/sources/ \
|
|
ftp://.*/.* &YOCTO_DL_URL;/mirror/sources/ \
|
|
http://.*/.* &YOCTO_DL_URL;/mirror/sources/ \
|
|
https://.*/.* &YOCTO_DL_URL;/mirror/sources/"
|
|
BB_FETCH_PREMIRRORONLY = "1"
|
|
|
|
These changes would cause the build system to successfully fetch source
|
|
over HTTP and any network accesses to anything other than the
|
|
:term:`PREMIRRORS` would fail.
|
|
|
|
Most source fetching by the OpenEmbedded build system is done by
|
|
``wget`` and you therefore need to specify the proxy settings in a
|
|
``.wgetrc`` file, which can be in your home directory if you are a
|
|
single user or can be in ``/usr/local/etc/wgetrc`` as a global user
|
|
file.
|
|
|
|
Here is the applicable code for setting various proxy types in the
|
|
``.wgetrc`` file. By default, these settings are disabled with comments.
|
|
To use them, remove the comments::
|
|
|
|
# You can set the default proxies for Wget to use for http, https, and ftp.
|
|
# They will override the value in the environment.
|
|
#https_proxy = http://proxy.yoyodyne.com:18023/
|
|
#http_proxy = http://proxy.yoyodyne.com:18023/
|
|
#ftp_proxy = http://proxy.yoyodyne.com:18023/
|
|
|
|
# If you do not want to use proxy at all, set this to off.
|
|
#use_proxy = on
|
|
|
|
The build system also accepts ``http_proxy``, ``ftp_proxy``, ``https_proxy``,
|
|
and ``all_proxy`` set as to standard shell environment variables to redirect
|
|
requests through proxy servers.
|
|
|
|
The Yocto Project also includes a
|
|
``meta-poky/conf/templates/default/site.conf.sample`` file that shows
|
|
how to configure CVS and Git proxy servers if needed.
|
|
|
|
.. note::
|
|
|
|
You can find more information on the
|
|
":yocto_wiki:`Working Behind a Network Proxy </Working_Behind_a_Network_Proxy>`"
|
|
Wiki page.
|
|
|
|
Using the OpenEmbedded Build system
|
|
===================================
|
|
|
|
How do I use an external toolchain?
|
|
-----------------------------------
|
|
|
|
See the ":ref:`dev-manual/external-toolchain:optionally using an external toolchain`"
|
|
section in the Development Task manual.
|
|
|
|
Why do I get chmod permission issues?
|
|
-------------------------------------
|
|
|
|
If you see the error
|
|
``chmod: XXXXX new permissions are r-xrwxrwx, not r-xr-xr-x``,
|
|
you are probably running the build on an NTFS filesystem. Instead,
|
|
run the build system on a partition with a modern Linux filesystem such as
|
|
``ext4``, ``btrfs`` or ``xfs``.
|
|
|
|
I see many 404 errors trying to download sources. Is anything wrong?
|
|
--------------------------------------------------------------------
|
|
|
|
Nothing is wrong. The OpenEmbedded build system checks any
|
|
configured source mirrors before downloading from the upstream sources.
|
|
The build system does this searching for both source archives and
|
|
pre-checked out versions of SCM-managed software. These checks help in
|
|
large installations because it can reduce load on the SCM servers
|
|
themselves. This can also allow builds to continue to work if an
|
|
upstream source disappears.
|
|
|
|
Why do I get random build failures?
|
|
-----------------------------------
|
|
|
|
If the same build is failing in totally different and random
|
|
ways, the most likely explanation is:
|
|
|
|
- The hardware you are running the build on has some problem.
|
|
|
|
- You are running the build under virtualization, in which case the
|
|
virtualization probably has bugs.
|
|
|
|
The OpenEmbedded build system processes a massive amount of data that
|
|
causes lots of network, disk and CPU activity and is sensitive to even
|
|
single-bit failures in any of these areas. True random failures have
|
|
always been traced back to hardware or virtualization issues.
|
|
|
|
Why does the build fail with ``iconv.h`` problems?
|
|
--------------------------------------------------
|
|
|
|
When you try to build a native recipe, you may get an error message that
|
|
indicates that GNU ``libiconv`` is not in use but ``iconv.h`` has been
|
|
included from ``libiconv``::
|
|
|
|
#error GNU libiconv not in use but included iconv.h is from libiconv
|
|
|
|
When this happens, you need to check whether you have a previously
|
|
installed version of the header file in ``/usr/local/include/``.
|
|
If that's the case, you should either uninstall it or temporarily rename
|
|
it and try the build again.
|
|
|
|
This issue is just a single manifestation of "system leakage" issues
|
|
caused when the OpenEmbedded build system finds and uses previously
|
|
installed files during a native build. This type of issue might not be
|
|
limited to ``iconv.h``. Make sure that leakage cannot occur from
|
|
``/usr/local/include`` and ``/opt`` locations.
|
|
|
|
Why don't other recipes find the files provided by my ``*-native`` recipe?
|
|
--------------------------------------------------------------------------
|
|
|
|
Files provided by your native recipe could be missing from the native
|
|
sysroot, your recipe could also be installing to the wrong place, or you
|
|
could be getting permission errors during the :ref:`ref-tasks-install`
|
|
task in your recipe.
|
|
|
|
This situation happens when the build system used by a package does not
|
|
recognize the environment variables supplied to it by :term:`BitBake`. The
|
|
incident that prompted this FAQ entry involved a Makefile that used an
|
|
environment variable named ``BINDIR`` instead of the more standard
|
|
variable ``bindir``. The makefile's hardcoded default value of
|
|
"/usr/bin" worked most of the time, but not for the recipe's ``-native``
|
|
variant. For another example, permission errors might be caused by a
|
|
Makefile that ignores ``DESTDIR`` or uses a different name for that
|
|
environment variable. Check the build system of the package to see if
|
|
these kinds of issues exist.
|
|
|
|
Can I get rid of build output so I can start over?
|
|
--------------------------------------------------
|
|
|
|
Yes --- you can easily do this. When you use BitBake to build an
|
|
image, all the build output goes into the directory created when you run
|
|
the build environment setup script (i.e. :ref:`structure-core-script`).
|
|
By default, this :term:`Build Directory` is named ``build`` but can be named
|
|
anything you want.
|
|
|
|
Within the :term:`Build Directory`, is the ``tmp`` directory. To remove all the
|
|
build output yet preserve any source code or downloaded files from
|
|
previous builds, simply remove the ``tmp`` directory.
|
|
|
|
Why isn't there a way to append bbclass files like bbappend for recipes?
|
|
------------------------------------------------------------------------
|
|
|
|
The Yocto Project has consciously chosen not to implement such functionality.
|
|
Class code is designed to be shared and reused, and exposes some level of
|
|
configuration to its users. We want to encourage people to share these changes
|
|
so we can build the best classes.
|
|
|
|
If the ``append`` functionality was available for classes, our evidence and
|
|
experience suggest that people would create their custom changes in their
|
|
layer instead of sharing and discussing the issues and/or limitations they
|
|
encountered. This would lead to bizarre class interactions when new layers are
|
|
included. We therefore consciously choose to have a natural pressure to share
|
|
class code improvements or fixes.
|
|
|
|
There are also technical considerations like which recipes a class append would
|
|
apply to and how that would fit within the layer model. These are complications
|
|
we think we can live without!
|
|
|
|
Customizing generated images
|
|
============================
|
|
|
|
What does the OpenEmbedded build system produce as output?
|
|
----------------------------------------------------------
|
|
|
|
Because you can use the same set of recipes to create output of
|
|
various formats, the output of an OpenEmbedded build depends on how you
|
|
start it. Usually, the output is a flashable image ready for the target
|
|
device.
|
|
|
|
How do I make the Yocto Project support my board?
|
|
-------------------------------------------------
|
|
|
|
Support for an additional board is added by creating a Board
|
|
Support Package (BSP) layer for it. For more information on how to
|
|
create a BSP layer, see the
|
|
":ref:`dev-manual/layers:understanding and creating layers`"
|
|
section in the Yocto Project Development Tasks Manual and the
|
|
:doc:`/bsp-guide/index`.
|
|
|
|
Usually, if the board is not completely exotic, adding support in the
|
|
Yocto Project is fairly straightforward.
|
|
|
|
How do I make the Yocto Project support my package?
|
|
---------------------------------------------------
|
|
|
|
To add a package, you need to create a BitBake recipe. For
|
|
information on how to create a BitBake recipe, see the
|
|
":ref:`dev-manual/new-recipe:writing a new recipe`"
|
|
section in the Yocto Project Development Tasks Manual.
|
|
|
|
What do I need to ship for license compliance?
|
|
----------------------------------------------
|
|
|
|
This is a difficult question and you need to consult your lawyer
|
|
for the answer for your specific case. It is worth bearing in mind that
|
|
for GPL compliance, there needs to be enough information shipped to
|
|
allow someone else to rebuild and produce the same end result you are
|
|
shipping. This means sharing the source code, any patches applied to it,
|
|
and also any configuration information about how that package was
|
|
configured and built.
|
|
|
|
You can find more information on licensing in the
|
|
":ref:`overview-manual/development-environment:licensing`"
|
|
section in the Yocto Project Overview and Concepts Manual and also in the
|
|
":ref:`dev-manual/licenses:maintaining open source license compliance during your product's lifecycle`"
|
|
section in the Yocto Project Development Tasks Manual.
|
|
|
|
Do I have to make a full reflash after recompiling one package?
|
|
---------------------------------------------------------------
|
|
|
|
The OpenEmbedded build system can build packages in various
|
|
formats such as IPK for OPKG, Debian package (``.deb``), or RPM. You can
|
|
then upgrade only the modified packages using the package tools on the device,
|
|
much like on a desktop distribution such as Ubuntu or Fedora. However,
|
|
package management on the target is entirely optional.
|
|
|
|
How to prevent my package from being marked as machine specific?
|
|
----------------------------------------------------------------
|
|
|
|
If you have machine-specific data in a package for one machine only
|
|
but the package is being marked as machine-specific in all cases,
|
|
you can set :term:`SRC_URI_OVERRIDES_PACKAGE_ARCH` = "0" in the ``.bb`` file.
|
|
However, but make sure the package is manually marked as machine-specific for the
|
|
case that needs it. The code that handles :term:`SRC_URI_OVERRIDES_PACKAGE_ARCH`
|
|
is in the ``meta/classes-global/base.bbclass`` file.
|
|
|
|
What's the difference between ``target`` and ``target-native``?
|
|
---------------------------------------------------------------
|
|
|
|
The ``*-native`` targets are designed to run on the system being
|
|
used for the build. These are usually tools that are needed to assist
|
|
the build in some way such as ``quilt-native``, which is used to apply
|
|
patches. The non-native version is the one that runs on the target
|
|
device.
|
|
|
|
Why do ``${bindir}`` and ``${libdir}`` have strange values for ``-native`` recipes?
|
|
-----------------------------------------------------------------------------------
|
|
|
|
Executables and libraries might need to be used from a directory
|
|
other than the directory into which they were initially installed.
|
|
Complicating this situation is the fact that sometimes these executables
|
|
and libraries are compiled with the expectation of being run from that
|
|
initial installation target directory. If this is the case, moving them
|
|
causes problems.
|
|
|
|
This scenario is a fundamental problem for package maintainers of
|
|
mainstream Linux distributions as well as for the OpenEmbedded build
|
|
system. As such, a well-established solution exists. Makefiles,
|
|
Autotools configuration scripts, and other build systems are expected to
|
|
respect environment variables such as ``bindir``, ``libdir``, and
|
|
``sysconfdir`` that indicate where executables, libraries, and data
|
|
reside when a program is actually run. They are also expected to respect
|
|
a ``DESTDIR`` environment variable, which is prepended to all the other
|
|
variables when the build system actually installs the files. It is
|
|
understood that the program does not actually run from within
|
|
``DESTDIR``.
|
|
|
|
When the OpenEmbedded build system uses a recipe to build a
|
|
target-architecture program (i.e. one that is intended for inclusion on
|
|
the image being built), that program eventually runs from the root file
|
|
system of that image. Thus, the build system provides a value of
|
|
"/usr/bin" for ``bindir``, a value of "/usr/lib" for ``libdir``, and so
|
|
forth.
|
|
|
|
Meanwhile, ``DESTDIR`` is a path within the :term:`Build Directory`.
|
|
However, when the recipe builds a native program (i.e. one that is
|
|
intended to run on the build machine), that program is never installed
|
|
directly to the build machine's root file system. Consequently, the build
|
|
system uses paths within the Build Directory for ``DESTDIR``, ``bindir``
|
|
and related variables. To better understand this, consider the following
|
|
two paths (artificially broken across lines for readability) where the
|
|
first is relatively normal and the second is not::
|
|
|
|
/home/maxtothemax/poky-bootchart2/build/tmp/work/i586-poky-linux/zlib/
|
|
1.2.8-r0/sysroot-destdir/usr/bin
|
|
|
|
/home/maxtothemax/poky-bootchart2/build/tmp/work/x86_64-linux/
|
|
zlib-native/1.2.8-r0/sysroot-destdir/home/maxtothemax/poky-bootchart2/
|
|
build/tmp/sysroots/x86_64-linux/usr/bin
|
|
|
|
Even if the paths look unusual, they both are correct --- the first for
|
|
a target and the second for a native recipe. These paths are a consequence
|
|
of the ``DESTDIR`` mechanism and while they appear strange, they are correct
|
|
and in practice very effective.
|
|
|
|
How do I create images with more free space?
|
|
--------------------------------------------
|
|
|
|
By default, the OpenEmbedded build system creates images that are
|
|
1.3 times the size of the populated root filesystem. To affect the image
|
|
size, you need to set various configurations:
|
|
|
|
- *Image Size:* The OpenEmbedded build system uses the
|
|
:term:`IMAGE_ROOTFS_SIZE` variable to define
|
|
the size of the image in Kbytes. The build system determines the size
|
|
by taking into account the initial root filesystem size before any
|
|
modifications such as requested size for the image and any requested
|
|
additional free disk space to be added to the image.
|
|
|
|
- *Overhead:* Use the
|
|
:term:`IMAGE_OVERHEAD_FACTOR` variable
|
|
to define the multiplier that the build system applies to the initial
|
|
image size, which is 1.3 by default.
|
|
|
|
- *Additional Free Space:* Use the
|
|
:term:`IMAGE_ROOTFS_EXTRA_SPACE`
|
|
variable to add additional free space to the image. The build system
|
|
adds this space to the image after it determines its
|
|
:term:`IMAGE_ROOTFS_SIZE`.
|
|
|
|
Why aren't spaces in path names supported?
|
|
------------------------------------------
|
|
|
|
The Yocto Project team has tried to do this before but too many
|
|
of the tools the OpenEmbedded build system depends on, such as
|
|
``autoconf``, break when they find spaces in pathnames. Until that
|
|
situation changes, the team will not support spaces in pathnames.
|
|
|
|
I'm adding a binary in a recipe. Why is it different in the image?
|
|
------------------------------------------------------------------
|
|
|
|
The first most obvious change is the system stripping debug symbols from
|
|
it. Setting :term:`INHIBIT_PACKAGE_STRIP` to stop debug symbols being
|
|
stripped and/or :term:`INHIBIT_PACKAGE_DEBUG_SPLIT` to stop debug symbols
|
|
being split into a separate file will ensure the binary is unchanged.
|
|
|
|
Issues on the running system
|
|
============================
|
|
|
|
How do I disable the cursor on my touchscreen device?
|
|
-----------------------------------------------------
|
|
|
|
You need to create a form factor file as described in the
|
|
":ref:`bsp-guide/bsp:miscellaneous bsp-specific recipe files`" section in
|
|
the Yocto Project Board Support Packages (BSP) Developer's Guide. Set
|
|
the ``HAVE_TOUCHSCREEN`` variable equal to one as follows::
|
|
|
|
HAVE_TOUCHSCREEN=1
|
|
|
|
How to always bring up connected network interfaces?
|
|
----------------------------------------------------
|
|
|
|
The default interfaces file provided by the netbase recipe does
|
|
not automatically bring up network interfaces. Therefore, you will need
|
|
to add a BSP-specific netbase that includes an interfaces file. See the
|
|
":ref:`bsp-guide/bsp:miscellaneous bsp-specific recipe files`" section in
|
|
the Yocto Project Board Support Packages (BSP) Developer's Guide for
|
|
information on creating these types of miscellaneous recipe files.
|
|
|
|
For example, add the following files to your layer::
|
|
|
|
meta-MACHINE/recipes-bsp/netbase/netbase/MACHINE/interfaces
|
|
meta-MACHINE/recipes-bsp/netbase/netbase_5.0.bbappend
|