rpmbuild

rpmbuild construye paquetes RPM.

Sintaxis

Construyendo paquetes:

       rpmbuild {-ba|-bb|-bp|-bc|-bi|-bl|-bs} [rpmbuild-options] SPECFILE ...

       rpmbuild {-ta|-tb|-tp|-tc|-ti|-tl|-ts} [rpmbuild-options] TARBALL ...

       rpmbuild {--rebuild|--recompile} SOURCEPKG ...

rpmbuild se utiliza para construir tanto paquetes binarios como fuentes. Un paquete consiste de un conjunto de archivos y metadatos utilizados para instalar y eliminar los archivos. Los metadatos incluyen programas ayudantes (scripts), atributos de archivos e información descriptiva acerca del paquete. Los paquetes vienen en dos variantes: paquetes binarios, utilizados para encapsular software a ser instalado, y paquetes fuentes que contienen el código fuente y las recetas necesarias para producir los paquetes binarios.

Uno de los siguientes modos básicos debe seleccionarse: Build Package, Build Package from Tarball, Recompile Package, Show Configuration.

Opciones generales

Estas opciones se pueden usar en todos los modos disponibles.

  • -?, --help : Imprime un mensaje acerca de uso más extenso que el normal.
  • --version : Imprime una línea con el número de versión que se está usando.
  • --quiet : Imprime la menor salida posible, normalmente sólo mensajes de error.
  • -v : Imprime más información, normalmente se mostrarán mensajes del progreso de las rutinas.
  • -vv : Imprime un montón de información para depuración.
  • --rcfile FILELIST : Cada uno de los archivos en la lista separados por dos puntos son leídos secuencialmente por rpm por información para configuración. Sólo el primer archivo en la lista debe existir, las tildes serán expandidas al valor de $HOME. El valor por omisión de FILELIST es /usr/lib/rpm/rpmrc:/usr/lib/rpm/redhat/rpmrc:/etc/rpmrc:~/.rpmrc.
  • --pipe CMD : Canaliza (pipes) la salida de rpm al comando CMD.
  • --dbpath DIRECTORY : Usar la base de datos en DIRECTORY en remplazo de la ruta por omisión /var/lib/rpm .
  • --root DIRECTORY : Usar el sistema de archivos como raíz en DIRECTORY para todas las operaciones. Note que esto significa que la base de datos en DIRECTORY será utilizada para las verificaciones de dependencias y cualquier scriptlet (e.g. %post si se está instalando, o %prep si se está construyendo un paquete) será ejecutado después de chroot(2) a DIRECTORY.

Construyendo paquetes

La forma general de un comando rpmbuild para construir un paquete es.

       rpmbuild -bSTAGE|-tSTAGE [ rpmbuild-options ] FILE ...

El argumento utilizado es -b si se está utilizando un archivo spec para construir el paquete y -t si rpmbuild debe mirar dentro de (posiblemente comprimido) archivo tar para buscar el archivo spec a usar. Después de este primer argumento, el próximo caracter (STAGE , etapa) especifica las etapas de la construcción del paquete a ser ejecutadas y puede ser una de las siguientes:

  • -ba : construye los paquetes binarios y fuente (después de ejecutar las secciones %pre, %build e %install).
  • -bb : construye el paquete binario (después de ejecutar las secciones %prep, %build, e %install).
  • -bp : ejecuta la etapa "%prep" del archivo spec. Normalmente esto involucra desempacar los fuentes y aplicar los parches.
  • -bc : ejecuta la etapa "%build" del archivo spec (después de ejecutar la etapa %prep). Esto generalmente involucra el equivalente a "make".
  • -bi : ejecuta la etapa "%install" del archivo spec (después de ejecutar las etapas %prep y %build). Esto generalmente equivale a "make install".
  • -bl : ejecutar la "lista de verificación". La sección "%files" del archivo spec es expandido y se hacen las verificaciones de cada archivo exista.
  • -bs : construye solamente el paquete fuente.

