You are on page 1of 22

How to create an RPM package/es - FedoraProject

1 de 22

http://fedoraproject.org/w/index.php?title=How_to_create_a...

How to create an RPM package/es


< How to create an RPM package
In other languages: Deutsch (de) (https://fedoraproject.org/wiki/How_to_create_an_RPM_package/de)
English (en) (https://fedoraproject.org/wiki/How_to_create_an_RPM_package)

Espaol (es)

Italiano (it) (https://fedoraproject.org/wiki/How_to_create_an_RPM_package/it)


Portugus (pt) (https://fedoraproject.org/wiki/How_to_create_an_RPM_package/pt)
(ru) (https://fedoraproject.org/w/index.php?title=How_to_create_an_RPM_package/ru&&action=edit)
() (zh-cn) (https://fedoraproject.org/wiki/How_to_create_an_RPM_package/zh-cn)
() (zh-tw) (https://fedoraproject.org/wiki/How_to_create_an_RPM_package/zh-tw)
[edit (https://fedoraproject.org/w/index.php?title=Template:Lang/How_to_create_an_RPM_package&action=edit) ]

Introduccin
Esta pgina describe detalladamente cmo crear un paquete RPM y en particular, cmo crear un archivo
SPEC. A diferencia de otras guas RPM, esta pgina explica los detalles de Fedora con enlaces a los
lineamientos especcos de Fedora. Dado que es mantenida a travs de la Wiki de Fedora, es probable
que est ms al da que otras guas. A pesar del enfoque en Fedora, la mayor parte de este documento se
aplica a otras distribuciones basadas en RPM. Si est impaciente, puede comenzar por mirar el ms breve
Cmo crear un paquete RPM GNU Hola.
Tenga en cuenta que estos no son los lineamientos del paquete ocial de Fedora, que puede verse en los
Lineamientos de empaquetado y Lineamientos de nombrado de paquetes. Dicho esto, esta pgina debe
ser compatible con ellos.
Si va a crear un paquete RPM para el repositorio de Fedora, siga el procedimiento para unirse a los
mantenedores de la coleccin de paquetes.

Preparando su sistema
Antes de crear paquetes RPM en Fedora, necesita instalar algunas herramientas bsicas de desarrollo y
congurar la(s) cuenta(s) que va a utilizar:
# yum install @development-tools
# yum install fedora-packager

Puede crear un usuario cticio (dummy) especcamente para crear paquetes RPM por si el proceso de
construccin sale mal no podr destruir sus archivos o enviar sus claves privadas al mundo.
Usted nunca debe crear los paquetes como usuario root.

Crear un nuevo usuario con el nombre


contrasea e ingresar como usuario:

makerpm,

agregar el usuario al grupo 'mock', establecer una

# /usr/sbin/useradd makerpm
# usermod -a -G mock makerpm
# passwd makerpm

Una vez que ha iniciado la sesin como un usuario build/dummy, crear la estructura de directorios
necesaria en su directorio home ejecutando:
$ rpmdev-setuptree

El programa rpmdev-setuptree crear el directorio ~/rpmbuild y una serie de subdirectorios (por ejemplo SPECS y
BUILD), que va a usar para crear sus paquetes. Tambin se crea el archivo ~/.rpmmacros, que puede utilizarse
para congurar diversas opciones.
Los lineamientos de empaquetado recomiendan preservar los datos del archivo; usted puede hacer esto
automticamente si usa wget o curl para obtener los archivos fuentes. Si utiliza wget para obtener los
archivos fuentes, aada el texto timestamping = on a ~/.wgetrc. Si usa curl, agregue el texto -R a ~/.curlrc.
Normalmente, no necesitar volver a realizar estos pasos.

30/01/13 23:09

How to create an RPM package/es - FedoraProject

2 de 22

http://fedoraproject.org/w/index.php?title=How_to_create_a...

Los fundamentos de la construccin de paquetes RPM


Para crear un paquete RPM, necesitar crear un archivo de texto .spec que suministre la informacin
acerca del software que ser empaquetado. Luego podr ejecutar el comando rpmbuild sobre dicho archivo
SPEC, lo que provocar ejecutar una serie de pasos para producir sus paquetes.
Normalmente, deber colocar sus fuentes originales (prstina), archivos tales como .tar.gz provistos por
los desarrolladores originales, en el directorio ~/rpmbuild/SOURCES. deber colocar su archivo .spec en el
directorio ~/rpmbuild/SPECS y asignarle el nombre NOMBRE.spec, donde NOMBRE es el nombre base del
paquete. Para crear ambos paquetes, tanto el binario como el fuente, cambie al directorio ~/rpmbuild/SPECS
y ejecute:
$ rpmbuild -ba NOMBRE.spec

Cuando rpmbuild es invocado de esta manera, leer el archivo .spec y recorrer en orden las etapas listadas
a continuacin. Los nombres que comienzan con % son macros predenidas (vea la siguiente tabla).
Etapa

%prep

%build

%check

Lee

%_sourcedir

%_builddir

%_builddir

Escribe

Accin

%_builddir

Esta lee los archivos fuentes y parches en el directorio de fuentes


%_sourcedir. Se desempaquetan los archivos fuentes al subdirectorio
dentro del directorio de construccin %_builddir y se aplican los parches.

%_builddir

Esta compila los archivos dentro del directorio de construccin %_builddir.


Esto se hace a menudo implementando alguna variacin de ./configure
&& make.

%_builddir

Verica que el software funciona correctamente. Esto es usualmente


implementado ejecutando alguna variacin de make test. Muchos
paquetes no implementan esta etapa.
Esta lee los archivos dentro del directorio de construccin %_builddir y
escribe a un directorio dentro del directorio raz de construccin
%_buildrootdir.

%install %_builddir

%_buildrootdir

Los archivos que son escritos son los que se supone sern
instalados cuando el paquete binario sea instalado por el usuario nal.
Tenga cuidado con esta terminologa algo extraa: El directorio raz de
construccin no es lo mismo que el directorio de construccin. Esta
etapa usualmente se implementa ejecutando make install.

bin

%_buildrootdir %_rpmdir

Este lee los archivos dentro del directorio raz de construccin


%_buildrootdir para crear los paquetes RPM binarios dentro del directorio
RPM %_rpmdir. Adentro del directorio RPM hay un directorio para cada
arquitectura, y un directorio "noarch" para los paquetes que se aplican a
cualquier arquitectura. Estos archivos RPM son los paquetes para que
instalen los usuarios.

src

%_sourcedir

Este crea un paquete fuente RPM (.src.rpm) dentro del directorio fuente
RPM %_srcrpmdir. Estos archivos son necesarios para revisar y actualizar
los paquetes.

%_srcrpmdir

Como podr notar, algunos directorios tienen ciertos propsitos especcos en


Nombre de la
macro
%_specdir

Nombre
Directorio de
especicacin

Usualmente

~/rpmbuild/SPECS

rpmbuild.

Estos son:

Propsito

Archivos de especicaciones RPM (.spec).

30/01/13 23:09

How to create an RPM package/es - FedoraProject

3 de 22

http://fedoraproject.org/w/index.php?title=How_to_create_a...

~/rpmbuild

Paquete fuente prstina (por ejemplo, tarballs) y


parches.

%_sourcedir

Directorio fuente

%_builddir

Directorio de
construccin

%_buildrootdir

Directorio raz de
construccin

%_rpmdir

Directorio RPM
binario

~/rpmbuild/RPMS

Los RPM binarios son creados y almacenados bajo


este directorio.

%_srcrpmdir

Directorio RPM
fuente

~/rpmbuild/SRPMS

Los RPM fuente son creados y almacenados bajo


este directorio.

/SOURCES

~/rpmbuild/BUILD

~/rpmbuild
/BUILDROOT

Los archivos fuentes son desempaquetados y


compilados en un subdirectorio dentro de este.
Los archivos son instalados bajo este directorio
durante la etapa %install.

Si falla alguna etapa, tendr que revisar la salida para ver por qu fall y deber cambiar el archivo
(u otra entrada) cuando sea necesario.

.spec

Preparndose a empaquetar un programa especco


Si se requieren programas especiales para construir o ejecutar el programa que est empaquetando,
instale dichos programas y anote los que son.
Al empaquetar un programa para el repositorio de Fedora, debe empaquetar los fuentes prstina
(originales), junto a los parches y las instrucciones de construccin; en general no es aceptable comenzar
con un cdigo precompilado. Instale el archivo con la fuente original (usualmente un archivo .tar.gz) en el
directorio ~/rpmbuild/SOURCES (de la cuenta de usuario para construccin de RPM).
Lea el manual de instrucciones para la instalacin de su programa. A menudo es una buena idea hacer un
simulacro construyendo manualmente el programa antes de intentar hacerlo a travs de RPM. Con
unas pocas excepciones, todos los binarios y bibliotecas incluidos en los paquetes de Fedora deben
construirse desde el cdigo fuente que se incluye en el paquete fuente.

Dividir el programa
El cdigo fuente de la aplicacin es a menudo liberado con el cdigo fuente de otras bibliotecas externas
incluido en ellos. No junte bibliotecas externas con la aplicacin principal en un solo paquete. En
cambio, divdalos en paquetes separados.

Concesin de licencias
Slo empaquete software que sea legal en su paquete. Ver Packaging:Guidelines#Legal, Licensing:Main y
Packaging:LicensingGuidelines. En general, slo empaquete software que sea lanzado como software de
cdigo abierto (OSS) utilizando una licencia OSS aprobada (tales como las licencias GPL, LGPL, BSD-new,
MIT/X, o Apache 2.0). Asegrese de que el software realmente tiene licencia de esta manera (por ejemplo,
vericar in situ los encabezados del cdigo fuente, archivos README, etc.). Si hay bibliotecas incluidas,
asegrese de que tambin son OSS.

Reutilizar la informacin del paquete existente


Trate de reutilizar lo que se pueda. Obviamente, asegrese de que no est empaquetando algo que ya ha
sido empaquetado. Encontrar una lista de los paquetes existentes en la Coleccin de paquetes de
Fedora en la Base de datos de paquetes de Fedora (https://admin.fedoraproject.org/pkgdb/) . Compruebe
tambin las Solicitudes de revisin en progreso y la lista de Paquetes retirados. Puede utilizar los
Repositorios de paquetes Git de Fedora (http://pkgs.fedoraproject.org/cgit) directamente para ver los
archivos SPEC (y parches). Puede descargar los SRPMS utilizando un programa desde el paquete yum-utils:
$ yum -y install yum-utils
$ yumdownloader --source nombre-paquetefuente

Alternativamente, puede obtener el cdigo fuente manualmente desde la pgina http/ftp de un espejo de
Fedora (http://mirrors.fedoraproject.org/publiclist) dentro del directorio releases/18/Everything/source/SRPMS.
Reemplace 18 con la versin de Fedora que desee y descargue el paquete .src.rpm que necesita.

30/01/13 23:09

How to create an RPM package/es - FedoraProject

4 de 22

Una vez que tiene el SRPM, instalarlo en

http://fedoraproject.org/w/index.php?title=How_to_create_a...
~/rpmbuild:

$ rpm -ivh nombre-paquetefuente*.src.rpm

Tambin puede desempaquetar el SRPM en un directorio usando

rpm2cpio:

$ mkdir NOMBREDEPROGRAMA_src_rpm
$ cd NOMBREDEPROGRAMA_src_rpm
$ rpm2cpio ../NOMBREDEPROGRAMA-*.src.rpm | cpio -i

Algunas veces es ms fcil comenzar con un paquete existente y luego limpiarlo y prepararlo para
Fedora. RPM Find (http://rpmnd.net/) puede ayudarle a encontrar RPM para sistemas diferentes a Fedora.
Puede instalar SRPMS de otros sistemas de la misma forma que para los de Fedora. Si eso falla, puede
localizar los archivos de paquetes fuentes (no los binarios .deb) en Ubuntu (http://packages.ubuntu.com/)
o Debian (http://www.debian.org/distrib/packages) (los archivos de paquetes fuentes son tarballs estndar
con un subdirectorio debian/). Si la coleccin de ports FreeBSD (http://www.freebsd.org/ports
/installing.html) lo tiene, podra descargarlo del FreeBSD ports tarball (ftp://ftp.freebsd.org/pub/FreeBSD
/ports/ports/ports.tar.gz) y ver si la informacin de empaquetado existente le ayuda como punto de
partida. Sin embargo, esto a veces no es til para todos. Las diferentes distribuciones tienen diferentes
reglas y lo que hacen en algunos casos puede ser inapropiado para Fedora.

Creando un archivo SPEC


Ahora necesita crear un archivo SPEC en el directorio ~/rpmbuild/SPECS. Debera nombrarlo de acuerdo al
nombre del programa (por ejemplo program.spec). Use donde se pueda el nombre de archivo o el nombre
publicado por el autor del software, pero asegrese de seguir los Lineamientos de nombres de paquetes.

Plantillas de SPEC
Al crear un archivo SPEC por primera vez, vim o emacs crearn automticamente una plantilla para usted:
$ cd ~/rpmbuild/SPECS
$ vim program.spec

He aqu un ejemplo de lo que se ver como plantilla (Nota: la plantilla que se ofrece no necesariamente
cumple con los Lineamientos de empaquetado de Fedora):
Name:
Version:
Release:
Summary:
Group:
License:
URL:
Source0:
BuildRoot:

1%{?dist}

%{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

BuildRequires:
Requires:
%description
%prep
%setup -q
%build
%configure
make %{?_smp_mflags}
%install
rm -rf %{buildroot}
make install DESTDIR=%{buildroot}
%clean
rm -rf %{buildroot}
%files
%defattr(-,root,root,-)
%doc

30/01/13 23:09

How to create an RPM package/es - FedoraProject

5 de 22

http://fedoraproject.org/w/index.php?title=How_to_create_a...

%changelog

Puede usar $RPM_BUILD_ROOT en lugar de


consistente.

%{buildroot}.

Ambos son aceptables, pero slo para ser ms

Tambin puede usar el comando rpmdev-newspec para crear un archivo SPEC para usted. rpmdev-newspec NOMBREpuede crear un archivo SPEC inicial para un nuevo paquete, adaptado a varios tipos de
paquetes. Adivinar tambin qu tipo de plantilla utilizar basndose en el nombre del paquete, o puede
especicarle una plantilla en particular. Vea las plantillas disponibles en /etc/rpmdevtools/spectemplate-*.spec,
y consulte rpmdev-newspec --help para ms informacin. Por ejemplo, para crear un nuevo archivo SPEC para
un mdulo python:

DE-NUEVO-PAQUETE

cd ~/rpmbuild/SPECS
rpmdev-newspec python-antigravity
vi python-antigravity.spec

Ejemplo de SPEC
He aqu un ejemplo simple que muestra un archivo SPEC de Fedora 16 para el programa
Summary:
Name:
Version:
Release:
License:
Group:
Source:
Patch1:
Patch2:
Patch3:
Patch4:
Patch5:
Patch6:
URL:
ExcludeArch:
BuildRequires:
BuildRequires:

eject:

A program that ejects removable media using software control


eject
2.1.5
21%{?dist}
GPLv2+
System Environment/Base
%{name}-%{version}.tar.gz
eject-2.1.1-verbose.patch
eject-timeout.patch
eject-2.1.5-opendevice.patch
eject-2.1.5-spaces.patch
eject-2.1.5-lock.patch
eject-2.1.5-umount.patch
http://www.pobox.com/~tranter
s390 s390x
gettext
libtool

%description
The eject program allows the user to eject removable media (typically
CD-ROMs, floppy disks or Iomega Jaz or Zip disks) using software
control. Eject can also control some multi-disk CD changers and even
some devices' auto-eject features.
Install eject if you'd like to eject removable media using software
control.
%prep
%setup -q -n %{name}
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
%patch5 -p1
%patch6 -p1
%build
%configure
make %{?_smp_mflags}
%install
make DESTDIR=%{buildroot} install
install -m 755 -d %{buildroot}/%{_sbindir}
ln -s ../bin/eject %{buildroot}/%{_sbindir}
%find_lang %{name}
%files -f %{name}.lang
%doc README TODO COPYING ChangeLog
%{_bindir}/*
%{_sbindir}/*
%{_mandir}/man1/*

30/01/13 23:09

How to create an RPM package/es - FedoraProject

6 de 22

http://fedoraproject.org/w/index.php?title=How_to_create_a...

%changelog
* Tue Feb 08 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 2.1.5-21
- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
* Fri Jul 02 2010 Kamil Dudka <kdudka@redhat.com> 2.1.5-20
- handle multi-partition devices with spaces in mount points properly (#608502)

Resumen del archivo SPEC


Otras guas tiles:
Gua RPM (http://docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html/RPM_Guide
/ch-creating-rpms.html) describe cmo escribir un archivo SPEC.
Las series de IBM Empaquetado de software con RPM Parte 1 (http://www.ibm.com/developerworks
/ssa/linux/library/l-rpm1/) , Parte 2 (http://www.ibm.com/developerworks/ssa/linux/library/l-rpm2/) , y
Parte 3 (http://www.ibm.com/developerworks/ssa/linux/library/l-rpm3/) .
Maximum RPM (http://rpm.org/max-rpm-snapshot/) tiene la informacin ms completa, pero es
anticuado.
Usted deber seguir los lineamientos Fedora: Lineamientos de nombres de paquetes, Lineamientos de
empaquetado, y Lineamientos de revisin de paquetes.
Insertar los comentarios con el primer carcter #, pero evite las macros (comienzan con %) que sean
potencialmente multilneas (las que se expanden primero). Si est comentando una lnea, doble los signos
de porcentaje (%%). Evite tambin los comentarios inline en la misma lnea como un comando de script.
Las principales etiquetas se enumeran a continuacin. Tenga en cuenta que las macros %{name}, %{version} y
pueden utilizarse para hacer referencia a las etiquetas Name, Version y Release
respectivamente. Cuando cambia la etiqueta, las macros se actualizan automticamente para utilizar el
nuevo valor.

%{release}

Name: El nombre (base) del paquete, que debe coincidir con el nombre del archivo SPEC. Debe seguir
los Lineamientos de nombres de paquetes y generalmente estar en minsculas.
Version: El nmero de versin de desarrollo. Vea la Seccin etiqueta de versin en los lineamientos de
empaquetado. Si la versin contiene etiquetas que no son numricas (contiene etiquetas que no son
nmeros), puede que necesite incluir caracteres no numricos adicionales en la etiqueta Release. Si el
desarrollo utiliza fechas completas para distinguir las versiones, considere usar nmeros de versin con
la forma yy.mm[dd] (por ejemplo 2008-05-01 se convierte en 8.05).
Release: El valor inicial normalmente debera ser 1%{?dist}. Incremente el nmero cada vez que libere un
nuevo paquete para la misma versin de software. Cuando una nueva versin de desarrollo es liberada,
cambiar la etiqueta Version para igualar y restablecer el nmero de Release a 1. Vea la Seccin etiqueta
de versin en los lineamientos de empaquetado. La etiqueta opcional Dist podra ser til.
Summary: Un breve, sumario del paquete en una lnea. Use ingls americano. Y no termine con un
punto.
Group: Este tiene que ser un grupo pre-existente, como Applications/Engineering; ejecute less
/usr/share/doc/rpm-*/GROUPS para ver la lista completa. Use el grupo Documentation para los
sub-paquetes (por ejemplo kernel-doc) que contienen documentacin. Nota: Esta etiqueta est en
desuso desde Fedora 17. Consulte Prembulo de referencia del archivo Spec
(http://docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html/Packagers_Guide
/chap-Packagers_Guide-Spec_File_Reference-Preamble.html)
License: La licencia, debe ser una licencia de software de cdigo abierto. No usar la antigua etiqueta
Copyright. Utilizar una abreviatura estndar (por ejemplo GPLv2+) y ser especco (por ejemplo use
GPLv2+ para la GPL versin 2 o superior en lugar de simplemente GPL o GPLv2 cuando sea cierto).
Consulte Licensing y los Lineamientos de licencias. Usted puede listar mltiples licencias combinndolas
con and y or (por ejemplo GPLv2 and BSD).
URL: La direccin URL completa para obtener ms informacin sobre el programa (por ejemplo, la
pgina web del proyecto). Nota: Esta no es de donde proviene el cdigo fuente original que
sirve para la etiqueta Source0 de abajo.

30/01/13 23:09

How to create an RPM package/es - FedoraProject

7 de 22

http://fedoraproject.org/w/index.php?title=How_to_create_a...

Source0: La direccin URL completa para el archivo comprimido que contiene el cdigo fuente (original)
prstina, liberado como desarrollo. Source es sinnimo de Source0. Si usted da una direccin URL
completa (y debera), su nombre base ser utilizado cuando se busque en el directorio SOURCES. Si es
posible, insertar %{name} y %{version}, as los cambios en cualquiera de ellas ir al lugar adecuado.
Preservar los datos al descargar archivos fuentes. Si existe ms de un archivo fuente, nmbrelos como
Source1, Source2 y as sucesivamente. Si va a aadir nuevos archivos completos, adems de las fuentes
originales, lstelos como fuentes despus de las fuentes prstinas. Una copia de cada una de estas
fuentes sern includas en cualquier SRPM que cree, a menos que especcamente le indique lo
contrario. Vea Source URL para obtener ms informacin sobre los casos especiales (por ejemplo, control
de revisin).
Patch0: El nombre del primer parche para aplicar al cdigo fuente. Si necesita parchear los archivos
despus de que hayan sido descomprimidos, debe editar los archivos y guardar sus diferencias como un
archivo patch en su directorio ~/rpmbuild/SOURCES. Los parches deben hacer slo un cambio lgico cada
uno, as que es muy posible tener varios archivos de parches.
BuildArch: Si est empaquetando archivos que son independientes de la arquitectura (por ejemplo,
scripts de shell, archivos de datos), agregar BuildArch: noarch. La arquitectura para el RPM binario ser
entonces noarch.
BuildRoot: Esta es dnde los archivos sern instalados durante el proceso %install (despus del
proceso %build). Esta es ahora redundante en Fedora y slo es necesaria para EPEL5. De forma
predeterminada, la raz de construccin se coloca en %{_topdir}/BUILDROOT/.
BuildRequires: Una lista separada por comas de paquetes requeridos para la construccin (compilar)
del programa. Este campo se puede (y lo es comnmente) repetir en varias lneas. Estas dependencias
no son determinadas automticamente, usted debe incluir todo lo necesario para construir el programa.
Algunos paquetes comunes se pueden omitir, tal como gcc. Puede especicar una versin mnima si es
necesario (por ejemplo ocaml >= 3.08). Si necesita el archivo /EGGS, determinar el paquete que lo posee
mediante la ejecucin de rpm -qf /EGGS. Si necesita el programa EGGS, determinar el paquete que lo
posee mediante la ejecucin de rpm -qf `which EGGS`. Mantener las dependencias al mnimo (por ejemplo
use sed en vez de perl si realmente no necesita las capacidades de perl), pero tenga en cuenta que
algunas aplicaciones desactivan funciones permanentemente si la dependencia asociada no est
presente; en estos casos deber incluir los paquetes adicionales. El paquete
auto-buildrequires
(https://admin.fedoraproject.org/pkgdb/acls/name/auto-buildrequires) puede ser til.
Requires: Una lista separada por comas de los paquetes que se requieren cuando se instala el
programa. Tenga en cuenta que la etiqueta BuildRequires lista lo que se necesita para construir el RPM
binario, mientras que la etiqueta Requires lista lo que se requiere para la instalacin/ejecucin del
programa; un paquete puede estar en una lista o en ambas. En muchos casos, rpmbuild detecta
automticamente las dependencias por lo que la etiqueta Requires no siempre es necesaria. Sin
embargo, puede que desee resaltar algunos paquetes especcos cuando sea necesario, o es posible
que no sean detectados automticamente.
%description: Una ms larga, descripcin multilnea del programa. Use ingls americano. Todas las
lneas deben ser de 80 caracteres o menos. Las lneas en blanco indican un nuevo prrafo. Algunos
programas de instalacin de la interfaz grca de usuario reformatearn los prrafos; las lneas que
comienzan con un espacio en blanco se tratan como texto preformateado y se mostrarn tal cual,
normalmente con una fuente de ancho jo. Consulte Gua RPM (http://docs.fedoraproject.org/drafts
/rpm-guide-en/ch09s03.html) .
%prep: Comandos de script para preparar el programa (por ejemplo, para descomprimirlo) y que
pueda estar listo para la construccin. Tpicamente es slo %setup -q; una variacin comn es %setup -q
-n NOMBRE si el archivo fuente se desempaqueta en NOMBRE. Consulte la seccin %prep de abajo para ms
detalles.
%build: Comandos de script para construir el programa (por ejemplo, para compilarlo) y prepararlo
para la instalacin. El programa debe venir con instrucciones de cmo hacerlo. Vea la seccin %build de
abajo para ms detalles.
%check: Comandos de script para probar el programa. Estos se ejecutan entre los

30/01/13 23:09

How to create an RPM package/es - FedoraProject

8 de 22

http://fedoraproject.org/w/index.php?title=How_to_create_a...

procedimientos %build e %install, as que debe colocarlo all si tiene esta seccin. A menudo
simplemente contiene make test o make check. Esto es aparte de %build para que las personas puedan
omitir la comprobacin automtica si lo desean.
%install: Comandos de script para instalar el programa. Los comandos deben copiar los archivos
desde el directorio de CONSTRUCCIN %{_builddir} al directorio raz de construccin, %{buildroot}. Vea la
seccin %install de abajo para ms detalles.
%clean: Instrucciones para limpiar la raz de construccin. Tenga en cuenta que esta seccin es ahora
redundante en Fedora y slo es necesaria para EPEL. Normalmente esto slo contiene:
rm -rf %{buildroot}

%les: La lista de archivos que sern instalados. Consulte la seccin %les de abajo para ms detalles.
%changelog: Cambios en el paquete. Utilice de ejemplo el formato anterior.
ExcludeArch: Si el paquete no compila, construye o funciona correctamente en una arquitectura en
particular, liste esas arquitecturas bajo esta etiqueta.
Puede agregar secciones para que el cdigo se ejecute cuando los paquetes sean instalados o removidos
en el sistema real (en lugar de slo ejecutar el script %install, que slo hace una pseudo-instalacin a la
raz de construccin). Estos se denominan scriptlets, y se utilizan generalmente para actualizar el
sistema en ejecucin con informacin del paquete. Consulte la seccin Scriptlets de abajo para ms
detalles.
RPM tambin soporta la creacin de varios paquetes (llamados subpaquetes) desde un nico archivo
SPEC, como los paquetes name-libs y name-devel.
No use estas etiquetas:
Packager
Vendor
Copyright
No cree un paquete relocalizable; que no agrega valor en Fedora y hace las cosas ms complicadas.

Secciones del archivo SPEC explicadas


Seccin %prep
La seccin %prep describe cmo desempaquetar los paquetes comprimidos para que puedan ser
construidos. Tpicamente, esto incluye los comandos %setup y %patch con referencia a las lneas
Source0 (y Source1, etc.). Vea la seccin %setup y %patch en Maximum RPM (http://rpm.org/max-rpmsnapshot/s1-rpm-inside-macros.html) para ms detalles.
Las macros %{patches} y %{sources} estn disponibles desde RPM 4.4.2 y son tiles si usted tiene una
gran lista de parches o fuentes:
for p in %{patches}; do
...
done

Sin embargo, tenga en cuenta que el uso de estas har a su SPEC incompatible con los RPMS utilizados en
RHEL y otras distribuciones basadas en RPM.
Seccin %prep: comando %setup
El comando %setup desempaqueta un paquete fuente. Los modicadores incluyen:
: Suprime la salida innecesaria. Este es comnmente utilizado.
-n nombre : Si el archivo tarball Fuente se desempaqueta en un directorio cuyo nombre no es el nombre
del RPM, este modicador puede utilizarse para especicar el nombre del directorio correcto. Por
ejemplo, si el archivo tarball se desempaqueta en el directorio FOO, use %setup -q -n FOO.
-c nombre : Si el archivo tarball Fuente se desempaqueta en varios directorios en lugar de un solo
directorio, este modicador puede utilizarse para crear un directorio llamado nombre y luego
-q

30/01/13 23:09

How to create an RPM package/es - FedoraProject

9 de 22

http://fedoraproject.org/w/index.php?title=How_to_create_a...

descomprimir en l.
Hay ms opciones %spec si est desempaquetando mltiples archivos (http://rpm.org/max-rpm-snapshot
/s1-rpm-inside-macros.html) , lo cual es especialmente til si est creando subpaquetes (ver ms abajo).
Las ms importantes son:
-a
nmero

Slo desempaquetar la directiva Fuente del nmero dado despus de cambiar de directorio (por
ejemplo a 0 para Source0).

nmero

Slo desempaquetar la directiva Fuente del nmero dado antes de cambiar de directorio (por
ejemplo b 0 para Source0).

-D

No eliminar el directorio antes de desempaquetar.

-T

Inhabilitar el desempaquetado automtico del archivador.

-b

Seccin %prep: comando %patch


El comando %patch0 aplica el Parche0 (y %patch1 aplica Parche1, etc.). Los parches son el mtodo
habitual de realizar los cambios necesarios en el cdigo fuente para el empaquetamiento. La usual opcin
-pNUMERO se aplica, la que pasa ese argumento al patch en el programa.
Los nombres de los archivos parche usualmente lucen como telnet-0.17-env.patch, que es el formato
%{name} - %{version} - RAZN.patch (aunque a veces se omite la versin). Los archivos parche son
tpicamente el resultado de diff -u; si hace esto desde el subdirectorio ~/rpmbuild/BUILD entonces no
tendr que especicar un nivel -p posterior.
Este es un procedimiento tpico para crear un parche para un solo archivo:
cp foo/bar foo/bar.orig
vim foo/bar
diff -u foo/bar.orig foo/bar > ~/rpmbuild/SOURCES/NOMBREDEPAQUETE.RAZN.patch

Si va a editar muchos archivos, un mtodo fcil es copiar el subdirectorio completo debajo de BUILD y
luego hacer dis por subdirectorio. Despus de cambiar al directorio ~rpmbuild/BUILD/NOMBRE, haga lo
siguiente:
cp -pr ./ ../NOMBREDEPAQUETE.orig/
... muchas ediciones ...
diff -u ../NOMBREDEPAQUETE.orig . > ~/rpmbuild/SOURCES/NOMBRE.RAZN.patch

Si edita muchos archivos en un parche, tambin puede copiar los archivos originales mediante alguna
terminacin consistente como .orig antes de editarlos. Luego, puede usar gendiff (en el paquete
rpm-build) para crear un parche con las diferencias.
Trate de asegurarse que el parche coincida exactamente con el contexto. El valor por omisin de fuzz
es 0, que requiere coincidencia para ser exacto. Puede solucionar esto aadiendo %global
_default_patch_fuzz 2 para volver al valor encontrado en las versiones anteriores de RPM en Fedora, pero
en general se recomienda evitar hacer esto.
Como se explica en Packaging/PatchUpstreamStatus, todos los parches deben tener un comentario sobre
ellos en el archivo SPEC sobre su estado de desarrollo. Este debe documentar el desarrollo que incluye los
errores/correo electrnico (incluyendo la fecha). Si es exclusivo de Fedora, debe mencionar por qu es
nico. El proyecto Fedora intenta no desviarse del desarrollo; consulte PackageMaintainers/WhyUpstream
para ver la importancia de esto.
Seccin %prep: Archivos sin modicar
A veces, uno o ms de los archivos Fuente no necesitarn ser descomprimidos. Usted puede prep esos
archivos en un directorio de construccin como este (donde SOURCE1 se reere al archivo Fuente
correspondiente):
cp -p %SOURCE1 .

Seccin %build
La seccin %build es a veces complicada; aqu usted congura y compila/construye los archivos a ser
instalados.

30/01/13 23:09

How to create an RPM package/es - FedoraProject

10 de 22

http://fedoraproject.org/w/index.php?title=How_to_create_a...

Muchos programas siguen el enfoque configure de GNU (o alguna variacin). De forma predeterminada, se
instalarn con un prejo de /usr/local, que es razonable para los archivos desempaquetados. Sin
embargo, como usted est empaquetndolo, cambiar el prejo a /usr. Las bibliotecas deben instalarse
bien sea en /usr/lib o /usr/lib64 dependiendo de la arquitectura.
Ya que configure de GNU es tan comn, la macro %configure se puede utilizar para invocar
automticamente las opciones correctas (por ejemplo, cambiar el prejo a /usr). Alguna variacin de esto
a menudo funciona:
%configure
make %{?_smp_mflags}

Para sustituir variables en el makele, pasarlas como parmetros a

make:

make %{?_smp_mflags} CFLAGS="%{optflags}" BINDIR=%{_bindir}

Ms informacin, consulte GNU autoconf, automake, and libtool (http://sourceware.org/autobook/) y


Open Source Development Tools: An Introduction to Make, Congure, Automake, Autoconf por Stefan
Hundhammer (http://www.suse.de/~sh/automake/automake.pdf) .
Algunos programas usan

cmake.

Ver Packaging/cmake.

Seccin %check
Si las pruebas automticas estn disponibles, por lo general es una buena idea incluirlas. Deben
colocarse en la seccin %check (que sigue inmediatamente a la seccin %build) en lugar de dentro de la
seccin %build, de modo que puedan ser fcilmente omitidas cuando sea necesario.
A menudo, esta seccin contiene:
make test

Seccin %install
Esta seccin incluye comandos de script para instalar el programa, copiar los archivos relevantes desde
%{_builddir} a %{buildroot} (que por lo general signica desde ~/rpmbuild/BUILD a ~/rpmbuild/BUILDROOT) y la
creacin de directorios dentro de %{buildroot} segn sea necesario.
Parte de la terminologa que puede inducir a error:
El directorio de construccin, tambin conocido como %{_builddir} no es el mismo que el raz de
construccin, tambin conocido como %{buildroot}. La compilacin se produce en el primer directorio,
mientras que los archivos a ser empaquetados son copiados desde el primero al ltimo.
Durante la seccin de %build, el directorio actual comenzar en %{buildsubdir}, que es el subdirectorio
dentro de %{_builddir} creado durante la etapa de %prep. Esto suele ser algo como ~/rpmbuild/BUILD
/%{name}-%{version}.
La seccin %install no no se ejecuta cuando el paquete RPM binario es instalado por el usuario nal,
pero slo se ejecuta cuando se crea un paquete.
Normalmente, una variacin de make

install

se lleva a cabo aqu:

%install
rm -rf %{buildroot}
make DESTDIR=%{buildroot} install

La eliminacin de

%{buildroot}

ya no es necesaria, excepto para EPEL 5.

Idealmente debe usar DESTDIR=%{buildroot} (http://www.gnu.org/prep/standards/html_node/DESTDIR.html) si


el programa lo admite, ya que redirige las instalaciones del archivo al directorio especicado y es
exactamente lo que queremos que ocurra durante la seccin %install.
Si el programa no admite

DESTDIR

(y slo si), es posible la solucin en una de las varias formas (inferiores):

Parchar el makele as es compatible con


necesario y enviar el parche a desarrollo.

DESTDIR.

Crear directorios dentro de

DESTDIR

cuando sea

30/01/13 23:09

How to create an RPM package/es - FedoraProject

11 de 22

http://fedoraproject.org/w/index.php?title=How_to_create_a...

Usar la macro %makeinstall. Este mtodo podra funcionar, pero puede conducir a fallas sutiles. Se
expande a algo as como make prefix=%{buildroot}%{_prefix} bindir=%{buildroot}%{_bindir} ... install, lo cual
puede resultar que en algunos programas no funcione correctamente. Crear directorios dentro de
%{buildroot} cuando sea necesario.
Considerar la posibilidad de usar el paquete auto-destdir. Para ello es necesario BuildRequires:
y cambiar make install por make-redir DESTDIR=%{buildroot} install. Esto slo funciona bien
si la instalacin utiliza slo ciertos comandos comunes para instalar los archivos, como cp e install.

auto-destdir,

Realizar la instalacin a mano. Esto implicara crear los directorios necesarios debajo de %{buildroot} y
copiar los archivos desde %{_builddir} a %{buildroot}. Tenga especial cuidado con las actualizaciones, que a
menudo contienen nombres de archivos nuevos o modicados. Un ejemplo de este procedimiento:
%install
rm -rf %{buildroot}
mkdir -p %{buildroot}%{_bindir}/
cp -p mycommand %{buildroot}%{_bindir}/

Como se indica en Packaging:Guidelines#Timestamps, tratar de preservar las marcas de tiempo de los


archivos si el makele permite sobrescribir comandos:
make INSTALL="install -p" CP="cp -p" DESTDIR=%{buildroot} install

Seccin %les
Esta seccin declara que los archivos y directorios son propiedad del paquete, por lo tanto los archivos y
directorios se colocan en el RPM binario.
Conceptos bsicos de %les
La %defattr establece los permisos de archivo por defecto, y se encuentra a menudo en el inicio de la
seccin %files. Tenga en cuenta que esto ya no es necesario a menos que los permisos deban modicarse.
El formato de esta es:
%defattr(<permisos de achivo>, <usuario>, <grupo>, <permisos de directorio>)

El cuarto parmetro se omite a menudo. Usualmente se utiliza


use los permisos predeterminados.

%defattr(-,root,root,-),

donde - signica

A continuacin, debe listar todos los archivos y directorios a ser propiedad del paquete. Utilizar macros
para los nombres de directorio donde sea posible, que pueden verse en Packaging:RPMMacros (por
ejemplo, utilice %{_bindir}/mycommand en lugar de /usr/bin/mycommand). Si el patrn comienza con una / (o
cuando se expande desde la macro) entonces se toma desde el directorio %{buildroot}. De lo contrario, se
presume que el archivo est en el directorio actual (por ejemplo dentro de %{_builddir}, como los archivos
de documentacin que desee incluir). Si su paquete slo instala un nico archivo /usr/sbin/mycommand, la
seccin %files simplemente puede ser:
%files
%{_sbindir}/mycommand

Para hacer que su paquete sea menos sensible a los cambios, declare que todos los archivos dentro de un
directorio sean propiedad del paquete con una coincidencia de patrn:
%{_bindir}/*

Para incluir un solo directorio:


%{_datadir}/%{name}/

Tenga en cuenta que %{_bindir}/* no reclama que este paquete sea propietario del directorio /usr/bin, pero
slo de los archivos contenidos en l. Si usted lista un directorio, entonces usted est reclamando que
este paquete sea dueo de ese directorio y de todos sus archivos y subdirectorios contenidos en l. Por lo
tanto, no liste el %{_bindir} y tenga cuidado con los directorios que puedan ser compartidos con otros
paquetes.

30/01/13 23:09

How to create an RPM package/es - FedoraProject

12 de 22

http://fedoraproject.org/w/index.php?title=How_to_create_a...

Se producir un error si:


una coincidencia de patrn no coincide con algn archivo o directorio
un archivo o directorio est listado o coincide ms de una vez
un archivo o directorio en la

%{buildroot}

no ha sido listado

Tambin es posible excluir archivos de una coincidencia anterior utilizando el glob %exclude. Esto puede ser
til para incorporar a casi todos los archivos incluidos por una coincidencia de patrn diferente, pero
tenga en cuenta que tambin fallar si no coincide con algo.
Prejos de %les
Puede que tenga que agregar uno o ms prejos a las lneas en la seccin %files; separados con un
espacio. Ver Max RPM section on %les directives (http://www.rpm.org/max-rpm/s1-rpm-inside-leslist-directives.html) .
Por lo general, %doc se utiliza para listar los archivos de documentacin dentro de %{_builddir} que no se
copiaron a %{buildroot}. Usualmente se incluyen los archivos README e INSTALL. Sern colocados en el
directorio /usr/share/doc/%{name}-%{version}, cuya propiedad no necesita ser declarada.
Nota: Si se especica una entrada %doc, entonces usted no puede copiar los archivos en el directorio de
documentacin durante la seccin %install. Si, por ejemplo, desea un subdirectorio ejemplos dentro del
directorio de documentacin, no utilice %doc, pero en cambio cree los directorios y copie los archivos
manualmente en %{buildroot}%{_defaultdocdir}/%{name}-%{version} durante la seccin %install. Sern marcados
correctamente como documentacin. Asegrese de incluir %{_defaultdocdir}/%{name}-%{version}/ como una
entrada en la seccin %les.
Los archivos de conguracin deben ser colocados en /etc y normalmente son especicados como esto (lo
que hace es asegurarse de que al actualizar no se sobrescriban los cambios hechos por el usuario):
%config(noreplace) %{_sysconfdir}/foo.conf

Si la actualizacin utiliza un formato de conguracin no compatible con versiones anteriores, entonces


especicarlo de la siguiente manera:
%config %{_sysconfdir}/foo.conf

%attr(mode, user, group) puede ser utilizado para un mayor control sobre los permisos, donde un -
signica utilizar el valor predeterminado:
%attr(0644, root, root) FOO.BAR

Si un archivo est en un idioma natural en particular, use

%lang

para asentarlo:

%lang(de) %{_datadir}/locale/de/LC_MESSAGES/tcsh*

Los programas que utilizan archivos Locale deben seguir el mtodo recomendado para el manejo de
archivos de i18n:
encontrar los nombres de archivo en la etapa

%install:

%find_lang ${name}

aadir las dependencias de construccin necesarias: BuildRequires:


utilizar los nombres de archivos encontrados: %files -f ${name}.lang
Estos prejos no son vlidos en Fedora:

%license

gettext

%readme.

%les y Estndar de jerarqua del sistema de archivos (FHS)


Usted debera seguir el Estndar de jerarqua del sistema de archivos (FHS) (http://www.pathname.com
/fhs/) . Los ejecutables van en /usr/bin, los archivos de conguracin global en /etc, las bibliotecas en
/usr/lib (o /usr/lib64) y as sucesivamente. Hay una excepcin: los ejecutables que no deberan ser
ejecutados directamente por los usuarios o administradores deben ir en el subdirectorio /usr/libexec, lo
que se conoce como %{_libexecdir}/%{name}.
No instalar los archivos en

/opt

/usr/local.

Desafortunadamente, muchos programas no siguen el FHS por defecto. En particular, las bibliotecas
independientes de la arquitectura se encontrarn en /usr/lib en lugar de /usr/share. El primero es para las

30/01/13 23:09

How to create an RPM package/es - FedoraProject

13 de 22

http://fedoraproject.org/w/index.php?title=How_to_create_a...

bibliotecas dependientes de la arquitectura, mientras que el segundo es para las bibliotecas


independientes de la arquitectura, lo que signica que los sistemas con arquitecturas de CPU diferentes
pueden compartir en /usr/share. Hay muchas excepciones en Fedora (como Python y Perl), pero Fedora
aplica esta regla ms estrictamente que algunas distribuciones. rpmlint generalmente se quejar si usted
pone algo ms que archivos ELF en /usr/lib.
Ejemplo de %les
He aqu un ejemplo simple de una seccin %les:
%files
%doc README LICENSE
%{_bindir}/*
%{_sbindir}/*
%{_datadir}/%{name}/
%config(noreplace) %{_sysconfdir}/*.conf

Bsqueda de duplicados
Puede listar los duplicados de dos paquetes binarios haciendo:
cd ~/rpmbuild/RPMS/ARCH # Sustituir ARCH por su arquitectura
rpm -qlp PACKAGE1.*.rpm | sort > ,1
rpm -qlp PACKAGE2.*.rpm | sort > ,2
comm -12 ,1 ,2

Scriptlets
Cuando un usuario nal instala el RPM, es posible que desee ejecutar algunos comandos. Esto se puede
lograr a travs de scriptlets. Consulte Packaging/ScriptletSnippets.
Los scriptlets se pueden ejecutar:
antes (%pre) o despus (%post) de instalar un paquete
antes (%preun) o despus (%postun) de desinstalar un paquete
al inicio (%pretrans) o al nal (%posttrans) de una transaccin
Por ejemplo, cada paquete RPM binario que almacena archivos de las bibliotecas compartidas en
cualquiera de las rutas de acceso predeterminadas del enlazador dinmico, debe llamar a ldconfig en %post
y %postun. Si el paquete tiene varios subpaquetes con bibliotecas, cada subpaquete tambin debe realizar
las mismas acciones.
%post -p /sbin/ldconfig
%postun -p /sbin/ldconfig

Si tan slo ejecuta un solo comando, entonces la opcin -p ejecuta el comando adyacente sin invocar el
shell. Sin embargo, para varios comandos, omita esta opcin e incluya los comandos de shell debajo.
Si ejecuta cualquier programa dentro de los scriptlets, debe especicar los requisitos en la forma
Requires(CONTEXTO) (por ejemplo Requires(post)).
%pre, %post, %preun,

y %postun ofrecen el argumento $1, que es el nmero de paquetes de este nombre que
quedar en el sistema cuando la accin se complete. No comparar a la igualdad con 2, pero en cambio
comprobar si es mayor o igual a 2. Para %pretrans y %posttrans, $1 es siempre 0.

Por ejemplo, si el paquete instala un manual de informacin, entonces el ndice del manual de
informacin debe ser actualizado con install-info del paquete info. En primer lugar, no hay ninguna
garanta de que el paquete info estar disponible a menos que lo declaremos explcitamente como
necesario, y en segundo lugar, no queremos fracasar completamente si se produce un error en
install-info:
Requires(post): info
Requires(preun): info
...
%post
/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir || :
%preun
if [ $1 = 0 ] ; then
/sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir || :

30/01/13 23:09

How to create an RPM package/es - FedoraProject

14 de 22

http://fedoraproject.org/w/index.php?title=How_to_create_a...

fi

Hay otros fallos tcnicos relacionados con la instalacin de los manuales de informacin. El comando
install-info actualizar el directorio de informacin, por lo que debemos eliminar el directorio inservible
vaco de %{buildroot} durante la seccin %install:
rm -f %{buildroot}%{_infodir}/dir

Otra capacidad tipo-scriptlet son los triggers, que se pueden ejecutar con su paquete cuando otros
paquetes sean instalados o desinstalados. Ver RPM Triggers (http://rpm.org/api/4.4.2.2/triggers.html) .

Macros
Las macros son texto en el formato de
Macro

%{string}.

Macros tpicas:

Expansin
tpica

Signicado

%{_bindir}

/usr/bin

Directorio binario: donde se almacenan normalmente los ejecutables.

%{_builddir}

~/rpmbuild/BUILD

Directorio de construccin: archivos que son compilados en un subdirectorio


del directorio de construccin. Ver %buildsubdir.

%{buildroot}

%{buildsubdir}

~/rpmbuild
/BUILDROOT

%{_builddir}/%
{name}

Raz de construccin: donde los archivos son instalados durante la etapa


de %install, que copia los archivos desde un subdirectorio de %{_builddir} a
un subdirectorio de %{buildroot}. (Histricamente, %{buildroot} estaba en
/var/tmp/.)
Subdirectorio de construccin: un subdirectorio dentro de %{_builddir} donde
se compilan los archivos durante la etapa de %build. Se establece despus
de

%setup.

%{_datadir}

/usr/share

Directorio compartido.

%{_defaultdocdir}

/usr/share/doc

Directorio predeterminado de documentacin.

%{dist}

.fcNUMERO

Distribucin+nombre corto de versin (por ejemplo .fc9)

%{fedora}

NUMERO

Nmero de liberacin de Fedora (por ejemplo 9)

%{_includedir}

/usr/include

%{_infodir}

/usr/share/info

%{_initrddir}

/etc/rc.d/init.d

%{_libdir}

/usr/lib

%{_libexecdir}

/usr/libexec

%{_localstatedir}

/var

%{_mandir}

/usr/share/man

Nombre del paquete, denido por Name: etiqueta

%{name}
%{_sbindir}

/usr/sbin

%{_sharedstatedir} /var/lib
%{_sysconfdir}
%{version}

/etc

Versin del paquete, denido por Version: etiqueta

Aprenda ms sobre las macros mirando en /etc/rpm/* y /usr/lib/rpm, especialmente /usr/lib/rpm/macros.


Tambin use rpm --showrc para mostrar los valores que RPM va a utilizar en las macros (modicados por los
archivos de conguracin de macros y rpmrc).
Puede establecer sus propios valores de macro usando %global, pero asegrese de denirlos antes de

30/01/13 23:09

How to create an RPM package/es - FedoraProject

15 de 22

http://fedoraproject.org/w/index.php?title=How_to_create_a...

usarlos. (Las deniciones de macro pueden referirse a otras macros.) Por ejemplo:
%global date 2012-02-08

Use la opcin -E de

rpmbuild

para encontrar el valor de una macro en un archivo SPEC:

rpmbuild -E '%{_bindir}' myfile.spec

Ver tambin Packaging/RPMMacros y Captulo 9 de la gua RPM (http://docs.fedoraproject.org/en-US


/Fedora_Draft_Documentation/0.1/html/RPM_Guide/ch09s07.html) .

Otras etiquetas
Adems de las etiquetas Requires y BuildRequires, tambin se pueden utilizar estas para controlar las
dependencias:
Provides: lista de nombres de paquetes virtuales que este paquete ofrece. Por ejemplo, puede haber un
paquete foo que exige una funcionalidad bar particular de otro programa. Si hay varios paquetes
que pueden satisfacer esa demanda, esos paquetes se pueden especicar Provides: bar y el paquete
foo se puede especicar Requires: foo. Tambin puede utilizar el sistema de alternativas
(http://dailypackage.fedorabook.com/index.php?/archives/6-Wednesday-Why-The-AlternativesSystem.html) , pero evitar si varios usuarios en el mismo sistema quieren diferentes valores
predeterminados, ya que estos ajustes son para todo el sistema. Use rpm -q --provides NOMBREDEPAQUETE
para ver lo que un determinado paquete proporciona. Algunos ejemplos de paquetes virtuales en Fedora:
MTA: Usado para el Agente de Transferencia de Correo, tal como sendmail.
tex(latex): Usado para latex.
Obsoletes: eliminar los otros paquetes nombrados cuando estos paquetes sean instalados. Utilizar
cuando cambia el nombre del paquete o cuando reemplaza totalmente a un paquete diferente.
Conicts: estado de otros paquetes que no se pueden instalar al mismo tiempo con ste. Evite esto si
puede. Vea Packaging/Conicts.
BuildConicts: estado de los paquetes que no se pueden instalar en la construccin de ste paquete.
Evite esto si puede.
Para administrar arquitecturas diferentes, hay dos etiquetas:
ExcludeArch: para excluir una arquitectura en la que el paquete no se construye. Por ejemplo:
ExcludeArch: ppc

ExclusiveArch: para incluir slo la arquitectura especicada. Evitar esto a menos que sea
absolutamente correcto.
Las arquitecturas vlidas estn listadas en Arquitecturas.

Subpaquetes
Un archivo SPEC puede denir ms de un paquete binario. En otras palabras, un archivo SRPM con un
SPEC pueden resultar en varios RPMS. Tenga en cuenta que todava hay slo un proceso de creacin
(%prep, %build, %install, etc.). Los subpaquetes name-doc y name-devel son comunes para los archivos de
documentacin y desarrollo respectivamente.
Use la directiva

%package

para iniciar la denicin de un subpaquete:

%package subpackage_name

Despus de cada directiva %package, liste las etiquetas para el subpaquete. Esta debe incluir por lo menos
las etiquetas Summary y Group, as como las directivas %description subpackage_name y %files subpackage_name:
Cualquier cosa no especicada por el subpaquete ser heredado de su padre.

30/01/13 23:09

How to create an RPM package/es - FedoraProject

16 de 22

http://fedoraproject.org/w/index.php?title=How_to_create_a...

Por omisin, si el nombre del paquete es foo y el nombre del subpaquete es bar, entonces el
subpaquete resultante ser foo-bar. Usted puede anularlo con la opcin -n (pero tambin tendr que
usarla en todas las dems directivas si la especica aqu):
%package -n new_subpackage_name

Vea la seccin subpaquetes de la Gua RPM (http://docs.fedoraproject.org/en-US


/Fedora_Draft_Documentation/0.1/html/RPM_Guide/ch10s04.html) para obtener ms informacin.

Condicionales
Puede insertar sentencias condicionales, por ejemplo para probar, si usted est creando un binario para
una arquitectura determinada:
%ifarch ARCHITECTURE_NAME

la versin negada con:


%ifnarch ARCHITECTURE_NAME

o la condicional ms general:
%if TRUE_OR_FALSE

Hay una seccin %else opcional; todos estas son cerradas con %endif.

Lineamientos especcos de la aplicacin


Existen muchos lineamientos especcos de las aplicaciones que pueden ayudarle (por ejemplo, para
lenguajes de programacin especcos, aplicaciones, bibliotecas y sistemas de construccin). Muchos de
ellos estn listados como parte de los Lineamientos especcos de la aplicacin de
empaquetamiento/directrices. Ejemplos de lineamientos especcos de la aplicacin son aquellos para:
Cmake
Emacs
En su defecto, otras maneras de encontrar ayuda especca de la aplicacin son:
El comando 'SEARCH' en Fedoraproject.org
PackagingDrafts
Un Grupo de inters especial (SIG)
Pginas wiki con el prejo 'Packaging' (http://fedoraproject.org/wiki/Special:PrexIndex/Packaging)

Varios consejos
Packaging/FrequentlyMadeMistakes tiene informacin sobre errores cometidos con frecuencia. Tambin
hay algunas recomendaciones y trucos controversiales en PackageMaintainers/Packaging Tricks.
Trate de escribir sus archivos SPEC para que pueda trabajar cuando se realice una nueva versin de
desarrollo, sin cambios aparte de subir el nmero de versin y actualizacin de los archivos fuentes. Por
ejemplo, si contiene archivos *.txt con bits de ejecucin, en lugar de hacer
chmod a-x Filename1.txt Filename2.txt Filename3.txt

considere hacer esto, lo que se encargar de los nuevos nombres de archivos que utilizan la misma
convencin de denominacin de archivos:
chmod a-x *.txt

Si quiere ver muchos ejemplos de scriptlets, pueden verse todos los scriptlets de los programas instalados
mediante:

30/01/13 23:09

How to create an RPM package/es - FedoraProject

17 de 22

http://fedoraproject.org/w/index.php?title=How_to_create_a...

rpm -qa --queryformat "\n\nPACKAGE: %{name}\n" --scripts | less

No intente interactuar con el usuario; RPM est diseado para soportar instalaciones de procesamiento
por lotes. Si una aplicacin necesita mostrar una EULA, debe ser parte de la ejecucin inicial, no de la
instalacin.
Usted podra no querer iniciar los servicios, ya que en una instalacin grande podra retrasar las cosas. Si
instala un script init o systemd, considere usar chkconfig o systemctl para organizar que el servicio sea
iniciado/detenido en el siguiente reinicio. Antes de desinstalar, debera normalmente intentar detener los
servicios si se estn ejecutando.
La desinstalacin debe revertir la mayora de los cambios realizados durante la instalacin, pero no
eliminar los archivos creados por el usuario.
Normalmente, si hay ejecutables binarios, se eliminan los smbolos de depuracin de los paquetes
binarios normales y se colocan en un subpaquete name-debug. Si esto no sucede, puede deshabilitar la
creacin y remocin de este subpaquete poniendo esto en la parte superior de su SPEC:
%global _enable_debug_package 0
%global debug_package %{nil}
%global __os_install_post /usr/lib/rpm/brp-compress %{nil}

Para evitar la remocin es posible que tenga que hacer esto en la seccin

%install:

export DONT_STRIP=1

Una forma de vericar la versin de Fedora en un archivo SPEC para la construccin condicional es:
%if 0%{?fedora} <= <version>

El ? provoca que la macro evale ponerse en blanco si %fedora no est denida. Esto hace que el resultado
nal sea 0 (que es un nmero y por lo tanto aceptable), mientras que no interera con el resultado si hay
realmente un valor para %fedora. (Tenga en cuenta que este truco no funciona en Koji scratch builds,
donde %fedora se establece durante la creacin del SRPM.)
Los programas de la GUI deben tener una entrada desktop para que la gente pueda invocarla desde el
men grco de escritorio. Para los archivos .desktop, consulte Lineamientos de empaquetado de Fedora
para archivos desktop y entrada desktop en spec (http://standards.freedesktop.org/desktop-entryspec/latest/) . Para los iconos dentro de /usr/share/icons, consulte tema de cono en spec
(http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html) .

Construccin del paquete binario


Prueba con rpmlint
Para detectar a tiempo muchos errores comunes, ejecute
construir algo con l:

rpmlint

en su archivo SPEC antes de intentar

$ rpmlint program.spec

Si el error reportado no tiene sentido, ejecutarlo de nuevo con la opcin -i para mensajes ms largos.
Trate de no tener errores, pero a veces rpmlint informa falsos positivos. Los Lineamientos de
empaquetamiento de Fedora explica cules ignorar.

Crear un RPMS binario desde el archivo SPEC


Una vez que haya creado su archivo SPEC, construir el SRPM y el RPMS binario ejecutando esto:
$ rpmbuild -ba program.spec

Si tiene xito, RPMS se crear dentro de

~/rpmbuild/RPMS

y SRPMS dentro de

~/rpmbuild/SRPMS.

Si no, vaya al directorio correspondiente y mire lo que queda. Para ayudar a depurar, puede saltarse las

30/01/13 23:09

How to create an RPM package/es - FedoraProject

18 de 22

http://fedoraproject.org/w/index.php?title=How_to_create_a...

etapas anteriores que tuvieron xito con la opcin --short-circuit. Por ejemplo, para reiniciar en la etapa
de %install (saltando etapas anteriores), haga lo siguiente:
$ rpmbuild -bi --short-circuit program.spec

Si lo que desea es crear un SRPM (que no ejecuta la

%prep

%build

u otras etapas), ejecute esto:

rpmbuild -bs program.spec

Pruebas de RPMS binarios con rpmlint


rpmlint se puede ejecutar en archivos SPEC, RPMS y SRPMS para comprobar si hay errores. Es necesario
para eliminar o corroborar las advertencias antes de publicar un paquete. Si usted est en el directorio
SPECS, haga lo siguiente:

$ rpmlint NOMBRE.spec ../RPMS/*/NOMBRE*.rpm ../SRPMS/NOMBRE*.rpm

Introduzca el directorio ~/rpmbuild/RPMS en el subdirectorio de la arquitectura. Encontrar algunos RPMS


binarios. Vea rpidamente sus archivos y permisos (para comprobar si son correctos) haciendo:
$ rpmls *.rpm

Si esto luce bien, instalarlos como root:


# rpm -ivp package1.rpm package2.rpm package3.rpm ...

Pruebe los programas de diferentes maneras para ver si todo funciona correctamente. Si se trata de una
herramienta de GUI, asegrese de que aparece en el men del escritorio, de lo contrario la entrada
.desktop ser errnea.
Desinstalar los paquetes ms tarde haciendo:
# rpm -e package1 package2 package3

Mock y Koji
Mock es una potente herramienta que utiliza el SRPM que usted ha creado para construir paquetes
binarios dentro de un ambiente casi vaco. Esto puede revelar si tiene las dependencias de construccin
adecuadas. Si esto falla, entonces se olvid de incluir algo en BuildRequires. Consulte Usando Mock para
probar las construcciones de paquetes. Una vez que su cuenta sea miembro del grupo mock, puede
ejecutar comandos como este para hacer pruebas locales:
$ mock -r fedora-9-i386 rebuild path_to_source_RPM

Puede utilizar Koji (que usa mock) para realizar construcciones en muchos sistemas diferentes, algunos de
los cuales puede que no tenga. PackageMaintainers/Join y PackageMaintainers/UsingKoji tienen ms
informacin acerca de Koji. Una vez que est instalado, puede probar su SRPM en una variedad de
plataformas ejecutando comandos como:
$ koji build --scratch dist-f9 path_to_source_RPM

Reemplace dist-f9 con cualquier versin posterior de Fedora, pero no use dist-rawhide. Recuerde que los
valores de %fedora, %fc9 y as sucesivamente, no sern correctos para un scratch build, por lo que estos no
funcionarn si el archivo SPEC hace algo diferente, basndose en esos valores.
Sus construcciones Koji slo pueden depender de los paquetes que se encuentran actualmente en el
repositorio de distribucin TARGET. En consecuencia, no puede construir con Koji para distribuciones
liberadas si su paquete depende de otros paquetes nuevos que Bodhi no ha liberado todava. Si necesita
construir en contra de un paquete que no es todava una liberacin estable actualizada, puede presentar
un ticket con rel-eng en: https://fedorahosted.org/rel-eng/newticket y solicitar que dicho paquete sea
aadido como un buildroot override.

30/01/13 23:09

How to create an RPM package/es - FedoraProject

19 de 22

http://fedoraproject.org/w/index.php?title=How_to_create_a...

Herramientas tiles
El paquete
instala.

rpmdevtools

contiene una serie de herramientas tiles; rpm

-qil rpmdevtools

le mostrar lo que

: resalta la etiqueta de la versin en el archivo spec y aade un comentario en el registro


de cambios con el formato de fecha y versin correctos:
rpmdev-bumpspec

rpmdev-bumpspec --comment=COMENTARIO --userstring=NOMBRE+CORREOELECTRONICO_STRING SPECFILES

El paquete

yum-utils

yumdownloader

tambin tiene algunas herramientas tiles:

: descargar el SRPM del paquete ejecutando:

yumdownloader --source NOMBREDEPAQUETE

El paquete auto-buildrequires tiene un par de buenas herramientas para ayudar a descifrar las entradas de
BuildRequires. Despus de instalar este paquete, reemplace rpmbuild con auto-br-rpmbuild y ver una
lista de BuildRequires generada automticamente.
Es posible que encuentre til a RUST (http://rust.sourceforge.net/) (GPL), aunque no crea archivos SPEC
de la calidad adecuada para los paquetes de Fedora. Alien (http://kitenet.net/~joey/code/alien/) convierte
entre formatos de paquetes. No producir SRPMS limpios, pero la conversin de un paquete existente
podra proporcionar cierta informacin til.

Lineamientos y reglas
Al crear los paquetes, deber seguir las siguientes reglas y lineamientos:
Cmo unirse a los Mantenedores de la coleccin de paquetes de Fedora
Lineamientos de empaquetamiento
Lineamientos de nombrado de paquetes
Lineamientos de licenciamiento de paquetes
Lineamientos de la etiqueta Dist
Lineamientos de revisin de paquetes
Hay muchas pautas ociales que le ayudarn con circunstancias especcas (por ejemplo, programas
Java, OCaml, GNOME, etc.). Puede aprender ms desde las secciones SIGs y Maintenedores de paquetes.
Tambin puede ver la lista de todas las pginas Wiki sobre el empaquetamiento (https://fedoraproject.org
/wiki/Special:Prexindex/Packaging) para ver si alguna es aplicable.
En su defecto, puede que encuentre algunas recomendaciones tiles en los Borradores de
empaquetamiento (https://fedoraproject.org/wiki/Special:Search?ns0=1&search=PackagingDrafts%2F&
searchx=Search) no ociales y en Borradores de empaquetamiento para hacer.

Mantenimiento del paquete


Una vez que su paquete ha sido aceptado, usted y sus co-mantenedores tendrn que mantenerlo. Ver
CMO actualizar paquetes y Lineamientos de actualizacin de paquetes. Si actualiza la versin en varias
liberaciones de Fedora, hgalo hacia atrs en el tiempo (por ejemplo, libere para Fedora N, luego una vez
aceptado, Fedora N-1). El sistema presume que las versiones ms recientes de Fedora poseen la misma o
ms recientes versiones de los programas.
Alentar a los desarrolladores principales a utilizar las convenciones estndar en la liberacin del cdigo
fuente. Usando las convenciones estndar hace que el empaquetamiento sea mucho ms fcil. Para
obtener ms informacin, consulte:
Releasing Free/Libre/Open Source Software (FLOSS) for Source Installation (http://www.dwheeler.com
/essays/releasing-oss-software.html) (un resumen rpido)
GNU Coding Standards release process (http://www.gnu.org/prep/standards/html_node/ManagingReleases.html)
Software Release Practice HOWTO (http://en.tldp.org/HOWTO/Software-Release-Practice-HOWTO/)

30/01/13 23:09

How to create an RPM package/es - FedoraProject

20 de 22

http://fedoraproject.org/w/index.php?title=How_to_create_a...

Filesystem Hierarchy Standard (FHS) (http://www.pathname.com/fhs/)


Packaging Unix software (http://oog.org/articles/packaging/)

Para obtener ms informacin


La pgina Mantenedores de paquetes enlaza a muchas otras pginas de inters, y CMO actualizar
paquetes describe cmo actualizar un paquete existente que usted ya mantenga en Fedora.
Para obtener ms informacin, fuera de la Wiki de Fedora, consulte:
How to build RPM packages on Fedora (http://www.g-loaded.eu/2006/04/05/how-to-build-rpm-packageson-fedora/) - muy breve repaso
Empaquetado de software con RPM (developerWorks) Part 1 (http://www.ibm.com/developerworks
/ssa/linux/library/l-rpm1/) , Part 2 (http://www.ibm.com/developerworks/ssa/linux/library/l-rpm2/) , y Part
3 (http://www.ibm.com/developerworks/ssa/linux/library/l-rpm3/)
Fedora Classroom tuvo una sesin de IRC en empaquetamiento y puede consultar los registros en
https://fedoraproject.org/wiki/Building_RPM_packages_%2820090405%29
Fedora Packager's Handbook (http://koti.welho.com/vskytta/packagers-handbook/packagershandbook.html)
When Sally met Eddie (http://www.redhatmagazine.com/2008/02/28/when-sally-met-eddie-the-fedorapackage-story/) - un cuento simple, pero pocos detalles
Maximum RPM Book (http://rpm.org/max-rpm-snapshot/) - informacin ms completa, pero en algunos
casos antigua/obsoleta
RPM Guide, section on creating RPMs (http://docs.fedoraproject.org/en-US/Fedora_Draft_Documentation
/0.1/html/RPM_Guide/ch-creating-rpms.html) - esta tiene un montn de buena informacin y es un poco
ms actualizada, pero es un proyecto
Developer's guide, section on building RPMs (http://docs.fedoraproject.org/developers-guide/chrpm-building.html)
Creating RPMS slides (http://www.gurulabs.com/GURULABS-RPM-LAB/GURULABS-RPM-GUIDE-v1.0.PDF)
de Guru Labs
The ght, my rst attempt to make a readable rpm package building introduction. (http://freshrpms.net
/docs/ght/)
Cambridge RPM tutorial (http://www-uxsup.csx.cam.ac.uk/talks/rpmbuild/rpmbuild.pdf) es una
presentacin sobre la creacin de RPM bsicos
RPM HOWTO: RPM at Idle by Donnie Barnes (http://en.tldp.org/HOWTO/RPM-HOWTO/index.html)
RPM HowTo by Dawson (http://home.fnal.gov/~dawson/rpms/howto/index.html)
Cross-distribution package HOWTO (http://en.opensuse.org/Build_Service
/cross_distribution_package_how_to) tiene consejos si usted est construyendo un RPM para muchas
distribuciones.
Mandriva Rpm HowTo (en) (http://wiki.mandriva.com/en/Development/Howto/RPM) es un tutorial de RPM,
aunque para Mandriva (no Mandrake). Nota: En Fedora, no no recomprimir los archivos tarballs
originales, como sugiere Mandriva, porque cambiara sus hashes criptogrcos.
Creating Your Own Linux RPM's - The Initial Software Build (http://linuxshellaccount.blogspot.com
/2008/03/creating-your-own-linux-rpms-initial.html) es otra breve introduccin, pero seala que El
proceso de construccin de RPM es mucho ms sencillo que la creacin de paquetes para Solaris...
Menos pasos, y la posibilidad de agregar toda la informacin de su software en un archivo de
especicacin, haciendo algo ms compacto (y ms fcil de modicar o reproducir) el sistema de
empaquetamiento de software.
All you need to know about RPM (http://fedoranews.org/alex/tutorial/rpm/) (ms sobre la instalacin de
paquetes que de crearlos)
La Wiki de rpm.org (http://wiki.rpm.org/) tiene algunas informaciones tiles, tal como la lista de
problemas RPM conocidos (http://wiki.rpm.org/Problems)
Nota: El sitio rpm5.org (http://rpm5.org/) tiene alguna documentacin, pero no depende de l; que es la

30/01/13 23:09

How to create an RPM package/es - FedoraProject

21 de 22

http://fedoraproject.org/w/index.php?title=How_to_create_a...

pgina de un fork de RPM mantenido por Je Johnson. El RPM utilizado por Fedora (y Novell/SuSE) se basa
ms bien en rpm.org (http://www.rpm.org) . lwn.net tiene un breve artculo (http://lwn.net/Articles
/236029/) acerca de esto.
Retrieved from "https://fedoraproject.org/w/index.php?title=How_to_create_an_RPM_package
/es&oldid=315883"
Categories:
How to Package Maintainers Spanish translations

30/01/13 23:09

How to create an RPM package/es - FedoraProject

22 de 22

http://fedoraproject.org/w/index.php?title=How_to_create_a...

Copyright 2013 Red Hat, Inc. and others. All Rights Reserved. For comments or queries, please contact us.
The Fedora Project is maintained and driven by the community and sponsored by Red Hat. This is a community maintained site. Red Hat
is not responsible for content.
This page was last modied on 25 December 2012, at 23:37. Content is available under Attribution-Share Alike 3.0 Unported.
Sponsors

Legal

Trademark Guidelines

30/01/13 23:09

You might also like