# Incorporar funcionalidad a Yocto mediante capas: Un ejemplo con Qt

Una vez hemos construido nuestra distribución podemos incorporarle nuevas funcionalidades a través de capas.

Las capas no son más que grupos de recetas, cada una de las cuales contiene información sobre como construir un componente de software concreto, de manera que trabajando juntos se incorpora la funcionalidad deseada. Para nuestro ejemplo añadiremos a nuestra distribución el *framework* de desarrollo de aplicaciones [Qt](https://jesustorres.es/proyecto-qt-framework-de-desarrollo-de-aplicaciones).

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1635808170902/aMxI4XRKp.png align="center")

La versión actual del proyecto [Yocto](https://jmtorres.webs.ull.es/me/2013/01/yocto-poky-y-bitbake/) ya provee de la capa **meta-qt** que permite incluir [Qt 4.8 Embedded for Linux](http://doc.qt.io/qt-4.8/qt-embedded-linux.html) en nuestra distribución.

Sin embargo, en la versión 5 se actualiza y reemplaza [Qt](https://jesustorres.es/proyecto-qt-framework-de-desarrollo-de-aplicaciones) for Embedded Linux con un nuevo componente denominado [QPA](http://qt-project.org/wiki/Qt-Platform-Abstraction) o Qt Platform Abstraction. La nueva arquitectura es más simple, facilita la integración de [Qt](https://jesustorres.es/proyecto-qt-framework-de-desarrollo-de-aplicaciones) con cualquier sistema de ventanas —suprime el gestor de ventanas QWS incluido en [Qt](https://jesustorres.es/proyecto-qt-framework-de-desarrollo-de-aplicaciones) for Embedded Linux— y la inclusión de contenidos basados en [OpenGL](http://es.wikipedia.org/wiki/OpenGL). Por eso la 5 será la versión que utilizaremos en nuestro proyecto.

En [una charla de Thomas Senyk](http://qt-project.org/videos/watch/qpa-the-qt-platform-abstraction) se desarrollan mucho mejor todas estas diferencias y se justifican las ventajas de QPA respecto a su predecesor.

# Incorporar Qt

Incorporar [Qt](https://jesustorres.es/proyecto-qt-framework-de-desarrollo-de-aplicaciones) es muy similar a hacerlo para [el soporte de Raspberry Pi](https://jesustorres.es/crea-tu-propia-distro-de-linux-con-yocto/) a nuestra distribución.

Empezamos clonado localmente el repositorio **meta-qt5** fuera del directorio `raspberry-pi-build`.

```sh
git clone https://github.com/meta-qt5/meta-qt5.git
```

Después buscamos la variable `BBLAYERS` en `raspberry-pi-build/conf/bblayers.conf` y añadir al final la ruta hasta el repositorio de la capa **meta-qt5** para incluirla en el proceso de construcción. Por ejemplo:

```plaintext
BBLAYERS ?= "
 /home/usuario/poky-danny-8.0/meta 
 /home/usuario/poky-danny-8.0/meta-yocto 
 /home/usuario/poky-danny-8.0/meta-yocto-bsp 
 /home/usuario/meta-raspberry-pi 
 /home/usuario/meta-qt5 
"
```

Posteriormente, construimos la imagen del sistema:

```sh
cd raspberry-pi-build
bitbake rpi-basic-image
```

Recuerda que esta imagen incluye un servidor **SSH** y un *splash* de Raspberry Pi durante el arranque. Mientras que la imagen alternativa `rpi-hwup-image` no contiene ninguna de las dos cosas.

Finalmente, transferimos la imagen construida a la tarjeta SD:

```sh
sudo dd if=tmp/deploy/images/rpi-basic-image-raspberrypi.rpi-sdimg of=/ruta/a/la/sd
```

y ya podemos probarla en el dispositivo.

# Referencias

* [Yocto Project Quick Start](http://www.yoctoproject.org/docs/1.0/yocto-quick-start/yocto-project-qs.html).