También se pueden utilizar las siguientes opciones:

  • --buildroot DIRECTORY : Cuando se esté construyendo el paquete, sobrescribir la etiqueta BuildRoot con el directorio DIRECTORY.
  • --clean : Remover el árbol de construcción después de construir los paquetes.
  • --nobuild : No ejecutar ninguna etapa de construcción. Útil para probar archivos spec.
  • --nodeps : No verificar dependencias de construcción.
  • --rmsource : Remover los fuentes después de construir (también se puede usar de forma independiente, e.g. "rpmbuild --rmsource foo.spec").
  • --rmspec : Remover el archivo spec después de construir (también se puede usar de forma independiente, eg. "rpmbuild --rmspec foo.spec").
  • --short-circuit : Saltarse directo a la etapa especificada. Sólo es valído con -bc, -bi y -bb. Útil para pruebas locales. Los paquetes construídos de esta manera serán marcados con una dependencia imposible para evitar su uso accidental.
  • --target PLATFORM : Cuando se esté construyendo el paquete, interpretar PLATFORM como arch-vendor-os y define los macros %_target, %_target_cpu, y %_target_os de forma correspondiente.

Recompilar y reconstruir

Existen dos maneras más de invocar rpmbuild:

       rpmbuild --rebuild|--recompile SOURCEPKG ...

Cuando se invoca de esta manera, rpmbuild instalar el paquete nombrado, se ejecuta la preparación, se compila e instala. Además, --rebuilds construye un nuevo paquete binario. Cuando se termina la construcción , el directorio de construcción es removido (como con --clean) y los fuentes y el archivo spec del paquete igualmente son borrados.

Configuración de rpmbuild

El comando siguiente muestra los valores que rpmbuild usará para todas sus opciones y de acuerdo a la configuración establecida en rpmrc y los archivos de configuración macros.

$ rpmbuild --showrc

ARCHITECTURE AND OS:
build arch            : x86_64
compatible build archs: x86_64 noarch
build os              : Linux
compatible build os's : Linux
install arch          : x86_64
install os            : Linux
compatible archs      : x86_64 amd64 athlon noarch i686 i586 i486 i386 fat
compatible os's       : Linux

RPMRC VALUES:
optflags              : %{__global_cflags} -m64 -mtune=generic

Features supported by rpmlib:
    rpmlib(BuiltinLuaScripts) = 4.2.2-1
    rpmlib(CompressedFileNames) = 3.0.4-1
    rpmlib(ConcurrentAccess) = 4.1-1
    rpmlib(ExplicitPackageProvide) = 4.0-1
    rpmlib(FileCaps) = 4.6.1-1
    rpmlib(FileDigests) = 4.6.0-1
    rpmlib(HeaderLoadSortsTags) = 4.0.1-1
    rpmlib(PartialHardlinkSets) = 4.0.4-1
    rpmlib(PayloadFilesHavePrefix) = 4.0-1
    rpmlib(PayloadIsBzip2) = 3.0.5-1
    rpmlib(PayloadIsLzma) = 4.4.2-1
    rpmlib(PayloadIsXz) = 5.2-1
    rpmlib(ScriptletExpansion) = 4.9.0-1
    rpmlib(ScriptletInterpreterArgs) = 4.0.3-1
    rpmlib(VersionedDependencies) = 3.0.3-1

========================
-14: GNUconfigure(MCs:)    
  CFLAGS="${CFLAGS:-%optflags}" ; export CFLAGS; 
  LDFLAGS="${LDFLAGS:-%{-s:-s}}"  ; export LDFLAGS; 
  %{-C:_mydir="`pwd`"; %{-M: %{__mkdir} -p %{-C*};} cd %{-C*}} 
  dirs="`find ${_mydir} -name configure.in -print`"; export dirs; 
    for coin in `echo ${dirs}` 
...
...

Archivos

   rpmrc Configuración
       /usr/lib/rpm/rpmrc
       /usr/lib/rpm/redhat/rpmrc
       /etc/rpmrc
       ~/.rpmrc

   Macro Configuración
       /usr/lib/rpm/macros
       /usr/lib/rpm/redhat/macros
       /etc/rpm/macros
       ~/.rpmmacros

   Temporales
       /var/tmp/rpm*

Algunos ejemplos

