Moving to the Yocto Project 2.1 Release (krogoth)
=================================================

This section provides migration information for moving to the Yocto
Project 2.1 Release (codename "krogoth") from the prior release.

.. _migration-2.1-variable-expansion-in-python-functions:

Variable Expansion in Python Functions
--------------------------------------

Variable expressions, such as ``${VARNAME}`` no longer expand
automatically within Python functions. Suppressing expansion was done to
allow Python functions to construct shell scripts or other code for
situations in which you do not want such expressions expanded. For any
existing code that relies on these expansions, you need to change the
expansions to expand the value of individual variables through
``d.getVar()``. To alternatively expand more complex expressions, use
``d.expand()``.

.. _migration-2.1-overrides-must-now-be-lower-case:

Overrides Must Now be Lower-Case
--------------------------------

The convention for overrides has always been for them to be lower-case
characters. This practice is now a requirement as BitBake's datastore
now assumes lower-case characters in order to give a slight performance
boost during parsing. In practical terms, this requirement means that
anything that ends up in :term:`OVERRIDES` must now
appear in lower-case characters (e.g. values for ``MACHINE``,
``TARGET_ARCH``, ``DISTRO``, and also recipe names if
``_pn-``\ recipename overrides are to be effective).

.. _migration-2.1-expand-parameter-to-getvar-and-getvarflag-now-mandatory:

Expand Parameter to ``getVar()`` and ``getVarFlag()`` is Now Mandatory
----------------------------------------------------------------------

The expand parameter to ``getVar()`` and ``getVarFlag()`` previously
defaulted to False if not specified. Now, however, no default exists so
one must be specified. You must change any ``getVar()`` calls that do
not specify the final expand parameter to calls that do specify the
parameter. You can run the following ``sed`` command at the base of a
layer to make this change:
::

   sed -e 's:\(\.getVar([^,()]*\)):\1, False):g' -i `grep -ril getVar *`
   sed -e 's:\(\.getVarFlag([^,()]*,[^,()]*\)):\1, False):g' -i `grep -ril getVarFlag *`

.. note::

   The reason for this change is that it prepares the way for changing
   the default to True in a future Yocto Project release. This future
   change is a much more sensible default than False. However, the
   change needs to be made gradually as a sudden change of the default
   would potentially cause side-effects that would be difficult to
   detect.

.. _migration-2.1-makefile-environment-changes:

Makefile Environment Changes
----------------------------

:term:`EXTRA_OEMAKE` now defaults to "" instead of
"-e MAKEFLAGS=". Setting ``EXTRA_OEMAKE`` to "-e MAKEFLAGS=" by default
was a historical accident that has required many classes (e.g.
``autotools``, ``module``) and recipes to override this default in order
to work with sensible build systems. When upgrading to the release, you
must edit any recipe that relies upon this old default by either setting
``EXTRA_OEMAKE`` back to "-e MAKEFLAGS=" or by explicitly setting any
required variable value overrides using ``EXTRA_OEMAKE``, which is
typically only needed when a Makefile sets a default value for a
variable that is inappropriate for cross-compilation using the "="
operator rather than the "?=" operator.

.. _migration-2.1-libexecdir-reverted-to-prefix-libexec:

``libexecdir`` Reverted to ``${prefix}/libexec``
------------------------------------------------

