# Compile y empaquete su aplicación

Tomando como ejemplo la aplicación MauiKit base (mauimusic) creada como se indica en:

{% content-ref url="/pages/Q2ciTe01pHxPifuvVLOz" %}
[MauiKit](/start/qt-qml-en-imagenes/mauikit.md)
{% endcontent-ref %}

#### 1. Registre una cuenta en Open Build Service:

{% embed url="<https://openbuildservice.org>" %}

{% embed url="<https://build.opensuse.org>" %}

#### 2. Crear un subproyecto y añadir el repositorio MauiKit:

* En la página de subproyecto verá: Overview, Repositories, Monitor, Requests, etc.
* Seleccione Repositories > Add from a project:

  * Project: home:hopeandtruth6517:mauikit-apps
  * Repositories: openSUSE\_Tumbleweed
  * Name: mauikit-apps\_Tumbleweed
  * Architectures: i586, x86\_64

  El repositorio mauikit-apps depende a su vez del repositorio de openSUSE Tumbleweed, por lo que el repositorio añadido a su subproyecto tiene acceso a los 2 repositorios.

#### 3. Seleccionar el subproyecto y crear un paquete:

* Name: mauimusic
* Title: Maui Music
* Description: Discover and listen music

#### 3. De un modo sencillo (sin integración git):

* Elimine la carpeta mauimusic/build si ha compilado y ejecutado localmente.
* Haga una copia de la carpeta mauimusic y renómbrela mauimusic-0.1.0.
* Con el gestor de archivos Dolphin, haga click sobre la carpeta mauimusic-0.1.0 y seleccione Compress > Here as "mauimusic-0.1.0.tar.gz"
* Suba el archivo en Open Build Service: Add local files.

#### 4. En la página de paquete mauimusic seleccione:

* Add an empty file or service > Filename: mauimusic.spec

#### 5. Añade a mauimusic.spec:

<pre><code>%define mauikit_version 3.0.1

Name:           mauimusic
Version:        0.1.0
Release:        0
License:        LGPL-3.0
Summary:        Discover and listen music
URL:            https://github.com/user/mauimusic
Source:         %{name}-%{version}.tar.gz

%if 0%{?sle_version} == 150400 &#x26;&#x26; 0%{?is_opensuse} 
ExcludeArch: x86_64
%endif

%if 0%{?sle_version} == 150500 &#x26;&#x26; 0%{?is_opensuse} 
ExcludeArch: x86_64
%endif

BuildRequires:  gcc-c++
BuildRequires:  cmake
BuildRequires:  extra-cmake-modules
BuildRequires:  fdupes
BuildRequires:  AppStream

BuildRequires:  cmake(Qt5QuickCompiler)
BuildRequires:  cmake(Qt5Core)
BuildRequires:  cmake(Qt5Quick)
BuildRequires:  cmake(Qt5Qml)
BuildRequires:  cmake(Qt5Widgets)

BuildRequires:  cmake(KF5I18n)
BuildRequires:  cmake(KF5CoreAddons)

BuildRequires:  cmake(MauiKit) = %{mauikit_version}
BuildRequires:  cmake(MauiKitFileBrowsing) = %{mauikit_version}

Requires:       qt5qmlimport(QtQuick.Controls.2)
Requires:       qt5qmlimport(QtQuick.Layouts.1)

Requires:       mauikit = %{mauikit_version}
Requires:       mauikit-filebrowsing = %{mauikit_version}

%description
Discover and listen music.

<strong>%prep
</strong>%autosetup -p1

%build
%cmake_kf5 -d build
%cmake_build

%install
%kf5_makeinstall -C build
%kf5_post_install
%fdupes %{buildroot}%{_prefix}