$ rpmbuild -ba ~/rpmbuild/SPECS/fwsnort.spec

Ejecutando(%prep): /bin/sh -e /var/tmp/rpm-tmp.tFOXBA
+ umask 022
+ cd /home/gomix/rpmbuild/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
+ cd /home/gomix/rpmbuild/BUILD
+ rm -rf fwsnort-1.6.1
+ /bin/tar -xf -
+ /usr/bin/gzip -dc /home/gomix/rpmbuild/SOURCES/fwsnort-1.6.1.tar.gz
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd fwsnort-1.6.1
+ /bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ mv deps/snort_rules/VERSION SNORT-RULES-VERSION
+ cp -p /home/gomix/rpmbuild/SOURCES/logrotate.fwsnort .
+ exit 0
Ejecutando(%build): /bin/sh -e /var/tmp/rpm-tmp.ZqIgbu
+ umask 022
+ cd /home/gomix/rpmbuild/BUILD
+ cd fwsnort-1.6.1
+ LANG=C
+ export LANG
+ unset DISPLAY
+ exit 0
Ejecutando(%install): /bin/sh -e /var/tmp/rpm-tmp.ljroNn
+ umask 022
+ cd /home/gomix/rpmbuild/BUILD
+ '[' /home/gomix/rpmbuild/BUILDROOT/fwsnort-1.6.1-1.fc16.x86_64 '!=' / ']'
+ rm -rf /home/gomix/rpmbuild/BUILDROOT/fwsnort-1.6.1-1.fc16.x86_64
++ dirname /home/gomix/rpmbuild/BUILDROOT/fwsnort-1.6.1-1.fc16.x86_64
+ mkdir -p /home/gomix/rpmbuild/BUILDROOT
+ mkdir /home/gomix/rpmbuild/BUILDROOT/fwsnort-1.6.1-1.fc16.x86_64
+ cd fwsnort-1.6.1
+ LANG=C
+ export LANG
+ unset DISPLAY
+ rm -rf /home/gomix/rpmbuild/BUILDROOT/fwsnort-1.6.1-1.fc16.x86_64
+ mkdir -p /home/gomix/rpmbuild/BUILDROOT/fwsnort-1.6.1-1.fc16.x86_64/var/log/fwsnort
+ mkdir -p /home/gomix/rpmbuild/BUILDROOT/fwsnort-1.6.1-1.fc16.x86_64/etc/fwsnort
+ mkdir -p /home/gomix/rpmbuild/BUILDROOT/fwsnort-1.6.1-1.fc16.x86_64/usr/bin
+ mkdir -p /home/gomix/rpmbuild/BUILDROOT/fwsnort-1.6.1-1.fc16.x86_64/usr/share/man/man8
+ mkdir -p /home/gomix/rpmbuild/BUILDROOT/fwsnort-1.6.1-1.fc16.x86_64/usr/sbin
+ install -m 755 fwsnort /home/gomix/rpmbuild/BUILDROOT/fwsnort-1.6.1-1.fc16.x86_64/usr/sbin/
+ install -m 644 fwsnort.conf /home/gomix/rpmbuild/BUILDROOT/fwsnort-1.6.1-1.fc16.x86_64/etc/fwsnort/
+ install -m 644 fwsnort.8 /home/gomix/rpmbuild/BUILDROOT/fwsnort-1.6.1-1.fc16.x86_64/usr/share/man/man8/
+ cp -r deps/snort_rules /home/gomix/rpmbuild/BUILDROOT/fwsnort-1.6.1-1.fc16.x86_64/etc/fwsnort
+ mkdir -p /home/gomix/rpmbuild/BUILDROOT/fwsnort-1.6.1-1.fc16.x86_64/etc/logrotate.d
+ install -p -m 644 logrotate.fwsnort /home/gomix/rpmbuild/BUILDROOT/fwsnort-1.6.1-1.fc16.x86_64/etc/logrotate.d/fwsnort
+ /usr/lib/rpm/find-debuginfo.sh --strict-build-id /home/gomix/rpmbuild/BUILD/fwsnort-1.6.1
+ /usr/lib/rpm/check-rpaths /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/redhat/brp-compress
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1
+ /usr/lib/rpm/redhat/brp-python-hardlink
+ /usr/lib/rpm/redhat/brp-java-repack-jars
Procesando archivos: fwsnort-1.6.1-1.fc16.noarch
Ejecutando(%doc): /bin/sh -e /var/tmp/rpm-tmp.LT5zKi
+ umask 022
+ cd /home/gomix/rpmbuild/BUILD
+ cd fwsnort-1.6.1
+ DOCDIR=/home/gomix/rpmbuild/BUILDROOT/fwsnort-1.6.1-1.fc16.x86_64/usr/share/doc/fwsnort-1.6.1
+ export DOCDIR
+ /bin/mkdir -p /home/gomix/rpmbuild/BUILDROOT/fwsnort-1.6.1-1.fc16.x86_64/usr/share/doc/fwsnort-1.6.1
+ cp -pr LICENSE VERSION README CREDITS TODO SNORT-RULES-VERSION /home/gomix/rpmbuild/BUILDROOT/fwsnort-1.6.1-1.fc16.x86_64/usr/share/doc/fwsnort-1.6.1
+ exit 0
Provides: config(fwsnort) = 1.6.1-1.fc16
Requires(interp): /bin/sh /bin/sh /bin/sh
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires(pre): /bin/sh
Requires(post): /bin/sh
Requires(preun): /bin/sh
Requires: /usr/bin/perl perl(Cwd) perl(Data::Dumper) perl(File::Copy) perl(File::Path) perl(Getopt::Long) perl(IO::Socket) perl(Sys::Hostname) perl(strict)
Comprobando si hay archivos desempaquetados: /usr/lib/rpm/check-files /home/gomix/rpmbuild/BUILDROOT/fwsnort-1.6.1-1.fc16.x86_64
Escrito: /home/gomix/rpmbuild/SRPMS/fwsnort-1.6.1-1.fc16.src.rpm
Escrito: /home/gomix/rpmbuild/RPMS/noarch/fwsnort-1.6.1-1.fc16.noarch.rpm
Ejecutando(%clean): /bin/sh -e /var/tmp/rpm-tmp.JixAEe
+ umask 022
+ cd /home/gomix/rpmbuild/BUILD
+ cd fwsnort-1.6.1
+ rm -rf /home/gomix/rpmbuild/BUILDROOT/fwsnort-1.6.1-1.fc16.x86_64
+ exit 0

