¿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