%files
%license licenses/*
%doc README.md
%{_bindir}/mauimusic
%{_datadir}/applications/*.desktop
%{_datadir}/metainfo/*.xml
%{_datadir}/icons/hicolor/*/*/*

%changelog
</code></pre>

La aplicación debería compilar exitosamente: **succeeded**

## El fichero spec.

De un modo práctico con cada aplicación sólo tendrá que rellenar:

* Name, Versión, License, Summary, URL.
* BuildRequires y Requires.
* Description.
* Files.

**BuildRequires:**

Son los requerimientos durante la compilación. Son paquetes "**devel**".

* mauimusic/CMakeLists.txt (busque todas las líneas **find\_package**):
* mauimusic/src/CMakeLists.txt (busque todo en **target\_link\_libraries**)

```
find_package(ECM ${REQUIRED_KF5_VERSION} REQUIRED NO_MODULE)

find_package(Qt5 ${QT_MIN_VERSION} REQUIRED COMPONENTS Core Quick Qml Widgets)
find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS I18n CoreAddons)

find_package(Qt5QuickCompiler)
set_package_properties(Qt5QuickCompiler PROPERTIES
    DESCRIPTION "Compile QML at build time"
    TYPE OPTIONAL
    )

find_package(MauiKit3)
find_package(MauiKit3 REQUIRED COMPONENTS FileBrowsing)
```

```
target_link_libraries(${PROJECT_NAME}
    PRIVATE
    MauiKit3
    MauiKit3::FileBrowsing

    Qt5::Core
    Qt5::Quick
    Qt5::Widgets

    KF5::CoreAddons
    KF5::I18n
    )
```

Cada uno de ellos es un requerimiento de compilación y debe ser incluido como BuildRequires.

Abra Gestión de Software de YaST:

* Qt5Core / paquete libQt5Core-devel / dependencias > proporciona: cmake(Qt5Core)
* KF5I18n / paquete ki18n-devel / dependencias > proporciona: cmake(KF5I18n)

Para buscar el paquete que corresponde a cmake(Qt5Core), indíquelo en:

{% embed url="<https://pkgs.org/>" %}

Si ha encontrado la librería binaria compilada y desea conocer el paquete devel tambien puede buscarlo en:

* libKF5I18n5

{% embed url="<https://software.opensuse.org>" %}

Seleccione en los resultados: libKF5I18n5 > official release > ki18n.spec:

* Name: ki18n
* %package devel: nombre resultante ki18n-devel
* %package addon: nombre resultante ki18n-addon (ejemplo, no existe)

o bien:

* %define lname libKF5I18n5
* %package -n %{lname}: nombre resultante libKF5I18n5
* %package -n libMusic: nombre resultante libMusic

**Requires:**

Paquetes requeridos durante la instalación.

1. Paquetes binarios de cada librería.
2. Paquetes correspondientes a cada "import".

Dado que vienen instalados por defecto es costumbre no indicarlos, pero es necesario incluirlo si no se encuentra instalado.

Para comprobar los import:

* Instale Bluefish.
* Navegar hasta mauimusic > click derecho o secundario ratón sobre mauimusic > Buscar archivos:
* Escriba: import y click "buscar todos".

```
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.12
```

```
Requires:       qt5qmlimport(QtQuick.Controls.2)
Requires:       qt5qmlimport(QtQuick.Layouts.1)
```

Comprobando en:

{% embed url="<https://pkgs.org>" %}

* qt5qmlimport(QtQuick.Controls.2) es: libqt5-qtquickcontrols2-5.15.11+kde5-1.1.x86\_64.rpm
* qt5qmlimport(QtQuick.Layouts.1) es: qtdeclarative-imports-provides-qt5-1.0-1.22.x86\_64.rpm

#### Files

Indicados en mauimusic/CMakeLists.txt

```
project(mauimusic VERSION 1.0)
install(FILES src/data/project.appdata.xml DESTINATION ${KDE_INSTALL_METAINFODIR} RENAME ${PROJECT_URI}.appdata.xml)
install(FILES src/data/project.desktop DESTINATION ${XDG_APPS_INSTALL_DIR} RENAME ${PROJECT_URI}.desktop)
install(FILES src/assets/logo.svg DESTINATION ${KDE_INSTALL_ICONDIR}/hicolor/scalable/apps RENAME ${PROJECT_NAME}.svg)
```

Si alguna vez compila una aplicación y no sabe que archivos se instalan, no incluya nada en la sección Files y compile. Si la compilación es correcta, producirá "failed" antes de empaquetar, pero le indicará los archivos y rutas de instalación.

El nombre del ejecutable o binario es el nombre del proyecto:

```
project(mauimusic VERSION 1.0)
```

```
// mauimusic.spec

%files
%license licenses/*                    // mauimusic/licenses/LGPL-3.0.txt
%doc README.md                         // mauimusic/README.md
%{_bindir}/mauimusic                   // /usr/bin/mauimusic
%{_datadir}/applications/*.desktop     // /usr/share/applications/*.desktop
%{_datadir}/metainfo/*.xml             // /usr/share/metainfo/*.xml
%{_datadir}/icons/hicolor/*/*/*        // /usr/share/icons/hicolor/*/*/*
```

#### Macros de rutas.

| %{\_sysconfdir}         | /etc                                                      | <p><br></p>                                     |
| ----------------------- | --------------------------------------------------------- | ----------------------------------------------- |
| %{\_prefix}             | /usr                                                      | can be defined to /app for flatpak builds       |
| %{\_exec\_prefix}       | %{\_prefix}                                               | default: /usr                                   |
| %{\_includedir}         | %{\_prefix}/include                                       | default: /usr/include                           |
| %{\_bindir}             | %{\_exec\_prefix}/bin                                     | default: /usr/bin                               |
| %{\_libdir}             | %{\_exec\_prefix}/%{\_lib}                                | default: /usr/%{\_lib}                          |
| %{\_libexecdir}         | %{\_exec\_pre-fix}/libexec                                | default: /usr/libexec                           |
| %{\_sbindir}            | %{\_exec\_prefix}/sbin                                    | default: /usr/sbin                              |
| %{\_datadir}            | %{\_datarootdir}                                          | default: /usr/share                             |
| %{\_infodir}            | %{\_datarootdir}/info                                     | default: /usr/share/info                        |
| %{\_mandir}             | %{\_datarootdir}/man                                      | default: /usr/share/man                         |
| %{\_docdir}             | %{\_datadir}/doc                                          | default: /usr/share/doc                         |
| %{\_rundir}             | /run                                                      | <p><br></p>                                     |
| %{\_localstatedir}      | /var                                                      | <p><br></p>                                     |
| %{\_sharedstatedir}     | /var/lib                                                  | <p><br></p>                                     |
| %{\_lib}                | Lib64 / lib on 32bit platforms                            | <p><br></p>                                     |
| <p><br></p>             | <p><br></p>                                               | <p><br></p>                                     |
| %{\_dataroot-dir}       | %{\_prefix}/share                                         | default: /usr/share                             |
| %{\_var}                | /var                                                      | <p><br></p>                                     |
| %{\_tmppath}            | %{\_var}/tmp                                              | default: /var/tmp                               |
| %{\_usr}                | /usr                                                      | <p><br></p>                                     |
| %{\_usrsrc}             | %{\_usr}/src                                              | default: /usr/src                               |
| %{\_initddir}           | %{\_sysconfdir}/rc.d/init.d                               | default: /etc/rc.d/init.d                       |
| %{\_initrddir}          | %{\_initddir}                                             | antiguo error ortográfico, retro-compatibilidad |
| <p><br></p>             | <p><br></p>                                               | <p><br></p>                                     |
| %{buildroot}            | %{\_buildrootdir}/%{name}-%{version}-%{release}.%{\_arch} | same as $BUILDROOT                              |
| %{\_topdir}             | %{getenv:HOME}/rpmbuild                                   | <p><br></p>                                     |
| %{\_builddir}           | %{\_topdir}/BUILD                                         | <p><br></p>                                     |
| %{\_rpmdir}             | %{\_topdir}/RPMS                                          | <p><br></p>                                     |
| %{\_sourcedir}          | %{\_topdir}/SOURCES                                       | <p><br></p>                                     |
| %{\_specdir}            | %{\_topdir}/SPECS                                         | <p><br></p>                                     |
| %{\_srcrpmdir}          | %{\_topdir}/SRPMS                                         | <p><br></p>                                     |
| %{\_buildrootdir}       | %{\_topdir}/BUILDROOT                                     | <p><br></p>                                     |
| <p><br></p>             | <p><br></p>                                               | <p><br></p>                                     |
| %{\_kf5\_libdir}        | /usr/%{\_lib}                                             | <p><br></p>                                     |
| %{\_kf5\_configkcfgdir} | /usr/share/config.kcfg                                    | <p><br></p>                                     |
| <p><br></p>             | <p><br></p>                                               | <p><br></p>                                     |
| %{\_docdir}             | /usr/share/doc/packages                                   | <p><br></p>                                     |

#### Otras secciones

<pre><code><strong>// Si es openSUSE Leap 15.4 y 15.5 excluir paquete (arquitectura x86_64)
</strong><strong>
</strong><strong>%if 0%{?sle_version} == 150400 &#x26;&#x26; 0%{?is_opensuse} 
</strong>ExcludeArch: x86_64
%endif

%if 0%{?sle_version} == 150500 &#x26;&#x26; 0%{?is_opensuse} 
ExcludeArch: x86_64
%endif
</code></pre>

```
BuildRequires:  gcc-c++              // compilador de GNU para código escrito en C++
BuildRequires:  cmake                // herramienta de construcción para proyectos con CMakeList.txt
BuildRequires:  extra-cmake-modules  // añade los módulos, incluyendo los usados por find_package() en CMakeList.txt para encontrar el software.
BuildRequires:  fdupes               // herramienta para reemplazar los archivos duplicados por enlaces para disminuir el espacio usado en el sistema instalado
BuildRequires:  AppStream            // soporte de metadatos: /usr/share/metainfo/*.xml o mauimusic/org.kde.mauimusic.appdata.xml
```

```
%prep
%autosetup -p1                 // extrae mauimusic-0.1.0.tar.gz y entra en carpeta mauimusic-0.1.0
                               // autosetup -p1 -n maui-v0.1.0 especifica nombre carpeta si no coincide con %{name}-%{version}
                               // -p1: omite nombre de la primera carpeta superior al aplicar patch

%build
%cmake_kf5 -d build            // configura
%cmake_build                   // compila

%install
%kf5_makeinstall -C build      // instala

%kf5_post_install
%fdupes %{buildroot}%{_prefix} // elimina duplicados reemplazándolos por enlaces
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.novaflowos.com/start/mauikit/documentacion-util/compile-y-empaquete-su-aplicacion.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