Verificación de archivos

Use la opción -bl para expandir la seccion %files y hacer una lista de "chequeo", se verifica que cada archivo exista en %{buildroot}. Una forma de garantizarse de que %{buildroot} no haya sido borrado, es hacer previamente rpmbuid -bi <spec>.

[makerpm@movix rpmbuild]$ rpmbuild -bl SPECS/rubygem-unicorn.spec 
Procesando archivos: rubygem-unicorn-4.1.1-1.fc16.x86_64
Provides: rubygem(unicorn) = 4.1.1 unicorn_http.so()(64bit)
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires: /this/will/be/overwritten/or/wrapped/anyways/do/not/worry/ruby /usr/bin/ruby libc.so.6()(64bit) libc.so.6(GLIBC_2.14)(64bit) libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.3.4)(64bit) libc.so.6(GLIBC_2.4)(64bit) libcrypt.so.1()(64bit) libdl.so.2()(64bit) libm.so.6()(64bit) libpthread.so.0()(64bit) librt.so.1()(64bit) libruby.so.1.8()(64bit) rtld(GNU_HASH)
Procesando archivos: rubygem-unicorn-doc-4.1.1-1.fc16.x86_64
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires: /bin/sh /usr/bin/env /usr/bin/ruby
Procesando archivos: rubygem-unicorn-debuginfo-4.1.1-1.fc16.x86_64
Comprobando si hay archivos desempaquetados: /usr/lib/rpm/check-files /home/makerpm/rpmbuild/BUILDROOT/rubygem-unicorn-4.1.1-1.fc16.x86_64

Notas varias

Usos:

$ rpmbuild --rebuild url-del-src.rpm
$ rpmbuild --clean --rebuild url-del-src.rpm