The use of ``${libdir}/${BPN}`` as ``libexecdir`` is different as
compared to all other mainstream distributions, which either uses
``${prefix}/libexec`` or ``${libdir}``. The use is also contrary to the
GNU Coding Standards (i.e.
https://www.gnu.org/prep/standards/html_node/Directory-Variables.html)
that suggest ``${prefix}/libexec`` and also notes that any
package-specific nesting should be done by the package itself. Finally,
having ``libexecdir`` change between recipes makes it very difficult for
different recipes to invoke binaries that have been installed into
``libexecdir``. The Filesystem Hierarchy Standard (i.e.
https://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch04s07.html) now
recognizes the use of ``${prefix}/libexec/``, giving distributions the
choice between ``${prefix}/lib`` or ``${prefix}/libexec`` without
breaking FHS.

.. _migration-2.1-ac-cv-sizeof-off-t-no-longer-cached-in-site-files:

``ac_cv_sizeof_off_t`` is No Longer Cached in Site Files
--------------------------------------------------------

For recipes inheriting the :ref:`autotools <ref-classes-autotools>`
class, ``ac_cv_sizeof_off_t`` is no longer cached in the site files for
``autoconf``. The reason for this change is because the
``ac_cv_sizeof_off_t`` value is not necessarily static per architecture
as was previously assumed. Rather, the value changes based on whether
large file support is enabled. For most software that uses ``autoconf``,
this change should not be a problem. However, if you have a recipe that
bypasses the standard :ref:`ref-tasks-configure` task
from the ``autotools`` class and the software the recipe is building
uses a very old version of ``autoconf``, the recipe might be incapable
of determining the correct size of ``off_t`` during ``do_configure``.

The best course of action is to patch the software as necessary to allow
the default implementation from the ``autotools`` class to work such
that ``autoreconf`` succeeds and produces a working configure script,
and to remove the overridden ``do_configure`` task such that the default
implementation does get used.

.. _migration-2.1-image-generation-split-out-from-filesystem-generation:

Image Generation is Now Split Out from Filesystem Generation
------------------------------------------------------------

Previously, for image recipes the :ref:`ref-tasks-rootfs`
task assembled the filesystem and then from that filesystem generated
images. With this Yocto Project release, image generation is split into
separate :ref:`ref-tasks-image` tasks for clarity both in
operation and in the code.

For most cases, this change does not present any problems. However, if
you have made customizations that directly modify the ``do_rootfs`` task
or that mention ``do_rootfs``, you might need to update those changes.
In particular, if you had added any tasks after ``do_rootfs``, you
should make edits so that those tasks are after the
:ref:`ref-tasks-image-complete` task rather than
after ``do_rootfs`` so that your added tasks run at the correct
time.

A minor part of this restructuring is that the post-processing
definitions and functions have been moved from the
:ref:`image <ref-classes-image>` class to the
:ref:`rootfs-postcommands <ref-classes-rootfs*>` class. Functionally,
however, they remain unchanged.

.. _migration-2.1-removed-recipes:

Removed Recipes
---------------

The following recipes have been removed in the 2.1 release:

-  ``gcc`` version 4.8: Versions 4.9 and 5.3 remain.

-  ``qt4``: All support for Qt 4.x has been moved out to a separate
   ``meta-qt4`` layer because Qt 4 is no longer supported upstream.

-  ``x11vnc``: Moved to the ``meta-oe`` layer.

-  ``linux-yocto-3.14``: No longer supported.

-  ``linux-yocto-3.19``: No longer supported.

-  ``libjpeg``: Replaced by the ``libjpeg-turbo`` recipe.

-  ``pth``: Became obsolete.

-  ``liboil``: Recipe is no longer needed and has been moved to the
   ``meta-multimedia`` layer.

-  ``gtk-theme-torturer``: Recipe is no longer needed and has been moved
   to the ``meta-gnome`` layer.

-  ``gnome-mime-data``: Recipe is no longer needed and has been moved to
   the ``meta-gnome`` layer.

-  ``udev``: Replaced by the ``eudev`` recipe for compatibility when
   using ``sysvinit`` with newer kernels.

-  ``python-pygtk``: Recipe became obsolete.

-  ``adt-installer``: Recipe became obsolete. See the
   ":ref:`ref-manual/migration-2.1:adt removed`" section for more information.

.. _migration-2.1-class-changes:

Class Changes
-------------

The following classes have changed:

-  ``autotools_stage``: Removed because the
   :ref:`autotools <ref-classes-autotools>` class now provides its
   functionality. Recipes that inherited from ``autotools_stage`` should
   now inherit from ``autotools`` instead.

-  ``boot-directdisk``: Merged into the ``image-vm`` class. The
   ``boot-directdisk`` class was rarely directly used. Consequently,
   this change should not cause any issues.

-  ``bootimg``: Merged into the
   :ref:`image-live <ref-classes-image-live>` class. The ``bootimg``
   class was rarely directly used. Consequently, this change should not
   cause any issues.

-  ``packageinfo``: Removed due to its limited use by the Hob UI, which
   has itself been removed.

.. _migration-2.1-build-system-ui-changes:

Build System User Interface Changes
-----------------------------------

The following changes have been made to the build system user interface:

-  *Hob GTK+-based UI*: Removed because it is unmaintained and based on
   the outdated GTK+ 2 library. The Toaster web-based UI is much more
   capable and is actively maintained. See the
   ":ref:`toaster-manual/setup-and-use:using the toaster web interface`"
   section in the Toaster User Manual for more information on this
   interface.

-  *"puccho" BitBake UI*: Removed because is unmaintained and no longer
   useful.

.. _migration-2.1-adt-removed:

ADT Removed
-----------

The Application Development Toolkit (ADT) has been removed because its
functionality almost completely overlapped with the :ref:`standard
SDK <sdk-manual/using:using the standard sdk>` and the
:ref:`extensible SDK <sdk-manual/extensible:using the extensible sdk>`. For
information on these SDKs and how to build and use them, see the
:doc:`/sdk-manual/index` manual.

.. note::

   The Yocto Project Eclipse IDE Plug-in is still supported and is not
   affected by this change.

.. _migration-2.1-poky-reference-distribution-changes:

Poky Reference Distribution Changes
-----------------------------------

The following changes have been made for the Poky distribution:

-  The ``meta-yocto`` layer has been renamed to ``meta-poky`` to better
   match its purpose, which is to provide the Poky reference
   distribution. The ``meta-yocto-bsp`` layer retains its original name
   since it provides reference machines for the Yocto Project and it is
   otherwise unrelated to Poky. References to ``meta-yocto`` in your
   ``conf/bblayers.conf`` should automatically be updated, so you should
   not need to change anything unless you are relying on this naming
   elsewhere.

-  The :ref:`uninative <ref-classes-uninative>` class is now enabled
   by default in Poky. This class attempts to isolate the build system
   from the host distribution's C library and makes re-use of native
   shared state artifacts across different host distributions practical.
   With this class enabled, a tarball containing a pre-built C library
   is downloaded at the start of the build.

   The ``uninative`` class is enabled through the
   ``meta/conf/distro/include/yocto-uninative.inc`` file, which for
   those not using the Poky distribution, can include to easily enable
   the same functionality.

   Alternatively, if you wish to build your own ``uninative`` tarball,
   you can do so by building the ``uninative-tarball`` recipe, making it
   available to your build machines (e.g. over HTTP/HTTPS) and setting a
   similar configuration as the one set by ``yocto-uninative.inc``.

-  Static library generation, for most cases, is now disabled by default
   in the Poky distribution. Disabling this generation saves some build
   time as well as the size used for build output artifacts.

   Disabling this library generation is accomplished through a
   ``meta/conf/distro/include/no-static-libs.inc``, which for those not
   using the Poky distribution can easily include to enable the same
   functionality.

   Any recipe that needs to opt-out of having the "--disable-static"
   option specified on the configure command line either because it is
   not a supported option for the configure script or because static
   libraries are needed should set the following variable:
   ::

      DISABLE_STATIC = ""

-  The separate ``poky-tiny`` distribution now uses the musl C library
   instead of a heavily pared down ``glibc``. Using musl results in a
   smaller distribution and facilitates much greater maintainability
   because musl is designed to have a small footprint.

   If you have used ``poky-tiny`` and have customized the ``glibc``
   configuration you will need to redo those customizations with musl
   when upgrading to the new release.

.. _migration-2.1-packaging-changes:

Packaging Changes
-----------------

The following changes have been made to packaging:

-  The ``runuser`` and ``mountpoint`` binaries, which were previously in
   the main ``util-linux`` package, have been split out into the
   ``util-linux-runuser`` and ``util-linux-mountpoint`` packages,
   respectively.

-  The ``python-elementtree`` package has been merged into the
   ``python-xml`` package.

.. _migration-2.1-tuning-file-changes:

Tuning File Changes
-------------------

The following changes have been made to the tuning files:

-  The "no-thumb-interwork" tuning feature has been dropped from the ARM
   tune include files. Because interworking is required for ARM EABI,
   attempting to disable it through a tuning feature no longer makes
   sense.

   .. note::

      Support for ARM OABI was deprecated in gcc 4.7.

-  The ``tune-cortexm*.inc`` and ``tune-cortexr4.inc`` files have been
   removed because they are poorly tested. Until the OpenEmbedded build
   system officially gains support for CPUs without an MMU, these tuning
   files would probably be better maintained in a separate layer if
   needed.

.. _migration-2.1-supporting-gobject-introspection:

Supporting GObject Introspection
--------------------------------

This release supports generation of GLib Introspective Repository (GIR)
files through GObject introspection, which is the standard mechanism for
accessing GObject-based software from runtime environments. You can
enable, disable, and test the generation of this data. See the
":ref:`dev-manual/common-tasks:enabling gobject introspection support`"
section in the Yocto Project Development Tasks Manual for more
information.

.. _migration-2.1-miscellaneous-changes:

Miscellaneous Changes
---------------------

These additional changes exist:

-  The minimum Git version has been increased to 1.8.3.1. If your host
   distribution does not provide a sufficiently recent version, you can
   install the buildtools, which will provide it. See the
   :ref:`ref-manual/system-requirements:required git, tar, python and gcc versions`
   section for more information on the buildtools tarball.

-  The buggy and incomplete support for the RPM version 4 package
   manager has been removed. The well-tested and maintained support for
   RPM version 5 remains.

-  Previously, the following list of packages were removed if
   package-management was not in
   :term:`IMAGE_FEATURES`, regardless of any
   dependencies:
   ::

      update-rc.d
      base-passwd
      shadow
      update-alternatives
      run-postinsts

   With the Yocto Project 2.1 release, these packages are
   only removed if "read-only-rootfs" is in ``IMAGE_FEATURES``, since
   they might still be needed for a read-write image even in the absence
   of a package manager (e.g. if users need to be added, modified, or
   removed at runtime).

-  The
   :ref:`devtool modify <sdk-manual/extensible:use \`\`devtool modify\`\` to modify the source of an existing component>`
   command now defaults to extracting the source since that is most
   commonly expected. The "-x" or "--extract" options are now no-ops. If
   you wish to provide your own existing source tree, you will now need
   to specify either the "-n" or "--no-extract" options when running
   ``devtool modify``.

-  If the formfactor for a machine is either not supplied or does not
   specify whether a keyboard is attached, then the default is to assume
   a keyboard is attached rather than assume no keyboard. This change
   primarily affects the Sato UI.

-  The ``.debug`` directory packaging is now automatic. If your recipe
   builds software that installs binaries into directories other than
   the standard ones, you no longer need to take care of setting
   ``FILES_${PN}-dbg`` to pick up the resulting ``.debug`` directories
   as these directories are automatically found and added.

-  Inaccurate disk and CPU percentage data has been dropped from
   ``buildstats`` output. This data has been replaced with
   ``getrusage()`` data and corrected IO statistics. You will probably
   need to update any custom code that reads the ``buildstats`` data.

-  The ``meta/conf/distro/include/package_regex.inc`` is now deprecated.
   The contents of this file have been moved to individual recipes.

   .. note::

      Because this file will likely be removed in a future Yocto Project
      release, it is suggested that you remove any references to the
      file that might be in your configuration.

-  The ``v86d/uvesafb`` has been removed from the ``genericx86`` and
   ``genericx86-64`` reference machines, which are provided by the
   ``meta-yocto-bsp`` layer. Most modern x86 boards do not rely on this
   file and it only adds kernel error messages during startup. If you do
   still need to support ``uvesafb``, you can simply add ``v86d`` to
   your image.

-  Build sysroot paths are now removed from debug symbol files. Removing
   these paths means that remote GDB using an unstripped build system
   sysroot will no longer work (although this was never documented to
   work). The supported method to accomplish something similar is to set
   ``IMAGE_GEN_DEBUGFS`` to "1", which will generate a companion debug
   image containing unstripped binaries and associated debug sources
   alongside the image.


