809 lines
33 KiB
ReStructuredText
809 lines
33 KiB
ReStructuredText
|
.. SPDX-License-Identifier: CC-BY-SA-2.0-UK
|
|||
|
|
|||
|
*****************************
|
|||
|
QA Error and Warning Messages
|
|||
|
*****************************
|
|||
|
|
|||
|
.. _qa-introduction:
|
|||
|
|
|||
|
Introduction
|
|||
|
============
|
|||
|
|
|||
|
When building a recipe, the OpenEmbedded build system performs various
|
|||
|
QA checks on the output to ensure that common issues are detected and
|
|||
|
reported. Sometimes when you create a new recipe to build new software,
|
|||
|
it will build with no problems. When this is not the case, or when you
|
|||
|
have QA issues building any software, it could take a little time to
|
|||
|
resolve them.
|
|||
|
|
|||
|
While it is tempting to ignore a QA message or even to disable QA
|
|||
|
checks, it is best to try and resolve any reported QA issues. This
|
|||
|
chapter provides a list of the QA messages and brief explanations of the
|
|||
|
issues you could encounter so that you can properly resolve problems.
|
|||
|
|
|||
|
The next section provides a list of all QA error and warning messages
|
|||
|
based on a default configuration. Each entry provides the message or
|
|||
|
error form along with an explanation.
|
|||
|
|
|||
|
.. note::
|
|||
|
|
|||
|
- At the end of each message, the name of the associated QA test (as
|
|||
|
listed in the ":ref:`ref-classes-insane`"
|
|||
|
section) appears within square brackets.
|
|||
|
|
|||
|
- As mentioned, this list of error and warning messages is for QA
|
|||
|
checks only. The list does not cover all possible build errors or
|
|||
|
warnings you could encounter.
|
|||
|
|
|||
|
- Because some QA checks are disabled by default, this list does not
|
|||
|
include all possible QA check errors and warnings.
|
|||
|
|
|||
|
.. _qa-errors-and-warnings:
|
|||
|
|
|||
|
Errors and Warnings
|
|||
|
===================
|
|||
|
|
|||
|
.. _qa-check-libexec:
|
|||
|
|
|||
|
- ``<packagename>: <path> is using libexec please relocate to <libexecdir> [libexec]``
|
|||
|
|
|||
|
The specified package contains files in ``/usr/libexec`` when the
|
|||
|
distro configuration uses a different path for ``<libexecdir>`` By
|
|||
|
default, ``<libexecdir>`` is ``$prefix/libexec``. However, this
|
|||
|
default can be changed (e.g. ``${libdir}``).
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-rpaths:
|
|||
|
|
|||
|
- ``package <packagename> contains bad RPATH <rpath> in file <file> [rpaths]``
|
|||
|
|
|||
|
The specified binary produced by the recipe contains dynamic library
|
|||
|
load paths (rpaths) that contain build system paths such as
|
|||
|
:term:`TMPDIR`, which are incorrect for the target and
|
|||
|
could potentially be a security issue. Check for bad ``-rpath``
|
|||
|
options being passed to the linker in your
|
|||
|
:ref:`ref-tasks-compile` log. Depending on the build
|
|||
|
system used by the software being built, there might be a configure
|
|||
|
option to disable rpath usage completely within the build of the
|
|||
|
software.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-useless-rpaths:
|
|||
|
|
|||
|
- ``<packagename>: <file> contains probably-redundant RPATH <rpath> [useless-rpaths]``
|
|||
|
|
|||
|
The specified binary produced by the recipe contains dynamic library
|
|||
|
load paths (rpaths) that on a standard system are searched by default
|
|||
|
by the linker (e.g. ``/lib`` and ``/usr/lib``). While these paths
|
|||
|
will not cause any breakage, they do waste space and are unnecessary.
|
|||
|
Depending on the build system used by the software being built, there
|
|||
|
might be a configure option to disable rpath usage completely within
|
|||
|
the build of the software.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-file-rdeps:
|
|||
|
|
|||
|
- ``<packagename> requires <files>, but no providers in its RDEPENDS [file-rdeps]``
|
|||
|
|
|||
|
A file-level dependency has been identified from the specified
|
|||
|
package on the specified files, but there is no explicit
|
|||
|
corresponding entry in :term:`RDEPENDS`. If
|
|||
|
particular files are required at runtime then :term:`RDEPENDS` should be
|
|||
|
declared in the recipe to ensure the packages providing them are
|
|||
|
built.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-build-deps:
|
|||
|
|
|||
|
- ``<packagename1> rdepends on <packagename2>, but it isn't a build dependency? [build-deps]``
|
|||
|
|
|||
|
There is a runtime dependency between the two specified packages, but
|
|||
|
there is nothing explicit within the recipe to enable the
|
|||
|
OpenEmbedded build system to ensure that dependency is satisfied.
|
|||
|
This condition is usually triggered by an
|
|||
|
:term:`RDEPENDS` value being added at the packaging
|
|||
|
stage rather than up front, which is usually automatic based on the
|
|||
|
contents of the package. In most cases, you should change the recipe
|
|||
|
to add an explicit :term:`RDEPENDS` for the dependency.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-dev-so:
|
|||
|
|
|||
|
- ``non -dev/-dbg/nativesdk- package contains symlink .so: <packagename> path '<path>' [dev-so]``
|
|||
|
|
|||
|
Symlink ``.so`` files are for development only, and should therefore
|
|||
|
go into the ``-dev`` package. This situation might occur if you add
|
|||
|
``*.so*`` rather than ``*.so.*`` to a non-dev package. Change
|
|||
|
:term:`FILES` (and possibly
|
|||
|
:term:`PACKAGES`) such that the specified ``.so``
|
|||
|
file goes into an appropriate ``-dev`` package.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-staticdev:
|
|||
|
|
|||
|
- ``non -staticdev package contains static .a library: <packagename> path '<path>' [staticdev]``
|
|||
|
|
|||
|
Static ``.a`` library files should go into a ``-staticdev`` package.
|
|||
|
Change :term:`FILES` (and possibly
|
|||
|
:term:`PACKAGES`) such that the specified ``.a`` file
|
|||
|
goes into an appropriate ``-staticdev`` package.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-libdir:
|
|||
|
|
|||
|
- ``<packagename>: found library in wrong location [libdir]``
|
|||
|
|
|||
|
The specified file may have been installed into an incorrect
|
|||
|
(possibly hardcoded) installation path. For example, this test will
|
|||
|
catch recipes that install ``/lib/bar.so`` when ``${base_libdir}`` is
|
|||
|
"lib32". Another example is when recipes install
|
|||
|
``/usr/lib64/foo.so`` when ``${libdir}`` is "/usr/lib". False
|
|||
|
positives occasionally exist. For these cases add "libdir" to
|
|||
|
:term:`INSANE_SKIP` for the package.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-debug-files:
|
|||
|
|
|||
|
- ``non debug package contains .debug directory: <packagename> path <path> [debug-files]``
|
|||
|
|
|||
|
The specified package contains a ``.debug`` directory, which should
|
|||
|
not appear in anything but the ``-dbg`` package. This situation might
|
|||
|
occur if you add a path which contains a ``.debug`` directory and do
|
|||
|
not explicitly add the ``.debug`` directory to the ``-dbg`` package.
|
|||
|
If this is the case, add the ``.debug`` directory explicitly to
|
|||
|
``FILES:${PN}-dbg``. See :term:`FILES` for additional
|
|||
|
information on :term:`FILES`.
|
|||
|
|
|||
|
.. _qa-check-empty-dirs:
|
|||
|
|
|||
|
- ``<packagename> installs files in <path>, but it is expected to be empty [empty-dirs]``
|
|||
|
|
|||
|
The specified package is installing files into a directory that is
|
|||
|
normally expected to be empty (such as ``/tmp``). These files may
|
|||
|
be more appropriately installed to a different location, or
|
|||
|
perhaps alternatively not installed at all, usually by updating the
|
|||
|
:ref:`ref-tasks-install` task/function.
|
|||
|
|
|||
|
.. _qa-check-arch:
|
|||
|
|
|||
|
- ``Architecture did not match (<file_arch>, expected <machine_arch>) in <file> [arch]``
|
|||
|
|
|||
|
By default, the OpenEmbedded build system checks the Executable and
|
|||
|
Linkable Format (ELF) type, bit size, and endianness of any binaries
|
|||
|
to ensure they match the target architecture. This test fails if any
|
|||
|
binaries do not match the type since there would be an
|
|||
|
incompatibility. The test could indicate that the wrong compiler or
|
|||
|
compiler options have been used. Sometimes software, like
|
|||
|
bootloaders, might need to bypass this check. If the file you receive
|
|||
|
the error for is firmware that is not intended to be executed within
|
|||
|
the target operating system or is intended to run on a separate
|
|||
|
processor within the device, you can add "arch" to
|
|||
|
:term:`INSANE_SKIP` for the package. Another
|
|||
|
option is to check the :ref:`ref-tasks-compile` log
|
|||
|
and verify that the compiler options being used are correct.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
- ``Bit size did not match (<file_bits>, expected <machine_bits>) in <file> [arch]``
|
|||
|
|
|||
|
By default, the OpenEmbedded build system checks the Executable and
|
|||
|
Linkable Format (ELF) type, bit size, and endianness of any binaries
|
|||
|
to ensure they match the target architecture. This test fails if any
|
|||
|
binaries do not match the type since there would be an
|
|||
|
incompatibility. The test could indicate that the wrong compiler or
|
|||
|
compiler options have been used. Sometimes software, like
|
|||
|
bootloaders, might need to bypass this check. If the file you receive
|
|||
|
the error for is firmware that is not intended to be executed within
|
|||
|
the target operating system or is intended to run on a separate
|
|||
|
processor within the device, you can add "arch" to
|
|||
|
:term:`INSANE_SKIP` for the package. Another
|
|||
|
option is to check the :ref:`ref-tasks-compile` log
|
|||
|
and verify that the compiler options being used are correct.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
- ``Endianness did not match (<file_endianness>, expected <machine_endianness>) in <file> [arch]``
|
|||
|
|
|||
|
By default, the OpenEmbedded build system checks the Executable and
|
|||
|
Linkable Format (ELF) type, bit size, and endianness of any binaries
|
|||
|
to ensure they match the target architecture. This test fails if any
|
|||
|
binaries do not match the type since there would be an
|
|||
|
incompatibility. The test could indicate that the wrong compiler or
|
|||
|
compiler options have been used. Sometimes software, like
|
|||
|
bootloaders, might need to bypass this check. If the file you receive
|
|||
|
the error for is firmware that is not intended to be executed within
|
|||
|
the target operating system or is intended to run on a separate
|
|||
|
processor within the device, you can add "arch" to
|
|||
|
:term:`INSANE_SKIP` for the package. Another
|
|||
|
option is to check the :ref:`ref-tasks-compile` log
|
|||
|
and verify that the compiler options being used are correct.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-textrel:
|
|||
|
|
|||
|
- ``ELF binary '<file>' has relocations in .text [textrel]``
|
|||
|
|
|||
|
The specified ELF binary contains relocations in its ``.text``
|
|||
|
sections. This situation can result in a performance impact at
|
|||
|
runtime.
|
|||
|
|
|||
|
Typically, the way to solve this performance issue is to add "-fPIC"
|
|||
|
or "-fpic" to the compiler command-line options. For example, given
|
|||
|
software that reads :term:`CFLAGS` when you build it,
|
|||
|
you could add the following to your recipe::
|
|||
|
|
|||
|
CFLAGS:append = " -fPIC "
|
|||
|
|
|||
|
For more information on text relocations at runtime, see
|
|||
|
https://www.akkadia.org/drepper/textrelocs.html.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-ldflags:
|
|||
|
|
|||
|
- ``File '<file>' in package '<package>' doesn't have GNU_HASH (didn't pass LDFLAGS?) [ldflags]``
|
|||
|
|
|||
|
This indicates that binaries produced when building the recipe have
|
|||
|
not been linked with the :term:`LDFLAGS` options
|
|||
|
provided by the build system. Check to be sure that the :term:`LDFLAGS`
|
|||
|
variable is being passed to the linker command. A common workaround
|
|||
|
for this situation is to pass in :term:`LDFLAGS` using
|
|||
|
:term:`TARGET_CC_ARCH` within the recipe as
|
|||
|
follows::
|
|||
|
|
|||
|
TARGET_CC_ARCH += "${LDFLAGS}"
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-xorg-driver-abi:
|
|||
|
|
|||
|
- ``Package <packagename> contains Xorg driver (<driver>) but no xorg-abi- dependencies [xorg-driver-abi]``
|
|||
|
|
|||
|
The specified package contains an Xorg driver, but does not have a
|
|||
|
corresponding ABI package dependency. The xserver-xorg recipe
|
|||
|
provides driver ABI names. All drivers should depend on the ABI
|
|||
|
versions that they have been built against. Driver recipes that
|
|||
|
include ``xorg-driver-input.inc`` or ``xorg-driver-video.inc`` will
|
|||
|
automatically get these versions. Consequently, you should only need
|
|||
|
to explicitly add dependencies to binary driver recipes.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-infodir:
|
|||
|
|
|||
|
- ``The /usr/share/info/dir file is not meant to be shipped in a particular package. [infodir]``
|
|||
|
|
|||
|
The ``/usr/share/info/dir`` should not be packaged. Add the following
|
|||
|
line to your :ref:`ref-tasks-install` task or to your
|
|||
|
``do_install:append`` within the recipe as follows::
|
|||
|
|
|||
|
rm ${D}${infodir}/dir
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-symlink-to-sysroot:
|
|||
|
|
|||
|
- ``Symlink <path> in <packagename> points to TMPDIR [symlink-to-sysroot]``
|
|||
|
|
|||
|
The specified symlink points into :term:`TMPDIR` on the
|
|||
|
host. Such symlinks will work on the host. However, they are clearly
|
|||
|
invalid when running on the target. You should either correct the
|
|||
|
symlink to use a relative path or remove the symlink.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-la:
|
|||
|
|
|||
|
- ``<file> failed sanity test (workdir) in path <path> [la]``
|
|||
|
|
|||
|
The specified ``.la`` file contains :term:`TMPDIR`
|
|||
|
paths. Any ``.la`` file containing these paths is incorrect since
|
|||
|
``libtool`` adds the correct sysroot prefix when using the files
|
|||
|
automatically itself.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-pkgconfig:
|
|||
|
|
|||
|
- ``<file> failed sanity test (tmpdir) in path <path> [pkgconfig]``
|
|||
|
|
|||
|
The specified ``.pc`` file contains
|
|||
|
:term:`TMPDIR`\ ``/``\ :term:`WORKDIR`
|
|||
|
paths. Any ``.pc`` file containing these paths is incorrect since
|
|||
|
``pkg-config`` itself adds the correct sysroot prefix when the files
|
|||
|
are accessed.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-debug-deps:
|
|||
|
|
|||
|
- ``<packagename> rdepends on <debug_packagename> [debug-deps]``
|
|||
|
|
|||
|
There is a dependency between the specified non-dbg package (i.e. a
|
|||
|
package whose name does not end in ``-dbg``) and a package that is a
|
|||
|
``dbg`` package. The ``dbg`` packages contain debug symbols and are
|
|||
|
brought in using several different methods:
|
|||
|
|
|||
|
- Using the ``dbg-pkgs``
|
|||
|
:term:`IMAGE_FEATURES` value.
|
|||
|
|
|||
|
- Using :term:`IMAGE_INSTALL`.
|
|||
|
|
|||
|
- As a dependency of another ``dbg`` package that was brought in
|
|||
|
using one of the above methods.
|
|||
|
|
|||
|
The dependency might have been automatically added because the
|
|||
|
``dbg`` package erroneously contains files that it should not contain
|
|||
|
(e.g. a non-symlink ``.so`` file) or it might have been added
|
|||
|
manually (e.g. by adding to :term:`RDEPENDS`).
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-dev-deps:
|
|||
|
|
|||
|
- ``<packagename> rdepends on <dev_packagename> [dev-deps]``
|
|||
|
|
|||
|
There is a dependency between the specified non-dev package (a package
|
|||
|
whose name does not end in ``-dev``) and a package that is a ``dev``
|
|||
|
package. The ``dev`` packages contain development headers and are
|
|||
|
usually brought in using several different methods:
|
|||
|
|
|||
|
- Using the ``dev-pkgs``
|
|||
|
:term:`IMAGE_FEATURES` value.
|
|||
|
|
|||
|
- Using :term:`IMAGE_INSTALL`.
|
|||
|
|
|||
|
- As a dependency of another ``dev`` package that was brought in
|
|||
|
using one of the above methods.
|
|||
|
|
|||
|
The dependency might have been automatically added (because the
|
|||
|
``dev`` package erroneously contains files that it should not have
|
|||
|
(e.g. a non-symlink ``.so`` file) or it might have been added
|
|||
|
manually (e.g. by adding to :term:`RDEPENDS`).
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-dep-cmp:
|
|||
|
|
|||
|
- ``<var>:<packagename> is invalid: <comparison> (<value>) only comparisons <, =, >, <=, and >= are allowed [dep-cmp]``
|
|||
|
|
|||
|
If you are adding a versioned dependency relationship to one of the
|
|||
|
dependency variables (:term:`RDEPENDS`,
|
|||
|
:term:`RRECOMMENDS`,
|
|||
|
:term:`RSUGGESTS`,
|
|||
|
:term:`RPROVIDES`,
|
|||
|
:term:`RREPLACES`, or
|
|||
|
:term:`RCONFLICTS`), you must only use the named
|
|||
|
comparison operators. Change the versioned dependency values you are
|
|||
|
adding to match those listed in the message.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-compile-host-path:
|
|||
|
|
|||
|
- ``<recipename>: The compile log indicates that host include and/or library paths were used. Please check the log '<logfile>' for more information. [compile-host-path]``
|
|||
|
|
|||
|
The log for the :ref:`ref-tasks-compile` task
|
|||
|
indicates that paths on the host were searched for files, which is
|
|||
|
not appropriate when cross-compiling. Look for "is unsafe for
|
|||
|
cross-compilation" or "CROSS COMPILE Badness" in the specified log
|
|||
|
file.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-install-host-path:
|
|||
|
|
|||
|
- ``<recipename>: The install log indicates that host include and/or library paths were used. Please check the log '<logfile>' for more information. [install-host-path]``
|
|||
|
|
|||
|
The log for the :ref:`ref-tasks-install` task
|
|||
|
indicates that paths on the host were searched for files, which is
|
|||
|
not appropriate when cross-compiling. Look for "is unsafe for
|
|||
|
cross-compilation" or "CROSS COMPILE Badness" in the specified log
|
|||
|
file.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-configure-unsafe:
|
|||
|
|
|||
|
- ``This autoconf log indicates errors, it looked at host include and/or library paths while determining system capabilities. Rerun configure task after fixing this. [configure-unsafe]``
|
|||
|
|
|||
|
The log for the :ref:`ref-tasks-configure` task
|
|||
|
indicates that paths on the host were searched for files, which is
|
|||
|
not appropriate when cross-compiling. Look for "is unsafe for
|
|||
|
cross-compilation" or "CROSS COMPILE Badness" in the specified log
|
|||
|
file.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-pkgname:
|
|||
|
|
|||
|
- ``<packagename> doesn't match the [a-z0-9.+-]+ regex [pkgname]``
|
|||
|
|
|||
|
The convention within the OpenEmbedded build system (sometimes
|
|||
|
enforced by the package manager itself) is to require that package
|
|||
|
names are all lower case and to allow a restricted set of characters.
|
|||
|
If your recipe name does not match this, or you add packages to
|
|||
|
:term:`PACKAGES` that do not conform to the
|
|||
|
convention, then you will receive this error. Rename your recipe. Or,
|
|||
|
if you have added a non-conforming package name to :term:`PACKAGES`,
|
|||
|
change the package name appropriately.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-unknown-configure-option:
|
|||
|
|
|||
|
- ``<recipe>: configure was passed unrecognized options: <options> [unknown-configure-option]``
|
|||
|
|
|||
|
The configure script is reporting that the specified options are
|
|||
|
unrecognized. This situation could be because the options were
|
|||
|
previously valid but have been removed from the configure script. Or,
|
|||
|
there was a mistake when the options were added and there is another
|
|||
|
option that should be used instead. If you are unsure, consult the
|
|||
|
upstream build documentation, the ``./configure --help`` output, and
|
|||
|
the upstream change log or release notes. Once you have worked out
|
|||
|
what the appropriate change is, you can update
|
|||
|
:term:`EXTRA_OECONF`,
|
|||
|
:term:`PACKAGECONFIG_CONFARGS`, or the
|
|||
|
individual :term:`PACKAGECONFIG` option values
|
|||
|
accordingly.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-pn-overrides:
|
|||
|
|
|||
|
- ``Recipe <recipefile> has PN of "<recipename>" which is in OVERRIDES, this can result in unexpected behavior. [pn-overrides]``
|
|||
|
|
|||
|
The specified recipe has a name (:term:`PN`) value that
|
|||
|
appears in :term:`OVERRIDES`. If a recipe is named
|
|||
|
such that its :term:`PN` value matches something already in :term:`OVERRIDES`
|
|||
|
(e.g. :term:`PN` happens to be the same as :term:`MACHINE`
|
|||
|
or :term:`DISTRO`), it can have unexpected
|
|||
|
consequences. For example, assignments such as
|
|||
|
``FILES:${PN} = "xyz"`` effectively turn into ``FILES = "xyz"``.
|
|||
|
Rename your recipe (or if :term:`PN` is being set explicitly, change the
|
|||
|
:term:`PN` value) so that the conflict does not occur. See
|
|||
|
:term:`FILES` for additional information.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-pkgvarcheck:
|
|||
|
|
|||
|
- ``<recipefile>: Variable <variable> is set as not being package specific, please fix this. [pkgvarcheck]``
|
|||
|
|
|||
|
Certain variables (:term:`RDEPENDS`,
|
|||
|
:term:`RRECOMMENDS`,
|
|||
|
:term:`RSUGGESTS`,
|
|||
|
:term:`RCONFLICTS`,
|
|||
|
:term:`RPROVIDES`,
|
|||
|
:term:`RREPLACES`, :term:`FILES`,
|
|||
|
``pkg_preinst``, ``pkg_postinst``, ``pkg_prerm``, ``pkg_postrm``, and
|
|||
|
:term:`ALLOW_EMPTY`) should always be set specific
|
|||
|
to a package (i.e. they should be set with a package name override
|
|||
|
such as ``RDEPENDS:${PN} = "value"`` rather than
|
|||
|
``RDEPENDS = "value"``). If you receive this error, correct any
|
|||
|
assignments to these variables within your recipe.
|
|||
|
|
|||
|
|
|||
|
- ``recipe uses DEPENDS:${PN}, should use DEPENDS [pkgvarcheck]``
|
|||
|
|
|||
|
This check looks for instances of setting ``DEPENDS:${PN}``
|
|||
|
which is erroneous (:term:`DEPENDS` is a recipe-wide variable and thus
|
|||
|
it is not correct to specify it for a particular package, nor will such
|
|||
|
an assignment actually work.) Set :term:`DEPENDS` instead.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-already-stripped:
|
|||
|
|
|||
|
- ``File '<file>' from <recipename> was already stripped, this will prevent future debugging! [already-stripped]``
|
|||
|
|
|||
|
Produced binaries have already been stripped prior to the build
|
|||
|
system extracting debug symbols. It is common for upstream software
|
|||
|
projects to default to stripping debug symbols for output binaries.
|
|||
|
In order for debugging to work on the target using ``-dbg`` packages,
|
|||
|
this stripping must be disabled.
|
|||
|
|
|||
|
Depending on the build system used by the software being built,
|
|||
|
disabling this stripping could be as easy as specifying an additional
|
|||
|
configure option. If not, disabling stripping might involve patching
|
|||
|
the build scripts. In the latter case, look for references to "strip"
|
|||
|
or "STRIP", or the "-s" or "-S" command-line options being specified
|
|||
|
on the linker command line (possibly through the compiler command
|
|||
|
line if preceded with "-Wl,").
|
|||
|
|
|||
|
.. note::
|
|||
|
|
|||
|
Disabling stripping here does not mean that the final packaged
|
|||
|
binaries will be unstripped. Once the OpenEmbedded build system
|
|||
|
splits out debug symbols to the ``-dbg`` package, it will then
|
|||
|
strip the symbols from the binaries.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-packages-list:
|
|||
|
|
|||
|
- ``<packagename> is listed in PACKAGES multiple times, this leads to packaging errors. [packages-list]``
|
|||
|
|
|||
|
Package names must appear only once in the
|
|||
|
:term:`PACKAGES` variable. You might receive this
|
|||
|
error if you are attempting to add a package to :term:`PACKAGES` that is
|
|||
|
already in the variable's value.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-files-invalid:
|
|||
|
|
|||
|
- ``FILES variable for package <packagename> contains '//' which is invalid. Attempting to fix this but you should correct the metadata. [files-invalid]``
|
|||
|
|
|||
|
The string "//" is invalid in a Unix path. Correct all occurrences
|
|||
|
where this string appears in a :term:`FILES` variable so
|
|||
|
that there is only a single "/".
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-installed-vs-shipped:
|
|||
|
|
|||
|
- ``<recipename>: Files/directories were installed but not shipped in any package [installed-vs-shipped]``
|
|||
|
|
|||
|
Files have been installed within the
|
|||
|
:ref:`ref-tasks-install` task but have not been
|
|||
|
included in any package by way of the :term:`FILES`
|
|||
|
variable. Files that do not appear in any package cannot be present
|
|||
|
in an image later on in the build process. You need to do one of the
|
|||
|
following:
|
|||
|
|
|||
|
- Add the files to :term:`FILES` for the package you want them to appear
|
|||
|
in (e.g. ``FILES:${``\ :term:`PN`\ ``}`` for the main
|
|||
|
package).
|
|||
|
|
|||
|
- Delete the files at the end of the :ref:`ref-tasks-install` task if the
|
|||
|
files are not needed in any package.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
- ``<oldpackage>-<oldpkgversion> was registered as shlib provider for <library>, changing it to <newpackage>-<newpkgversion> because it was built later``
|
|||
|
|
|||
|
This message means that both ``<oldpackage>`` and ``<newpackage>``
|
|||
|
provide the specified shared library. You can expect this message
|
|||
|
when a recipe has been renamed. However, if that is not the case, the
|
|||
|
message might indicate that a private version of a library is being
|
|||
|
erroneously picked up as the provider for a common library. If that
|
|||
|
is the case, you should add the library's ``.so`` filename to
|
|||
|
:term:`PRIVATE_LIBS` in the recipe that provides
|
|||
|
the private version of the library.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-unlisted-pkg-lics:
|
|||
|
|
|||
|
- ``LICENSE:<packagename> includes licenses (<licenses>) that are not listed in LICENSE [unlisted-pkg-lics]``
|
|||
|
|
|||
|
The :term:`LICENSE` of the recipe should be a superset
|
|||
|
of all the licenses of all packages produced by this recipe. In other
|
|||
|
words, any license in ``LICENSE:*`` should also appear in
|
|||
|
:term:`LICENSE`.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-configure-gettext:
|
|||
|
|
|||
|
- ``AM_GNU_GETTEXT used but no inherit gettext [configure-gettext]``
|
|||
|
|
|||
|
If a recipe is building something that uses automake and the automake
|
|||
|
files contain an ``AM_GNU_GETTEXT`` directive then this check will fail
|
|||
|
if there is no ``inherit gettext`` statement in the recipe to ensure
|
|||
|
that gettext is available during the build. Add ``inherit gettext`` to
|
|||
|
remove the warning.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-mime:
|
|||
|
|
|||
|
- ``package contains mime types but does not inherit mime: <packagename> path '<file>' [mime]``
|
|||
|
|
|||
|
The specified package contains mime type files (``.xml`` files in
|
|||
|
``${datadir}/mime/packages``) and yet does not inherit the
|
|||
|
:ref:`ref-classes-mime` class which will ensure that these get
|
|||
|
properly installed. Either add ``inherit mime`` to the recipe or remove the
|
|||
|
files at the :ref:`ref-tasks-install` step if they are not needed.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-mime-xdg:
|
|||
|
|
|||
|
- ``package contains desktop file with key 'MimeType' but does not inhert mime-xdg: <packagename> path '<file>' [mime-xdg]``
|
|||
|
|
|||
|
The specified package contains a .desktop file with a 'MimeType' key
|
|||
|
present, but does not inherit the :ref:`mime-xdg <ref-classes-mime-xdg>`
|
|||
|
class that is required in order for that to be activated. Either add
|
|||
|
``inherit mime`` to the recipe or remove the files at the
|
|||
|
:ref:`ref-tasks-install` step if they are not needed.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-src-uri-bad:
|
|||
|
|
|||
|
- ``<recipename>: SRC_URI uses unstable GitHub archives [src-uri-bad]``
|
|||
|
|
|||
|
GitHub provides "archive" tarballs, however these can be re-generated
|
|||
|
on the fly and thus the file's signature will not necessarily match that
|
|||
|
in the :term:`SRC_URI` checksums in future leading to build failures. It is
|
|||
|
recommended that you use an official release tarball or switch to
|
|||
|
pulling the corresponding revision in the actual git repository instead.
|
|||
|
|
|||
|
|
|||
|
- ``SRC_URI uses PN not BPN [src-uri-bad]``
|
|||
|
|
|||
|
If some part of :term:`SRC_URI` needs to reference the recipe name, it should do
|
|||
|
so using ${:term:`BPN`} rather than ${:term:`PN`} as the latter will change
|
|||
|
for different variants of the same recipe e.g. when :term:`BBCLASSEXTEND`
|
|||
|
or multilib are being used. This check will fail if a reference to ``${PN}``
|
|||
|
is found within the :term:`SRC_URI` value --- change it to ``${BPN}`` instead.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-unhandled-features-check:
|
|||
|
|
|||
|
- ``<recipename>: recipe doesn't inherit features_check [unhandled-features-check]``
|
|||
|
|
|||
|
This check ensures that if one of the variables that the
|
|||
|
:ref:`ref-classes-features_check` class supports (e.g.
|
|||
|
:term:`REQUIRED_DISTRO_FEATURES`) is used, then the recipe
|
|||
|
inherits :ref:`ref-classes-features_check` in order for
|
|||
|
the requirement to actually work. If you are seeing this message, either
|
|||
|
add ``inherit features_check`` to your recipe or remove the reference to
|
|||
|
the variable if it is not needed.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-missing-update-alternatives:
|
|||
|
|
|||
|
- ``<recipename>: recipe defines ALTERNATIVE:<packagename> but doesn't inherit update-alternatives. This might fail during do_rootfs later! [missing-update-alternatives]``
|
|||
|
|
|||
|
This check ensures that if a recipe sets the :term:`ALTERNATIVE` variable that the
|
|||
|
recipe also inherits :ref:`ref-classes-update-alternatives` such
|
|||
|
that the alternative will be correctly set up. If you are seeing this message, either
|
|||
|
add ``inherit update-alternatives`` to your recipe or remove the reference to the variable
|
|||
|
if it is not needed.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-shebang-size:
|
|||
|
|
|||
|
- ``<packagename>: <file> maximum shebang size exceeded, the maximum size is 128. [shebang-size]``
|
|||
|
|
|||
|
This check ensures that the shebang line (``#!`` in the first line) for a script
|
|||
|
is not longer than 128 characters, which can cause an error at runtime depending
|
|||
|
on the operating system. If you are seeing this message then the specified script
|
|||
|
may need to be patched to have a shorter in order to avoid runtime problems.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-perllocalpod:
|
|||
|
|
|||
|
- ``<packagename> contains perllocal.pod (<files>), should not be installed [perllocalpod]``
|
|||
|
|
|||
|
``perllocal.pod`` is an index file of locally installed modules and so shouldn't be
|
|||
|
installed by any distribution packages. The :ref:`ref-classes-cpan` class
|
|||
|
already sets ``NO_PERLLOCAL`` to stop this file being generated by most Perl recipes,
|
|||
|
but if a recipe is using ``MakeMaker`` directly then they might not be doing this
|
|||
|
correctly. This check ensures that perllocal.pod is not in any package in order to
|
|||
|
avoid multiple packages shipping this file and thus their packages conflicting
|
|||
|
if installed together.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-usrmerge:
|
|||
|
|
|||
|
- ``<packagename> package is not obeying usrmerge distro feature. /<path> should be relocated to /usr. [usrmerge]``
|
|||
|
|
|||
|
If ``usrmerge`` is in :term:`DISTRO_FEATURES`, this check will ensure that no package
|
|||
|
installs files to root (``/bin``, ``/sbin``, ``/lib``, ``/lib64``) directories. If you are seeing this
|
|||
|
message, it indicates that the :ref:`ref-tasks-install` step (or perhaps the build process that
|
|||
|
:ref:`ref-tasks-install` is calling into, e.g. ``make install`` is using hardcoded paths instead
|
|||
|
of the variables set up for this (``bindir``, ``sbindir``, etc.), and should be
|
|||
|
changed so that it does.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-patch-fuzz:
|
|||
|
|
|||
|
- ``Fuzz detected: <patch output> [patch-fuzz]``
|
|||
|
|
|||
|
This check looks for evidence of "fuzz" when applying patches within the :ref:`ref-tasks-patch`
|
|||
|
task. Patch fuzz is a situation when the ``patch`` tool ignores some of the context
|
|||
|
lines in order to apply the patch. Consider this example:
|
|||
|
|
|||
|
Patch to be applied::
|
|||
|
|
|||
|
--- filename
|
|||
|
+++ filename
|
|||
|
context line 1
|
|||
|
context line 2
|
|||
|
context line 3
|
|||
|
+newly added line
|
|||
|
context line 4
|
|||
|
context line 5
|
|||
|
context line 6
|
|||
|
|
|||
|
Original source code::
|
|||
|
|
|||
|
different context line 1
|
|||
|
different context line 2
|
|||
|
context line 3
|
|||
|
context line 4
|
|||
|
different context line 5
|
|||
|
different context line 6
|
|||
|
|
|||
|
Outcome (after applying patch with fuzz)::
|
|||
|
|
|||
|
different context line 1
|
|||
|
different context line 2
|
|||
|
context line 3
|
|||
|
newly added line
|
|||
|
context line 4
|
|||
|
different context line 5
|
|||
|
different context line 6
|
|||
|
|
|||
|
Chances are, the newly added line was actually added in a completely
|
|||
|
wrong location, or it was already in the original source and was added
|
|||
|
for the second time. This is especially possible if the context line 3
|
|||
|
and 4 are blank or have only generic things in them, such as ``#endif`` or ``}``.
|
|||
|
Depending on the patched code, it is entirely possible for an incorrectly
|
|||
|
patched file to still compile without errors.
|
|||
|
|
|||
|
*How to eliminate patch fuzz warnings*
|
|||
|
|
|||
|
Use the ``devtool`` command as explained by the warning. First, unpack the
|
|||
|
source into devtool workspace::
|
|||
|
|
|||
|
devtool modify <recipe>
|
|||
|
|
|||
|
This will apply all of the patches, and create new commits out of them in
|
|||
|
the workspace --- with the patch context updated.
|
|||
|
|
|||
|
Then, replace the patches in the recipe layer::
|
|||
|
|
|||
|
devtool finish --force-patch-refresh <recipe> <layer_path>
|
|||
|
|
|||
|
The patch updates then need be reviewed (preferably with a side-by-side diff
|
|||
|
tool) to ensure they are indeed doing the right thing i.e.:
|
|||
|
|
|||
|
#. they are applied in the correct location within the file;
|
|||
|
#. they do not introduce duplicate lines, or otherwise do things that
|
|||
|
are no longer necessary.
|
|||
|
|
|||
|
To confirm these things, you can also review the patched source code in
|
|||
|
devtool's workspace, typically in ``<build_dir>/workspace/sources/<recipe>/``
|
|||
|
|
|||
|
Once the review is done, you can create and publish a layer commit with
|
|||
|
the patch updates that modify the context. Devtool may also refresh
|
|||
|
other things in the patches, those can be discarded.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-patch-status:
|
|||
|
|
|||
|
- ``Missing Upstream-Status in patch <patchfile> Please add according to <url> [patch-status-core/patch-status-noncore]``
|
|||
|
|
|||
|
The ``Upstream-Status`` value is missing in the specified patch file's header.
|
|||
|
This value is intended to track whether or not the patch has been sent
|
|||
|
upstream, whether or not it has been merged, etc.
|
|||
|
|
|||
|
There are two options for this same check - ``patch-status-core`` (for
|
|||
|
recipes in OE-Core) and ``patch-status-noncore`` (for recipes in any other
|
|||
|
layer).
|
|||
|
|
|||
|
For more information, see the
|
|||
|
":ref:`contributor-guide/recipe-style-guide:patch upstream status`"
|
|||
|
section in the Yocto Project and OpenEmbedded Contributor Guide.
|
|||
|
|
|||
|
- ``Malformed Upstream-Status in patch <patchfile> Please correct according to <url> [patch-status-core/patch-status-noncore]``
|
|||
|
|
|||
|
The ``Upstream-Status`` value in the specified patch file's header is invalid -
|
|||
|
it must be a specific format. See the "Missing Upstream-Status" entry above
|
|||
|
for more information.
|
|||
|
|
|||
|
|
|||
|
.. _qa-check-buildpaths:
|
|||
|
|
|||
|
- ``File <filename> in package <packagename> contains reference to TMPDIR [buildpaths]``
|
|||
|
|
|||
|
This check ensures that build system paths (including :term:`TMPDIR`) do not
|
|||
|
appear in output files, which not only leaks build system configuration into
|
|||
|
the target, but also hinders binary reproducibility as the output will change
|
|||
|
if the build system configuration changes.
|
|||
|
|
|||
|
Typically these paths will enter the output through some mechanism in the
|
|||
|
configuration or compilation of the software being built by the recipe. To
|
|||
|
resolve this issue you will need to determine how the detected path is
|
|||
|
entering the output. Sometimes it may require adjusting scripts or code to
|
|||
|
use a relative path rather than an absolute one, or to pick up the path from
|
|||
|
runtime configuration or environment variables.
|
|||
|
|
|||
|
|
|||
|
Configuring and Disabling QA Checks
|
|||
|
===================================
|
|||
|
|
|||
|
You can configure the QA checks globally so that specific check failures
|
|||
|
either raise a warning or an error message, using the
|
|||
|
:term:`WARN_QA` and :term:`ERROR_QA`
|
|||
|
variables, respectively. You can also disable checks within a particular
|
|||
|
recipe using :term:`INSANE_SKIP`. For information on
|
|||
|
how to work with the QA checks, see the
|
|||
|
":ref:`ref-classes-insane`" section.
|
|||
|
|
|||
|
.. note::
|
|||
|
|
|||
|
Please keep in mind that the QA checks are meant to detect real
|
|||
|
or potential problems in the packaged output. So exercise caution
|
|||
|
when disabling these checks.
|