Instalación desde código fuente y creación de paquetes
Introducción
Cuando un programa no está disponible en los repositorios o se necesita una versión específica, se puede
compilar desde el código fuente. Este proceso sigue el flujo clásico
./configure → make → make install. También veremos cómo crear paquetes
.deb y .rpm propios para distribuir software internamente.
Instalación desde código fuente
Dependencias de compilación:
# apt install build-essential # gcc, g++, make y herramientas básicas
# apt install libssl-dev # ejemplo de cabeceras de biblioteca
Flujo estándar autoconf/automake:
$ tar -xf programa-1.0.tar.gz
$ cd programa-1.0/
$ ./configure # detecta el entorno y genera el Makefile
$ ./configure --prefix=/usr/local # instalar en /usr/local en vez de /usr
$ ./configure --help # ver todas las opciones disponibles
$ make # compilar (usa todos los cores: make -j$(nproc))
# make install # copiar binarios, bibliotecas y man pages al sistema
Desinstalar lo compilado manualmente:
# make uninstall # si el Makefile lo soporta
Variables de compilación comunes:
CC→ compilador de C (CC=gcc)CFLAGS→ opciones del compilador (CFLAGS="-O2 -Wall")LDFLAGS→ opciones del enlazadorPREFIX→ prefijo de instalación
$ ./configure CC=clang CFLAGS="-O2" --prefix=/opt/miapp
Crear un paquete .deb con dpkg-deb
Un paquete .deb es un árbol de directorios con los archivos a instalar más un directorio especial DEBIAN/ con metadatos.
Estructura mínima:
miapp-1.0/
├── DEBIAN/
│ └── control
└── usr/
└── local/
└── bin/
└── miapp
Fichero DEBIAN/control:
Package: miapp
Version: 1.0
Architecture: amd64
Maintainer: Nombre Apellido <nombre@ejemplo.com>
Description: Mi aplicación de ejemplo
Descripción larga de la aplicación.
Depends: libssl3, libc6
Construir el paquete:
$ chmod 755 miapp-1.0/DEBIAN
# dpkg-deb --build miapp-1.0 miapp_1.0_amd64.deb
$ dpkg -c miapp_1.0_amd64.deb # verificar contenido antes de instalar
# dpkg -i miapp_1.0_amd64.deb # instalar
Crear un paquete .rpm con rpmbuild
Instalar las herramientas:
# dnf install rpm-build rpmdevtools
$ rpmdev-setuptree # crea ~/rpmbuild/ con la estructura necesaria
Estructura de ~/rpmbuild/:
~/rpmbuild/
├── BUILD/ # directorio de compilación
├── RPMS/ # paquetes .rpm generados
├── SOURCES/ # tarballs y parches
├── SPECS/ # ficheros .spec
└── SRPMS/ # paquetes fuente .src.rpm
Fichero .spec mínimo:
Name: miapp
Version: 1.0
Release: 1%{?dist}
Summary: Mi aplicación de ejemplo
License: GPL
Source0: %{name}-%{version}.tar.gz
%description
Descripción de la aplicación.
%prep
%autosetup
%build
./configure --prefix=/usr
make %{?_smp_mflags}
%install
make install DESTDIR=%{buildroot}
%files
/usr/local/bin/miapp
%changelog
* Mon May 05 2026 Nombre Apellido <nombre@ejemplo.com> - 1.0-1
- Primera versión del paquete
Construir el paquete:
$ rpmbuild -ba ~/rpmbuild/SPECS/miapp.spec # construye binario y fuente
$ rpmbuild -bb ~/rpmbuild/SPECS/miapp.spec # solo binario
$ rpm -qlp ~/rpmbuild/RPMS/x86_64/miapp-1.0-1.x86_64.rpm # verificar contenido
Código fuente vs paquete: consideraciones
- Los paquetes de repositorio son preferibles: gestión de dependencias, actualizaciones de seguridad automáticas.
- Compilar desde fuente permite versiones muy recientes o con opciones de compilación personalizadas.
-
make installno deja rastro en el gestor de paquetes; el sistema no sabe qué archivos instaló. -
Empaqueta lo que compilas con
dpkg-deborpmbuildpara poder desinstalar limpiamente.