|  | <!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" | 
|  | "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" | 
|  | [<!ENTITY % poky SYSTEM "../poky.ent"> %poky; ] > | 
|  |  | 
|  | <chapter id='ref-qa-checks'> | 
|  | <title>QA Error and Warning Messages</title> | 
|  |  | 
|  | <section id='qa-introduction'> | 
|  | <title>Introduction</title> | 
|  |  | 
|  | <para> | 
|  | 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. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | 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. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | 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> | 
|  | <title>Notes</title> | 
|  | <itemizedlist> | 
|  | <listitem><para> | 
|  | At the end of each message, the name of the associated | 
|  | QA test (as listed in the | 
|  | "<link linkend='ref-classes-insane'><filename>insane.bbclass</filename></link>" | 
|  | section) appears within square brackets. | 
|  | </para></listitem> | 
|  | <listitem><para> | 
|  | 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. | 
|  | </para></listitem> | 
|  | <listitem><para> | 
|  | Because some QA checks are disabled by default, this list | 
|  | does not include all possible QA check errors and warnings. | 
|  | </para></listitem> | 
|  | </itemizedlist> | 
|  | </note> | 
|  | </para> | 
|  | </section> | 
|  |  | 
|  | <section id='qa-errors-and-warnings'> | 
|  | <title>Errors and Warnings</title> | 
|  |  | 
|  | <!-- | 
|  | This section uses the <para><code> construct to enable permalinks for the | 
|  | various QA issue and warning messages.  The file templates/qa-code-permalinks.xsl | 
|  | is used to locate the construct and generate the permalink.  This solution | 
|  | leverages the fact that right now this section in the ref-manual is the only | 
|  | place is all the YP docs that uses the <para><code> construct.  If, in the | 
|  | future, that construct were to appear in the ref-manual, a generic permalink | 
|  | would be generated for the text between <code></code>.  If a better solution | 
|  | can be found then it should be implemented.  I can't find one at the moment. | 
|  | --> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-libexec'> | 
|  | <code> | 
|  | <packagename>: <path> is using libexec please relocate to <libexecdir> [libexec] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | The specified package contains files in | 
|  | <filename>/usr/libexec</filename> when the distro | 
|  | configuration uses a different path for | 
|  | <filename><libexecdir></filename> | 
|  | By default, <filename><libexecdir></filename> is | 
|  | <filename>$prefix/libexec</filename>. | 
|  | However, this default can be changed (e.g. | 
|  | <filename>${libdir}</filename>). | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-rpaths'> | 
|  | <code> | 
|  | package <packagename> contains bad RPATH <rpath> in file <file> [rpaths] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | The specified binary produced by the recipe contains dynamic | 
|  | library load paths (rpaths) that contain build system paths | 
|  | such as | 
|  | <link linkend='var-TMPDIR'><filename>TMPDIR</filename></link>, | 
|  | which are incorrect for the target and could potentially | 
|  | be a security issue. | 
|  | Check for bad <filename>-rpath</filename> options being | 
|  | passed to the linker in your | 
|  | <link linkend='ref-tasks-compile'><filename>do_compile</filename></link> | 
|  | 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. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-useless-rpaths'> | 
|  | <code> | 
|  | <packagename>: <file> contains probably-redundant RPATH <rpath> [useless-rpaths] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | 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. | 
|  | <filename>/lib</filename> and <filename>/usr/lib</filename>). | 
|  | 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. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-file-rdeps'> | 
|  | <code> | 
|  | <packagename> requires <files>, but no providers in its RDEPENDS [file-rdeps] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | A file-level dependency has been identified from the | 
|  | specified package on the specified files, but there is | 
|  | no explicit corresponding entry in | 
|  | <link linkend='var-RDEPENDS'><filename>RDEPENDS</filename></link>. | 
|  | If particular files are required at runtime then | 
|  | <filename>RDEPENDS</filename> should be declared in the | 
|  | recipe to ensure the packages providing them are built. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-build-deps'> | 
|  | <code> | 
|  | <packagename1> rdepends on <packagename2>, but it isn't a build dependency? [build-deps] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | A runtime dependency exists 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 | 
|  | <link linkend='var-RDEPENDS'><filename>RDEPENDS</filename></link> | 
|  | 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 <filename>RDEPENDS</filename> for the dependency. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-dev-so'> | 
|  | <code> | 
|  | non -dev/-dbg/nativesdk- package contains symlink .so: <packagename> path '<path>' [dev-so] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | Symlink <filename>.so</filename> files are for development | 
|  | only, and should therefore go into the | 
|  | <filename>-dev</filename> package. | 
|  | This situation might occur if you add | 
|  | <filename>*.so*</filename> rather than | 
|  | <filename>*.so.*</filename> to a non-dev package. | 
|  | Change | 
|  | <link linkend='var-FILES'><filename>FILES</filename></link> | 
|  | (and possibly | 
|  | <link linkend='var-PACKAGES'><filename>PACKAGES</filename></link>) | 
|  | such that the specified <filename>.so</filename> file goes | 
|  | into an appropriate <filename>-dev</filename> package. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-staticdev'> | 
|  | <code> | 
|  | non -staticdev package contains static .a library: <packagename> path '<path>' [staticdev] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | Static <filename>.a</filename> library files should go into | 
|  | a <filename>-staticdev</filename> package. | 
|  | Change | 
|  | <link linkend='var-FILES'><filename>FILES</filename></link> | 
|  | (and possibly | 
|  | <link linkend='var-PACKAGES'><filename>PACKAGES</filename></link>) | 
|  | such that the specified <filename>.a</filename> file goes | 
|  | into an appropriate <filename>-staticdev</filename> package. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-libdir'> | 
|  | <code> | 
|  | <packagename>: found library in wrong location [libdir] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | The specified file may have been installed into an incorrect | 
|  | (possibly hardcoded) installation path. | 
|  | For example, this test will catch recipes that install | 
|  | <filename>/lib/bar.so</filename> when | 
|  | <filename>${base_libdir}</filename> is "lib32". | 
|  | Another example is when recipes install | 
|  | <filename>/usr/lib64/foo.so</filename> when | 
|  | <filename>${libdir}</filename> is "/usr/lib". | 
|  | False positives occasionally exist. | 
|  | For these cases add "libdir" to | 
|  | <link linkend='var-INSANE_SKIP'><filename>INSANE_SKIP</filename></link> | 
|  | for the package. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-debug-files'> | 
|  | <code> | 
|  | non debug package contains .debug directory: <packagename> path <path> [debug-files] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | The specified package contains a | 
|  | <filename>.debug</filename> directory, which should not | 
|  | appear in anything but the <filename>-dbg</filename> | 
|  | package. | 
|  | This situation might occur if you add a path which contains | 
|  | a <filename>.debug</filename> directory and do not | 
|  | explicitly add the <filename>.debug</filename> directory | 
|  | to the <filename>-dbg</filename> package. | 
|  | If this is the case, add the <filename>.debug</filename> | 
|  | directory explicitly to | 
|  | <filename>FILES_${PN}-dbg</filename>. | 
|  | See | 
|  | <link linkend='var-FILES'><filename>FILES</filename></link> | 
|  | for additional information on <filename>FILES</filename>. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-arch'> | 
|  | <code> | 
|  | Architecture did not match (<machine_arch> to <file_arch>) on <file> [arch] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | 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 | 
|  | <link linkend='var-INSANE_SKIP'><filename>INSANE_SKIP</filename></link> | 
|  | for the package. | 
|  | Another option is to check the | 
|  | <link linkend='ref-tasks-compile'><filename>do_compile</filename></link> | 
|  | log and verify that the compiler options being used | 
|  | are correct. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-arch-bit-size-no-match'> | 
|  | <code> | 
|  | Bit size did not match (<machine_bits> to <file_bits>) <recipe> on <file> [arch] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | 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 | 
|  | <link linkend='var-INSANE_SKIP'><filename>INSANE_SKIP</filename></link> | 
|  | for the package. | 
|  | Another option is to check the | 
|  | <link linkend='ref-tasks-compile'><filename>do_compile</filename></link> | 
|  | log and verify that the compiler options being used are | 
|  | correct. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-arch-endianness-no-match'> | 
|  | <code> | 
|  | Endianness did not match (<machine_endianness> to <file_endianness>) on <file> [arch] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | 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 | 
|  | <link linkend='var-INSANE_SKIP'><filename>INSANE_SKIP</filename></link> | 
|  | for the package. | 
|  | Another option is to check the | 
|  | <link linkend='ref-tasks-compile'><filename>do_compile</filename></link> | 
|  | log and verify that the compiler options being used | 
|  | are correct. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-textrel'> | 
|  | <code> | 
|  | ELF binary '<file>' has relocations in .text [textrel] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | The specified ELF binary contains relocations in its | 
|  | <filename>.text</filename> sections. | 
|  | This situation can result in a performance impact | 
|  | at runtime. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | 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 | 
|  | <link linkend='var-CFLAGS'><filename>CFLAGS</filename></link> | 
|  | when you build it, you could add the following to your | 
|  | recipe: | 
|  | <literallayout class='monospaced'> | 
|  | CFLAGS_append = " -fPIC " | 
|  | </literallayout> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | For more information on text relocations at runtime, see | 
|  | <ulink url='http://www.akkadia.org/drepper/textrelocs.html'></ulink>. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-ldflags'> | 
|  | <code> | 
|  | No GNU_HASH in the elf binary: '<file>' [ldflags] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | This indicates that binaries produced when building the | 
|  | recipe have not been linked with the | 
|  | <link linkend='var-LDFLAGS'><filename>LDFLAGS</filename></link> | 
|  | options provided by the build system. | 
|  | Check to be sure that the <filename>LDFLAGS</filename> | 
|  | variable is being passed to the linker command. | 
|  | A common workaround for this situation is to pass in | 
|  | <filename>LDFLAGS</filename> using | 
|  | <link linkend='var-TARGET_CC_ARCH'><filename>TARGET_CC_ARCH</filename></link> | 
|  | within the recipe as follows: | 
|  | <literallayout class='monospaced'> | 
|  | TARGET_CC_ARCH += "${LDFLAGS}" | 
|  | </literallayout> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-xorg-driver-abi'> | 
|  | <code> | 
|  | Package <packagename> contains Xorg driver (<driver>) but no xorg-abi- dependencies [xorg-driver-abi] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | 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 | 
|  | <filename>xorg-driver-input.inc</filename> or | 
|  | <filename>xorg-driver-video.inc</filename> will | 
|  | automatically get these versions. | 
|  | Consequently, you should only need to explicitly add | 
|  | dependencies to binary driver recipes. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-infodir'> | 
|  | <code> | 
|  | The /usr/share/info/dir file is not meant to be shipped in a particular package. [infodir] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | The <filename>/usr/share/info/dir</filename> should not be | 
|  | packaged. | 
|  | Add the following line to your | 
|  | <link linkend='ref-tasks-install'><filename>do_install</filename></link> | 
|  | task or to your <filename>do_install_append</filename> | 
|  | within the recipe as follows: | 
|  | <literallayout class='monospaced'> | 
|  | rm ${D}${infodir}/dir | 
|  | </literallayout> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-symlink-to-sysroot'> | 
|  | <code> | 
|  | Symlink <path> in <packagename> points to TMPDIR [symlink-to-sysroot] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | The specified symlink points into | 
|  | <link linkend='var-TMPDIR'><filename>TMPDIR</filename></link> | 
|  | 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. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-la'> | 
|  | <code> | 
|  | <file> failed sanity test (workdir) in path <path> [la] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | The specified <filename>.la</filename> file contains | 
|  | <link linkend='var-TMPDIR'><filename>TMPDIR</filename></link> | 
|  | paths. | 
|  | Any <filename>.la</filename> file containing these paths | 
|  | is incorrect since <filename>libtool</filename> adds the | 
|  | correct sysroot prefix when using the files automatically | 
|  | itself. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-pkgconfig'> | 
|  | <code> | 
|  | <file> failed sanity test (tmpdir) in path <path> [pkgconfig] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | The specified <filename>.pc</filename> file contains | 
|  | <link linkend='var-TMPDIR'><filename>TMPDIR</filename></link><filename>/</filename><link linkend='var-WORKDIR'><filename>WORKDIR</filename></link> | 
|  | paths. | 
|  | Any <filename>.pc</filename> file containing these paths is | 
|  | incorrect since <filename>pkg-config</filename> itself adds | 
|  | the correct sysroot prefix when the files are accessed. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-debug-deps'> | 
|  | <code> | 
|  | <packagename> rdepends on <debug_packagename> [debug-deps] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | A dependency exists between the specified non-dbg package | 
|  | (i.e. a package whose name does not end in | 
|  | <filename>-dbg</filename>) and a package that is a | 
|  | <filename>dbg</filename> package. | 
|  | The <filename>dbg</filename> packages contain | 
|  | debug symbols and are brought in using several | 
|  | different methods: | 
|  | <itemizedlist> | 
|  | <listitem><para> | 
|  | Using the <filename>dbg-pkgs</filename> | 
|  | <link linkend='var-IMAGE_FEATURES'><filename>IMAGE_FEATURES</filename></link> | 
|  | value. | 
|  | </para></listitem> | 
|  | <listitem><para> | 
|  | Using | 
|  | <link linkend='var-IMAGE_INSTALL'><filename>IMAGE_INSTALL</filename></link>. | 
|  | </para></listitem> | 
|  | <listitem><para> | 
|  | As a dependency of another | 
|  | <filename>dbg</filename> package that was brought | 
|  | in using one of the above methods. | 
|  | </para></listitem> | 
|  | </itemizedlist> | 
|  | The dependency might have been automatically added | 
|  | because the <filename>dbg</filename> package erroneously | 
|  | contains files that it should not contain (e.g. a | 
|  | non-symlink <filename>.so</filename> file) or it might | 
|  | have been added manually (e.g. by adding to | 
|  | <link linkend='var-RDEPENDS'><filename>RDEPENDS</filename></link>). | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-dev-deps'> | 
|  | <code> | 
|  | <packagename> rdepends on <dev_packagename> [dev-deps] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | A dependency exists between the specified non-dev package | 
|  | (a package whose name does not end in | 
|  | <filename>-dev</filename>) and a package that is a | 
|  | <filename>dev</filename> package. | 
|  | The <filename>dev</filename> packages contain development | 
|  | headers and are usually brought in using several different | 
|  | methods: | 
|  | <itemizedlist> | 
|  | <listitem><para> | 
|  | Using the <filename>dev-pkgs</filename> | 
|  | <link linkend='var-IMAGE_FEATURES'><filename>IMAGE_FEATURES</filename></link> | 
|  | value. | 
|  | </para></listitem> | 
|  | <listitem><para> | 
|  | Using | 
|  | <link linkend='var-IMAGE_INSTALL'><filename>IMAGE_INSTALL</filename></link>. | 
|  | </para></listitem> | 
|  | <listitem><para> | 
|  | As a dependency of another | 
|  | <filename>dev</filename> package that was brought | 
|  | in using one of the above methods. | 
|  | </para></listitem> | 
|  | </itemizedlist> | 
|  | The dependency might have been automatically added (because | 
|  | the <filename>dev</filename> package erroneously contains | 
|  | files that it should not have (e.g. a non-symlink | 
|  | <filename>.so</filename> file) or it might have been added | 
|  | manually (e.g. by adding to | 
|  | <link linkend='var-RDEPENDS'><filename>RDEPENDS</filename></link>). | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-dep-cmp'> | 
|  | <code> | 
|  | <var>_<packagename> is invalid: <comparison> (<value>)   only comparisons <, =, >, <=, and >= are allowed [dep-cmp] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | If you are adding a versioned dependency relationship to one | 
|  | of the dependency variables | 
|  | (<link linkend='var-RDEPENDS'><filename>RDEPENDS</filename></link>, | 
|  | <link linkend='var-RRECOMMENDS'><filename>RRECOMMENDS</filename></link>, | 
|  | <link linkend='var-RSUGGESTS'><filename>RSUGGESTS</filename></link>, | 
|  | <link linkend='var-RPROVIDES'><filename>RPROVIDES</filename></link>, | 
|  | <link linkend='var-RREPLACES'><filename>RREPLACES</filename></link>, | 
|  | or | 
|  | <link linkend='var-RCONFLICTS'><filename>RCONFLICTS</filename></link>), | 
|  | you must only use the named comparison operators. | 
|  | Change the versioned dependency values you are adding | 
|  | to match those listed in the message. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-compile-host-path'> | 
|  | <code> | 
|  | <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] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | The log for the | 
|  | <link linkend='ref-tasks-compile'><filename>do_compile</filename></link> | 
|  | 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. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-install-host-path'> | 
|  | <code> | 
|  | <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] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | The log for the | 
|  | <link linkend='ref-tasks-install'><filename>do_install</filename></link> | 
|  | 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. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-autoconf-log'> | 
|  | <code> | 
|  | This autoconf log indicates errors, it looked at host include and/or library paths while determining system capabilities. Rerun configure task after fixing this. The path was '<path>' | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | The log for the | 
|  | <link linkend='ref-tasks-configure'><filename>do_configure</filename></link> | 
|  | 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. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-pkgname'> | 
|  | <code> | 
|  | <packagename> doesn't match the [a-z0-9.+-]+ regex [pkgname] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | 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 | 
|  | <link linkend='var-PACKAGES'><filename>PACKAGES</filename></link> | 
|  | 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 | 
|  | <filename>PACKAGES</filename>, change the package name | 
|  | appropriately. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-unknown-configure-option'> | 
|  | <code> | 
|  | <recipe>: configure was passed unrecognized options: <options> [unknown-configure-option] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | 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 | 
|  | <filename>./configure --help</filename> output, | 
|  | and the upstream change log or release notes. | 
|  | Once you have worked out what the appropriate | 
|  | change is, you can update | 
|  | <link linkend='var-EXTRA_OECONF'><filename>EXTRA_OECONF</filename></link>, | 
|  | <link linkend='var-PACKAGECONFIG_CONFARGS'><filename>PACKAGECONFIG_CONFARGS</filename></link>, | 
|  | or the individual | 
|  | <link linkend='var-PACKAGECONFIG'><filename>PACKAGECONFIG</filename></link> | 
|  | option values accordingly. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-pn-overrides'> | 
|  | <code> | 
|  | Recipe <recipefile> has PN of "<recipename>" which is in OVERRIDES, this can result in unexpected behavior. [pn-overrides] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | The specified recipe has a name | 
|  | (<link linkend='var-PN'><filename>PN</filename></link>) | 
|  | value that appears in | 
|  | <link linkend='var-OVERRIDES'><filename>OVERRIDES</filename></link>. | 
|  | If a recipe is named such that its <filename>PN</filename> | 
|  | value matches something already in | 
|  | <filename>OVERRIDES</filename> (e.g. <filename>PN</filename> | 
|  | happens to be the same as | 
|  | <link linkend='var-MACHINE'><filename>MACHINE</filename></link> | 
|  | or | 
|  | <link linkend='var-DISTRO'><filename>DISTRO</filename></link>), | 
|  | it can have unexpected consequences. | 
|  | For example, assignments such as | 
|  | <filename>FILES_${PN} = "xyz"</filename> effectively | 
|  | turn into <filename>FILES = "xyz"</filename>. | 
|  | Rename your recipe (or if <filename>PN</filename> is being | 
|  | set explicitly, change the <filename>PN</filename> value) so | 
|  | that the conflict does not occur. | 
|  | See | 
|  | <link linkend='var-FILES'><filename>FILES</filename></link> | 
|  | for additional information. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-pkgvarcheck'> | 
|  | <code> | 
|  | <recipefile>: Variable <variable> is set as not being package specific, please fix this. [pkgvarcheck] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | Certain variables | 
|  | (<link linkend='var-RDEPENDS'><filename>RDEPENDS</filename></link>, | 
|  | <link linkend='var-RRECOMMENDS'><filename>RRECOMMENDS</filename></link>, | 
|  | <link linkend='var-RSUGGESTS'><filename>RSUGGESTS</filename></link>, | 
|  | <link linkend='var-RCONFLICTS'><filename>RCONFLICTS</filename></link>, | 
|  | <link linkend='var-RPROVIDES'><filename>RPROVIDES</filename></link>, | 
|  | <link linkend='var-RREPLACES'><filename>RREPLACES</filename></link>, | 
|  | <link linkend='var-FILES'><filename>FILES</filename></link>, | 
|  | <filename>pkg_preinst</filename>, | 
|  | <filename>pkg_postinst</filename>, | 
|  | <filename>pkg_prerm</filename>, | 
|  | <filename>pkg_postrm</filename>, and | 
|  | <link linkend='var-ALLOW_EMPTY'><filename>ALLOW_EMPTY</filename></link>) | 
|  | should always be set specific to a package (i.e. they | 
|  | should be set with a package name override such as | 
|  | <filename>RDEPENDS_${PN} = "value"</filename> rather than | 
|  | <filename>RDEPENDS = "value"</filename>). | 
|  | If you receive this error, correct any assignments to these | 
|  | variables within your recipe. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-already-stripped'> | 
|  | <code> | 
|  | File '<file>' from <recipename> was already stripped, this will prevent future debugging! [already-stripped] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | 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 | 
|  | <filename>-dbg</filename> packages, this stripping must be | 
|  | disabled. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | 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 <filename>-dbg</filename> package, | 
|  | it will then strip the symbols from the binaries. | 
|  | </note> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-packages-list'> | 
|  | <code> | 
|  | <packagename> is listed in PACKAGES multiple times, this leads to packaging errors. [packages-list] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | Package names must appear only once in the | 
|  | <link linkend='var-PACKAGES'><filename>PACKAGES</filename></link> | 
|  | variable. | 
|  | You might receive this error if you are attempting to add a | 
|  | package to <filename>PACKAGES</filename> that is | 
|  | already in the variable's value. | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-files-invalid'> | 
|  | <code> | 
|  | FILES variable for package <packagename> contains '//' which is invalid. Attempting to fix this but you should correct the metadata. [files-invalid] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | The string "//" is invalid in a Unix path. | 
|  | Correct all occurrences where this string appears in a | 
|  | <link linkend='var-FILES'><filename>FILES</filename></link> | 
|  | variable so that there is only a single "/". | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-installed-vs-shipped'> | 
|  | <code> | 
|  | <recipename>: Files/directories were installed but not shipped in any package [installed-vs-shipped] | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | Files have been installed within the | 
|  | <link linkend='ref-tasks-install'><filename>do_install</filename></link> | 
|  | task but have not been included in any package by way of the | 
|  | <link linkend='var-FILES'><filename>FILES</filename></link> | 
|  | 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: | 
|  | <itemizedlist> | 
|  | <listitem><para> | 
|  | Add the files to <filename>FILES</filename> for the | 
|  | package you want them to appear in (e.g. | 
|  | <filename>FILES_${</filename><link linkend='var-PN'><filename>PN</filename></link><filename>}</filename> for the main | 
|  | package). | 
|  | </para></listitem> | 
|  | <listitem><para> | 
|  | Delete the files at the end of the | 
|  | <filename>do_install</filename> task if the files | 
|  | are not needed in any package. | 
|  | </para></listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  |   | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem> | 
|  | <para id='qa-issue-old-and-new-package-and-version-names'> | 
|  | <code> | 
|  | <oldpackage>-<oldpkgversion> was registered as shlib provider for <library>, changing it to <newpackage>-<newpkgversion> because it was built later | 
|  | </code> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | This message means that both | 
|  | <filename><oldpackage></filename> and | 
|  | <filename><newpackage></filename> 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 | 
|  | <filename>.so</filename> file name to | 
|  | <link linkend='var-PRIVATE_LIBS'><filename>PRIVATE_LIBS</filename></link> | 
|  | in the recipe that provides | 
|  | the private version of the library. | 
|  | </para> | 
|  | </listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <!-- | 
|  | Here are some messages that might be documented in the future. | 
|  | Right now we are not documenting them because the QA checks are not | 
|  | enabled by default: | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem><para> | 
|  | <literallayout class='monospaced'> | 
|  | Desktop file issue: <error> [desktop] | 
|  | </literallayout> | 
|  | NEED A DESCRIPTION AND SOLUTION | 
|  | </para></listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem><para> | 
|  | <literallayout class='monospaced'> | 
|  | <packagename>: <file>, installed in the base_prefix, requires a shared library under exec_prefix (<exec_prefix&t;g) [unsafe-references-in-binaries] | 
|  | </literallayout> | 
|  | NEED A DESCRIPTION AND SOLUTION | 
|  | </para></listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  |  | 
|  | <para> | 
|  | <itemizedlist> | 
|  | <listitem><para> | 
|  | <literallayout class='monospaced'> | 
|  | <packagename>: Found a reference to <exec_prefix>/ in <path> - Shell scripts in base_bindir and base_sbindir should not reference anything in exec_prefix [unsafe-references-in-scripts] | 
|  | </literallayout> | 
|  | NEED A DESCRIPTION AND SOLUTION | 
|  | </para></listitem> | 
|  | </itemizedlist> | 
|  | </para> | 
|  | --> | 
|  | </section> | 
|  |  | 
|  | <section id='configuring-and-disabling-qa-checks'> | 
|  | <title>Configuring and Disabling QA Checks</title> | 
|  |  | 
|  | <para> | 
|  | You can configure the QA checks globally so that specific check | 
|  | failures either raise a warning or an error message, using the | 
|  | <link linkend='var-WARN_QA'><filename>WARN_QA</filename></link> and | 
|  | <link linkend='var-ERROR_QA'><filename>ERROR_QA</filename></link> | 
|  | variables, respectively. | 
|  | You can also disable checks within a particular recipe using | 
|  | <link linkend='var-INSANE_SKIP'><filename>INSANE_SKIP</filename></link>. | 
|  | For information on how to work with the QA checks, see the | 
|  | "<link linkend='ref-classes-insane'><filename>insane.bbclass</filename></link>" | 
|  | section. | 
|  | <note><title>Tip</title> | 
|  | Please keep in mind that the QA checks exist in order to | 
|  | detect real or potential problems in the packaged output. | 
|  | So exercise caution when disabling these checks. | 
|  | </note> | 
|  | </para> | 
|  | </section> | 
|  | </chapter> | 
|  | <!-- | 
|  | vim: expandtab tw=80 ts=4 | 
|  | --> |