rpm rpm-spec

¿Puedo usar rpm para expandir las macros en un archivo de especificaciones?



rpm-spec (5)

El ejemplo concreto es que tengo muchos archivos de Source0 con Source0 : u otras líneas de Source que contienen macros. ¿Cómo puedo expandir estas macros sin comenzar realmente una compilación en el archivo spec o escribir mi propio analizador?


Expandir macros en scripts

Si está interesado en cómo se verán los scripts en su RPM después de la expansión de macros, puede simplemente compilar el RPM y luego obtener RPM para extraer los scripts:

rpmbuild -bi my-package.spec rpm -qp --scripts my-package.rpm

Esto funciona porque RPM expande las macros en tiempo de construcción.


Desde rpm 4.9 puedes usar:

rpmspec -P <spec_file>

Esto imprimirá el archivo de especificaciones expandido en la salida estándar


Podría obtener grep para obtener las líneas de origen, sed para extraer la cadena que contiene la macro y luego rpm --eval ''cadena'' para evaluarla. Tenga en cuenta que esto solo expandirá las macros globales, no las definidas en esta especificación.

Para expandirlos también es probable que necesites grep para ellos y alimentarlos a rpm como tu archivo de macros personalizado.


Si /usr/bin/spectool script /usr/bin/spectool en rpmdevtools de los que habla @mmckinst, verás que es solo un truco elaborado. Crea un archivo de especificación tmp que esencialmente hace lo que hace el script a continuación. Esto es lo que estamos usando para expandir el archivo de especificaciones y luego grep para las partes del archivo que necesitamos. En nuestro caso, queríamos más que las fuentes y los parches.

Aquí hay un ejemplo de script bash que simula este comportamiento. Expandirá todas las macros hacia arriba a través de la sección %prep .

#!/bin/bash spec_file="$1" # pass in the path to the spec file as the first argument tmp_spec="/tmp/eval-$$.spec" cat "$spec_file" | sed ''/^%prep/,$d'' > "$tmp_spec" echo ''%prep'' >> "$tmp_spec" echo ''cat<<__EOF__'' >> $tmp_spec cat "$spec_file" | sed ''/^%prep/,$d'' >> "$tmp_spec" echo ''__EOF__'' >> "$tmp_spec" rpmbuild -bp "$tmp_spec" 2>/dev/null rm -f "$tmp_spec"


Si solo es necesario analizar las líneas fuente, spectool lo hará por usted. Es parte de rpmdevtools de Fedora.

$ spectool ./mg.spec Source0: http://homepage.boetes.org/software/mg/mg-20110120.tar.gz $

Aquí está su pantalla de ayuda.

Usage: spectool [<options>] <specfile> Options: operating mode: -l, --lf, --list-files lists the expanded sources/patches (default) -g, --gf, --get-files gets the sources/patches that are listed with a URL -h, --help display this help screen files on which to operate: -A, --all all files, sources and patches (default) -S, --sources all sources -P, --patches all patches -s, --source x[,y[,...]] specified sources -p, --patch a[,b[,...]] specified patches misc: -d, --define ''macro value'' defines RPM macro ''macro'' to be ''value'' -C, --directory dir download into specified directory (default ''.'') -R, --sourcedir download into rpm''s %{_sourcedir} -n, --dryrun, --dry-run don''t download anything, just show what would be done -D, --debug output debug info, don''t clean up when done